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
(키)와 x
Y
테이블은 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;