반응형
SQL 쿼리에서 서브쿼리는 특정 작업의 결과를 다시 상위 쿼리에서 사용하기 위한 매우 유용한 도구입니다. 이 서브쿼리는 반환되는 결과의 수에 따라 단일 행 서브쿼리와 다중 행 서브쿼리로 나뉩니다. 이번 글에서는 이 두 종류의 서브쿼리의 차이점, 사용법, 그리고 실무에서의 응용 방법을 예제를 통해 상세히 알아보겠습니다.
1. 서브쿼리란?
서브쿼리는 하나의 SQL 문장 안에서 다른 SQL 문장을 중첩하여 사용하는 방식입니다. 보통 SELECT, INSERT, UPDATE, DELETE와 같은 주요 SQL 문장 안에서 활용됩니다.
- 단일 행 서브쿼리 (Single-row Subquery):
단 하나의 값(행)을 반환합니다. - 다중 행 서브쿼리 (Multi-row Subquery):
하나 이상의 값을 반환합니다.
2. 단일 행 서브쿼리
2.1 특징
- 서브쿼리가 단일 행과 단일 열의 데이터를 반환합니다.
- 비교 연산자로 주로 사용됩니다: =, <, >, <=, >=, <>.
2.2 예제
예제 1: 특정 직원의 최대 급여를 찾기
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES);
- 설명:
서브쿼리가 반환하는 최대 급여 값과 일치하는 직원 데이터를 검색합니다.
결과 예시:- 이름: Steven, 급여: 24000.
예제 2: 특정 부서의 평균 급여보다 높은 직원 검색
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEES WHERE DEPARTMENT_ID = 60);
- 설명:
서브쿼리가 반환하는 평균 급여 값보다 높은 직원 데이터를 검색합니다.
결과 예시:- 이름: John, 급여: 15000.
3. 다중 행 서브쿼리
3.1 특징
- 서브쿼리가 여러 행의 데이터를 반환합니다.
- 다중 행 연산자를 사용합니다: IN, ANY, ALL.
3.2 예제
예제 1: 특정 부서에서 일하는 직원 검색
SELECT FIRST_NAME
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE LOCATION_ID = 1700);
- 설명:
서브쿼리가 반환한 DEPARTMENT_ID 값들 중 하나와 일치하는 직원 데이터를 검색합니다.
결과 예시:- 이름: Alice, Bob 등.
예제 2: 최고 급여를 받는 직원을 제외한 데이터 검색
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY < ANY (SELECT MAX(SALARY) FROM EMPLOYEES);
- 설명:
서브쿼리가 반환한 최대 급여 값보다 낮은 급여를 받는 직원 데이터를 검색합니다.
결과 예시:- 이름: Mary, 급여: 12000.
예제 3: 모든 부서의 평균 급여보다 높은 직원 검색
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > ALL (SELECT AVG(SALARY) FROM EMPLOYEES GROUP BY DEPARTMENT_ID);
- 설명:
각 부서의 평균 급여 값을 모두 가져온 후, 그 중 가장 높은 값을 초과하는 급여를 받는 직원을 검색합니다.
결과 예시:- 이름: Robert, 급여: 20000.
4. 단일 행 서브쿼리와 다중 행 서브쿼리 비교
구분 단일 행 서브쿼리 다중 행 서브쿼리
결과값 | 하나의 행만 반환 | 여러 행 반환 |
사용 연산자 | =, <, >, <=, >=, <> | IN, ANY, ALL |
사용 목적 | 특정 값과 비교 | 여러 값 중 하나 이상 또는 모두와 비교 |
적용 사례 | 최대값, 최소값, 평균값 등 특정 값 검색 | 여러 기준 값과 매칭 |
5. 실무 활용 팁
5.1 적절한 연산자 선택
- 단일 값 비교가 필요할 때는 단일 행 서브쿼리와 =를 사용합니다.
- 여러 값과의 비교가 필요할 때는 다중 행 서브쿼리와 IN, ANY, ALL을 사용합니다.
5.2 성능 최적화
- 단일 행 서브쿼리: 결과가 명확하고 간단하므로 대규모 데이터셋에서 상대적으로 빠르게 작동합니다.
- 다중 행 서브쿼리: 반환된 데이터셋이 크면 성능 저하가 발생할 수 있으므로 적절한 인덱스와 조건 설정이 필요합니다.
5.3 대체 방안 고려
- 복잡한 다중 행 서브쿼리는 **조인 (JOIN)**으로 변환하여 성능을 개선할 수 있습니다.
- 예:
SELECT E.FIRST_NAME FROM EMPLOYEES E JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID WHERE D.LOCATION_ID = 1700;
6. 마무리
단일 행 서브쿼리와 다중 행 서브쿼리는 각각의 목적에 맞게 사용될 때 매우 강력한 도구가 됩니다. 위에서 설명한 특징과 예제를 통해 각 상황에 적합한 서브쿼리를 선택하고, 필요 시 조인으로 변환하여 성능을 최적화하는 것이 중요합니다. 이를 실무에 적극 활용하여 효율적인 SQL 쿼리를 작성해 보세요!
반응형
'Database' 카테고리의 다른 글
오라클 SQL VIEW 생성 및 관리하기 (0) | 2024.12.03 |
---|---|
오라클 UNION, UNION ALL, INTERSECT, MINUS 사용법 (0) | 2024.12.03 |
오라클 서브쿼리란 무엇인가? (0) | 2024.12.03 |
오라클 DB에서 SELF JOIN과 CROSS JOIN 이해하기 (0) | 2024.12.03 |
오라클 DB에서 JOIN 개념 이해하기: INNER JOIN과 OUTER JOIN (0) | 2024.12.03 |