2025. 3. 5. 22:48ㆍTools & Skills/SQL
1. 서브쿼리(Subquery)
한 식당의 매니저가 직원 급여를 조정해야 한다고 가정해 보자.
매니저는 "우리 직원 중 최고 연봉을 받는 사람의 급여를 기준으로, 연봉이 그보다 낮은 사람들의 연봉을 10% 인상해야 해" 라고 말한다.

이 문제를 SQL로 풀려면, 최고 연봉을 찾는 쿼리와 연봉이 낮은 직원들의 급여를 조정하는 쿼리가 필요하다.
이처럼 한 SQL 문 안에서 또 다른 SQL 문이 필요한 경우 서브쿼리(Subquery)를 사용한다.
1.1 서브쿼리의 기본 구조

서브쿼리는 쿼리 속의 쿼리로, 주로 메인 쿼리의 연산을 돕는 역할을 한다.
SELECT 컬럼명 FROM 테이블명 -- 메인 쿼리(Main Query)
SELECT 컬럼명 FROM 다른_테이블 WHERE 조건 -- 서브쿼리(Subquery)
메인 쿼리(=부모쿼리, 외부쿼리) - 서브쿼리의 결과를 사용하여 최종 결과를 반환
서브쿼리(=자식쿼리, 내부쿼리) - 메인 쿼리 실행 전 수행되어 필요한 데이터를 제공
👉 서브쿼리는 Java 같은 객체지향 프로그래밍의 상속 개념과 비슷하다.
- 부모(메인 쿼리)는 자식(서브쿼리)의 결과를 사용할 수 있다.
- 하지만 자식(서브쿼리)은 부모(메인 쿼리)의 값을 직접 참조할 수 없다.
서브 쿼리의 장점이 뭔데?
2. 서브쿼리의 장점
서브쿼리는 다음과 같은 장점을 가진다.
1. 쿼리를 구조화하여, 각 부분을 명확하게 구분할 수 있다.
2. 복잡한 조인(JOIN) 연산을 대체할 수 있다.
3. 가독성이 향상되어 유지보수가 쉬워진다.
4. 조건을 동적으로 설정할 수 있어, 보다 유연한 데이터 조회가 가능하다.
3. 서브쿼리의 주요 유형
서브쿼리는 사용되는 방식에 따라 여러 유형으로 나뉜다.
3.1 스칼라 서브쿼리 (Scalar Subquery)
먼저, 서브쿼리가 단일 값(Scalar Value)을 반환하는 경우다.
주로 SELECT, WHERE, HAVING 절에서 사용된다.
SELECT Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary) FROM Employee);
👉 SELECT AVG(Salary) FROM Employee는 전체 직원의 평균 급여를 반환하고, 이를 이용해 평균 급여보다 높은 직원만 필터링한다.
🚨 주의: 스칼라 서브쿼리는 하나의 값만 반환해야 하며, 다중 레코드를 반환하면 오류 발생!
3.2 다중 행 서브쿼리 (Multi-row Subquery)
다음은, 서브쿼리가 여러 개의 값을 반환하는 경우다.
SELECT Name, Department
FROM Employee
WHERE Department IN (SELECT Department FROM Employee WHERE Salary > 5000);
👉 급여가 5000 이상인 직원이 속한 부서만 조회하는 예제
- IN 연산자와 함께 사용되어 여러 개의 값과 비교 가능
- ANY, ALL 연산자도 함께 사용 가능
3.3 다중 열 서브쿼리 (Multi-column Subquery)
또한, 서브쿼리가 두 개 이상의 값을 반환하는 경우도 존재한다.
SELECT Name, Salary
FROM Employee
WHERE (Department, Salary) IN (SELECT Department, MAX(Salary) FROM Employee GROUP BY Department);
👉 각 부서에서 최고 연봉을 받는 직원을 조회하는 예제
- 튜플(Department, Salary)을 비교하는 방식
3.4 상관 서브쿼리 (Correlated Subquery)
마지막으로, 서브쿼리가 메인 쿼리의 각 행을 참조하며 실행되는 방식이다.
SELECT Name, Salary
FROM Employee e1
WHERE Salary > (SELECT AVG(Salary) FROM Employee e2 WHERE e1.Department = e2.Department);
👉 각 직원의 부서별 평균 급여를 계산하여, 평균보다 높은 급여를 받는 직원만 조회
🚨 주의: 상관 서브쿼리는 메인 쿼리 실행 시 반복 수행되므로, 성능 저하 가능성이 있음.
4. 서브쿼리 vs JOIN 차이점
비교 항목 | 서브쿼리 | JOIN |
실행 방식 | 내부적으로 별도 쿼리 실행 후 결과 사용 | 여러 테이블을 결합하여 한 번에 처리 |
성능 | 다중 행, 상관 서브쿼리는 성능 저하 가능 | 일반적으로 성능이 더 좋음 |
가독성 | 단순한 경우 가독성이 높음 | 복잡한 경우 구조적으로 더 효율적 |
👉 JOIN이 더 빠른 경우가 많지만, 서브쿼리는 특정 상황에서 가독성과 유지보수성을 높일 수 있음!
5. 서브쿼리 실행 조건
- 서브쿼리는 SELECT 문으로만 작성할 수 있다. (정확히 SELECT문 쿼리밖에 사용 할 수 없다.)
- 반드시 괄호()안에 존재해야 한다.
- 괄호가 끝나고 끝에 ;(세미콜론)을 쓰지 않는다.
- ORDER BY를 사용할 수 없다.
6. 서브쿼리의 활용 예시
✅ 최고 연봉을 받는 직원 조회
SELECT Name, Salary
FROM Employee
WHERE Salary = (SELECT MAX(Salary) FROM Employee);
✅ 특정 부서의 평균 급여보다 높은 직원 조회
SELECT Name, Salary, Department
FROM Employee
WHERE Salary > (SELECT AVG(Salary) FROM Employee e2 WHERE e1.Department = e2.Department);
✅ 서브쿼리를 활용한 INSERT
INSERT INTO HighSalaryEmployees (Name, Salary)
SELECT Name, Salary FROM Employee WHERE Salary > (SELECT AVG(Salary) FROM Employee);
👉 급여가 4000 이하인 부서의 직원들을 삭제
✅ 서브쿼리를 활용한 UPDATE
UPDATE Employee
SET Salary = Salary * 1.1
WHERE Department IN (SELECT Department FROM Employee WHERE Salary < 5000);
👉 IT 부서에서 최고 연봉을 받는 직원 조회
정리
✔ 서브쿼리는 SQL 내에서 특정 연산의 중간 결과를 활용하는 강력한 도구
✔ 스칼라, 다중 행, 다중 열, 상관 서브쿼리 등 다양한 유형이 존재
✔ JOIN이 성능이 더 좋을 때도 많지만, 서브쿼리는 가독성과 유지보수성에서 장점
✔ 데이터 조회, 조건 필터링, 연산, 업데이트 등에 광범위하게 활용 가능
서브쿼리를 적절히 활용하면 SQL의 가독성과 유지보수성이 향상될 수 있는 점을 기억하자!
'Tools & Skills > SQL' 카테고리의 다른 글
[SQL] 프로그래머스 Lv.4 보호소에서 중성화한 동물 (0) | 2025.04.05 |
---|---|
[SQL] LeetCode #511 - Game Play Analysis (0) | 2025.03.19 |
정규화 (0) | 2025.03.19 |
RDBMS (1) | 2025.02.06 |