728x90
728x90
**서브쿼리(Subquery)**는 SQL에서 하나의 쿼리 내부에 포함된 또 다른 쿼리를 의미합니다. 서브쿼리는 메인 쿼리의 데이터를 필터링하거나 계산하는 데 사용되며, 다양한 형태로 분류됩니다. 다음은 서브쿼리의 주요 종류와 특징입니다:
1. 단일 행 서브쿼리 (Single-Row Subquery)
- 정의: 서브쿼리가 **하나의 행(row)**만 반환하는 서브쿼리입니다.
- 사용 연산자: =, >, <, >=, <=, <> 등 단일 값과 비교하는 연산자.
- 예시:
SELECT EMP_NAME, SALARY FROM EMPLOYEES WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES);
- 서브쿼리는 MAX(SALARY)를 계산하여 하나의 값을 반환합니다.
2. 다중 행 서브쿼리 (Multi-Row Subquery)
- 정의: 서브쿼리가 **여러 행(rows)**을 반환하는 서브쿼리입니다.
- 사용 연산자: IN, ANY, ALL, EXISTS 등.
- 예시:
SELECT EMP_NAME, SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE LOCATION = 'SEOUL');
- 서브쿼리가 여러 DEPARTMENT_ID를 반환하고, 메인 쿼리는 IN 연산을 통해 필터링합니다.
3. 다중 열 서브쿼리 (Multi-Column Subquery)
- 정의: 서브쿼리가 **여러 열(columns)**을 반환하는 서브쿼리입니다.
- 사용 연산자: (column1, column2) IN, (column1, column2) = (subquery)
- 예시:
SELECT EMP_NAME FROM EMPLOYEES WHERE (DEPARTMENT_ID, JOB_ID) IN (SELECT DEPARTMENT_ID, JOB_ID FROM JOBS WHERE SALARY > 5000);
- 서브쿼리는 두 개의 열(DEPARTMENT_ID, JOB_ID)을 반환합니다.
4. 상관 서브쿼리 (Correlated Subquery)
- 정의: 서브쿼리가 메인 쿼리의 값을 참조하는 서브쿼리입니다. 서브쿼리는 메인 쿼리의 각 행에 대해 반복적으로 실행됩니다.
- 특징: 실행 속도가 느릴 수 있지만 특정 행 기반 연산에 유용합니다.
- 예시:
SELECT E1.EMP_NAME, E1.SALARY FROM EMPLOYEES E1 WHERE E1.SALARY > (SELECT AVG(SALARY) FROM EMPLOYEES E2 WHERE E2.DEPARTMENT_ID = E1.DEPARTMENT_ID);
- 서브쿼리는 각 E1.DEPARTMENT_ID를 기반으로 평균 급여를 계산합니다.
5. 스칼라 서브쿼리 (Scalar Subquery)
- 정의: 서브쿼리가 단일 값을 반환하며, SELECT 절에 사용될 수 있는 서브쿼리입니다.
- 특징: 스칼라 값(단일 값)을 반환하므로 컬럼의 값처럼 사용됩니다.
- 예시:
SELECT EMP_NAME, (SELECT MAX(SALARY) FROM EMPLOYEES) AS HIGHEST_SALARY FROM EMPLOYEES;
- 서브쿼리가 MAX(SALARY)를 반환하여 각 행에 대해 같은 값을 제공합니다.
6. 중첩 서브쿼리 (Nested Subquery)
- 정의: 서브쿼리 안에 또 다른 서브쿼리가 포함된 형태입니다.
- 특징: 여러 레벨의 서브쿼리를 중첩할 수 있습니다.
- 예시:
SELECT EMP_NAME FROM EMPLOYEES WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE LOCATION = 'SEOUL'));
- 서브쿼리 안에 또 다른 서브쿼리가 중첩되어 있습니다.
7. 인라인 뷰 (Inline View)
- 정의: FROM 절에서 서브쿼리를 사용하여 임시 테이블처럼 활용하는 형태입니다.
- 특징: 결과 집합을 테이블처럼 사용합니다.
- 예시:
SELECT DEPARTMENT_ID, AVG_SALARY FROM (SELECT DEPARTMENT_ID, AVG(SALARY) AS AVG_SALARY FROM EMPLOYEES GROUP BY DEPARTMENT_ID) WHERE AVG_SALARY > 5000;
- 서브쿼리는 AVG(SALARY)를 계산한 후 메인 쿼리에서 필터링합니다.
8. EXISTS 서브쿼리
- 정의: 서브쿼리의 결과가 존재하는지 여부를 확인합니다.
- 사용 연산자: EXISTS, NOT EXISTS.
- 예시:
SELECT EMP_NAME FROM EMPLOYEES E WHERE EXISTS (SELECT 1 FROM DEPARTMENTS D WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID);
- 서브쿼리의 조건을 만족하는 행이 존재하면 EXISTS는 참으로 평가됩니다.
요약
종류 특징 주요 연산자
단일 행 서브쿼리 | 하나의 행만 반환 | =, >, < |
다중 행 서브쿼리 | 여러 행 반환 | IN, ANY, ALL |
다중 열 서브쿼리 | 여러 열 반환 | (col1, col2) IN ... |
상관 서브쿼리 | 메인 쿼리의 각 행을 참조하여 실행 | 메인 쿼리와 상관관계 있음 |
스칼라 서브쿼리 | 단일 값을 반환 | SELECT 절에 사용 |
중첩 서브쿼리 | 서브쿼리 안에 또 다른 서브쿼리가 포함됨 | 중첩된 서브쿼리 구조 |
인라인 뷰 | FROM 절에서 임시 테이블처럼 사용 | FROM 절 사용 |
EXISTS 서브쿼리 | 존재 여부에 따라 조건 판단 | EXISTS, NOT EXISTS |
서브쿼리는 다양한 형태로 사용될 수 있으며, 각 유형은 상황에 따라 성능과 코드 가독성에 영향을 줄 수 있습니다.
728x90
728x90
'데이터베이스 DB' 카테고리의 다른 글
SQL 윈도우 함수 정리: 개념과 예제 (0) | 2024.12.17 |
---|---|
오라클 힌트 사용법 (0) | 2024.12.17 |
VIEW PUSHED PREDICATE (0) | 2024.12.17 |
오라클 환경셋팅, 오라클 다운로드 방법 (0) | 2024.12.17 |
SQL 실행 계획 분석 실전 (0) | 2024.12.17 |
댓글