본문으로 바로 가기

SQL 개발자 (SQLD) SQL 활용 개념 정리

중요도 ★★★★★ · 40% (추정)

개요

이 단원은 SELECT 문을 한 단계 더 깊이 쓰는 방법을 배웁니다. 서브쿼리와 집합 연산자로 여러 결과를 엮는 법을 먼저 익히고, 소계를 만드는 그룹 함수, 행마다 순위·누적값을 붙이는 윈도우 함수, 상위 몇 건만 뽑는 Top N, 계층형 질의와 셀프 조인, PIVOT·UNPIVOT, 정규 표현식을 차례로 공부합니다.

서브쿼리는 위치에 따라 SELECT 절의 스칼라 서브쿼리, FROM 절의 인라인 뷰, WHERE 절의 중첩 서브쿼리로 나뉩니다. 결과가 여러 행이면 IN·ANY·ALL·EXISTS 를 쓰며, > ANY 는 가장 작은 값보다 크다는 뜻이고 > ALL 은 가장 큰 값보다 크다는 뜻입니다. 집합 연산자는 UNION(중복 제거), UNION ALL(중복 그대로), INTERSECT(교집합), MINUS(차집합)가 있고, 합치는 SELECT 문들은 컬럼 수가 같아야 합니다.

그룹 함수 ROLLUP(A, B) 는 (A, B)·(A)·전체 소계를, CUBE(A, B) 는 모든 조합의 소계를, GROUPING SETS 는 적은 기준의 소계만 만듭니다. 윈도우 함수는 행 수를 줄이지 않고 각 행에 결과를 붙이며, 같은 값이 있을 때 RANK 는 순위를 건너뛰고 DENSE_RANK 는 건너뛰지 않으며 ROW_NUMBER 는 언제나 다른 번호를 줍니다. ORDER BY 만 쓰면 기본 범위가 RANGE 라서 같은 값의 행이 함께 누적됩니다.

Oracle 의 ROWNUM 은 정렬보다 먼저 붙으므로 Top N 은 인라인 뷰에서 정렬한 뒤 바깥에서 ROWNUM 을 겁니다. 계층형 질의는 START WITH 로 시작 행을, CONNECT BY PRIOR 로 전개 방향을 정하고, LEVEL·CONNECT_BY_ISLEAF·SYS_CONNECT_BY_PATH 로 깊이와 경로를 봅니다. PIVOT 은 행을 열로, UNPIVOT 은 열을 행으로 바꾸며, REGEXP_LIKE·REGEXP_SUBSTR·REGEXP_REPLACE 로 정규 표현식을 씁니다.

핵심 개념

  • 서브쿼리 위치별 이름

    SELECT 절에서 값 하나를 돌려주면 스칼라 서브쿼리, FROM 절에서 테이블처럼 쓰이면 인라인 뷰, WHERE 절에 쓰이면 중첩 서브쿼리입니다. 메인쿼리의 컬럼을 안에서 쓰면 상관 서브쿼리라고 합니다.

    외우는 요령메인쿼리가 서브쿼리 컬럼을 쓸 수 있는 것은 인라인 뷰뿐입니다.

  • ANY 와 ALL

    > ANY (목록) 은 목록 중 하나보다만 크면 되므로 가장 작은 값보다 큰 것이고, > ALL (목록) 은 모든 값보다 커야 하므로 가장 큰 값보다 큰 것입니다.

    외우는 요령'ANY 는 최솟값, ALL 은 최댓값 기준'(크다 비교일 때).

  • 집합 연산자

    UNION 은 합집합(중복 제거), UNION ALL 은 합집합(중복 유지), INTERSECT 는 교집합, MINUS(SQL Server 는 EXCEPT)는 차집합입니다. 합치는 SELECT 문은 컬럼 수와 형식이 맞아야 하고, ORDER BY 는 맨 끝에 한 번만 씁니다.

    외우는 요령결과 컬럼 이름은 첫 번째 SELECT 문을 따릅니다.

  • ROLLUP·CUBE·GROUPING SETS

    ROLLUP(A, B) 는 (A, B), (A), 전체 합계를 만들고, CUBE(A, B) 는 (A, B), (A), (B), 전체 합계를 모두 만듭니다. GROUPING SETS(A, B) 는 A 별, B 별 소계만 만들고 전체 합계는 없습니다. GROUPING(컬럼) 은 소계 행이면 1 입니다.

    외우는 요령A·B 가 각각 2가지 값이고 조합이 4개면 ROLLUP 7행, CUBE 9행, GROUPING SETS 4행입니다.

  • 순위 윈도우 함수

    점수가 100, 90, 90, 80 일 때 RANK 는 1, 2, 2, 4, DENSE_RANK 는 1, 2, 2, 3, ROW_NUMBER 는 1, 2, 3, 4 를 줍니다. PARTITION BY 로 그룹을 나누면 그룹마다 1부터 다시 매깁니다.

    외우는 요령RANK 는 건너뜀, DENSE_RANK 는 촘촘히, ROW_NUMBER 는 모두 다르게.

  • ROWNUM 과 Top N

    Oracle 의 ROWNUM 은 WHERE 를 통과한 행에 1부터 붙는 번호라 ORDER BY 보다 먼저 정해집니다. 그래서 ROWNUM = 2 는 결과가 없고, 정렬 후 상위 N 건은 인라인 뷰에서 정렬한 뒤 바깥에서 ROWNUM <= N 을 겁니다.

    외우는 요령SQL Server 의 TOP (N) WITH TIES 는 N 번째와 같은 값의 행까지 포함합니다.

  • 계층형 질의 (Oracle)

    START WITH 로 시작(루트) 행을 정하고, CONNECT BY PRIOR 자식키 = 부모키 로 위에서 아래로 전개합니다. 루트의 LEVEL 은 1 이고, 자식이 없는 행은 CONNECT_BY_ISLEAF 가 1, SYS_CONNECT_BY_PATH 는 루트부터의 경로를 보여 줍니다.

    외우는 요령PRIOR EMPNO = MGR 은 아래로, PRIOR MGR = EMPNO 는 위로 올라갑니다.

