STUDY/database

[MySQL] 데이터 조회(2) subquery

까미이모 2023. 11. 27. 16:24
  • 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