alt

[SQLD 2과목] SQL 활용2 | 서브쿼리/집합 연산자/계층 쿼리/TOP N 쿼리 총정리

2026년 11월 9일 공유

SQLD 핵심 문법 종합 정리

개요

SQLD에서 자주 출제되는 서브쿼리, 집합 연산자, 계층형 쿼리, Top-N 쿼리의 핵심 개념과 대표적인 함정을 정리한다. 각 문법의 용도뿐 아니라 결과 형태와 실행 순서를 함께 이해하는 것이 중요하다.

핵심 메시지

  • 서브쿼리는 위치, 반환 형태, 메인 쿼리와의 연관성으로 구분한다.
  • 집합 연산자는 합집합·교집합·차집합의 차이와 쿼리 순서를 확인한다.
  • 계층형 쿼리는 시작점, 연결 방향, 필터 적용 위치, 정렬 방식이 핵심이다.
  • Top-N 쿼리는 DBMS별 문법과 정렬 후 행 제한 여부, 동점자 처리 방식을 구별한다.

주요 내용

1. 서브쿼리

위치에 따른 구분
  • SELECT 절: 스칼라 서브쿼리. 단일 값을 반환한다.
  • FROM 절: 인라인 뷰. 메인 쿼리 실행 중 사용하는 동적 테이블이다.
  • WHERE 절: 중첩 서브쿼리. 조건 필터링에 사용한다.
반환 형태와 연산자
  • 단일행 서브쿼리: 한 행을 반환하며 =, <, > 등의 비교 연산자를 사용할 수 있다.
  • 다중행 서브쿼리: 여러 행을 반환하므로 IN, ANY, ALL, EXISTS 등의 다중행 연산자를 사용한다. 여러 행이 반환될 수 있는 자리에 단일행 비교 연산자를 사용하면 오류가 발생할 수 있다.
  • 다중 컬럼 서브쿼리: 여러 컬럼을 함께 반환하며, 메인 쿼리에서도 대응되는 여러 컬럼을 비교해야 한다.
  • 스칼라 서브쿼리는 반드시 단일 컬럼·단일 행 값을 반환한다. 여러 행을 반환하면 오류가 나고, 행이 없으면 NULL을 반환한다. 연관·비연관 형태 모두 가능하다.
연관·비연관 서브쿼리
  • 연관 서브쿼리: 서브쿼리에서 메인 쿼리의 컬럼을 참조한다. 메인 쿼리의 각 행과 관련해 평가된다.
  • 비연관 서브쿼리: 메인 쿼리와 독립적으로 작성된다.
  • 연관 여부는 서브쿼리 안에서 메인 쿼리의 컬럼을 참조하는지 확인해 판단한다.
다중행 연산자
  • IN: 값이 서브쿼리 결과 목록에 포함되는지 비교한다.
  • EXISTS: 조건에 맞는 행이 하나라도 존재하는지 확인한다. 존재 여부만 중요하므로 SELECT 1 등을 사용할 수 있다.
  • NOT EXISTS: 조건에 맞는 행이 없는 경우를 찾는다. NOT IN은 서브쿼리 결과에 NULL이 있으면 예상과 다른 결과가 나올 수 있어 주의한다.
  • ANY: 비교 조건을 하나 이상의 값이 만족하면 참이다.
  • ALL: 비교 조건을 모든 값이 만족해야 참이다. > ANY는 최솟값보다 큰 경우, > ALL은 최댓값보다 큰 경우를 판단하는 식으로 이해할 수 있다.

2. 집합 연산자

  • UNION: 두 결과를 합치고 중복 행을 제거한다.
  • UNION ALL: 중복을 제거하지 않고 결과를 합친다.
  • INTERSECT: 두 결과에 공통으로 존재하는 행을 반환한다.
  • MINUS 또는 SQL Server의 EXCEPT: 첫 번째 결과에서 두 번째 결과를 뺀다. A MINUS B와 B MINUS A의 결과는 다를 수 있다.
  • 집합 연산에 포함된 각 쿼리는 컬럼 수와 대응 컬럼의 데이터 타입을 맞춰야 한다.
  • ORDER BY는 전체 집합 결과의 마지막에 한 번 적용한다. 각 쿼리에서 별도로 정렬하려는 경우에는 해당 DBMS의 문법을 확인해야 한다.
