본문 바로가기

공부 기록/Database

쿼리 안의 쿼리(서브쿼리)

서브쿼리(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

https://youtu.be/lwmwlA2WhFc

 

'공부 기록 > 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