algolearn
Học viên
485
Đánh giá
70
Điểm khóa học
4.7
공부하고 전파하는 것을 좋아합니다. 빅데이터와 인공지능에 오랜 경력이 있습니다.
20년 현업 데이터분석가 경력, 5년 데이터 분석 강의!
빅데이터 및 인공지능 분야 기업 및 공공기관 자문 및 출강
빅데이터 분석기사 한권완성 필기, 실기 저자
인공지능 분야 스타트업 대표
Khóa học
Đánh giá khóa học
- [2025] SQLD All-in-One - Đỗ ngay lần đầu dành cho người không chuyên
- [2025] SQLD All-in-One - Đỗ ngay lần đầu dành cho người không chuyên
- [2025] Giải 176 bài tập SQLD dành cho bạn gặp khó khăn với đề thi SQLD
- [2025] Giải 176 bài tập SQLD dành cho bạn gặp khó khăn với đề thi SQLD
- [2025] Giải 176 bài tập SQLD dành cho bạn gặp khó khăn với đề thi SQLD
Bài viết
Hỏi & Đáp
DIVIDE 인지 어떻게 판단할 수 있나요?
"안녕하세요. mkp0131 님등록하신 질문을 다시 꼼꼼히 검토해보다가, 제가 용어 설명에서 정정이 필요한 부분을 발견했어요. 질문 덕분에 정확한 개념을 다시 짚고 넘어가게 되었네요. 감사합니다. 결론부터 말씀드리면, 이 문제는 이론적으로 'DIVIDE'가 아니라 'DIFFERENCE(차집합)' 연산이 맞습니다.용어 정정:제가 설명에서 'DIVIDE'라고 표현했던 건, '전체 집합에서 특정 데이터를 분리(나누어) 낸다'는 일반적인 의미로 사용한 표현인데요. 일반적으로 관계대수에서 Not Exists 가 devide 연산에 사용되는 경우는 모든 조건에 맞는 것을 구할 때 입니다. 이 번문제는 DEVIDE가 아니라 Difference 로 보는게 맞겠습니다. 정확한 개념 구분:DIVIDE: '모든 조건을 만족하는 것'을 찾을 때 (예: 모든 과목을 다 들은 학생)DIFFERENCE(차집합): '특정 조건을 제외하는 것'을 찾을 때 (예: 비선호 컨텐츠 빼기)따라서 지금 문제는 '제외'하는 로직이므로 차집합(Difference)이 맞고, 그렇기 때문에 mkp0131님이 처말씀하신 LEFT JOIN + IS NULL 방식으로도 데이터를 추출할 수 있습니다.다만, 보기의 3번 지문은 LEFT JOIN + is not null 로 되어 있기 때문에 오답이구요.정답은 Not Exists로 작성한 보기 4번이 되는 것입니다.헷갈릴 수 있는 부분인데 정확하게 짚어주셔서 저도 다시 한번 정리하는 계기가 되었습니다. 문제는 보완해두겠습니다. 감사드립니다.
- 0
- 2
- 16
Hỏi & Đáp
ORDER BY 자료 및 강의 내용에 문제가 있는 것 같은데, 체크 부탁드립니다.
안녕하세요. 최준호님. 교재의 내용은 아래와 같습니다.(사진)위의 쿼리를 실행하면, comm 기준으로 먼저 정렬이 되고, 그 다음 정렬 기준으로 sal 가 적용이 됩니다.그래서 실제 쿼리의 결과는 좌측 옆의 이미지 처럼 나오게 되는 겁니다. 아마도 두가지 이유 때문에 혼란스러우셨을거 같은데요. 그 외의 직원들은 급여로 정렬된다라는 말 때문에 혼란을 드린 것 같네요. 이 부분은 명확하게 작성 하자면 다음과 같이 쓰는게 좋겠네요. 이 쿼리는 1차 정렬 기준으로 comm이 NULL인 직원들을 맨 위에 배치한 후 오름차순 정렬한다. 그 다음 2차 기준인 sal을 기준으로 다시 오름차순 정렬한다.보완해둘게요. 정말 감사드려요. 🙂 그다음에 쿼리에 comm 뒤에 nulls first 만 있고 asc가 생략 되어 있어서 좀 혼란스러울거 같긴 합니다. 만약에 이쿼리에서 asc를 생략하지 않는다면 아래와 같은 쿼리가 작성됩니다. SELECT ename, sal, comm FROM scott.emp WHERE sal BETWEEN 1000 AND 2000 and ename != 'MILLER' ORDER BY comm asc NULLS FIRST, sal asc;이 쿼리는 comm 기준으로 asc 정렬을 하되, 널 값을 먼저 출력하라는 말이구요. 그 다음 정렬 기준이 sal(급여)이 되는 것입니다. 제 답변이 도움이 되셨으면 좋겠네요. 감사합니다.
- 1
- 2
- 31
Hỏi & Đáp
실전모의고사 2회 42번 문제
안녕하세요. KOKODAE.KO 님. 이 문제는 가장 적절한 쿼리를 구하는 문제입니다. 보기 1번도 4번과 같이 동일한 결과를 나타냅니다. 하지만 쿼리 자체가 최적화 되어 있지는 못합니다. 그래서 가장 적절한 쿼리는 4번이 적합하다고 할 수 있습니다. 실제 문제도 이런 식으로 나올 수 있습니다. 동일한 결과를 나타내기 때문에 실전 시험에서도 이슈를 제기할 수도 있습니다만, 가급적이면 가장 적절해 보이는 것으로 선택하는 게 더 좋을 거 같습니다. 아래는 실습 쿼리입니다. 참고하십시오. 감사합니다. -- 1. 기존 테이블이 있다면 삭제 (선택 사항) DROP TABLE EMPLOYEE; -- 2. EMPLOYEE 테이블 생성 CREATE TABLE EMPLOYEE ( EMP_ID VARCHAR2(5) PRIMARY KEY, NAME VARCHAR2(50) NOT NULL, DEPT_ID VARCHAR2(5) NOT NULL, SALARY NUMBER(10) NOT NULL ); -- 3. 데이터 삽입 INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES ('E001', '홍길동', 'D001', 5000); INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES ('E002', '김철수', 'D001', 5500); INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES ('E003', '이영희', 'D002', 4500); INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES ('E004', '박민수', 'D002', 6000); INSERT INTO EMPLOYEE (EMP_ID, NAME, DEPT_ID, SALARY) VALUES ('E005', '정대현', 'D002', 5000); -- 4. 변경사항 반영 COMMIT; -- 4번 쿼리 WITH DEPT_AVG AS ( -- 1. 각 부서의 평균 연봉 계산 SELECT DEPT_ID, AVG(SALARY) AS AVG_SAL FROM EMPLOYEE GROUP BY DEPT_ID ) SELECT E.* FROM EMPLOYEE E JOIN DEPT_AVG D ON E.DEPT_ID = D.DEPT_ID WHERE E.SALARY > D.AVG_SAL -- 2. 부서 평균보다 높은 직원만 필터링 AND E.SALARY = ( -- 3. 필터링된 전체 직원 중에서 최소 연봉을 찾음 SELECT MIN(E2.SALARY) FROM EMPLOYEE E2 JOIN DEPT_AVG D2 ON E2.DEPT_ID = D2.DEPT_ID WHERE E2.SALARY > D2.AVG_SAL ); -- 1번 쿼리 SELECT E.* FROM EMPLOYEE E WHERE E.SALARY > ( SELECT AVG(SALARY) FROM EMPLOYEE WHERE DEPT_ID = E.DEPT_ID ) AND E.SALARY = ( SELECT MIN(SALARY) FROM EMPLOYEE E2 WHERE E2.SALARY > ( SELECT AVG(SALARY) FROM EMPLOYEE WHERE DEPT_ID = E.DEPT_ID ) ); /* 기대 결과: EMP_ID | NAME | DEPT_ID | SALARY -------|------|---------|------- E002 | 김철수 | D001 | 5500 */
- 0
- 2
- 41
Hỏi & Đáp
도커 설치 오류
안녕하세요. 박재훈님.도커 가상화에 문제가 있어서 답답하셨겠네요. 잘 해결 되면 좋겠습니다. 우선, 이미지의 로그를 보니 가상화 지원이 안되는 pc 이거나, 혹은 설정이 꺼져 있는거 같습니다.제가 드린 교안의 목차: 03 오라클 설치(on 컨테이너) 를 참고하셔서 처리해야 합니다. (교안 356 페이지)교안에서 안내하는 가이드는 아래의 순서로 확인을 하도록 되어 있습니다. 이미지가 포함되어 있으니 가이드에 따라 진행해보십시오. 가상화 가능 여부 확인 - 작업 관리자>성능>가상화 사용 확인 가상 머신 플랫폼 기능 확인 - 윈도우 기능 켜기/끄기 > 가상머신 플랫폼 체크 상태 확인 그리고, 혹시 확인했는데 가상화를 지원하지 않는 pc거나, 설정 작업이 너무 번거러우시다면.., livesql을 사용하시길 권해드립니다. livesql.oracle.com 에 접속해서 사용하실 수가 있습니다. 사용방법은 제 교안(목차-05 Live SQL 활용 (Oracle 미설치), 367페이지)에 있습니다. livesql은 oracle 에서 제공하는 sql 환경입니다. 오라클을 설치하지 않고 충분히 sqld 시험준비를 하실 수 있습니다. 그럼 처리해보시구요. 잘 안되면 질문 다시 남겨주세요. 감사합니다.
- 0
- 2
- 34
Hỏi & Đáp
3강 노랭이 문제 SQL 실습 스크립트 다운로드 파일 오류
안녕하세요. sniperkdw 님. 알려주셔서 감사합니다. 압축된 파일에 약간의 문제가 있었네요. (참, 이상하네요.. 😅 ) 다시 압축해서 올려두었습니다. 다운로드 받아서 이상이 없는 것을 확인했어요. 혹시 다운로드 받으신 후 이상이 있으면 번거로우시겠지만, 다시 메세지 남겨주시길 부탁 드릴게요. 감사합니다.
- 0
- 1
- 50
Hỏi & Đáp
노랭이 기출
안녕하세요. dussud159 님. 이 강의는 노랭이 문제 풀이 강의와 다른 내용입니다. 노랭이 문제는 난이도가 높은 것들이 많기 때문에 기본 내용을 모르고는 풀기가 어렵습니다. 기본 내용을 알려주는 강의가 이 강의입니다. 혹시 강의 내용을 오해하셨을까 염려되네요. 괜찮으시면 leader.bettermind@gmail.com 으로 메일 한 통주세요. 도움을 드릴 방법을 찾아보겠습니다. 감사합니다.
- 0
- 2
- 40
Hỏi & Đáp
실전문제 2회차 24번문제
안녕하세요. kokodae.ko 님. 질문 주셔서 감사합니다. 질문에 답을 드리자면.. 24번 문제는 아래와 같고, 문제에서 요구하는 것은 '연속된 3일 이상' 입니다.24. 아래의 테이블에서 연속된 3일 이상 결제금액이 10만원을 초과한 고객을 찾으려고 한다. 가장 적절한 SQL문은? 문제에서 요구하는 '3일 이상' 이라는 기준으로 접답을 찾으면 3번입니다. 보기 1번은 3일 '이상' 이라는 기준을 충족하기 어렵습니다. 작성된 쿼리는 정확히 3일을 기준으로 데이터를 조회하게 되어 있습니다. 보기 3번은 3일 이상이라는 조건을 충족합니다. 물론 제시된 데이터만 가지고 보면, 1번도 답이 맞는 것 같다고 할 수 있습니다. 하지만 문제는 가장 적절한 것을 찾는 것이기 때문에 보기 중에서 가장 적절한 것을 선택하는 것이 좋습니다. 아래는 24번 문제의 실습 데이터와 쿼리입니다. 문제에서 제시된 데이터 외에 추가로 몇 건을 더 입력합니다. 실습 해보시면, 이해가 더 잘 되실 겁니다. CREATE TABLE PAYMENT ( CUSTOMER_ID VARCHAR(10) NOT NULL, PAYMENT_DATE DATE NOT NULL, AMOUNT INT NOT NULL, PRIMARY KEY (CUSTOMER_ID, PAYMENT_DATE) ); INSERT INTO PAYMENT (CUSTOMER_ID, PAYMENT_DATE, AMOUNT) VALUES ('A001', DATE '2024-01-01', 120000), ('A001', DATE '2024-01-02', 150000), ('A001', DATE '2024-01-03', 130000), -- A001은 3일 연속 (1/1~1/3) 조건을 만족 ('A001', DATE '2024-01-04', 80000), -- 10만원 이하로 연속 종료 ('A002', DATE '2024-01-01', 110000), ('A002', DATE '2024-01-02', 90000), -- 10만원 이하로 연속 실패 ('A002', DATE '2024-01-03', 120000), ('A003', DATE '2024-01-05', 110000), ('A003', DATE '2024-01-07', 120000), -- 1일씩 간격이 있어 연속 실패 ('A003', DATE '2024-01-09', 130000), ('A004', DATE '2024-02-10', 105000), ('A004', DATE '2024-02-11', 106000), ('A004', DATE '2024-02-12', 107000), ('A004', DATE '2024-02-13', 108000); -- A004는 4일 연속 (1/10~1/13) 조건을 만족 -- DBMS에 따라 DATE 'YYYY-MM-DD' 형식이 지원되지 않을 경우 TO_DATE('YYYY-MM-DD', 'YYYY-MM-DD') 등을 사용해야 할 수 있습니다. -- 1번 보기 : 정확하게 3일간 10만 이상인 데이터를 찾음. 문제에서는 3일 이상을 요구하고 있음 SELECT DISTINCT P1.CUSTOMER_ID FROM PAYMENT P1 JOIN PAYMENT P2 ON P1.CUSTOMER_ID = P2.CUSTOMER_ID JOIN PAYMENT P3 ON P2.CUSTOMER_ID = P3.CUSTOMER_ID WHERE P2.PAYMENT_DATE = P1.PAYMENT_DATE + 1 AND P3.PAYMENT_DATE = P2.PAYMENT_DATE + 1 AND P1.AMOUNT > 100000 AND P2.AMOUNT > 100000 AND P3.AMOUNT > 100000; -- 2번 보기 : 10만 이상인 고객 중 거래가 3건 이상인 고객 아이디를 반환함 SELECT CUSTOMER_ID FROM PAYMENT WHERE AMOUNT > 100000 GROUP BY CUSTOMER_ID HAVING COUNT(*) >= 3; -- 3번 : 연속된 날짜를 그룹화 하는 '차이 분석 기법' 방식 -- With 내부의 Select 구문을 실행하면, 연속된 날짜인 경우 동일한 GRP 날짜가 생깁니다. 연속되지 않은 경우 동일한 GRP 날짜가 생기지 않고요. WITH CONSECUTIVE_DAYS AS ( SELECT CUSTOMER_ID, PAYMENT_DATE, AMOUNT, ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS RN, PAYMENT_DATE - ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS GRP FROM PAYMENT WHERE AMOUNT > 100000 ) SELECT DISTINCT CUSTOMER_ID FROM ( SELECT CUSTOMER_ID, GRP, COUNT(*) AS CNT FROM CONSECUTIVE_DAYS GROUP BY CUSTOMER_ID, GRP HAVING COUNT(*) >= 3 ); -- 4번: 3일 이상 연속 조건을 확인하기 어려움. 금액이 10만 이상인 것 기준으로 조회 SELECT DISTINCT CUSTOMER_ID FROM ( SELECT CUSTOMER_ID, AMOUNT, LAG(AMOUNT, 1) OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS PREV_AMOUNT, LAG(AMOUNT, 2) OVER (PARTITION BY CUSTOMER_ID ORDER BY PAYMENT_DATE) AS PREV2_AMOUNT FROM PAYMENT )일 WHERE AMOUNT > 100000 AND PREV_AMOUNT > 100000 AND PREV2_AMOUNT > 100000;
- 0
- 2
- 36
Hỏi & Đáp
실전문제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
- 41
Hỏi & Đáp
실전문제 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
- 40
Hỏi & Đáp
SQLD 자격증
안녕하세요. spb03240님. 질문 남겨주셔서 감사합니다. SQL을 공부하면 데이터를 이해하고 다룰 수 있는 기본적인 역량을 향상 시킬 수 있습니다. 빅데이터 분석 실무에는 당연히 도움이 되고 필수적입다. 하지만 자격증 획득을 목적으로 할 경우는 좀 다릅니다. 빅데이터 분석기사를 획득하기 위해서 SQL을 공부하는 것이 필수적이지는 않고 시험 범위가 겹치지도 않습니다. 물론 ADsP 처럼 SQL 문제가 간혹 나올 수도 있겠지만 나오더라도 한 두 문제라 당락에 영향을 줄 정도는 아닐거라 짐작합니다. 질문자님께서 자격증 획득에 높은 비중을 둔다면 빅데이터 분석에 바로 도전하시는 걸 권해드리구요. 데이터 관련 분야에 직업을 구하실 계획이라면 SQL을 꼭 공부하셔서 자격증도 획득하시길 권해드립니다. 참고로 저는 SQL과 빅데이터 분석에 대한 실무와 강의를 모두 하고 있다는 걸 알려드립니다. 그럼 도움이 되셨으면 좋겠구요. 행복한 날들 보내십시오. 감사합니다.
- 0
- 1
- 49




