공부하고 전파하는 것을 좋아합니다. 빅데이터와 인공지능에 오랜 경력이 있습니다.
20년 현업 데이터분석가 경력, 5년 데이터 분석 강의!
빅데이터 및 인공지능 분야 기업 및 공공기관 자문 및 출강
빅데이터 분석기사 한권완성 필기, 실기 저자
인공지능 분야 스타트업 대표
강의
수강평
- [2025] SQLD 문제가 어려운 당신을 위한 노랭이 176 문제 풀이
- [2025] 비전공자도 한 번에 합격하는 SQLD 올인원
- [2025] 비전공자도 한 번에 합격하는 SQLD 올인원
게시글
질문&답변
실전문제3회 41번문제
안녕하세요. kokodae.ko 님. 질문 남겨주셔서 감사합니다. 이 문제는 가장 적절한 sql 을 찾는 문제입니다. 말씀하신 것 처럼 보기 1, 3은 해당 데이터 내에서는 동일한 결과가 나옵니다. 하지만 3번 같은 경우, Lag 에 4 라는 값을 하드코딩 해두었기 때문에 데이터가 누락된 경우에는 완전히 잘 못된 값을 출력하게 됩니다. 예를 들어 한 개 쿼터의 값이 없는 경우에도 4개 이전의 값을 가지고 계산을 하게 됩니다. 그래서 가장 적절한 sql은 1번으로 선택하는 것이 좋습니다. 물론 실제시험에서도 이런 경우가 있을 수 있습니다. 실제로 제시된 데이터를 기준으로 정답을 선택하는 것이기 때문에 3번이 정답이라고 이의를 제기할 수 있습니다. (이런 경우가 종종 존재합니다) 이의를 제기해서 점수를 받을 수도 있겠지만 리스크 관리차원에서 1번 보기를 선택하는 게 더 좋을 것 같습니다. 아래, 참고하시라고 실습 스크립트를 남겨드립니다. 이미 실습을 해보신 것 같지만, 참고하십시오. 감사합니다. -- SALES 테이블 생성CREATE TABLE SALES ( YEAR INT, QUARTER INT, AMOUNT DECIMAL(10, 0));-- 예시 데이터 삽입INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 1, 1000);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 2, 1200);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 3, 1500);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2023, 4, 1800);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 1, 1300);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 2, 1400);-- 추가 데이터를 삽입하여 2024년 3분기/4분기 YoY 비교가 가능하도록 합니다.INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 3, 1700);INSERT INTO SALES (YEAR, QUARTER, AMOUNT) VALUES (2024, 4, 2000);commit; -- 보기1 SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) / LAG(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기2SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER)) / LAG(AMOUNT) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기3SELECT YEAR, QUARTER, AMOUNT, LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) as PREV_AMOUNT, ROUND((AMOUNT - LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER)) / LAG(AMOUNT, 4) OVER (ORDER BY YEAR, QUARTER) * 100, 2) as GROWTH_RATEFROM SALES;-- 보기4SELECT YEAR, QUARTER, AMOUNT, FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) as PREV_AMOUNT, ROUND((AMOUNT - FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR)) / FIRST_VALUE(AMOUNT) OVER (PARTITION BY QUARTER ORDER BY YEAR) * 100, 2) as GROWTH_RATEFROM SALES;
- 0
- 2
- 21
질문&답변
실전문제 3회차 18번
안녕하세요. 질문 주셔서 감사합니다. 내용 살펴봤습니다. 문제의 보기를 작성할 때 실수가 있었습니다. 18번 문제의 정답은 1, 3번이 모두 해당 하는 것이 맞습니다. 아래 AI 인턴이 남긴 답은 1, 3번 보기의 쿼리가 모두 중복 결과를 리턴하기 때문에 부정확합니다. 실수를 알려주셔서 감사드립니다. 참고로 아래에 쿼리 실습을 할 수 있도록 스크립트를 남깁니다. 문제는 업데이트 해서 다시 올려두었습니다. 감사드립니다. -- EMPLOYEE 테이블 생성CREATE TABLE EMPLOYEE ( EMP_ID INT PRIMARY KEY, NAME VARCHAR(50), DEPT_ID INT, SALARY INT);-- 데이터 삽입INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (100, '김철수', 10, 5000);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (200, '이영희', 10, 4000);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (300, '박민수', 20, 4500);INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (400, '최종호', 20, 5500);-- 테이블 전체 확인 (선택 사항)SELECT * FROM EMPLOYEE;commit; SELECT * FROM EMPLOYEE WHERE (DEPT_ID, SALARY) IN ( -- 각 부서별 최대 급여와 부서 ID를 조회 SELECT DEPT_ID, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_ID);SELECT * FROM EMPLOYEE E WHERE SALARY = ( -- 직원 E의 부서(E.DEPT_ID) 내에서 최대 급여를 조회 SELECT MAX(SALARY) FROM EMPLOYEE WHERE DEPT_ID = E.DEPT_ID);
- 0
- 2
- 21
질문&답변
SQLD 자격증
안녕하세요. spb03240님. 질문 남겨주셔서 감사합니다. SQL을 공부하면 데이터를 이해하고 다룰 수 있는 기본적인 역량을 향상 시킬 수 있습니다. 빅데이터 분석 실무에는 당연히 도움이 되고 필수적입다. 하지만 자격증 획득을 목적으로 할 경우는 좀 다릅니다. 빅데이터 분석기사를 획득하기 위해서 SQL을 공부하는 것이 필수적이지는 않고 시험 범위가 겹치지도 않습니다. 물론 ADsP 처럼 SQL 문제가 간혹 나올 수도 있겠지만 나오더라도 한 두 문제라 당락에 영향을 줄 정도는 아닐거라 짐작합니다. 질문자님께서 자격증 획득에 높은 비중을 둔다면 빅데이터 분석에 바로 도전하시는 걸 권해드리구요. 데이터 관련 분야에 직업을 구하실 계획이라면 SQL을 꼭 공부하셔서 자격증도 획득하시길 권해드립니다. 참고로 저는 SQL과 빅데이터 분석에 대한 실무와 강의를 모두 하고 있다는 걸 알려드립니다. 그럼 도움이 되셨으면 좋겠구요. 행복한 날들 보내십시오. 감사합니다.
- 0
- 1
- 20
질문&답변
계층형 질의 질문입니다.
안녕하세요. 질문에 아래와 같이 답변 드립니다. 답변이 도움이 되었으면 좋겠네요. 감사합니다. 다른 강의에서 Prior 자식 = 부모가 순방향이라고 하는 경우가 있나 보네요. 제가, 해당 강의를 듣지 않았기 때문에 뭐라고 말씀드리기는 어려울 거 같습니다.. 일반적으로 설명하자면, Prior 라는 키워드는 이전 행을 의미합니다. 만약 Prior empno = mgr (Prior 부모 = 자식)과 같이 작성하면, 이전 행의 사원 번호와 현재 행의 매니저 번호가 동일한 값을 찾는 방식으로 전개합니다. 이는 순방향입니다. 이때 시작점은 Start with mgr is null로 표현합니다. 왜냐하면 최상위 매니저 번호에서 아래 쪽으로 찾아 나가기 때문입니다.여기서 사원번호는 부모 칼럼이고 매니저 번호는 자식 칼럼입니다. 사원번호(부모 칼럼)는 주식별자(PK) 이고 매니저번호(자식 칼럼)는 외래참조키(FK) 죠. Emp 테이블은 자기 참조 관계를 가진 엔터티입니다. 자기 스스로 부모 자식 관계를 가진 엔터티인거죠. Prior 부모 = 자식 이라는 말은 엄밀하게 말하자면 Prior 부모 칼럼 = 자식 칼럼입니다. 풀어서 말하자면 이전 행의 부모 칼럼과 현재 행의 자식 칼럼이 일치하는 경우이죠.만약 Prior mgr = empno (Prior 자식 = 부모)와 같이 찾아갈 경우 역방향 전개입니다. 이때 시작점은 특정 지점(ex.start with ename = 'SMITH')을 선택합니다. 왜냐하면 특정 행에서 부터 상위로 찾아나가는 방식으로 이전 행의 매니저 번호와 현재 행의 사원번호가 동일한 값을 기준으로 찾기 때문입니다.순방향 역방향은 단순히 Prior 키워드로 판단하기는 어렵습니다. Start with 구문의 시작점을 보고 함께 판단해야 합니다. 또한 Prior 키워드는 이전 행을 의미한다는 점, 그리고 계층형 쿼리에서 사용하는 부모 자식이란 자기 참조 관계에 있는 엔터티의 부모 칼럼과 자식 칼럼을 의미한다는 점을 기억하고 순방향 역방향읗 판단해야 합니다. 노랭이 문제집의 63번 문제 보기 4번은 2군데가 잘못되어 있습니다. 보기 4번: ④ 오라클의 계층형 질의문에서 PRIOR 키워드는 CONNECT BY 절에서만 사용될 수 있으며, PRIOR 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다.1) 첫 번째 잘못된 부분은 'Prior 키워드가 Connect By 절에서만' 사용될 수 있다고 한 부분입니다. Prior 키워드는 Select 절에서도 사용될 수 있습니다. 이때 Prior 키워드는 현재 행의 부모(이전) 행의 값을 가져오는 용도로 사용합니다. 노랭이 해설지에는 이 부분에 대한 설명만 제공하고 있습니다. 2) 두 번째 잘못된 부분은 'Prior 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다' 라고 한 것입니다. 순방향은 Prior 부모 = 자식입니다. 이전 행의 부모 칼럼을 기준으로 자식을 찾아나가기 때문에 순방향입니다. 역방향은 Prior 자식 = 부모입니다. 이전 행의 자식 칼럼을 기준으로 부모를 찾아나가기 때문에 역방향입니다. (노랭이에서는 Prior 키워드만 가지고 순방향, 역방향을 알기가 어렵기 때문에 위 1)번만 설명한게 아닌가 짐작을 해봅니다.. )참고로.. 위 1번과 2번을 확인할 수 있는 쿼리를 아래에 작성해두었습니다.-- 순방향 전개 SELECT LEVEL,LPAD(' ', (LEVEL-1)*4) || ENAME AS "직원명",EMPNO,MGR,-- (1) 현재 행의 상사(부모)의 ENAME 값을 가져옵니다.PRIOR ENAME AS "직속_상사명"FROMEMP START WITH MGR IS NULL -- 최상위(루트)는 MGR이 NULL인 KINGCONNECT BY PRIOR EMPNO = MGR; -- 순방향 전개 (부모 칼럼 EMPNO = 자식 칼럼 MGR); - 수행 결과 (사진)-- 역방향 전개 SELECT LEVEL,LPAD(' ', (LEVEL-1)*3) || ENAME AS 조직도,EMPNO,MGRFROM EMP START WITH ENAME = 'SMITH' -- SMITH를 최하위 노드로 지정 (LEVEL 1)CONNECT BY PRIOR MGR = EMPNO -- 역방향 전개 (자식 칼럼 MGR = 부모 칼럼 EMPNO). 자식 칼럼(MGR)을 기준으로 부모 칼럼(EMPNO)를 찾으며 위로 전개 (역방향)ORDER SIBLINGS BY EMPNO;- 수행 결과 (사진)emp 테이블 데이터는 아래 링크에서 확인하시면 되겠습니다.https://java7.tistory.com/164
- 1
- 2
- 23
질문&답변
Part 2 > Chapter 3 단원 정리 문제
안녕하세요. Part2 Chapter 3의 문제중에, 2번 같은 경우는 충분히 이견을 제시할 수 있을 것 같네요. 좀 애매한 면이 있어서요. 실제 시험에서도 이런 경우가 발생하는 데요. 이의를 제기할 경우 모두 정답으로 처리하는 경우가 있습니다. 참고하시구요. 문제는 좀더 명확히 변경을 해두었습니다. 4, 5번은 실수가 있었습니다. 이것 또한 수정하여 반영해두었습니다. 감사드립니다.
- 0
- 2
- 36
질문&답변
챕터1. SQL 기본 단원정리문제 53번
안녕하세요. 쿠라와님. 교안 내용을 알려주셔서 감사합니다. 아래 링크에 이메일을 하나 남겨주세요. 작은 선물을 보내드리겠습니다. https://forms.gle/rXRi6TpFTUxd7sW46감사합니다.
- 0
- 3
- 34
질문&답변
챕터1. SQL 기본 단원정리문제 53번
안녕하세요. 데이터코드랩입니다. 말씀하신 내용이 맞습니다. 해당 문제는 이미 정정해서 교안을 갱신해 둔 상태에요. 아마도 다운로드 받으신 파일이 수정 전의 것 같습니다. 새로 다운 받으시면 정정된 것을 사용하실 수 있습니다. 시험 합격 응원할게요 감사합니다.
- 0
- 3
- 34
질문&답변
챕터1. SQL 기본 단원정리문제 23번, 50번
안녕하세요. 데이터코드랩입니다. 네 말씀하신 내용이 맞습니다. 오류가 있었어요. 그런데, 이미 수정해서 올려 놓았던 내용인데요. 아마도 교안이 수정하기 전 파일로 보입니다. 새로 받으시면 정정 된 내용을 보실 수 있습니다. 시험이 얼마 안 남았네요 응원하겠습니다 감사합니다.
- 0
- 2
- 30
질문&답변
챕터1. SQL 기본 단원정리문제 23번
안녕하세요. 데이터코드랩입니다. 네 말씀하신 내용이 맞습니다. 해당 문제는 얼마전에 정정해서 다시 올려두었는 데요. 아마도 다운로드 받으신 교안이 과거 버전인 듯 합니다. 다시 다운로드 받으시면 정정된 교안을 사용하실 수 있습니다. 감사합니다.
- 0
- 2
- 31
질문&답변
문제에 문제가 있는 것 같습니다.
안녕하세요. Jeongin님. Null 값은 가장 큰 값으로 인식됩니다. 그래서, 말씀하신 것처럼 ASC 로 정렬하게 되면 가장 뒤에 나오는 것이 맞습니다. 정답이 잘 못 표기가 되어 있었습니다. 실수한 내용은 바로 잡아서 반영해 두었습니다. 바로 잡아주신 것이 많네요. 감사한 마음에 선물을 하나 보내드리려고 합니다. 아래 링크에 이메일 주소만 하나 남겨주세요. 감사합니다. https://forms.gle/rXRi6TpFTUxd7sW46그리고, 아래의 쿼리 참고하십시오. DROPTABLEEMPLOYEES; -- 1. EMPLOYEES 테이블 생성CREATETABLEEMPLOYEES (IDNUMBERPRIMARYKEY,NAMEVARCHAR2(50),DEPT_IDNUMBER); -- 2. SALARIES 테이블 생성CREATETABLESALARIES (EMP_IDNUMBERPRIMARYKEY,SALARYNUMBER); -- 3. EMPLOYEES 테이블에 데이터 삽입INSERTINTOEMPLOYEES (ID, NAME, DEPT_ID) VALUES (1, 'Alice', 101);INSERTINTOEMPLOYEES (ID, NAME, DEPT_ID) VALUES (2, 'Bob', 102);INSERTINTOEMPLOYEES (ID, NAME, DEPT_ID) VALUES (3, 'Carol', 103); -- 4. SALARIES 테이블에 데이터 삽입INSERTINTOSALARIES (EMP_ID, SALARY) VALUES (1, 6000);INSERTINTOSALARIES (EMP_ID, SALARY) VALUES (2, 4500);INSERTINTOSALARIES (EMP_ID, SALARY) VALUES (3, NULL); -- 5. 데이터 삽입 확인SELECT * FROMEMPLOYEES;SELECT * FROMSALARIES; -- 6. LEFT JOIN 실행 (문제에 제시된 쿼리)SELECTE.NAME, S.SALARYFROMEMPLOYEESELEFTJOINSALARIESSONE.ID = S.EMP_IDORDERBYS.SALARYASC;
- 0
- 2
- 38