2 분 소요

SQL 기초 Join

JOIN

벤다이어그램 설명
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 JOINLEFT 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';

위와 같이 다양하게 조합해서 사용 가능하다.

  1. 핵심은 JOIN 구문을 연속해서 사용하는점
  2. SELECT 부분에서 컬럼 이름만 써도 알아서 찾아진다는 점
  3. WHERE 부분에서는 어디로 부터온 컬럼인지 적어둔다는 점

댓글남기기