오라클 SQL · 조인과 서브쿼리

다중행 서브쿼리와 IN, ANY, ALL

서브쿼리 결과가 여러 행이 되는 순간 비교 연산자 선택이 달라진다. IN, ANY, ALL을 정확히 구분하면 다중행 서브쿼리 문제를 안정적으로 풀 수 있다.

다중행 서브쿼리와 IN, ANY, ALL 대표 이미지

이 글에서 꼭 잡아야 할 것

서브쿼리 결과가 여러 행이 되는 순간 비교 연산자 선택이 달라진다. IN, ANY, ALL을 정확히 구분하면 다중행 서브쿼리 문제를 안정적으로 풀 수 있다.

다중행 서브쿼리는 안쪽 결과가 하나가 아니라 여러 개일 수 있다는 점에서 단일행과 본질적으로 다르다. 따라서 바깥 비교 연산자를 바꿔야 하며, 문제를 풀 때는 “안쪽에서 몇 개가 나올 수 있는가”를 먼저 따지는 습관이 가장 중요하다.

난이도 중급
모듈 조인과 서브쿼리
학습 시간 10분
핵심 키워드 IN, ANY, ALL

개념 지도와 이해 포인트

IN 패턴 `IN`은 서브쿼리 결과 목록 중 하나라도 일치하면 참이다. 가장 자주 쓰이는 다중행 서브쿼리 연산자다.
ANY와 SOME `> ANY`는 결과 중 하나보다만 크면 참이 된다. `ANY`와 `SOME`은 같은 의미로 본다.
ALL 비교 `> ALL`은 결과 전부보다 커야 참이다. 최대값과 비교하는 효과를 만들 수 있어 해석이 중요하다.
다중행 서브쿼리와 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개를 모아 두었습니다. 바로 앞뒤 문맥을 이어서 읽고 싶을 때 가장 편합니다.