서브쿼리란 SQL 쿼리 안에 포함된 또 다른 쿼리를 의미합니다. 주로 특정 조건에 맞는 데이터를 추출하거나 결과를 가공할 때 사용됩니다.
서브쿼리는 중첩 서브쿼리, 인라인 뷰, 스칼라 서브쿼리로 나눌 수 있으며, 단일 행, 다중 행, 다중 컬럼 등의 형태로도 구분됩니다.
다른 쿼리의 내부에 포함된 쿼리입니다.
WHERE, HAVING, SELECT 절에서 사용될 수 있습니다.
서브쿼리가 하나의 값만 반환합니다. 비교 연산자(=, >, <, >=, <=)와 함께 사용됩니다.
SELECT emp_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
설명: 이 쿼리는 직원들의 이름과 급여를 조회합니다. 서브쿼리는 employees 테이블에서 평균 급여를 계산하고, 이 값을 기준으로 평균 급여보다 많은 급여를 받는 직원들을 반환합니다.
서브쿼리가 여러 개의 값을 반환합니다. 주로 IN, ANY, ALL 연산자와 함께 사용됩니다.
SELECT emp_name, department
FROM employees
WHERE department IN (SELECT department FROM employees WHERE salary > 5000);
설명: 이 쿼리는 급여가 5000 이상인 직원들이 속한 부서에서 일하는 모든 직원들을 조회합니다. 서브쿼리는 급여가 5000 이상인 직원들의 부서를 찾고, 그 부서에 속한 직원들을 반환합니다.
서브쿼리가 여러 개의 컬럼을 반환합니다. 주로 WHERE 조건에서 여러 컬럼을 비교할 때 사용됩니다.
SELECT emp_name
FROM employees
WHERE (department, salary) IN (SELECT department, MAX(salary)
FROM employees
GROUP BY department);
설명: 각 부서의 최고 급여를 받는 직원들의 이름을 조회합니다.
서브쿼리를 FROM 절에서 사용하여 일시적인 테이블처럼 활용하는 방법입니다.
SELECT department, AVG(salary) AS avg_salary
FROM (SELECT department, salary
FROM employees) AS subquery
GROUP BY department;
설명: employees 테이블의 일부 데이터를 인라인 뷰로 사용하고, 각 부서의 평균 급여를 구합니다.
서브쿼리가 단일 값을 반환하고, SELECT 절이나 WHERE 절에서 사용됩니다.
SELECT emp_name, salary, (SELECT AVG(salary) FROM employees) AS overall_avg
FROM employees;
설명: 각 직원의 이름과 급여를 보여주며, 전체 직원 평균 급여도 함께 반환합니다.
SELECT emp_name
FROM employees e1
WHERE EXISTS (SELECT 1
FROM employees e2
WHERE e1.department = e2.department
AND e2.salary > 5000);
설명: 각 직원의 부서에 급여가 5000 이상인 다른 직원이 있는 경우, 해당 직원을 반환합니다.