

서브쿼리(Subquery)는 하나의 SQL 쿼리 안에 중첩된 또 다른 쿼리를 의미합니다.
이 서브쿼리는 주 쿼리(Main Query)의 입력값을 제공하거나 필터링 조건으로 사용됩니다.
서브쿼리는 SELECT, FROM, WHERE 절에서 사용되며, 각각 다음과 같이 나눌 수 있습니다:
SELECT 절에서 사용되는 서브쿼리로, 하나의 값을 반환합니다.
스칼라 서브쿼리는 주로 계산된 컬럼이나 특정 기준에 따른 추가 정보를 포함하는 데 사용됩니다.
SELECT
emp_name,
(SELECT MAX(salary) FROM employees) AS max_salary
FROM
employees;
FROM 절에서 사용되는 서브쿼리로, 하나의 테이블처럼 작동합니다.
이 방식은 서브쿼리를 통해 임시 테이블을 생성하여 주 쿼리가 이를 참조할 수 있게 합니다.
SELECT
e.emp_name,
e.department_id,
d.avg_salary
FROM
employees e
JOIN
(SELECT
department_id,
AVG(salary) AS avg_salary
FROM
employees
GROUP BY
department_id
HAVING
AVG(salary) > 50000) d
ON
e.department_id = d.department_id;
WHERE 절에서 사용되는 서브쿼리로, 특정 조건을 만족하는 데이터를 필터링합니다.
이는 주로 주 쿼리의 조건문에서 동적으로 값을 제공할 때 사용됩니다.

SELECT
emp_name,
salary
FROM
employees
WHERE
salary > (SELECT AVG(salary) FROM employees);
| 구분 | 스칼라 서브쿼리 | 인라인 뷰 | 일반 중첩 서브쿼리 |
|---|---|---|---|
| 사용 위치 | SELECT 절 | FROM 절 | WHERE 절 |
| 반환값 | 단일 값 | 테이블 형태 | 단일 값, 단일 컬럼, 다수 값 |
| 주요 목적 | 동적으로 계산된 값 추가 | 임시 테이블로 가공된 데이터 사용 | 필터링 조건 설정 |
| 사용 시기 | 컬럼 계산 및 정보 추가 | 복잡한 데이터 집계나 가공 | 조건에 따라 데이터 제한 |
SQL에서는 서브쿼리와 함께 다중행 연산자와 단일행 연산자를 사용하여 데이터를 비교하거나 필터링할 수 있습니다.
단일행 연산자는 서브쿼리가 단일 값(스칼라 값)을 반환할 때 사용됩니다.
주로 비교 연산자와 함께 사용되며, 하나의 값과 다른 하나의 값을 비교합니다.
=, >, <, >=, <=, <> (같다, 크다, 작다 등 단순 비교)
SELECT
emp_name,
salary
FROM
employees
WHERE
salary > (SELECT AVG(salary) FROM employees);
(SELECT AVG(salary) FROM employees): 단일 값을 반환(평균 연봉).salary >: 단일 값과 비교하는 단일행 연산자.다중행 연산자는 서브쿼리가 여러 개의 행을 반환할 때 사용됩니다.
이는 반환된 다수의 값과 주어진 조건을 비교할 때 활용됩니다.
IN: 리스트 내의 값과 일치하는 경우.ANY 또는 SOME: 반환된 값 중 하나 이상과 조건을 만족하는 경우.ALL: 반환된 모든 값과 조건을 만족하는 경우.
1) IN 연산자
SELECT
emp_name,
branch
FROM
employees
WHERE
branch IN (SELECT branch FROM branches WHERE city = '서울');
(SELECT branch FROM branches WHERE city = '서울'): 서울에 있는 지점들을 반환(다수의 값).branch IN: 반환된 값 중 하나와 일치하는 경우 필터링.2) ANY 연산자
SELECT
emp_name,
salary
FROM
employees
WHERE
salary > ANY (SELECT MAX(salary) FROM employees GROUP BY department_id);
(SELECT MAX(salary) FROM employees GROUP BY department_id): 각 부서의 최고 연봉 리스트를 반환.salary > ANY: 리스트 중 하나라도 만족하면 필터링.3) ALL 연산자
SELECT
emp_name,
salary
FROM
employees
WHERE
salary > ALL (SELECT MAX(salary) FROM employees GROUP BY department_id);
(SELECT MAX(salary) FROM employees GROUP BY department_id): 각 부서의 최고 연봉 리스트를 반환.salary > ALL: 반환된 리스트의 모든 값보다 커야 필터링.| 구분 | 단일행 연산자 | 다중행 연산자 |
|---|---|---|
| 서브쿼리 결과 | 단일 값(스칼라 값) | 여러 값(리스트) |
| 사용 연산자 | =, >, <, >=, <=, <> | IN, ANY, ALL |
| 적용 대상 | 하나의 값과 비교 | 여러 값과 조건을 비교 |
| 사용 시기 | 값 하나를 반환하는 서브쿼리와 함께 사용 | 다수의 값을 반환하는 서브쿼리와 함께 사용 |
서브쿼리는 적절히 사용하면 SQL의 가독성과 성능을 향상시킬 수 있습니다.
효율적인 SQL 작성을 위해 각 방식의 용도를 명확히 이해하고 활용하세요! 😊