SQL 개발자 (SQLD) SQL 활용 핵심정리
26년 11월 1일 검사 완료
SQL 활용, 핵심정리
- 단일행 서브쿼리에는 =·<·> 를, 여러 행이 나오는 서브쿼리에는 IN·ANY·ALL·EXISTS 를 씁니다.
- UNION 은 중복을 없애고, UNION ALL 은 중복을 그대로 둡니다.
- ROLLUP(A, B)는 (A, B)·(A)·전체 소계를, CUBE(A, B)는 가능한 모든 조합의 소계를 만듭니다.
- 같은 값이 있을 때 RANK 는 1·1·3, DENSE_RANK 는 1·1·2, ROW_NUMBER 는 1·2·3 으로 매깁니다.
- Oracle 의 ROWNUM 은 ORDER BY 보다 먼저 붙으므로 Top N 은 정렬한 인라인 뷰 바깥에서 ROWNUM 을 씁니다.
- 계층형 질의(Oracle): START WITH 로 시작 행을, CONNECT BY PRIOR 로 부모·자식 방향을 정합니다.
- 중요도
- ★★★★★ (5 / 5)
- 출제 비중
- SQL 기본 및 활용 40문항 중 약 16문항 (40%)
서브쿼리(단일행·다중행·상관 서브쿼리), 집합 연산자(UNION·UNION ALL·INTERSECT·MINUS), 그룹 함수(ROLLUP·CUBE·GROUPING SETS), 윈도우 함수, Top N 쿼리, 계층형 질의와 셀프 조인, PIVOT·UNPIVOT, 정규 표현식을 다룹니다.
📖 SQL 활용 개념 정리 더보기 →SQL 활용 대표 문제 10개
문제 1. WHERE DEPTNO ___ (SELECT DEPTNO FROM DEPT WHERE LOC = '서울') 에서 서브쿼리 결과가 여러 행일 수 있을 때 빈칸에 쓸 연산자로 알맞은 것은?
- ① >
- ② <>
- ③ IN
- ④ =
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ IN
핵심: 서브쿼리 결과가 여러 행 → IN·ANY·ALL·EXISTS
서브쿼리가 여러 행을 돌려줄 수 있으면 =, >, <> 같은 단일행 비교 연산자를 쓰면 오류가 납니다. 이때는 IN(목록 중 하나와 같음), ANY, ALL, EXISTS 같은 다중행 연산자를 씁니다.
틀린 선지
- >: 단일행 연산자라 여러 행과 바로 비교할 수 없습니다.
- <>: 단일행 연산자입니다.
- =: 서브쿼리가 한 행만 돌려줄 때 쓰는 단일행 연산자입니다. 여러 행이면 오류가 납니다.
문제 2. 두 SELECT 결과를 합치면서 중복된 행을 하나만 남기는 집합 연산자는?
- ① UNION ALL
- ② INTERSECT
- ③ UNION
- ④ MINUS
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ UNION
핵심: UNION=합집합(중복 제거), UNION ALL=중복 그대로
- UNION: 합집합, 중복 행은 하나만 남김
- UNION ALL: 합집합, 중복도 그대로 모두
- INTERSECT: 교집합(양쪽에 다 있는 것)
- MINUS(Oracle) / EXCEPT: 차집합(앞에만 있는 것)
틀린 선지
- UNION ALL: 중복을 없애지 않고 모두 보여 줍니다.
- INTERSECT: 양쪽에 모두 있는 행만 남기는 교집합입니다.
- MINUS: 앞의 결과에서 뒤의 결과를 뺀 차집합입니다.
문제 3. [SCORE 테이블] NAME | PT 가 | 100 나 | 90 다 | 90 라 | 80 SELECT NAME, RANK() OVER (ORDER BY PT DESC) FROM SCORE; 에서 '라'의 순위는?
- ① 2
- ② 3
- ③ 4
- ④ 5
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ 4
핵심: RANK: 같은 값은 같은 순위, 다음 순위는 건너뜀 (1, 2, 2, 4)
RANK 는 같은 값에 같은 순위를 주고, 그만큼 다음 순위를 건너뜁니다.
- 가(100) → 1위
- 나(90)·다(90) → 공동 2위
- 라(80) → 2위가 두 명이므로 3위를 건너뛰고 4위
틀린 선지
- 2: 공동 2위인 나·다의 순위입니다.
- 3: DENSE_RANK 의 결과입니다. RANK 는 공동 순위 수만큼 건너뜁니다.
- 5: 행이 4개뿐이라 5위는 나올 수 없습니다.
문제 4. [A 테이블] X 1 2 2 3 [B 테이블] X 2 3 4 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT X FROM A UNION SELECT X FROM B;
- ① 3
- ② 4
- ③ 6
- ④ 7
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 4
핵심: UNION 은 합친 뒤 중복 제거, UNION ALL 은 그대로
- 두 결과를 합치면: 1, 2, 2, 3, 2, 3, 4 (7행)
- UNION 은 중복을 없앰 → 1, 2, 3, 4
- 결과 4행
UNION ALL 이었다면 7행입니다.
틀린 선지
- 3: 4 를 빠뜨린 값입니다. B 에만 있는 4 도 합집합에 들어갑니다.
- 6: 중복을 일부만 없앤 값입니다.
- 7: 중복을 없애지 않는 UNION ALL 의 결과입니다.
문제 5. [EMP 테이블] EMPNO | ENAME | DEPTNO | SAL | COMM 101 | 김철수 | 10 | 300 | NULL 102 | 이영희 | 20 | 250 | 50 103 | 박민수 | 10 | 400 | 0 104 | 최지은 | 30 | 200 | NULL 105 | 정우성 | NULL | 350 | 100 [DEPT 테이블] DEPTNO | DNAME 10 | 총무 20 | 영업 30 | 개발 40 | 연구 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT D.DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO);
- ① 0
- ② 1
- ③ 2
- ④ 3
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 1
핵심: NOT EXISTS = 서브쿼리 결과가 한 행도 없을 때 참
EXISTS 는 서브쿼리 결과가 한 행이라도 있으면 참, NOT EXISTS 는 하나도 없으면 참입니다. 서브쿼리는 바깥의 D.DEPTNO 를 쓰는 상관 서브쿼리라 부서마다 따로 확인합니다.
- 10, 20, 30: 소속 사원이 있음 → NOT EXISTS 거짓
- 40(연구): 소속 사원 없음 → 참
결과 1행 (연구)
틀린 선지
- 0: 부서 40 에는 사원이 없으므로 NOT EXISTS 가 참이 되어 한 행이 나옵니다.
- 2: DEPTNO 가 NULL 인 정우성을 따로 센 값입니다. 결과는 DEPT 의 행이므로 정우성은 상관없습니다.
- 3: 사원이 있는 부서 수로, EXISTS 의 결과입니다.
문제 6. [SALES 테이블] REGION | PRODUCT | AMT 서울 | A | 10 서울 | B | 20 부산 | A | 30 부산 | B | 40 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT REGION, PRODUCT, SUM(AMT) FROM SALES GROUP BY ROLLUP(REGION, PRODUCT);
- ① 4
- ② 6
- ③ 7
- ④ 9
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ 7
핵심: ROLLUP(A, B) = (A, B) + (A) 소계 + 전체 합계
ROLLUP(REGION, PRODUCT) 은 오른쪽부터 하나씩 빼며 묶습니다.
- (REGION, PRODUCT): 서울A, 서울B, 부산A, 부산B → 4행
- (REGION) 소계: 서울, 부산 → 2행
- 전체 합계: 1행
4 + 2 + 1 = 7행
틀린 선지
- 4: 소계와 전체 합계를 빼고 일반 GROUP BY 만 센 값입니다.
- 6: 전체 합계 행을 빠뜨린 값입니다.
- 9: PRODUCT 별 소계(2행)까지 만드는 CUBE 의 결과입니다.
문제 7. [SCORE 테이블] NAME | PT 가 | 100 나 | 90 다 | 90 라 | 80 SELECT NAME, DENSE_RANK() OVER (ORDER BY PT DESC) FROM SCORE; 에서 '라'의 순위는?
- ① 2
- ② 3
- ③ 4
- ④ 5
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 3
핵심: DENSE_RANK: 같은 값은 같은 순위, 다음 순위를 건너뛰지 않음 (1, 2, 2, 3)
DENSE_RANK 는 같은 값에 같은 순위를 주지만 다음 순위를 건너뛰지 않습니다.
- 가(100) → 1
- 나(90)·다(90) → 2
- 라(80) → 바로 다음 순위 3
틀린 선지
- 2: 공동 2위인 나·다의 순위입니다.
- 4: RANK 의 결과입니다. DENSE_RANK 는 건너뛰지 않습니다.
- 5: 행이 4개뿐이라 나올 수 없습니다.
문제 8. Oracle 에서 SAL 이 높은 순서로 상위 3명을 바르게 구하는 SQL 은?
- ① SELECT * FROM (SELECT * FROM EMP WHERE ROWNUM <= 3) ORDER BY SAL DESC;
- ② SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM <= 3;
- ③ SELECT * FROM EMP WHERE ROWNUM <= 3 ORDER BY SAL DESC;
- ④ SELECT * FROM EMP WHERE ROWNUM BETWEEN 1 AND 3 ORDER BY SAL;
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM <= 3;
핵심: Top N: 인라인 뷰에서 먼저 정렬하고 바깥에서 ROWNUM
ROWNUM 은 ORDER BY 보다 먼저 붙습니다. 그래서 정렬한 결과에서 위 3행을 자르려면 인라인 뷰 안에서 먼저 정렬하고, 바깥에서 ROWNUM <= 3 을 걸어야 합니다.
틀린 선지
- SELECT * FROM (SELECT * FROM EMP WHERE ROWNUM <= 3) ORDER BY SAL DESC;: 정렬하기 전에 3행을 자르므로 상위 3명이 아닐 수 있습니다.
- SELECT * FROM EMP WHERE ROWNUM <= 3 ORDER BY SAL DESC;: 아무 3행을 먼저 뽑은 뒤 그 3행만 정렬합니다. 상위 3명이 아닐 수 있습니다.
- SELECT * FROM EMP WHERE ROWNUM BETWEEN 1 AND 3 ORDER BY SAL;: 역시 먼저 3행을 뽑고, 정렬도 오름차순이라 맞지 않습니다.
문제 9. [EMP2 테이블] EMPNO | ENAME | MGR 1 | 대표 | NULL 2 | 김부장 | 1 3 | 이부장 | 1 4 | 박과장 | 2 5 | 최대리 | 4 6 | 정사원 | 3 Oracle 에서 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT LEVEL, ENAME FROM EMP2 START WITH EMPNO = 2 CONNECT BY PRIOR EMPNO = MGR;
- ① 2
- ② 3
- ③ 4
- ④ 6
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 3
핵심: START WITH 행부터 그 아래 자식만 전개 (형제·상위는 제외)
- 시작 행: EMPNO 2 김부장 (LEVEL 1)
- PRIOR EMPNO = MGR → MGR 이 2 인 행: 박과장 (LEVEL 2)
- MGR 이 4 인 행: 최대리 (LEVEL 3)
- MGR 이 5 인 행: 없음 → 끝
결과 3행 (김부장, 박과장, 최대리). 이부장·정사원은 김부장 아래가 아니라 나오지 않습니다.
틀린 선지
- 2: 시작 행인 김부장을 빼고 센 값입니다. START WITH 행도 결과에 들어갑니다.
- 4: 대표까지 넣은 값입니다. 대표는 김부장의 위라 순방향 전개에서 나오지 않습니다.
- 6: 모든 행을 센 값으로, START WITH MGR IS NULL 처럼 대표에서 시작했을 때의 결과입니다.
문제 10. [A 테이블] X 1 2 2 3 [B 테이블] X 2 3 4 다음 SQL 을 실행하면 몇 행이 나오는가? SELECT X FROM A INTERSECT SELECT X FROM B;
- ① 1
- ② 2
- ③ 3
- ④ 4
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ② 2
핵심: INTERSECT = 양쪽에 모두 있는 값(중복 제거)
INTERSECT 는 두 결과에 모두 있는 값만 남기고 중복은 없앱니다.
- A: 1, 2, 2, 3 / B: 2, 3, 4
- 양쪽에 다 있는 값: 2, 3
- 결과 2행 (A 에 2 가 두 번 있어도 한 번만)
틀린 선지
- 1: 2 와 3 가운데 하나만 센 값입니다.
- 3: A 의 2 를 두 번 센 값입니다. INTERSECT 는 중복을 없앱니다.
- 4: UNION(합집합)의 결과입니다.
직접 풀어서 확인해 보세요.
AI 작성 · 운영진 검수 전