2026 SQLD 필기 2과목 2장 1절 | 서브쿼리·EXISTS·스칼라 서브쿼리 — 핵심 이론

데이터위자드 ·

2026 SQLD 필기 2과목 2장 1절 | 서브쿼리·EXISTS·스칼라 서브쿼리 — 핵심 이론

필기 · 핵심 이론

서브쿼리는 다른 SQL 안에서 결과를 제공하는 SELECT입니다. 결과가 한 값인지, 여러 값인지, 존재 여부만 필요한지부터 구분합니다. 바깥 행의 값을 참조하는 상관 서브쿼리는 각 바깥 행과 연결되는 조건을 놓치지 않아야 합니다.

이번 절에서 익힐 내용

단일행과 다중행 · 상관 서브쿼리 · EXISTS와 행 존재 · ANY와 ALL · 스칼라 서브쿼리와 인라인 뷰

1. 단일행과 다중행

단일행 서브쿼리를 = 같은 비교에 사용하려면 결과가 한 행이어야 합니다. 여러 행이 나올 수 있으면 IN·ANY·ALL처럼 다중행 연산자를 검토합니다. 최고 급여를 MAX로 구한 결과와 부서별 최고 급여를 GROUP BY로 구한 결과는 행 수가 다릅니다.

조회 조건이 지금은 한 행을 반환하더라도 데이터가 늘면 달라질 수 있습니다. 쿼리 구조나 유일 제약으로 한 행이 보장되는지 확인하세요.

핵심 기준

= 비교의 서브쿼리는 단일행 결과를 전제로 한다.

예제로 적용하기

부서가 3개이고 SELECT MAX(salary) FROM emp GROUP BY dept가 3행을 반환한다. 이를 salary = (서브쿼리)에 쓰면?

풀이와 판단 과정

결론: 다중행 결과로 단일행 비교 오류가 날 수 있다.

그룹별 최대는 여러 행이므로 단일행 = 비교의 전제를 충족하지 않습니다.

2. 상관 서브쿼리

상관 서브쿼리는 내부에서 바깥 쿼리의 컬럼을 참조합니다. 같은 부서 평균보다 급여가 높은 직원을 찾으려면 내부 평균의 부서 조건을 바깥 직원의 부서와 연결합니다. 전체 회사 평균과 부서 평균은 다른 기준입니다.

논리적으로 바깥 행별 조건이 달라지지만 실제 DBMS는 이를 조인이나 다른 실행계획으로 변환할 수 있습니다. 작성 형태만 보고 반드시 물리적으로 한 행씩 반복 실행된다고 단정하지 마세요.

핵심 기준

상관 서브쿼리는 바깥 쿼리의 컬럼을 참조한다.

예제로 적용하기

e의 같은 부서 평균을 구하는 내부 조건은?

풀이와 판단 과정

결론: i.dept = e.dept

내부 i의 부서를 바깥 e의 부서와 연결해야 해당 직원 부서 평균을 계산합니다.

3. EXISTS와 행 존재

EXISTS는 서브쿼리 결과에 행이 있는지 판단합니다. 내부 SELECT 목록의 값보다 조건에 맞는 행의 존재가 핵심입니다. 주문이 있는 고객을 찾을 때 주문과 고객을 연결한 EXISTS를 쓰면 주문 수만큼 고객 결과를 늘리지 않고 존재를 확인할 수 있습니다.

EXISTS(SELECT NULL ...)도 행이 존재하면 참이 될 수 있습니다. NULL이라는 값과 결과 행이 없다는 상태를 구분하세요.

핵심 기준

EXISTS는 서브쿼리 결과 행의 존재 여부를 검사한다.

예제로 적용하기

EXISTS(SELECT NULL FROM t)에서 t에 한 행이 있으면?

풀이와 판단 과정

결론: TRUE

선택 값이 NULL이어도 결과 행이 존재하므로 EXISTS는 TRUE입니다.

4. ANY와 ALL

x>ANY(목록)은 목록 중 하나보다 크면 참이고 x>ALL(목록)은 모든 값보다 커야 참입니다. NULL이 없는 10,20 목록에서 >ANY는 최솟값 10보다 큰 조건, >ALL은 최댓값 20보다 큰 조건과 연결됩니다.

NULL이나 빈 집합이 있으면 단순 최솟값·최댓값 치환만으로 판단하면 안 됩니다. ANY의 빈 집합은 참인 비교가 없어 FALSE이고 ALL의 빈 집합은 위반 비교가 없어 TRUE가 되는 논리도 구분합니다.

핵심 기준

NULL 없는 집합에서 >ALL은 모든 원소보다 큰 조건이다.

예제로 적용하기

15 > ANY(10,20)와 15 > ALL(10,20)의 결과는?

풀이와 판단 과정

결론: TRUE, FALSE

15는 10보다 크므로 ANY는 참이지만 20보다 크지 않아 ALL은 거짓입니다.

5. 스칼라 서브쿼리와 인라인 뷰

