Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

단일 행 서브쿼리와 다중 행 서브쿼리 완벽 정리

단일 행 서브쿼리(Single Row Subquery)란?

단일 행 서브쿼리는 외부 쿼리(메인 쿼리)의 결과가 하나의 알 수 없는 값을 기준으로 결정되어야 할 때 사용합니다. '단일 행'이라는 이름 때문에 여러 컬럼을 반환하는 것처럼 오해하기 쉽지만, 실제로 단일 행 서브쿼리는 외부 쿼리에 단 하나의 컬럼으로 구성된 단 한 개의 행만 반환할 수 있습니다.

아래 SELECT 문에서 내부 쿼리는 회사 전체 직원 중 최저 급여라는 단 하나의 값만 반환합니다. 외부 쿼리는 이 값을 기준으로 모든 직원의 급여를 비교하여, 최저 급여와 일치하는 직원만 조회해 표시합니다.

SELECT first_name, salary, department_id
FROM employees
WHERE salary = (SELECT MIN(salary)
FROM employees);

HAVING 절에서의 단일 행 서브쿼리 활용

HAVING 절은 그룹화된 쿼리 결과를 특정 조건에 따라 제한해야 할 때 사용됩니다. 만약 서브쿼리의 결과를 그룹 함수(MIN, AVG 등)와 비교해야 한다면, 내부 쿼리를 반드시 외부 쿼리의 HAVING 절 안에 중첩시켜야 합니다.

아래 예제는 각 부서별 최저 급여를 조회하되, 그 값이 회사 전체 평균 급여보다 낮은 부서만 필터링하는 쿼리입니다.

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) < (SELECT AVG(salary)
FROM employees)

다중 행 서브쿼리(Multiple Row Subquery)란?

다중 행 서브쿼리는 부모 쿼리(외부 쿼리)에 두 개 이상의 행을 반환할 수 있는 중첩 쿼리입니다. 다중 행 서브쿼리는 주로 WHERE 절과 HAVING 절에서 사용되며, 여러 행을 반환하기 때문에 반드시 집합 비교 연산자(IN, ALL, ANY)와 함께 사용해야 합니다.

  • IN: 지정된 값이 서브쿼리가 반환하는 결과 목록 중 하나와 일치하는지 확인합니다.
  • ANY: 지정된 값을 서브쿼리가 반환하는 각각의 값과 비교하여 하나라도 조건을 만족하면 참이 됩니다.
  • ALL: 지정된 값을 서브쿼리가 반환하는 모든 값과 비교하여 전부 조건을 만족해야 참이 됩니다.

잘못된 사용 예시

아래 쿼리는 동등 비교 연산자(=)를 사용했지만, 내부 서브쿼리가 여러 개의 행을 반환하므로 오류가 발생합니다. 단일 행 비교 연산자(=)는 하나의 값만 처리할 수 있기 때문입니다. 이런 경우에는 = 대신 IN 연산자를 사용해야 올바르게 동작합니다.

SELECT first_name, department_id FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE LOCATION_ID = 100)

단일 행 vs 다중 행 서브쿼리 비교

구분단일 행 서브쿼리다중 행 서브쿼리
반환 결과단일 값 (1행 1열)두 개 이상의 행
사용 가능한 연산자=, >, <, >=, <=, <>IN, ANY, ALL
주요 사용 위치WHERE, HAVING 절WHERE, HAVING 절
대표 예시최댓값·최솟값·평균값 비교특정 목록에 포함 여부 확인

서브쿼리를 작성할 때는 내부 쿼리가 몇 개의 행을 반환하는지 먼저 파악하고, 그에 맞는 비교 연산자를 선택하는 것이 중요합니다. 이를 통해 런타임 오류를 방지하고 의도한 데이터를 정확하게 조회할 수 있습니다.