자주 나오는 포인트

  • RANK·DENSE_RANK·ROW_NUMBER 의 차이를 같은 값이 있는 표로 묻는 문제가 자주 나옵니다.
  • ROLLUP·CUBE·GROUPING SETS 결과 행 수를 세는 문제가 나옵니다.
  • UNION 과 UNION ALL, INTERSECT, MINUS 결과를 표로 계산해 보세요.
  • ROWNUM 으로 Top N 을 구하는 올바른 SQL 을 고르는 문제가 많습니다.
  • 계층형 질의에서 START WITH 행부터 전개된 행 수와 LEVEL 을 따라가는 연습을 하세요.
  • 윈도우 함수는 GROUP BY 와 달리 행 수를 줄이지 않습니다.

헷갈리는 것 비교: 순위 함수 비교 (점수 100, 90, 90, 80)

함수결과특징
RANK1, 2, 2, 4같은 값 뒤 순위를 건너뜀
DENSE_RANK1, 2, 2, 3건너뛰지 않음
ROW_NUMBER1, 2, 3, 4같은 값이어도 다른 번호

대표 문제 3개

검수를 마친 예상문제 가운데 이 단원의 대표 문제입니다.

예상문제검수 완료SQL 기본 및 활용 › SQL 활용★★★★★

문제 1. WHERE DEPTNO ___ (SELECT DEPTNO FROM DEPT WHERE LOC = '서울') 에서 서브쿼리 결과가 여러 행일 수 있을 때 빈칸에 쓸 연산자로 알맞은 것은?

  1. ① >
  2. ② <>
  3. ③ IN
  4. ④ =
▼ 정답과 해설 보기▲ 정답과 해설 접기

정답: ③ IN

핵심: 서브쿼리 결과가 여러 행 → IN·ANY·ALL·EXISTS

서브쿼리가 여러 행을 돌려줄 수 있으면 =, >, <> 같은 단일행 비교 연산자를 쓰면 오류가 납니다. 이때는 IN(목록 중 하나와 같음), ANY, ALL, EXISTS 같은 다중행 연산자를 씁니다.

틀린 선지

  • >: 단일행 연산자라 여러 행과 바로 비교할 수 없습니다.
  • <>: 단일행 연산자입니다.
  • =: 서브쿼리가 한 행만 돌려줄 때 쓰는 단일행 연산자입니다. 여러 행이면 오류가 납니다.
예상문제검수 완료SQL 기본 및 활용 › SQL 활용★★★★★

문제 2. 두 SELECT 결과를 합치면서 중복된 행을 하나만 남기는 집합 연산자는?

  1. ① UNION ALL
  2. ② INTERSECT
  3. ③ UNION
  4. ④ MINUS
▼ 정답과 해설 보기▲ 정답과 해설 접기

정답: ③ UNION

핵심: UNION=합집합(중복 제거), UNION ALL=중복 그대로

  • UNION: 합집합, 중복 행은 하나만 남김
  • UNION ALL: 합집합, 중복도 그대로 모두
  • INTERSECT: 교집합(양쪽에 다 있는 것)
  • MINUS(Oracle) / EXCEPT: 차집합(앞에만 있는 것)

틀린 선지

  • UNION ALL: 중복을 없애지 않고 모두 보여 줍니다.
  • INTERSECT: 양쪽에 모두 있는 행만 남기는 교집합입니다.
  • MINUS: 앞의 결과에서 뒤의 결과를 뺀 차집합입니다.
예상문제검수 완료SQL 기본 및 활용 › SQL 활용★★★★★

문제 3. [SCORE 테이블] NAME | PT 가 | 100 나 | 90 다 | 90 라 | 80 SELECT NAME, RANK() OVER (ORDER BY PT DESC) FROM SCORE; 에서 '라'의 순위는?

  1. ① 2
  2. ② 3
  3. ③ 4
  4. ④ 5
▼ 정답과 해설 보기▲ 정답과 해설 접기

정답: ③ 4

핵심: RANK: 같은 값은 같은 순위, 다음 순위는 건너뜀 (1, 2, 2, 4)

RANK 는 같은 값에 같은 순위를 주고, 그만큼 다음 순위를 건너뜁니다.

  1. 가(100) → 1위
  2. 나(90)·다(90) → 공동 2위
  3. 라(80) → 2위가 두 명이므로 3위를 건너뛰고 4위

틀린 선지

  • 2: 공동 2위인 나·다의 순위입니다.
  • 3: DENSE_RANK 의 결과입니다. RANK 는 공동 순위 수만큼 건너뜁니다.
  • 5: 행이 4개뿐이라 5위는 나올 수 없습니다.
이 단원 5문제 풀기 →

AI 작성 · 검수 완료 · AI가 새로 쓴 글 가운데, 작성과 분리된 AI 검증(다시 읽고 사실·수치 확인)을 통과한 단원만 싣습니다. 틀린 곳을 발견하면 알려 주세요.