- subquery (nested query or inner query) : SELECT, INSERT, UPDATE, DELETE에 포함된 query
- outer query (main query) : subquery를 포함하는 query
- subquery는 ()안에 기술된다
-- subquery ID가 14인 임직원보다 생일이 빠른 임직원의 ID, 이름, 생일을 알고싶다.
select id, name, birth_date
from employee
where birth_date < (
SELECT birth_date
FROM employee
WHERE id = 14
);
IN
- v IN(v1, v2, v3,…): v가 (v1, v2, v3,…)중에 하나와 값이 같다면 TRUE를 return 한다.
- (v1, v2, v3,…)는 명시적인 값들의 집합일 수도 있고 subquery의 결과(set or multiset) 일 수도 있다.
- v NOT IN(v1, v2, v3,…): v가 (v1, v2, v3,…)의 모든 값과 값이 다르다면 TRUE를 return 한다.
-- 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가 5인 임직원과 같은 프로젝트에 참여한 임직원들의 ID와 이름을 알고싶다.
SELECT id, name
FROM employee,
( 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
)
) AS DSTNCT_E
WHERE id = DSTNCT_E.empl_id;
EXISTS / NOT EXISTS
- correlated query : subquery가 바깥쪽 query attribute를 참조할 때, correlated subquery라 부름
- EXISTS : subquery의 결과가 최소 하나의 row라도 있다면 TRUE를 반환
- NOT EXISTS : subquery의 결과가 단 하나의 row도 없다면 TRUE를 반환
-- 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)
);
-- IN으로 표현
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)
);
비교연산 ANY
- v comparison_operator ANY (subquery) : subquery가 반환한 결과들 중에 단 하나라도 v와의 비교 연산이 TRUE라면 TRUE를 반환한다
- SOME도 ANY와 같은 역할을 한다
SELECT E.id, E.name, E.salary,
(
SELECT max(salary)
FROM employee
WHERE dept_id = E.dept_id
) AS dept_max_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
);
- v comparison_operator ALL (subquery): subquery가 반환한 결과들과 v와의 비교연산이 모두 TRUE라면 TRUE를 반환한다
참고: 쉬운코드
'STUDY > database' 카테고리의 다른 글
| [MySQL] 데이터조회(4) JOIN (0) | 2023.11.27 |
|---|---|
| [MySQL]데이터 조회(3) NULL (0) | 2023.11.27 |
| [MySQL] 데이터 조회(1) (1) | 2023.11.27 |
| [MySQL] 데이터 추가, 수정, 삭제 (0) | 2023.11.23 |
| [DB] constrains(제약사항) 설정 (0) | 2023.11.21 |