DataBase
[postgreSQL] INTERSECT, EXCEPT
바까
2021. 9. 14. 08:08
반응형
--3)INTERSECT 연산자
--두 개 이상의 SELECT문들의 결과 집합을 하나의 결과 집합으로 결합한다.
--즉 테이블1과 테이블2의 교집합을 리턴
SELECT COLUMN_1_1, COLUMN_1_2 --두 개의 SELECT문 간 컬럼의 개수는 동일해야하고
--해당 순서의 열에는 서로 호환되는 데이터 유형이어야한다.
FROM TABLE_NAME_1
INTERSECT
SELECT COLUMN_2_1, COLUMN_2_2
FROM TABLE_NAME_2;
select EMPLOYEE_ID
from keys k
intersect
select employee_id
from HIPOS;
--실무에서 많이쓰이지 않음
--왜냐면 INNER JOIN과 결과가 동일하기 때문
select A.EMPLOYEE_ID
from KEYS A, HIPOS B
where A.employee_id = B.employee_id ;
--ORDER BY 사용
select EMPLOYEE_ID
from keys k
intersect
select employee_id
from hipos h
order by employee_id desc; --마지막 SELECT문 뒤에 order by절
--4)EXCEPT 연산자
--맨위에 SELECT문의 결과 집합에서 그 아래에 있는 SELECT문의 결과 집합을 제외한 결과를 리턴
--테이블 1과 테이블 2의 차집합을 리턴(테이블1-테이블2)
--실무에서 많이 쓰임
select COLUMN_1_1, COLUMN_1_2 --두 개의 SELECT문 간 컬럼의 개수는 동일해야하고
from TABLE_NAME_1 --해당 순서의 열에는 서로 호환되는 데이터 유형이어야한다.
except
select COLUMN_2_1, COLUMN_2_2
from TABLE_NAME_2;
--재고가 존재하는 영화의 필름ID와 영화제목을 추출하는 SQL
select distinct INVENTORY.FILM_ID, TITLE
from INVENTORY
inner join film
on FILM.film_id = INVENTORY.film_id
order by TITLE;
--필름과 인벤토리는 1:M관계 -> 두테이블을 조인하면 -> 영화 하나당 여러개의 재고가 나온다. ->증복을 제거하기위해 DISTINCT사용
--그렇다면 재고가 존재하지 않는 영화는 어떻게 추출하는가
--필름집합 - 재고가 존재하는 영화 = 재고가 존재하지 않은 영화
SELECT FILM_ID, TITLE --전체영화에서
FROM FILM
EXCEPT --재고가 존재하는 영화를 뺀다.
SELECT DISTINCT INVENTORY.FILM_ID, TITLE
FROM INVENTORY
INNER JOIN FILM
ON FILM.FILM_ID = INVENTORY.FILM_ID
ORDER BY TITLE;
반응형