서브쿼리(Subquery)
- nested query or inner query
- SELECT, INSERT, UPDATE, DELETE에 포함된 query
서브쿼리를 사용한 예시
- ID가 14인 임직원보다 생일이 빠른 임직원의 ID, 이름, 생일을 알고 싶을 때
SELECT id, name, birth_date FROM employee
WHERE birth_date < ( SELECT birth_date FROM employee WHERE id = 14);
- ID가 1인 임직원과 같은 부서, 같은 성별인 임직원들의 ID, 이름, 직군을 알고 싶을 때
SELECT id, name, position
FROM employee
WHERE (dept_id, gender) = ( SELECT dept_id, gender FROM employee WHERE id = 1);
- ID가 5인 임직원과 같은 프로젝트에 참여한 임직원들의 ID를 알고 싶을 때
SELECT DISTINCT empl_id FROM works_on WHERE empl_id != 5 AND proj_id IN (
SELECT proj_id FROM works_on WHERE empl_id = 5;
- ID가 7 혹은 12인 임직원이 참여한 프로젝트의 ID와 이름을 알고 싶을 때
SELECT P.id, P.name FROM project P
WHERE EXISTS ( SELECT * FROM works_on W
WHERE W.proj_id = P.id AND W.empl_id IN (7,12));
# 또는
SELECT P.id, P.name FROM project P
WHERE id IN ( SELECT W.proj_id FROM works_on W
WHERE W.empl_id IN (7,12);
- 2000년대생이 없는 부서의 ID와 이름을 알고 싶을 때
SELECT D.id, D.name FROM department AS D
WHERE NOT EXISTS ( SELECT * FROM employee E
WHERE E.dept_id = D.id AND E.birth_date >= '2000-01-01');
# 또는
SELECT D.id, D.name FROM department AS D
WHERE D.id NOT IN ( SELECT E.dept_id FROM employee E
WHERE E.birth_date >= '2000-01-01');
- 리더보다 높은 연봉을 받는 부서원을 가진 리더의 ID, 이름, 연봉을 알고 싶을 때
SELECT E.id, E.name, E.salary
FROM department D, employee E
WHERE D.leader_id = E.id AND E.salary < ANY (
SELECT salary FROM employee WHERE id <> D.leader_id AND dept_id = E.dept_id);
- ID가 13인 임직원과 한번도 같은 프로젝트에 참여하지 못한 임직원들의 ID, 이름, 직군을 알고 싶을 때
SELECT DISTINCT E.id, E.name, E.position
FROM employee E, works_on W
WHERE E.id = W.empl_id AND W.proj_id <> ALL (
SELECT proj_id FROM works_on WHERE empl_id = 13);
* 참고
- <> 는 != 와 같다.
- IN & NOT IN
- EXISTS : 서브쿼리의 결과가 최소 하나의 row라도 있다면 TRUE를 반환한다.(vs NOT EXISTS)
- Correlated query : 서브쿼리가 바깥쪽 쿼리의 attribute를 참조할 때, correlated subquery라 부른다.
- unqualified attribute가 참조하는 테이블은 해당 attribute가 사용된 쿼리를 포함하여 그 쿼리의 바깥쪽으로 존재하는 모든 쿼리들 중에 해당 attribute 이름을 가지는 가장 가까이에 있는 테이블을 참조한다.
- V 비교_연산자 ANY 서브쿼리 : 서브쿼리가 반환한 결과들 중에 하나라도 V와의 비교 연산이 TRUE라면 TRUE를 반환한다.(= SOME)
- ALL
'공부 기록 > Database' 카테고리의 다른 글
Join (0) | 2023.06.02 |
---|---|
Three-Valued Logic (0) | 2023.05.04 |
DML - 데이터 조작하기 (0) | 2023.01.19 |
DDL - Table 생성하기, 목록 및 구조 확인 (0) | 2023.01.19 |
Database 생성, 접속하기 (0) | 2023.01.19 |