이 글에서 꼭 잡아야 할 것
서브쿼리 결과가 여러 행이 되는 순간 비교 연산자 선택이 달라진다. IN, ANY, ALL을 정확히 구분하면 다중행 서브쿼리 문제를 안정적으로 풀 수 있다.
다중행 서브쿼리는 안쪽 결과가 하나가 아니라 여러 개일 수 있다는 점에서 단일행과 본질적으로 다르다. 따라서 바깥 비교 연산자를 바꿔야 하며, 문제를 풀 때는 “안쪽에서 몇 개가 나올 수 있는가”를 먼저 따지는 습관이 가장 중요하다.
개념 지도와 이해 포인트
대표 문법 패턴
SELECT employee_id, department_id
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location_id = 1700
);
SELECT employee_id, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE department_id = 30
);
문법 읽는 포인트
- `IN`은 목록 포함 여부, `ANY`는 하나 이상 만족, `ALL`은 전부 만족이다.
- 다중행 결과에는 단일행 비교 연산자를 직접 쓰지 않는다.
- `ALL`은 최대값 또는 최소값 비교로 바꿔 해석하면 이해가 쉽다.
핵심 용어
- IN
- ANY
- ALL
특정 지역 부서 소속 직원 조회하기
다중행 서브쿼리는 “안쪽에서 부서 목록을 만든다” 같은 사고방식으로 접근하면 편하다. 결과를 목록으로 본다면 IN이 왜 자연스러운지도 금방 이해된다.
SELECT employee_id, last_name, department_id
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE department_name LIKE '%Sales%'
)
ORDER BY department_id, employee_id;
수험 체크포인트와 자주 하는 실수
시험 체크포인트
- `ANY`와 `ALL`은 비교 연산자 방향까지 함께 해석해야 한다.
- 다중행 결과인지 불확실하면 먼저 서브쿼리만 따로 실행한다고 상상해 보자.
- `IN`은 목록 비교라는 감각으로 기억하면 오답이 줄어든다.
자주 하는 실수
- 다중행 결과에 `=`를 사용해 오류를 만드는 실수
- `> ALL`과 `> ANY` 의미를 바꿔 기억하는 실수
- 서브쿼리가 NULL을 포함할 수 있는 상황을 간과하는 실수
연결 학습
다중행 비교가 익숙해졌다면 다음은 바깥 행마다 안쪽 질의가 달라지는 상호연관 서브쿼리다. EXISTS와 함께 읽는 감각을 길러 보자.
댓글 0
작성자 이름과 댓글 내용을 입력하면 바로 등록됩니다. 답글은 한 단계까지 지원하고, 댓글은 최대 200자까지 작성할 수 있습니다.
같은 카테고리에서 이어서 읽기
지금 읽은 글과 가까운 흐름의 글 5개를 모아 두었습니다. 바로 앞뒤 문맥을 이어서 읽고 싶을 때 가장 편합니다.
OUTER JOIN과 오라클 전통 조인 문법
실무에서는 매칭되지 않은 데이터도 보고 싶을 때가 많다. OUTER JOIN은 누락된 쪽을 NULL로 채워 결과에 남기며, 오라클 전통 `(+)` 문법도 시험에서 여전히 자주 등장한다.
SELF JOIN, CROSS JOIN, 비등가 조인
조인은 같은 테이블을 다시 붙일 수도 있고, 범위 조건으로 연결할 수도 있다. SELF JOIN, CROSS JOIN, 비등가 조인은 조인 개념을 깊게 이해했는지 확인하는 좋은 주제다.
서브쿼리 기본: 단일행 서브쿼리 읽는 법
서브쿼리는 하나의 질의 안에서 다른 질의를 이용하는 문법이다. 먼저 한 값을 구하고, 그 값을 바탕으로 바깥 질의를 실행하는 단일행 서브쿼리부터 이해하면 전체 구조가 쉬워진다.
상호연관 서브쿼리와 EXISTS
상호연관 서브쿼리는 바깥 질의의 각 행이 안쪽 질의에 영향을 준다. EXISTS와 함께 익히면 “관련 데이터가 있는가”를 검사하는 문제를 매우 자연스럽게 풀 수 있다.
SET 연산자: UNION, UNION ALL, INTERSECT, MINUS
SET 연산자는 여러 SELECT 결과를 집합처럼 합치거나 비교하는 문법이다. 결과 구조가 같아야 하며, 중복 제거 여부를 정확히 구분하는 것이 핵심이다.
댓글을 불러오는 중입니다.