Subquery를 사용하면 쿼리 안에서 다른 쿼리를 사용하여 불러온 데이터를 활용할 수 있다.
조건문에서의 단순한 비교 연산이나 IN 키워드 외에 더 다양한 Subquery 활용법을 알아보자.
SOME, ALL
SOME 키워드를 사용하면 조회한 데이터에 하나라도 조건을 만족하는지,
ALL 키워드를 사용하면 조회한 모든 데이터가 조건을 만족하는지 검사할 수 있다.
SELECT name
FROM instructor
WHERE salary > SOME(SELECT salary
FROM instructor
WHERE dept_name='Comp.Sci.')
예를 들어, 위 쿼리는 컴퓨터공학과 교수 최소 한명보다 연봉이 높은 교수들의 이름을 조회하는 쿼리이다.
SELECT name
FROM instructor
WHERE salary > ALL(SELECT salary
FROM instructor
WHERE dept_name='Comp.Sci.')
반대로, ALL 키워드를 붙이면 모든 컴퓨터공학과 교수들보다 연봉이 높은 교수들의 이름을 조회할 수 있다.
EXISTS, NOT EXISTS
EXISTS, NOT EXISTS 키워드를 통해서는 Subquery의 결과가 존재하는지 존재하지 않는지 검사할 수 있다.
SELECT name
FROM instructor AS A
WHERE dept_name='Comp.Sci.' AND
EXISTS (SELECT *
FROM instructor AS B
WHERE A.name = B.name)
예를 들어, 위 쿼리는 컴퓨터공학과 교수 중 동명이인이 존재하는 교수를 찾는 쿼리이다.
SELECT name
FROM instructor AS A
WHERE dept_name='Comp.Sci.' AND
NOT EXISTS (SELECT *
FROM instructor AS B
WHERE A.name = B.name)
반대로, 위 쿼리는 컴퓨터공학과 교수 중 동명이인이 존재하지 않는 교수를 찾는 쿼리이다.
UNIQUE
UNIQUE 키워드를 통해서는 Subquery의 결과가 중복된 항목을 갖고있는지 검사할 수 있다.
SELECT A.name
FROM instructor AS A
WHERE UNIQUE(SELECT B.name
FROM instructor AS B
WHERE A.name = B.name)
예를 들어, 위 쿼리는 동명이인이 존재하는 교수들의 이름을 출력하는 쿼리이다.
WITH
WITH 키워드를 사용하면 Subquery의 결과를 새로운 테이블로 만들어 사용할 수 있다.
WITH avg_salary(value) AS
(SELECT AVG(salary) FROM instructor)
SELECT salary
FROM instructor, avg_salary
WHERE instructor.salary > avg_salary.value
예를 들어, 위 쿼리는 교수들의 평균 연봉을 계산하여 avg_salary 테이블을 만든 뒤,
이를 통해 평균 연봉보다 높은 연봉의 교수들을 조회하는 쿼리이다.
'Computer Science > Database' 카테고리의 다른 글
Entity-Relationship Model & Diagram (0) | 2020.06.16 |
---|---|
[SQL] INNER JOIN, OUTER JOIN, NATURAL JOIN (0) | 2020.06.16 |
[SQL] Subquery, Scalar Subquery, Inline View (0) | 2020.06.16 |
[SQL] AVG, MIN, MAX, SUM, COUNT, GROUP BY, HAVING (0) | 2020.06.15 |
[SQL] OR, AND, NOT, IN, IS NULL (0) | 2020.06.15 |