[PostgreSQL] JOIN / UNION

도톨이·2024년 2월 26일
0

SQL

목록 보기
4/19

JOIN

JOIN 은 여러 테이블에서 정보를 결합할 수 있게 해준다.

Inner Joins, Full Outer Joins, Left Outer Joins, Right Joins 등이 있다.

AS statement

AS 는 출력에 표시할 새로운 이름을 정할 떄 사용된다.

SELECT column AS new_name FROM table;

주의할 점은 AS 문은 가장 마지막에 칼럼의 별칭으로 바꾸는 것이므로 WHERE 이나 HAVING 문에서 별칭으로 적으면 안된다. 아래 사진은 정상적으로 작동하나, 두번째 사진에서는 오류가 발생함을 확인할 수 있다.

Inner Join

inner join 은 가장 간단한 join 유형이다.

inner join 은 두 테이블 내에 일치하는 걸 찾을 떄 사용된다.

예를 들어 아래 처럼 Registration 테이블과 logins 테이블이 있다고 할 때, INNER JOIN 은 둘 다에서 매치되는 애들을 결과로 출력한다.

문법

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.col_match = TableB.col_match

위 예시에서는 다음처럼 사용한다.

SELECT * FROM Registrations
INNER JOIN Logins
ON Registrations.name = Logins.name

INNER JOIN 이기 때문에 SELECT FROM Registrations 와 SELECT FROM LOGINS 이 똑같이 되게 된다.

실습은 payment 테이블과 customer 테이블에서 customer_id 가 같으므로 해당 칼럼으로 inner join 하였다.

OUTER JOIN

OUTER JOIN 은 두 테이블에 동시에 있는 행만 가져오지만 OUTER JOIN 은 조금 더 복잡하다.

FULL OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN 으로 나눌 수 있다.

FULL OUTER JOIN

FULL OUTER JOIN 은 모든 행을 가져온다고 보면 된다.

아래와 같은 예시에서는 Andrew, Bob, Charlie, David, Xavier, Yolanda 를 가져온다.

벤다이어그램으로 표현하면 이렇다.

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.col_match = TableB.col_match

WHERE 을 쓰면 겹치는 애들을 제외할 수도 있다.

id가 null 인 애들만 출력할 수 있기 때문이다.

SELECT * FROM Registrations FULL OUTER JOIN Logins
ON Registrations.name = Logins.name
WHERE Registrations.reg_id IS null OR
Logins.log_id IS null

LEFT OUTER JOIN

LEFT OUTER JOIN 은 TableA 만 리턴하게 된다. 아래 사진처럼 말이다. 만약 우리가 A에는 있지만 B에는 없는 데이터를 보려고 할 때 LEFT OUTER JOIN 을 사용할 수 있다.

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match

벤 다이어그램으로 표현하면 이렇다. FULL OUTER JOIN과 INNER JOIN 에서는 순서가 중요하지 않았지만 LEFT OUTER JOIN 은 FROM 뒤에 써진 테이블이 기준이 되므로 테이블의 순서가 중요해진다.

WHERE 을 쓰면 TableA 에는 있으면서 TableB 인 애들을 거를 수 있다.

위에서 봤던 표를 보면, A에 있고 B에 없는 애들은 B의 id 가 null 이 됨을 확인할 수 있었다. 이를 이용하면 unique 한 Table A 행들을 추출할 수 있다.

SELECT * FROM Registrations
LEFT OUTER JOIN Logins
ON Registrations.bane = Logins.name
WHERE Logins.log_id IS null

실습을 해보면, film 테이블에는 있지만 inventory 테이블에는 없는 행들을 다음처럼 뽑아낼 수 있다. 재고에 없는 영화들을 추출할 수 있다.

SELECT film.film_id, film.title, inventory_id, store_id
FROM film 
LEFT OUTER JOIN inventory
ON film.film_id = inventory.film_id
WHERE inventory.film_id IS null

RIGHT OUTER JOIN

다음은 RIGHT JOIN 이다. RIGHT JOIN 은 LEFT JOIN 의 반대격이다.
아래 문장에서 Table A가 아닌 Table B 의 전체 행을 추출한다.

SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match

LEFT JOIN 과 마찬가지로 WHERE 을 사용하면 Table B 이면서 Table A 인 애들을 제외할 수 있다.

SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match
WHERE TableA.id IS null

UNION

UNION 은 결과를 그냥 결합할 때 사용한다.

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

예를 들어 아래와 같은 내용에서 David 는 처음에는 100 다음에는 200을 판매했을 때, 이 둘을 합치기 위해 두번째 사진처럼 합칠 수 있다. 첫번째 쿼리 이후에 두번째 쿼리를 그냥 넣는 것이다.

profile
Computer Engineering

0개의 댓글

관련 채용 정보