스칼라 서브쿼리는 한 행·한 열의 값으로 쓰며 결과가 없으면 NULL로 취급될 수 있습니다. 인라인 뷰는 FROM 안의 서브쿼리로 결과 집합을 테이블처럼 참조합니다. 여러 행을 반환하는 스칼라 서브쿼리는 오류가 될 수 있습니다.

컬럼 이름과 별칭을 명확히 지정하면 바깥 쿼리에서 참조하기 쉽습니다. 인라인 뷰의 내부 ORDER BY만으로 최종 결과 정렬까지 보장된다고 생각하지 마세요. 최종 ORDER BY는 바깥 결과에 명시합니다.

핵심 기준

FROM 절의 서브쿼리는 인라인 뷰로 사용할 수 있다.

예제로 적용하기

SELECT (SELECT name FROM dept WHERE id=-1)에서 해당 부서가 없으면 스칼라 결과는?

풀이와 판단 과정

결론: NULL

스칼라 서브쿼리가 0행을 반환하는 경우 NULL 값으로 평가됩니다.

한눈에 비교하기

구분쓰임확인할 조건
단일행값 비교최대 한 행
다중행IN·ANY·ALLNULL·빈 집합
EXISTS존재 여부상관 조건
인라인 뷰중간 결과 집합바깥 별칭과 정렬

순서대로 풀어 보는 예제

A부서 급여 100·200, B부서 급여 300·500이 있습니다. 부서 평균은 150과 400이므로 같은 부서 평균 초과 직원은 200과 500입니다. 전체 평균 275와 비교하면 300과 500이 나와 다른 결과가 됩니다.

서브쿼리 안의 부서 조건이 빠졌는지 먼저 확인하고, 내부 집계가 결과를 한 행으로 만드는지 살펴보세요. 단순한 SQL 길이보다 비교 기준이 업무 요구에 맞는지가 중요합니다.

SELECT e.id,e.salary
FROM emp e
WHERE e.salary > (
 SELECT AVG(i.salary) FROM emp i WHERE i.dept=e.dept
);

헷갈리는 문장 바로잡기

단일행과 다중행

잘못된 판단 =는 여러 행을 자동으로 첫 행만 골라 비교한다.

올바른 판단: = 비교의 서브쿼리는 단일행 결과를 전제로 한다.

상관 서브쿼리

잘못된 판단 상관 서브쿼리는 바깥 컬럼을 참조할 수 없다.

올바른 판단: 상관 서브쿼리는 바깥 쿼리의 컬럼을 참조한다.

EXISTS와 행 존재

잘못된 판단 EXISTS는 SELECT값이 NULL이면 언제나 FALSE다.

올바른 판단: EXISTS는 서브쿼리 결과 행의 존재 여부를 검사한다.

ANY와 ALL

잘못된 판단 >ANY는 반드시 모든 값보다 커야 한다.

올바른 판단: NULL 없는 집합에서 >ALL은 모든 원소보다 큰 조건이다.

스칼라 서브쿼리와 인라인 뷰

잘못된 판단 스칼라 서브쿼리는 여러 열·여러 행이어도 된다.

올바른 판단: FROM 절의 서브쿼리는 인라인 뷰로 사용할 수 있다.

이론을 정리했다면 같은 절의 객관식 문제에서 조건과 예외를 확인하세요. 정답을 고른 뒤에는 틀린 선택지가 왜 성립하지 않는지도 설명해 보세요.

핵심 개념 확인 — 객관식 5문제

설명을 읽은 뒤 아래 다섯 문항을 풀어 보세요. 정답을 고르고 틀린 선택지의 오류도 설명할 수 있으면 이 단원의 기준을 이해한 것입니다.

문제 1

서브쿼리·EXISTS·스칼라 서브쿼리에서 단일행과 다중행에 대한 설명으로 옳은 것은?

  1. ① GROUP BY의 결과는 언제나 한 행이다.
  2. ② = 비교의 서브쿼리는 단일행 결과를 전제로 한다.
  3. ③ =는 여러 행을 자동으로 첫 행만 골라 비교한다.
  4. ④ IN은 한 값만 받을 수 있다.
정답과 해설 보기

정답 ②

단일행 서브쿼리를 = 같은 비교에 사용하려면 결과가 한 행이어야 합니다. 여러 행이 나올 수 있으면 IN·ANY·ALL처럼 다중행 연산자를 검토합니다. 최고 급여를 MAX로 구한 결과와 부서별 최고 급여를 GROUP BY로 구한 결과는 행 수가 다릅니다. 조회 조건이 지금은 한 행을 반환하더라도 데이터가 늘면 달라질 수 있습니다. 쿼리 구조나 유일 제약으로 한 행이 보장되는지 확인하세요.

기억할 핵심

= 비교의 서브쿼리는 단일행 결과를 전제로 한다.

문제 2

서브쿼리·EXISTS·스칼라 서브쿼리에서 상관 서브쿼리에 대한 설명으로 옳은 것은?

  1. ① 상관 서브쿼리는 바깥 쿼리의 컬럼을 참조한다.
  2. ② 상관 서브쿼리는 바깥 컬럼을 참조할 수 없다.
  3. ③ 회사 전체 평균과 부서 평균은 언제나 같다.
  4. ④ 서브쿼리의 논리 구조가 물리 실행 순서를 항상 확정한다.
