서로 다른 테이블을 세로 방향으로 합치기 위해선 2개의 쿼리문 사이에 연결 명령어를 추가하면 된다.
이때 2가지 조건을 충족해야한다.
1.두 SQL은 서로 컬럼의 개수가 동일할것
2.두 SQL의 컬럼의 타입이 동일할 것
EXCEPT, EXCEPT ALL
# EXCEPT
두 테이블 차집합. 서로 중복되는 행은 1개만 출력
(
(select id, name, quantity from drink)
union all
(select id, name, quantity from ramen)
union all
(select id, name, quantity from drink)
)
except
(
(select id, name, quantity from drink)
union all
(select id, name, quantity from canned_food)
) order by id asc;
id | name | quantity
----+------------+----------
1 | 진라멘 | 2
2 | 고추짜장면 | 15
3 | 리얼짬뽕 | 47
4 | 추풍라면 | 18
5 | 겨울이라면 | 50
(5 rows)
윗쿼리는 5(drink) * 2 + 5(ramen)으로 15개행 아래쿼리는 5(drink) + 5(canned_food) 10개행.
except로 공통된 drink행이 전부 제거되어 결과로 ramen의 5개행만 출력.
# EXCEPT ALL
두 테이블의 차집합. 중복여부 체크x
(
(select id, name, quantity from drink)
union all
(select id, name, quantity from ramen)
union all
(select id, name, quantity from drink)
)
except all
(
(select id, name, quantity from drink)
union all
(select id, name, quantity from canned_food)
) order by id asc;
id | name | quantity
----+--------------+----------
1 | 에너지드링크 | 36
1 | 진라멘 | 2
2 | 오렌지주스 | 38
2 | 고추짜장면 | 15
3 | 리얼짬뽕 | 47
3 | 무안단물 | 41
4 | 순진맥주 | 47
4 | 추풍라면 | 18
5 | 겨울이라면 | 50
5 | 더맛 | 3
(10 rows)
윗쿼리는 5(drink) * 2 + 5(ramen)으로 15개행 아래쿼리는 5(drink) + 5(canned_food) 10개행.
except all로 drink행이 윗쿼리와 아래쿼리에서 5개씩 제거되어도
윗쿼리엔 또 한번의 drink행의 정보가 잔존하여 10개행 출력.
'SQL' 카테고리의 다른 글
SQL 테이블 열연결(FROM, WHERE) (1) | 2025.02.05 |
---|---|
SQL 테이블 행연결 응용 (1) | 2025.02.05 |
SQL 테이블 행연결(UNION, UNION ALL) (0) | 2025.02.05 |
SQL 테이블 행연결(INTERSECT, INTERSECT ALL) (2) | 2025.01.31 |
SQL 5장 실습문제 (1) | 2025.01.23 |