SELECT 문의 옵션절LEFT JOIN 은 왼쪽 테이블에 있는 모든 행(rows)을 리턴하고, 오른쪽 테이블에 있는 매칭되는 행들(rows)을 리턴한다.
문법은 다음과 같다.
SELECT
column_list
FROM
X
LEFT JOIN Y ON X.id = Y.id;
여기서 LEFT JOIN 은 왼쪽 테이블인 X 의 id 칼럼의 값들을 오른쪽 테이블인 Y 의 칼럼의 값들과 매치한다.
여기서 값들이 같다면, 양쪽 테이블에서 두 개의 열들을 합친다. 만약 왼쪽 테이블에 있는 열이 오른쪽 테이블에 있는 열과 매칭되는게 없다면, LEFT JOIN 은 왼쪽 테이블에 있는 행을 오른쪽 테이블에 있는 행과 합친다. 오른쪽 테이블에 있는 열들을 NULL 값으로 채운다.

id (키)와 xY 테이블은 2개의 컬럼인 id (키)와 y
left join은 왼쪽 테이블인 X 의 모든 행들과 오른쪽 테이블인 Y 에 있는 매칭되는 값들을 포함한다.

이를 벤 다이어그램으로 표현하면, 테이블 X 전체를 다 표현하는 것과 같다.

관계형 데이터베이스는 각 테이블들의 관계를 표현하는 데이터베이스이다. 여기서 주문 정보를 나타내는 ORDERS 테이블과 판매 직원의 정보를 나타내는 EMPLOYEES 테이블이 있다고 하자.
여기서 ORDERS 테이블의 SALESMAN_ID 컬럼은 EMPLOYEES 테이블의 Primary Key인 EMPLOYEE_ID 를 참조한다. 즉, SALESMAN_ID 는 외래키이다.
SELECT ORDER_ID, STATUS, FIRST_NAME, LAST_NAME
FROM ORDERS
LEFT JOIN EMPLOYEES
ON EMPLOYEES ON EMPLOYEE_ID = SALESMAN_ID
ORDER BY ORDER_DATE DESC;
해당 쿼리를 작성하면 쿼리 결과는 다음과 같이 나오는 것을 알 수 있다.
즉, LEFT JOIN 을 사용하면 왼쪽 테이블인 ORDERS 테이블에 있는 모든 행들을 리턴하고, EMPLOYEES 테이블과 매칭되는 행을 가지지 않는 행들에 대해서는 FIRST_NAME, LAST_NAME과 같은 컬럼에 대해서 NULL 값을 채운다.
테이블 3개를 LEFT JOIN 절을 사용해서 합칠 때도 위와 별반 다를게 없다. 다음 쿼리를 실행한 결과는 아래와 같다.
SELECT ORDER_ID, NAME AS CUSTOMER_NAME, STATUS, FIRST_NAME, LAST_NAME
FROM ORDERS
LEFT JOIN EMPLOYEES ON EMPLOYEE_ID = SALESMAN_ID
LEFT JOIN CUSTOMERS ON CUSTOMERS.CUSTOMER_ID = ORDERS.CUSTOMER_ID
ORDER BY
ORDER_DATE DESC;

매칭되지 않는 행들에 대해서는 null 값으로 채워진 것을 알 수 있다.
USING 절을 사용해서 테이블을 합치는 것을 표현할 수 있음을 배웠다. 그러면 LEFT JOIN 을 사용할 때도 이를 똑같이 적용할 수 있다.
SELECT
COLUMN_LIST
FROM
X
LEFT JOIN Y USING (id);
여기서 LEFT JOIN 은 X 테이블의 id 컬럼의 값들이 Y 테이블의 id 컬럼의 값들과 같은지 체크한다.
USING 절을 이용한 표현은 다음과 같다.
USING (id)
ON X.id = Y.id
SELECT
NAME,
ORDER_ID,
STATUS,
ORDER_dATE
FROM
CUSTOMERS
LEFT JOIN ORDERS
USING (CUSTOMER_ID)
ORDER BY NAME;
해당 쿼리를 실행하면 다음과 같이 결과가 나오는 것을 알 수 있다.

고객이 어떠한 주문을 하지 않았다면, LEFT JOIN 을 통해 ORDERS 테이블의 컬럼(열)들을 NULL 값으로 채운 것을 알 수 있다.
즉, LEFT JOIN 절을 통해 왼쪽 테이블에 있는 모든 행들을 리턴하고 오른쪽 테이블에는 매칭되는 행들을 리턴한다. 매칭되는 행이 다면 NULL 값으로 채운다는 것을 알 수 있다.
그리고 LEFT JOIN 을 LEFT OUTER JOIN 으로 표현할 수 있다. 둘은 다른 의미가 아니고 단지 표현 방식이 다를 뿐이다. LEFT OUTER JOIN 을 써서 테이블을 합치고자 한다면 다음과 같이 쿼리를 작성하면 된다.
SELECT ORDER_ID, STATUS, FIRST_NAME, LAST_NAME
FROM ORDERS
LEFT OUTER JOIN EMPLOYEES
ON EMPLOYEES ON EMPLOYEE_ID = SALESMAN_ID
ORDER BY ORDER_DATE DESC;