서브쿼리는 다른 SQL 쿼리 안에 중첩된 SELECT 문입니다. 메인 쿼리의 결과를 얻기 위해 보조적인 역할을 하며, 괄호 () 안에 작성됩니다.
하나의 행만 반환하는 서브쿼리입니다.
-- 평균 급여보다 높은 급여를 받는 직원 찾기
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
여러 행을 반환하며, IN, ANY, ALL 등의 연산자와 함께 사용됩니다.
-- IT 부서에 속한 직원들 찾기
SELECT name
FROM employees
WHERE department_id IN (
SELECT id FROM departments WHERE name = 'IT'
);
SELECT 절에 사용되어 단일 값을 반환합니다.
SELECT name,
salary,
(SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;
외부 쿼리의 값을 참조하는 서브쿼리입니다.
-- 각 부서에서 평균 급여보다 높은 직원 찾기
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
SELECT dept_name, avg_sal
FROM (
SELECT department_id, AVG(salary) as avg_sal
FROM employees
GROUP BY department_id
) subquery
JOIN departments ON subquery.department_id = departments.id;
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);
같은 결과를 얻을 수 있지만 상황에 따라 선택합니다:
서브쿼리가 적합한 경우:
JOIN이 적합한 경우:
서브쿼리랑 JOIN 중 적합한 것을 고르는 기준을 확립해야할 것 같다.