1. 서브쿼리 (Subquery)
SQL 쿼리문의 하부 절에 또 다른 SQL 쿼리문을 중첩하여 사용하는 기법을 말한다. 주의할 점은, 서브쿼리는 항상 연산자의 우측에 존재해야 하며 반드시 괄호로 묶어줘야 한다는 것이다. 서브쿼리는 다음과 같이 간단히 분류해볼 수 있다.
대분류 | 소분류 |
위치에 따른 분류 | SELECT 문에 존재하는 서브쿼리 |
FROM 절에 존재하는 서브쿼리 | |
WHERE 절에 존재하는 서브쿼리 | |
반환 값에 따른 분류 | 단일 행 서브쿼리 (단일 행 + 단일 열) |
다중 행 서브쿼리 (다중 행 + 단일 열) | |
다중 열 서브쿼리 (다중 행 + 다중 열) |
2. 서브쿼리의 분류
2-1. 단일 행 서브쿼리 (Single Row Subquery)
단일 행 비교 연산자인 =, <, >, <=, >= 등을 사용할 수 있다.
EX) 이름이 SMITH인 직원의 부서에 속한 직원들의 이름/부서번호를 출력
SELECT name, dept_no FROM employee WHERE dept_no = (SELECT dept_no FROM employee WHERE name='SMITH'); |
2-2. 다중 행 서브쿼리 (Multiple Row Subquery)
다중 행 비교 연산자인 IN, > ANY, < ALL, < ANY, > ALL, EXIST 등을 사용할 수 있다.
EX) 직업이 PRESIDENT인 직원의 부서들에 속한 직원들의 이름/직업/부서번호를 출력
SELECT name, job, dept_no FROM employee WHERE dept_no IN (SELECT dept_no FROM employee WHERE job='PRESIDENT'); |
2-3. 다중 열 서브쿼리 (Multiple Column Subquery)
대응하는 컬럼의 개수가 반드시 같아야 한다.
EX) 부서별로 봉급이 최소인 직원들의 부서번호/이름/봉급을 출력
SELECT dept_no, name, salary FROM employee WHERE (dept_no, salary) IN (SELECT dept_no, MIN(salary) FROM employee GROUP BY dept_no); |
2-4. 스칼라 서브쿼리 (Scala Subquery)
SELECT 문에서 사용하는 서브쿼리로, 1행만 반환한다.
EX) 직업이 MANAGER인 직원들의 이름/부서이름/직업을 출력
SELECT name, (SELECT d_name FROM department d WHERE d.dept_no = e.dept_no) dept_name, job FROM employee e WHERE job='MANAGER'; |
2-5. 상호연관 서브쿼리 (Correlated Subquery)
메인쿼리의 값을 서브쿼리에게 전달하고 서브쿼리를 수행한 뒤, 그 결과를 다시 메인쿼리로 돌려주고 메인쿼리를 수행하는 것이다.
EX) 자신이 속한 부서의 봉급 평균보다 많은 봉급을 받는 직원들의 이름/부서번호/봉급을 부서 번호순으로 출력
SELECT name, dept_no, salary FROM employee e1 WHERE salary > (SELECT AVG(salary) FROM employee e2 WHERE e2.dept_no=e1.dept_no) ORDER BY dept_no; |
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
'데이터베이스 (Database)' 카테고리의 다른 글
[Database] 인덱스 (Index), B-Tree (0) | 2020.06.23 |
---|---|
[Database] 트랜잭션 (Transaction) (0) | 2020.06.18 |