SQL 테이블 조인에 관한 내용

dong5854·2022년 3월 28일
0

sql

목록 보기
7/7

Foreign Key

Foreign Key는 외래키라고도 하며 다른 테이블의 특정 row를 식별할 수 있게 해주는 컬럼을 말한다.
외래키를 이용하여 참조할 때 참조를 하는 테이블을 자식 테이블이라고 하고, 참조를 당하는 테이블을 부모 테이블이라고 한다.

Foreign Key는 자식 테이블에 부모 테이블에 존재하지 않는 row를 참조하려고 할 때 에러를 발생시켜 이를 방지하는 역할을 해준다.

Join

JOIN은 여러 테이블을 합쳐 하나로 보이게 해준다. 이번에 예제에 사용할 테이블들은 다음과 같다.
item 테이블

stock 테이블

OUTER JOIN

OUTER JOINLEFT OUTER JOINRIGHT OUTER JOIN이 있는데 이 둘의 차이는 SQL문에서 어느 쪽에 있는 table을 기준으로 JOIN하는지에 따라 달라진다. ON은 두 테이블을 연결할 조건을 명시한다.

# LEFT OUTER JOIN은 왼쪽에 있는 item 테이블을 기준으로 join한다.
SELECT 
	item.id,
	item.name,
    stock.item_id,
    stock.inventory_count
 FROM item LEFT OUTER JOIN stock
 ON item.id = stock.item_id;

# right OUTER JOIN은 오른쪽에 있는 stock 테이블을 기준으로 join한다.
SELECT 
	item.id,
	item.name,
   stock.item_id,
   stock.inventory_count
FROM item RIGHT OUTER JOIN stock
ON item.id = stock.item_id;

INNER JOIN

INNER JOIN는 각 테이블에서 조인 기준으로 사용되는 컬럼들에 일치하는 값이 둘 다 존재하는 경우들만 합치는 JOIN이다. INNER JOINOUTER JOIN에서 LEFT OUTER JOINRIGHT OUTER JOIN이 따로 존재하던 것과는 다르게 기준이 되는 테이블이 따로 없다. 집합으로 치면 교집합을 구한다고 생각하면 이해하기 쉽다.

SELECT 
	item.id,
	item.name,
   stock.item_id,
   stock.inventory_count
FROM item INNER JOIN stock
ON item.id = stock.item_id;

조인할 때 테이블에 alias 붙이기

조인을 할 때는 sql문의 길이기 길어지기 때문에 테이블에 alias를 사용할 때가 많다. 이렇게 alias를 사용할 때는 원래의 테이블 이름을 사용하면 오히려 에러가 난다.

# FROM 절에서 테이블에 alias를 붙이고 이를 사용할 수 있다.
SELECT 
	i.id,
	i.name,
  s.item_id,
  s.inventory_count
FROM item AS i RIGHT OUTER JOIN stock AS s
ON i.id = s.item_id;

ON 대신 USING 사용하기

만약 조인의 기준이 되는 컬럼명이 같은 경우 ON 대신 USING을 사용할 수 있다.

# ON을 사용한 모습
SELECT 
	i.id,
	i.name,
 s.item_id,
 s.inventory_count
FROM item AS i RIGHT OUTER JOIN stock AS s
ON i.id = s.item_id;

#USING을 사용한 모습
SELECT 
	i.id,
	i.name,
 s.item_id,
 s.inventory_count
FROM item AS i RIGHT OUTER JOIN stock AS s
USING(id);

결합 연산과 집합 연산

결합연산은 테이블을 가로 방향으로 합치는 것에 관한 연산이고,
집합연산은 테이블을 세로 방향으로 합치는 것에 관한 연산이다.

이중 조인은 테이블들을 가로 방향으로 이어주기 때문에 결합연산에 해당된다.

그렇다면 집합 연산은 무엇인가?

집합 연산은 같은 종류의 테이블 즉 컬럼 구조가 같은 테이블끼리 가능하다.

(1) 교집합

#INTERSECT 연산자 사용
SELECT * FROM member_A 

INTERSECT 

SELECT * FROM member_B

(2) 차집합

#A-B(MINUS 연산자 또는 EXCEPT 연산자 사용)
SELECT * FROM member_A 

MINUS

SELECT * FROM member_B

#B-A(MINUS 연산자 또는 EXCEPT 연산자 사용)
SELECT * FROM member_B

MINUS

SELECT * FROM member_A

(3) 합집합

#UNION 연산자 사용
SELECT * FROM member_A

UNION

SELECT * FROM member_B

이런 집합 연산자들은 DBMS에 따라 전부 지원하지 않고 UNION연산자만 지원하는 경우가 있다. 따라서 결합 연산에 해당하는 JOIN을 사용하여 간접적으로 원하는 결과를 얻어야 한다.

UNION 추가로 알아 둘 사항

  1. 서로 다른 종류의 테이블도, 조회하는 컬럼을 일치시키면 집합 연산이 가능하다.

    즉 select절 뒤의 부분을 공통적으로 가지고 있는 컬럼 이름으로 바꿔주면 집합 연산이 가능하다.

  2. UNION ALL

    UNION은 기본적으로 중복을 제거해서 보여주는데 UNION ALL을 사용하면 중복을 제거하지 않고 결과를 보여주는 것이 가능하다.

profile
https://github.com/dong5854?tab=repositories

0개의 댓글