Recommanded Free YOUTUBE Lecture: High Avalibility Application On AWS Cloud

모든 쿼리는 연습용 데이터베이스를 통해서 실행해 볼 수 있다. MySQL & SQL 스터디 준비 를 참고하여 실습환경을 구축하자.

MySQL LEFT JOIN

SQL에서 JOIN은 두 개 이상의 테이블을 관련 열을 기반으로 결합하는 방법이다. INNER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN, SELF JOIN등 다양한 결합 방법들이 있다. 여기에서는 LEFT JOIN을 다룬다.
LEFT JOIN

LEFTER OUTER JOIN 이라고 부르기도 하는 LEFT JOIN은 왼쪽(LEFT) 테이블 의 모든 행을 검색해서 오른쪽 테이블에 일치하는 행을 반환한다. 일치하는 항목이 없을 경우에는 NULL을 포함한다.

LEFT JOIN Syntax

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

Example

"customers" 테이블에는 고객 정보가 들어있다.

CustomerID ContactName Address City Country
ALFKI Maria Anders Obere Str. 57 Berlin Germany
ANATR Ana Trujillo Avda. de la Constitución 2222 México D.F. Mexico
ANTON Antonio Moreno Mataderos 2312 México D.F. Mexico
AROUT Thomas Hardy 120 Hanover Sq. London UK

"orders" 테이블에는 주문정보가 들어있다.

OrderID CustomerID EmployeeID OrderDate ShippedDate ShipName
10248 VINET 5 1994-08-04 00:00:00 1994-08-16 00:00:00 Vins et alcools Chevalier
10249 TOMSP 6 1994-08-05 00:00:00 1994-08-10 00:00:00 Toms Spezialitäten
10250 HANAR 4 1994-08-08 00:00:00 1994-08-12 00:00:00 Hanari Carnes
10251 VICTE 3 1994-08-08 00:00:00 1994-08-15 00:00:00 Victuailles en stock

고객관리 담당자는 DBA에게 각 1996년 01월 01일 이후의 고객별 주문정보를 보고해 달라고 요청했다. 이 문제는 아래와 같이 해결할 수 있다.

  1. orders는 고객별 주문 정보가 있으며, 어떤 고객이 주문했는지는 CustomerID로 고객을 식별 할 수 있다.

  2. 따라서 customers 테이블에 있는 전체 CustomerID에 대해서 orders에 주문정보가 있는지를 조회하면 된다. 두개의 테이블은 CustomerID로 관계가 맺어져 있으므로 CustomerID로 조회하면 된다.

SELECT customers.ContactName, orders.OrderID 
FROM customers LEFT 
JOIN orders ON customers.CustomerID = orders.CustomerID 
WHERE orders.OrderDate > '1996-01-01 00:00:00' 
ORDER BY customers.ContactName;

DBA는 아래와 같이 각 고객별 주문 정보를 얻을 수 있다.

ContactName OrderID
Alejandra Camino 10917
Alejandra Camino 11013
Alexander Feuer 10779
Alexander Feuer 10945
Ana Trujillo 10926
Anabela Domingues 10830

MySQL JOIN

SQL에서 Join은 두 개 이상의 테이블에서 서로 관계가 있는 컬럼을 기반으로 행을 결합하기 위해서 사용한다.

아래 Orders 테이블과 Customers 테이블을 보자.

orders table

OrderID CustomerID OrderDate
10248 VINET 1994-08-04 00:00:00
10249 TOMSP 1994-08-05 00:00:00
10250 HANAR 1994-08-08 00:00:00
10251 VICTE 1994-08-08 00:00:00
10252 SUPRD 1994-08-09 00:00:00
10253 HANAR 1994-08-10 00:00:00
10254 CHOPS 1994-08-11 00:00:00

customers table

CustomerID ContactName Country City
ALFKI Maria Anders Germany Berlin
ANATR Ana Trujillo Mexico México D.F.
ANTON Antonio Moreno Mexico México D.F.
AROUT Thomas Hardy UK London
BERGS Christina Berglund Sweden Luleå
BLAUS Hanna Moos Germany Mannheim
BLONP Frédérique Citeaux France Strasbourg

orders 테이블과 customers 테이블은 CustomerID 컬럼을 공통으로 가지고 있다. 즉 두 개의 테이블은 CustomerID로 관계(relationship)가 맺어져 있다. 우리는 CustomerID 컬럼을 이용해서 두 개의 테이블을 JOIN 하여 원하는 정보를 얻을 수 있다.

본사의 주문관리자가 고객 별 주문일자와 선적일자가 담긴 정보를 요청했다고 가정해보자. 아래와같이 INNER JOIN으로 레포트를 만들 수 있다.

SELECT orders.OrderID, customers.CustomerName, orders.OrderDate
FROM orders
INNER JOIN customers ON orders.CustomerID=customers.CustomerID;
OrderID ContactName OrderDate ShippedDate
10248 Paul Henriot 1994-08-04 00:00:00 1994-08-16 00:00:00
10249 Karin Josephs 1994-08-05 00:00:00 1994-08-10 00:00:00
10250 Mario Pontes 1994-08-08 00:00:00 1994-08-12 00:00:00
10251 Mary Saveley 1994-08-08 00:00:00 1994-08-15 00:00:00
10252 Pascale Cartrain 1994-08-09 00:00:00 1994-08-11 00:00:00
10253 Mario Pontes 1994-08-10 00:00:00 1994-08-16 00:00:00
10254 Yang Wang 1994-08-11 00:00:00 1994-08-23 00:00:00

Join 유형

sql join
JOIN은 결합 방법에 따라 INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN 이 있다.

  • INNER JOIN : 한 테이블의 각 행을 다른 테이블의 모든 행과 비교하여 일치하는 행을 찾는다. 일치하는 행을 찾으면 두 테이블의 행을 단일 행으로 결합한다.

  • LEFT JOIN : 두 테이블 모두에서 일치하는 행만 반환하는 INNER JOIN과 달리 LEFT JOIN은 일치하지 않는 왼쪽(LEFT) 테이블의 결과도 반환한다. 이러한 행은 NULL 값을 가진다.

  • RIGHT JOIN : 두 테이블 모두에서 일치하는 행만 반환하는 INNER JOIN과 달리 RIGHT JOIN은 일치하지 않는 오른쪽(RIGHT) 테이블의 결과도 반환한다. 이러한 행은 NULL 값을 가진다.

  • CROSS JOIN : 양쪽 테이블의 모든 행을 반환한다. 특정 행이 다른 테이블의 모든 행과 join 되기 때문에 n x n의 결과가 반환된다. 한쪽 테이블의 행의 갯수가 10,000 이고 다른 하나의 행의 갯수가 100,000 이라면 10,000 x 100,000의 행이 반환될 수 있다. 자주 사용하는 join 유형은 아니다.

JOIN Syntax

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name

참고

SQL Study With MySQL 에서 MySQL과 관련된 다른 문서들을 읽을 수 있습니다.