SQL

SQL 테이블 행연결(EXCEPT, EXCEPT ALL)

봄다온 2025. 2. 5. 12:02

서로 다른 테이블을 세로 방향으로 합치기 위해선 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