정답과 해설 보기

정답 ①

상관 서브쿼리는 내부에서 바깥 쿼리의 컬럼을 참조합니다. 같은 부서 평균보다 급여가 높은 직원을 찾으려면 내부 평균의 부서 조건을 바깥 직원의 부서와 연결합니다. 전체 회사 평균과 부서 평균은 다른 기준입니다. 논리적으로 바깥 행별 조건이 달라지지만 실제 DBMS는 이를 조인이나 다른 실행계획으로 변환할 수 있습니다. 작성 형태만 보고 반드시 물리적으로 한 행씩 반복 실행된다고 단정하지 마세요.

기억할 핵심

상관 서브쿼리는 바깥 쿼리의 컬럼을 참조한다.

문제 3

서브쿼리·EXISTS·스칼라 서브쿼리에서 EXISTS와 행 존재에 대한 설명으로 옳은 것은?

  1. ① EXISTS는 SELECT값이 NULL이면 언제나 FALSE다.
  2. ② EXISTS는 반드시 SELECT *만 허용한다.
  3. ③ 주문이 두 건이면 바깥 고객을 자동으로 두 번 반환한다.
  4. ④ EXISTS는 서브쿼리 결과 행의 존재 여부를 검사한다.
정답과 해설 보기

정답 ④

EXISTS는 서브쿼리 결과에 행이 있는지 판단합니다. 내부 SELECT 목록의 값보다 조건에 맞는 행의 존재가 핵심입니다. 주문이 있는 고객을 찾을 때 주문과 고객을 연결한 EXISTS를 쓰면 주문 수만큼 고객 결과를 늘리지 않고 존재를 확인할 수 있습니다. EXISTS(SELECT NULL ...)도 행이 존재하면 참이 될 수 있습니다. NULL이라는 값과 결과 행이 없다는 상태를 구분하세요.

기억할 핵심

EXISTS는 서브쿼리 결과 행의 존재 여부를 검사한다.

문제 4

서브쿼리·EXISTS·스칼라 서브쿼리에서 ANY와 ALL에 대한 설명으로 옳은 것은?

  1. ① >ALL은 하나보다만 크면 된다.
  2. ② >ANY는 반드시 모든 값보다 커야 한다.
  3. ③ NULL 없는 집합에서 >ALL은 모든 원소보다 큰 조건이다.
  4. ④ ANY와 ALL은 항상 같은 결과다.
정답과 해설 보기

정답 ③

x>ANY(목록)은 목록 중 하나보다 크면 참이고 x>ALL(목록)은 모든 값보다 커야 참입니다. NULL이 없는 10,20 목록에서 >ANY는 최솟값 10보다 큰 조건, >ALL은 최댓값 20보다 큰 조건과 연결됩니다. NULL이나 빈 집합이 있으면 단순 최솟값·최댓값 치환만으로 판단하면 안 됩니다. ANY의 빈 집합은 참인 비교가 없어 FALSE이고 ALL의 빈 집합은 위반 비교가 없어 TRUE가 되는 논리도 구분합니다.

기억할 핵심

NULL 없는 집합에서 >ALL은 모든 원소보다 큰 조건이다.

문제 5

서브쿼리·EXISTS·스칼라 서브쿼리에서 스칼라 서브쿼리와 인라인 뷰에 대한 설명으로 옳은 것은?

  1. ① FROM 절의 서브쿼리는 인라인 뷰로 사용할 수 있다.
  2. ② 스칼라 서브쿼리는 여러 열·여러 행이어도 된다.
  3. ③ 인라인 뷰는 원본 테이블을 영구 복제한다.
  4. ④ 내부 정렬은 어떤 외부 연산 뒤에도 보장된다.
정답과 해설 보기

정답 ①

스칼라 서브쿼리는 한 행·한 열의 값으로 쓰며 결과가 없으면 NULL로 취급될 수 있습니다. 인라인 뷰는 FROM 안의 서브쿼리로 결과 집합을 테이블처럼 참조합니다. 여러 행을 반환하는 스칼라 서브쿼리는 오류가 될 수 있습니다. 컬럼 이름과 별칭을 명확히 지정하면 바깥 쿼리에서 참조하기 쉽습니다. 인라인 뷰의 내부 ORDER BY만으로 최종 결과 정렬까지 보장된다고 생각하지 마세요. 최종 ORDER BY는 바깥 결과에 명시합니다.

기억할 핵심

FROM 절의 서브쿼리는 인라인 뷰로 사용할 수 있다.

범위 확인

2026년 학습 범위를 기준으로 구성했습니다. 시험 시행기관의 자격 안내·출제 기준에서 과목과 변경 공지를 확인할 수 있습니다.

이 단원의 객관식 문제 풀기

이전 · INNER·OUTER·표준 조인

다음 · 집합 연산·ROLLUP·CUBE·GROUPING

SQLD 전체 목차

과목별 이론

단원별 객관식

실습

필기 모의고사

스터디클럽의 다른 강의 보기