서버 개발/MySQL

MySQL - (7) JOIN

Johnny Yoon 2019. 8. 10. 14:28
728x90
반응형

 

 

MySQL 포스팅

(1) SELECT

(2) 집계함수

(3) VIEW

(4) 윈도우 함수

(5) 데이터 갱신

(6) 조건 분기

(7) JOIN


JOIN

Join이란 두개의 테이블을 합쳐 어떠한 결과물을 내는 작업입니다.

이때, 대개의 경우 컬럼명이 같은 컬럼을 기준으로 Join을 수행합니다.

 

SQL에서 지원하는 Join의 종류는 다음과 같습니다.

  • NATURAL JOIN
  • INNER JOIN
  • LEFT/RIGHT JOIN
  • SELF JOIN

이번 포스팅에서는 NATURAL JOIN과 FULL JOIN, 그리고 INNER JOIN에 대해서 알아보겠습니다.

 

데이터 준비

JOIN을 하려면 (SELF JOIN을 제외하면) 테이블이 두개 이상 필요합니다.

먼저 Customer테이블 이외에 Orders테이블을 생성해주겠습니다.

샘플을 다음과 같고, 파일을 첨부하겠습니다.

OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2
10251 84 3 1996-07-08 1
10252 76 4 1996-07-09 2

orders.csv
0.00MB

 

NATURAL JOIN

NATURAL JOIN은 결합할 조건을 지정하지 않고 SQL이 알아서 이름이 같은 컬럼을 사용해 JOIN을 수행하는 것입니다.

문법은 다음과 같습니다.

SELECT 컬럼명, ...
FROM 테이블
NATURAL JOIN
테이블 (혹은 SELECT를 이용한 가상 테이블)

보통은 SELECT문으로 사용하고, FROM에서 테이블(혹은 가상테이블)끼리 JOIN을 수행하는 형식입니다.

 

다음은 customers테이블과 orders테이블을 NATURAL JOIN하는 쿼리입니다.

SELECT * 
FROM customers 
NATURAL JOIN orders;

 

위 쿼리의 결과중 상위 5개는 다음과 같습니다.

CustomerID의 순서가 바뀐 것을 볼 수 있습니다.

이는 orders테이블에는 CustomerID가 unique한 값이 아니기 때문인데요,

결과 메시지를 보시면 다음과 같이 196줄, 즉 orders의 레코드 수와 같은것을 볼 수 있습니다.

위의 JOIN의 결과는 CustomerID로 Join이 되었을 것입니다.

 

INNER JOIN

INNER JOIN은 NATURAL JOIN과 매우 비슷합니다.

하지만 INNER JOIN에서는 JOIN할 컬럼을 지정해주어야 합니다.

또한 INNER JOIN은 조인할 테이블의 모든 값들이 존재하는 값이어야 합니다.

INNER JOIN의 문법은 다음과 같습니다.

SELECT 컬럼명, ...
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.컬럼명 테이블2.컬럼명

NATURAL JOIN에서와 같이 테이블은 가상테이블이 될 수 있습니다.

 

INNER JOIN을 사용해서 위와 같은 결과를 내는 쿼리를 만들어 보겠습니다.

SELECT *
FROM customers
INNER JOIN orders ON customers.CustomerID = orders.CustomerID;

 

위의 쿼리의 결과중 상위 5개는 다음과 같습니다.

한가지 다른점이 있다면, 이 테이블에는 CustomerID가 두개가 존재합니다.

 

각각의 컬럼들은 암묵적으로 출신 테이블을 내포하고 있습니다.

따라서 현실적으로는 모든 컬럼이 필요하지 않기 때문에 다음과 같이 컬럼명을 지정해 쿼리를 많이 사용합니다.

SELECT orders.OrderID, customers.CustomerID, customers.CustomerName
FROM customers
INNER JOIN orders ON customers.CustomerID = orders.CustomerID;

 

위 쿼리의 수행 결과 중 상위 5개는 다음과 같습니다.

 

LEFT/RIGHT JOIN

LEFT/RIGHT JOIN을 LEFT OUTER JOIN혹은 RIGHT OUTER JOIN이라고도 합니다.

이렇게 부르는 이유는 INNER JOIN과는 반대로 한쪽에 NULL값이 존재해도,

해당 행에 JOIN을 수행한다는 의미입니다.

(참고로 MySQL은 FULL OUTER JOIN을 지원하지 않습니다.)

 

LEFT/RIGHT JOIN의 문법은 다음과 같습니다. (RIGHT은 LEFT를 RIGHT으로 바꾸면 됩니다.)

SELECT 컬럼명, ...
FROM 테이블1
LEFT JOIN 테이블2
ON 테이블1.컬럼명 테이블2.컬럼명

모든 OUTER JOIN은 WHERE문도 지원합니다.

 

위에서 살펴본 예제에서 Order를 하지 않은 Customer들까지 JOIN을 하려면 다음과 같은 쿼리를 수행하면 됩니다.

SELECT customers.CustomerID, customers.CustomerName, orders.OrderID
FROM customers
LEFT JOIN orders ON customers.CustomerID = orders.CustomerID;

 

위 쿼리의 수행 결과 중 하위 5개 결과는 다음과 같습니다.

결과를 보시면, OrderID에 NULL값이 존재합니다.

이는 주문이 없는 고객이 있다는 의미입니다.

 

SELF JOIN

SELF JOIN은 한 테이블 안에서의 연산, 집계, 혹은 연관성 분석을 할 때 쓰입니다.

SELF JOIN은 키워드가 존재한다기 보다는 개념이기 때문에, 별도의 문법이 존재하지는 않습니다.

따라서 (거의 모든 JOIN이 그렇지만) SELF JOIN을 JOIN문법이 없이도 수행이 가능합니다.

 

만약 같은 도시의 사용자들 끼리 Align 시켜놓고 상관관계를 분석하기 위해 테이블을 생성한다고 가정해 봅시다.

아래의 쿼리를 사용하면, 같은 도시의 사용자들을 CROSS JOIN을 수행할 수 있습니다.

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM customers A, customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;

위 쿼리의 결과 중 상위 10개는 다음과 같습니다.

 

이번에는 JOIN을 쓰는 예제로 조금 더 응용해 보겠습니다.

같은 나라에 살지만, 도시가 다른 사용자들을 Align시켜 비교하는 테이블을 만들어 보겠습니다.

SELECT A.CustomerName, B.CustomerName, A.City, B.City, A.Country 
FROM customers A JOIN customers B
WHERE A.CustomerName <> B.CustomerName
AND A.Country = B.Country
ORDER BY A.Country;

 

위 쿼리의 결과 중 상위 10개는 다음과 같습니다.

 

위 두 쿼리의 차이는, 가상테이블 두개에 각각의 SELECT문을 돌리느냐,

JOIN을 수행해 하나의 가상테이블에 SELECT문을 돌리느냐의 차이 입니다.

 

여기까지 JOIN에 대해서 알아보았습니다.


MySQL 포스팅

(1) SELECT

(2) 집계함수

(3) VIEW

(4) 윈도우 함수

(5) 데이터 갱신

(6) 조건 분기

(7) JOIN


참고자료

https://www.w3schools.com/sql

https://yahwang.github.io/posts/33

728x90
반응형

'서버 개발 > MySQL' 카테고리의 다른 글

MySQL - (6) 조건분기  (0) 2019.08.10
MySQL - (5) 데이터 갱신  (0) 2019.08.10
MySQL - (4) 윈도우 함수  (0) 2019.08.10
MySQL - (3) VIEW  (0) 2019.08.09
MySQL - (2) 집계함수  (0) 2019.08.08