[PostgreSQL] Basic JOIN, INNER,OUTER,UNION
SQL 기초 Join
JOIN
AS
SELECT column AS new_name FROM table;
SELECT SUM(column) AS new_name FROM table;
- 별칭으로 프린트 위에 같은 경우 column 대신에 new_name 으로 출력됨
- AS 문은 가장 마지막에 실행됨
INNER JOINS
SELECT * FROM TableA INNER JOIN TableB ON TableA.col_match = TableB.col_match;

주의사항
- 중복이 일어난다.
REGISTRATIONS
| reg_id | name |
|---|---|
| 1 | Andrew |
| 2 | Bob |
| 3 | Cha |
| 4 | David |
LOGINS
| log_id | name |
|---|---|
| 1 | Xavier |
| 2 | Andrew |
| 3 | Y |
| 4 | Bob |
RESULTS
| reg_id | name | log_id | name |
|---|---|---|---|
| 1 | Andrew | 2 | Andrew |
| 2 | Bob | 4 | Bob |
SELECT * FROM Registrations INNER JOIN Logins ON Registrations.name = Logins.name;
- 중복을 제거하려면 원하는 열을 지정해야한다
SELECT reg_id, Logins.name.log_id FROM Registrations INNER JOIN Logins ON Registrations.name = Logins.name; - name 이 중복되기 때문에 어떤 테이블을 참조할 건지 정해줘야한다.
- 어차피 값은 같기 때문에 어떤 테이블을 참조할건지는 중요하지 않다.
OUTER JOINS
- OUTER JOIN 은 꽤 복잡하다. LEFT/RIGHT OUTER JOIN을 다룰 때는 더더욱 그렇다.
FULL OUTER JOIN
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.col_match = TableB.col_match;

REGISTRATIONS
| reg_id | name |
|---|---|
| 1 | Andrew |
| 2 | Bob |
| 3 | Cha |
| 4 | David |
LOGINS
| log_id | name |
|---|---|
| 1 | Xavier |
| 2 | Andrew |
| 3 | Y |
| 4 | Bob |
SELECT * FROM Registrations FULL OUTER JOIN Logins ON Registrations.name = Logins.name;
RESULTS
| reg_id | name | log_id | name |
|---|---|---|---|
| 1 | Andrew | 2 | Andrew |
| 2 | Bob | 4 | Bob |
| 3 | Cha | null | null |
| 4 | David | null | null |
| null | null | 1 | Xavier |
| null | null | 4 | Y |

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.col_match = TableB.col_match WHERE TableA.id IS null OR TableB.id IS 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;
RESULTS
| reg_id | name | log_id | name |
|---|---|---|---|
| 3 | Cha | null | null |
| 4 | David | null | null |
| null | null | 1 | Xavier |
| null | null | 4 | Y |
LEFT OUTER JOIN
- LEFT OUTER JOIN은 왼쪽 테이블에 있는 레코드 세트를 결과로 출력한다.
- 오른쪽 테이블에 일치하는 내용이 없으면 그 결과는 null 이다.
- FULL OUTER JOIN 과는 다르게 순서가 중요하다.
LEFT OUTER JOIN은LEFT JOIN으로도 사용 가능하다.- WHERE 문을 추가하여 LEFT OUTER JOIN을 추가로 수정할 수 있다.

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

SELECT * FROM Registrations LEFT OUTER JOIN Logins ON Registrations.name = Logins.name;
RESULTS
| reg_id | name | log_id | name |
|---|---|---|---|
| 1 | Andrew | 2 | Andrew |
| 2 | Bob | 4 | Bob |
| 3 | Charlie | null | null |
| 4 | David | null | null |
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.col_match = TableB.col_match WHERE TableB.id IS null

SELECT * FROM Registrations LEFT OUTER JOIN Logins ON Registrations.name = Logins.name
WHERE Logins.log_id IS null;
RESULTS
| reg_id | name | log_id | name |
|---|---|---|---|
| 3 | Charlie | null | null |
| 4 | David | null | null |
RIGHT OUTER JOIN
- RIGHT JOIN은 기본적으로 LEFT JOIN과 완전히 동일하지만 테이블이 서로 바뀐다는 점만 다르다.
SELECT * FROM TableA RIGHT OUTER JOIN TableB
ON TableA.col_match = TableB.col_match

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

UNION
- UNION은 이미 나온 두 결과를 직접 붙인다는게 JOIN과의 차이점이다.
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;

Result
SELECT column_name(s) FROM Sales2021_Q1
UNION
SELECT column_name(s) FROM Sales2021_Q2;

- ORDER BY name 으로 정렬할 수도 있다
3개 이상의 테이블을 합치는 법
SELECT title,actor.first_name, actor.last_name FROM film
FULL OUTER JOIN film_actor ON film.film_id = film_actor.film_id
FULL OUTER JOIN actor ON actor.actor_id = film_actor.actor_id
WHERE actor.first_name = 'Nick' AND actor.last_name = 'Wahlberg';
SELECT title, first_name, last_name FROM film_actor
INNER JOIN actor ON film_actor.actor_id = actor.actor_id
INNER JOIN film ON film_actor.film_id = film.film_id
WHERE actor.first_name = 'Nick' AND actor.last_name = 'Wahlberg';
위와 같이 다양하게 조합해서 사용 가능하다.
- 핵심은 JOIN 구문을 연속해서 사용하는점
- SELECT 부분에서 컬럼 이름만 써도 알아서 찾아진다는 점
- WHERE 부분에서는 어디로 부터온 컬럼인지 적어둔다는 점
댓글남기기