728x90
목차
SUBQUERY (서브쿼리)는 다른 쿼리의 내부에 포함된 쿼리로, SELECT, FROM, WHERE, HAVING, INSERT, UPDATE, DELETE 등 다양한 SQL 절에서 사용할 수 있습니다.
하지만 서브쿼리를 사용할 수 있는 절에는 약간의 제한이 있습니다. 각 절에서 서브쿼리를 사용할 수 있는지에 대해 구체적으로 설명하겠습니다.
1. SELECT 절에서 서브쿼리 사용
- 사용 가능: SELECT 절에서 서브쿼리를 사용하여 컬럼 값을 계산하거나 반환할 수 있습니다.
- 예시: 특정 조건에 맞는 값을 서브쿼리로 가져오기
SELECT
emp_name,
(SELECT department FROM departments WHERE emp_id = employees.emp_id) AS emp_department
FROM employees;
- 설명: 이 쿼리는 employees 테이블에서 emp_name과 함께 서브쿼리를 사용하여 해당 직원의 부서명을 가져옵니다.
2. FROM 절에서 서브쿼리 사용
- 사용 가능: FROM 절에서 서브쿼리를 사용하면 서브쿼리 결과를 테이블처럼 취급할 수 있습니다. 이를 인라인 뷰 또는 서브쿼리 테이블이라고 부릅니다.
- 예시: 서브쿼리 결과를 테이블처럼 사용
SELECT dept_name, COUNT(*) AS emp_count
FROM (SELECT department AS dept_name FROM employees) AS subquery
GROUP BY dept_name;
- 설명: employees 테이블에서 서브쿼리를 사용해 부서명을 추출한 후, 해당 결과를 이용해 각 부서의 직원 수를 구합니다.
3. WHERE 절에서 서브쿼리 사용
- 사용 가능: WHERE 절에서 서브쿼리를 사용하여 조건을 지정할 수 있습니다. 서브쿼리가 단일 값을 반환하면 =, IN, EXISTS 등의 연산자와 함께 사용됩니다.
- 예시: 특정 부서에 속하는 직원 찾기
SELECT emp_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE dept_name = 'Sales');
- 설명: 서브쿼리를 사용하여 departments 테이블에서 'Sales' 부서의 department_id를 찾고, 이를 employees 테이블에서 사용하여 해당 부서에 속한 직원들의 이름을 조회합니다.
4. HAVING 절에서 서브쿼리 사용
- 사용 가능: HAVING 절에서도 서브쿼리를 사용할 수 있습니다. 보통 집계 함수와 함께 조건을 설정할 때 사용됩니다.
- 예시: 평균 급여가 특정 금액 이상인 부서 찾기
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);
- 설명: 서브쿼리에서 모든 직원의 평균 급여를 계산하고, 이를 사용하여 평균 급여가 그보다 높은 부서만을 필터링합니다.
5. INSERT 절에서 서브쿼리 사용
- 사용 가능: INSERT 문에서 서브쿼리를 사용하여 다른 테이블로 데이터를 삽입할 수 있습니다.
- 예시: 다른 테이블에서 데이터를 삽입
INSERT INTO employees_backup (emp_id, emp_name, department_id)
SELECT emp_id, emp_name, department_id
FROM employees
WHERE hire_date < '2020-01-01';
- 설명: employees 테이블에서 2020년 1월 1일 이전에 입사한 직원들의 데이터를 employees_backup 테이블에 삽입합니다.
6. UPDATE 절에서 서브쿼리 사용
- 사용 가능: UPDATE 문에서도 서브쿼리를 사용하여 값을 갱신할 수 있습니다. 서브쿼리는 보통 SET 절이나 WHERE 절에서 사용됩니다.
- 예시: 특정 직원의 급여를 부서별 평균 급여로 업데이트
UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees WHERE department_id = employees.department_id)
WHERE department_id = 10;
- 설명: 부서 ID가 10인 직원들의 급여를 해당 부서의 평균 급여로 업데이트하는 쿼리입니다.
7. DELETE 절에서 서브쿼리 사용
- 사용 가능: DELETE 문에서 서브쿼리를 사용하여 조건에 맞는 데이터를 삭제할 수 있습니다.
- 예시: 특정 부서의 직원을 삭제
DELETE FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE dept_name = 'HR');
- 설명: 'HR' 부서에 속한 직원들을 삭제하는 쿼리입니다.
8. 서브쿼리 사용 불가능한 곳
- ORDER BY 절에서는 서브쿼리 사용이 불가능합니다.
- 이유는 ORDER BY는 결과 집합을 정렬하는 데 사용되며, 그 자체로 조건을 설정하는 데 사용되지 않기 때문입니다.
- 예시 (잘못된 예시):
SELECT emp_id, emp_name
FROM employees
ORDER BY (SELECT department FROM departments WHERE dept_id = employees.dept_id);
- 이 쿼리는 서브쿼리에서 반환된 값으로 정렬하려는 시도이지만, SQL에서는 ORDER BY에서 서브쿼리를 사용할 수 없습니다.
정리
- 모든 절에서 서브쿼리를 사용할 수 있습니다:
- SELECT: SELECT 결과로 사용
- FROM: 서브쿼리를 테이블처럼 사용
- WHERE: 조건을 설정하는 데 사용
- HAVING: 집계 함수와 함께 사용
- INSERT: 다른 테이블에서 데이터를 삽입
- UPDATE: 값을 갱신
- DELETE: 데이터를 삭제
- ORDER BY 절에서는 서브쿼리를 사용할 수 없습니다.
728x90
'SQL' 카테고리의 다른 글
NVL 함수와 COALESCE 함수 (0) | 2025.01.23 |
---|---|
UNION ALL에 대하여 (0) | 2025.01.23 |
아웃터 조인 (Outer Join) (0) | 2025.01.23 |
SQL -AS 사용 가능한 곳 (0) | 2025.01.23 |
SQL의 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 쉽게 이해하기 (2) | 2025.01.23 |