서브쿼리는 사용되는 위치에 따라 여러 가지로 분류할 수 있습니다.
| 서브쿼리 유형 | 설명 | 예제 |
|---|---|---|
| FROM 서브쿼리 | 테이블처럼 동작하여 임시 데이터셋을 생성 | FROM (SELECT ...) AS alias |
| SELECT 서브쿼리 | 개별 열의 값을 계산하여 반환 (스칼라 서브쿼리) | SELECT (SELECT MAX(salary) FROM employees) AS max_salary |
| WHERE 서브쿼리 | 특정 조건을 만족하는 데이터 필터링 | WHERE salary > (SELECT AVG(salary) FROM employees) |
| HAVING 서브쿼리 | 그룹 조건 필터링 | HAVING SUM(sales) > (SELECT AVG(total_sales) FROM yearly_sales) |
| 서브쿼리 종류 | 설명 | 예시 |
|---|---|---|
| 스칼라 서브쿼리 | 하나의 값을 반환하는 서브쿼리. 주 쿼리에서 비교하거나 계산에 사용. | SELECT name FROM employees WHERE salary = (SELECT MAX(salary) FROM employees) |
| 인라인 뷰 (Inline View) | 서브쿼리를 FROM 절에 사용하여 가상의 테이블처럼 취급. | SELECT dept, AVG(salary) FROM (SELECT department, salary FROM employees) AS subquery GROUP BY dept |
| 상관 서브쿼리 | 외부 쿼리의 값을 참조하는 서브쿼리. 일반적으로 WHERE 절에서 사용. | SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees e WHERE e.department = employees.department) |
| 다중 값 서브쿼리 | 여러 값을 반환하며, IN 절과 함께 사용됨. | SELECT name FROM employees WHERE department IN (SELECT department FROM employees WHERE salary > 80000) |
| 복합 서브쿼리 | 여러 개의 값을 반환하고, 주로 EXISTS 또는 NOT EXISTS와 함께 사용. | SELECT name FROM employees e WHERE EXISTS (SELECT * FROM departments d WHERE d.dept_id = e.department_id) |
데이터베이스에서 여러 테이블을 결합하는 방법으로 조인(JOIN)과 서브쿼리(SUBQUERY)가 있습니다.
두 방법은 각기 장단점이 있으며, 상황에 따라 적절히 선택해야 합니다.
| 비교 항목 | 조인(JOIN) | 서브쿼리(SUBQUERY) |
|---|---|---|
| 정의 | 여러 테이블을 직접 결합하여 하나의 결과 집합 생성 | 하나의 쿼리 안에서 다른 쿼리를 중첩하여 실행 |
| 사용 위치 | FROM 절에서 사용하여 테이블을 결합 | SELECT, WHERE, HAVING, FROM 등에서 사용 가능 |
| 성능 | 대량 데이터 처리 시 성능이 좋음 (인덱스 활용 가능) | 데이터가 적을 때는 간단하지만, 큰 데이터셋에서는 느려질 수 있음 |
| 가독성 | 테이블 관계가 명확해 가독성이 높음 | 단순한 경우는 가독성이 좋으나, 복잡해질수록 이해하기 어려울 수 있음 |
| 응용 사례 | 여러 테이블을 동시에 조회할 때 적합 | 단일 값 조회, 조건 필터링, 가상 테이블 생성 등에 적합 |
| 예제 | sql SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id; | sql SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE department_name = 'IT'); |
| FROM 절 서브쿼리 예제 | sql SELECT * FROM (SELECT name, salary FROM employees WHERE department_id = 1) AS dept_1_employees; | sql SELECT dept_1_employees.name, dept_1_employees.salary FROM (SELECT name, salary FROM employees WHERE department_id = 1) AS dept_1_employees; |
정리
- 조인(JOIN)은 여러 테이블을 한 번에 결합하여 데이터를 조회할 때 적합합니다.
- 서브쿼리(SUBQUERY)는
FROM절에서 가상 테이블을 만들거나 조건을 동적으로 생성하는 데 유용합니다.- 성능이 중요한 경우 조인(JOIN)을 우선 고려하는 것이 일반적입니다.