SQL & DB/PostgreSQL

[PostgreSQL] 테이블 가로 결합(JOIN) (LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN)

YSY^ 2021. 1. 7. 21:01

테이블 가로 결합(JOIN)

JOIN을 활용하여 두개 이상의 테이블을 가로로 결합할 수 있습니다.

ON t1.column1 = t2.column1 이런식으로 조인해줄 칼럼을 지정해주면 됩니다.

 

JOIN의 종류

- (INNER) JOIN : Table1과 Table2에서 값이 같은 행만 반환

- LEFT (OUTER) JOIN : JOIN 왼쪽에 있는 Table1의 모든 결과를 가지고 온 후 Table2와 매칭하며, 매칭되는 데이터가 없을 경우 NULL값 삽입

- RIGHT (OUTER) JOIN : JOIN 오른쪽에 있는 Table2의 모든 결과를 가지고 온 후 Table1와 매칭하며, 매칭되는 데이터가 없을 경우 NULL값 삽입

- FULL(OUTER) JOIN : Table1과 Table2을 매칭시키고 데이터가 없는 경우 NULL처리

- CROSS JOIN : Table1과 Table2의 모든 행을 JOIN한다. 결과는 두 테이블의 행의 개수를 곱한 것과 같음

 

DATASET QUERY

CREATE TABLE categories_sales (
    category_id integer
  , name        varchar(255)
  , sales_amount  integer
);

INSERT INTO categories_sales
VALUES
    (1, 'dvd', 850000 )
  , (3, 'book', 444444)
  , (4, 'tape', 300000)
;

CREATE TABLE sales_ranking (
    category_id integer
  , rank        integer
  , product_id  varchar(255)
  , sales       integer
);

INSERT INTO sales_ranking
VALUES
    (1, 1, 'D001', 50000)
  , (1, 2, 'D002', 20000)
  , (1, 3, 'D003', 10000)
  , (2, 1, 'B001', 60000)
  , (2, 2, 'B002', 30000)
  , (2, 3, 'B003', 40000)
  , (3, 1, 'A001', 60000)
  , (3, 2, 'A002', 30000)
  , (3, 3, 'A003', 40000)
;

INNER JOIN

select
	m.category_id
	,m.name
	,m.sales_amount
	,s.product_id
	,s.sales
from 
	categories_sales as m
	JOIN
		sales_ranking as s
		ON m.category_id = s.category_id;

LEFT JOIN

select
	m.category_id
	,m.name
	,m.sales_amount
	,s.product_id
	,s.sales
from 
	categories_sales as m
	LEFT JOIN
		sales_ranking as s
		ON m.category_id = s.category_id;

RIGHT JOIN

select
	m.category_id
	,m.name
	,m.sales_amount
	,s.product_id
	,s.sales
from 
	categories_sales as m
	 RIGHT JOIN
		sales_ranking as s
		ON m.category_id = s.category_id;

FULL JOIN

select
	m.category_id
	,m.name
	,m.sales_amount
	,s.product_id
	,s.sales
from 
	categories_sales as m
	 FULL OUTER JOIN
		sales_ranking as s
		ON m.category_id = s.category_id;

CROSS JOIN

Cross join은 on으로 묶어줄 필요가 없다.

select
	m.category_id
	,m.name
	,m.sales_amount
	,s.product_id
	,s.sales
from 
	categories_sales as m
	 CROSS JOIN
		sales_ranking as s

728x90
반응형