공집합
  • 조건을 만족하는 행이 없는 결과를 공집합이라고 한다. 이는 NULL과 다르다.
  • SELECT 결과가 비어 있어도 집계 함수 결과는 다를 수 있다.
  • SUM은 NULL을 반환한다.
  • COUNT(*)는 0을 반환한다.
  • CREATE TABLE ... AS SELECT ... WHERE 1=2와 같은 방식으로 데이터 없이 테이블 구조를 만들 수 있다.

3. 뷰

뷰는 실제 데이터를 저장하는 테이블이 아니라, 저장된 쿼리를 통해 제공되는 가상 테이블이다.
  • 장점:
  • 필요한 컬럼만 노출해 정보 접근을 제한할 수 있다.
  • 복잡한 조인·집계 쿼리를 단순화할 수 있다.
  • 뷰를 통해 논리적 독립성을 제공할 수 있다.
  • 일반적인 뷰는 데이터를 저장하지 않으며, 뷰를 사용한다고 조회가 반드시 빨라지는 것은 아니다. 일반적인 뷰 자체에 인덱스를 직접 생성할 수 있는지는 DBMS와 뷰의 종류에 따라 다르다.

4. 계층형 쿼리

계층형 쿼리는 조직도처럼 상위·하위 관계를 표현한다.
  • START WITH: 계층 탐색의 시작 행을 지정한다.
  • CONNECT BY PRIOR: 행 사이의 연결 관계와 탐색 방향을 지정한다.
  • PRIOR의 앞뒤에 어떤 컬럼이 놓이는지에 따라 상위에서 하위로 내려가는지, 하위에서 상위로 올라가는지 달라진다. 방향을 판단할 때 부모·자식 컬럼의 위치를 확인한다.
조건과 실행 흐름
  • START WITH는 탐색의 출발점을 정한다.
  • CONNECT BY 조건은 계층을 연결한다. 이 단계의 조건으로 특정 경로가 끊기면 그 하위 행도 탐색되지 않을 수 있다.
  • WHERE 조건은 만들어진 결과에서 행을 필터링한다. 특정 행이 제외되어도 이미 연결된 하위 행은 결과에 남을 수 있다.
계층형 가상 컬럼·함수
  • LEVEL: 시작 행을 1로 하는 계층 깊이를 나타낸다.
  • CONNECT_BY_ROOT: 현재 행의 루트 행 값을 반환한다.
  • CONNECT_BY_ISLEAF: 하위 행이 없는 말단 행이면 1을 반환한다.
계층 구조를 유지하는 정렬
  • 일반 ORDER BY는 전체 결과를 정렬해 계층의 표시 순서를 깨뜨릴 수 있다.
  • ORDER SIBLINGS BY는 같은 수준의 형제 행끼리 정렬하면서 계층 구조를 유지한다.

5. Top-N 쿼리와 행 제한

Oracle의 ROWNUM
  • ROWNUM은 정렬 전에 부여되므로, 원하는 상위 행을 얻으려면 인라인 뷰 안에서 먼저 정렬한 뒤 바깥 쿼리에서 ROWNUM으로 제한한다.
  • ROWNUM <= 3처럼 앞에서부터 제한할 수 있지만, ROWNUM = 2처럼 특정 중간 번호만 지정하는 조건은 일반적으로 원하는 결과를 얻지 못한다.
SQL Server의 TOP
  • TOP n으로 상위 행을 제한하며, 원하는 순위를 얻으려면 ORDER BY를 함께 지정한다.
  • WITH TIES를 사용하면 마지막 행과 같은 정렬 값을 가진 행도 포함하므로 지정한 건수보다 더 많이 반환될 수 있다.
OFFSET·FETCH
  • OFFSET n ROWS는 정렬된 결과에서 앞의 n개 행을 건너뛴다.
  • FETCH FIRST n ROWS ONLY는 그 다음 n개 행만 반환한다.
  • WITH TIES를 지정하면 마지막 행과 같은 정렬 값을 가진 행이 추가될 수 있다.
  • 백분율로 행 수를 지정하는 문법에서는 결과 건수 계산 방식이 DBMS별로 다를 수 있으므로 해당 DBMS의 규칙을 확인한다.
공개 노트 모두 보기