2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
Sub-query에 대해서 정리해보도록 하겠습니다. 서브 쿼리는 어떤 기준으로 보느냐에 따라서 다양하게 분류할 수 있는데요, 제멋대로 큰 얼개위주로 정리해보겠습니다. 어차피 명칭이나 분류보다는 활용성이 중요한 거겠죠!
1.sub-query가 놓여있는 위치에 따른 분류
(1) From 절 sub-query
(2) where 절 sub-query
사실 저 같은 경우에는 From절 sub-query는 처음부터 익숙했는데, where절은 잘 붙지 않았던 것 같습니다. where절 sub-query도 잘 사용하면 아주 유용합니다. 이건 형태적으로 바로 구분할 수 있으니 예시는 생략하겠습니다.
주의) where절에서 사용하더라도 Sub "쿼리"입니다. "select"를 반드시 포함시켜주어야 합니다.
2. 반환 형태에 따른 분류
(1) scalar sub-query : 스칼라 서브쿼리는 하나의 값을 반환하는 서브쿼리입니다. SELECT, WHERE, HAVING 등의 절에서 사용할 수 있으며, 서브쿼리의 결과를 단일 값으로 처리합니다.
예) 평균 급여보다 높은 급여를 받는 직원조회
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
이 예시에서 average를 취했으므로 평균 급여값(스칼라 값)이 where절에 전달됩니다.
(2) Multi-row subquery : 다중 행 서브쿼리는 여러 행의 결과를 반환하는 서브쿼리입니다. 메인 쿼리에서 IN, ANY, ALL 등의 연산자와 함께 사용하여 서브쿼리의 결과와 비교할 수 있습니다.
예) location_id가 1700인 부서의 직원들을 조회
SELECT first_name, last_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
이 예시에서 서브쿼리는 location_id가 1700인 department_id 목록을 반환하고, 메인 쿼리는 이 목록에 포함된 department_id를 가진 직원들을 찾습니다.
(3) Multi-column subquery : 다중 열 서브쿼리는 여러 열의 결과를 반환하는 서브쿼리입니다. 메인 쿼리에서는 다중 열 서브쿼리의 결과를 IN 절과 함께 사용하여 여러 열의 값이 모두 일치하는 행을 찾습니다.
예) employee_id가 101인 직원이 과거에 속했던 부서와 직무에 해당하는 직원들을 조회
SELECT first_name, last_name
FROM employees
WHERE (department_id, job_id) IN (SELECT department_id, job_id FROM job_history WHERE employee_id = 101);
3. Main-query와 Sub-query와의 관계에 따른 분류
(1) 비연관 서브쿼리 (Uncorrelated Sub-query) : 비연관 서브쿼리는 메인 쿼리와 독립적으로 실행되며, 메인 쿼리의 값에 의존하지 않는 서브쿼리입니다. 서브쿼리가 한 번만 실행되고 그 결과가 메인 쿼리에 전달되어 사용됩니다.일반적으로 연관 서브쿼리보다 성능이 좋습니다. 메인 쿼리의 각 행에 대해 서브쿼리를 반복 실행하지 않기 때문입니다.
SELECT employee_id, first_name, last_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
(2) 연관 서브쿼리 (Correlated Sub-query) : 연관 서브쿼리는 메인 쿼리의 각 행에 대해 한 번씩 실행되며, 메인 쿼리의 값을 참조합니다. 서브쿼리의 실행 결과는 메인 쿼리의 현재 행에 따라 달라지며, 메인 쿼리의 각 행에 대해 서브쿼리가 반복 실행됩니다. 비연관 서브쿼리에 비해 성능이 낮을 수 있습니다. 메인 쿼리의 행 수가 많을수록 서브쿼리 실행 횟수가 증가하기 때문입니다.
SELECT e1.employee_id, e1.first_name, e1.salary
FROM employees e1
WHERE e1.salary > (SELECT AVG(e2.salary)
FROM employees e2
WHERE e1.department_id = e2.department_id);
그럼 sub-query에 대한 내용은 이정도로 정리하겠습니다.
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL 기초] Window함수 (1) | 2024.11.03 |
---|---|
[SQL 기초] SQL join (0) | 2024.11.02 |
[SQL 기초] Null 관련 함수 (2) | 2024.11.01 |
[SQL 기초] SQL 연산자 우선순위 (0) | 2024.10.31 |
[SQL 기초] 따옴표 사용법 (0) | 2024.10.31 |