[SQL] LEFT (OUTER) JOIN

FinDer178·2025년 5월 27일
0

SQL

목록 보기
2/4

LEFT JOIN절 개념과 동작 원리

  • SELECT 문의 옵션절
  • 두 테이블로부터 열들 합치도록 함
  • 첫 번째 테이블이 LEFT TABLE, 두 번째 테이블이 RIGHT TABLE

LEFT JOIN왼쪽 테이블에 있는 모든 행(rows)을 리턴하고, 오른쪽 테이블에 있는 매칭되는 행들(rows)을 리턴한다.

문법은 다음과 같다.

SELECT 
	column_list
FROM
	X
LEFT JOIN Y ON X.id = Y.id;

여기서 LEFT JOIN 은 왼쪽 테이블인 Xid 칼럼의 값들을 오른쪽 테이블인 Y 의 칼럼의 값들과 매치한다.

여기서 값들이 같다면, 양쪽 테이블에서 두 개의 열들을 합친다. 만약 왼쪽 테이블에 있는 열이 오른쪽 테이블에 있는 열과 매칭되는게 없다면, LEFT JOIN 은 왼쪽 테이블에 있는 행을 오른쪽 테이블에 있는 행과 합친다. 오른쪽 테이블에 있는 열들을 NULL 값으로 채운다.

  • 테이블은 2개의 컬럼인 id (키)와 x
  • Y 테이블은 2개의 컬럼인 id (키)와 y

left join은 왼쪽 테이블인 X 의 모든 행들과 오른쪽 테이블인 Y 에 있는 매칭되는 값들을 포함한다.


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

LEFT JOIN절 예시

관계형 데이터베이스는 각 테이블들의 관계를 표현하는 데이터베이스이다. 여기서 주문 정보를 나타내는 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 값을 채운다.

LEFT JOIN 절 사용해서 3개의 테이블 합치기

테이블 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 표현

USING 절을 사용해서 테이블을 합치는 것을 표현할 수 있음을 배웠다. 그러면 LEFT JOIN 을 사용할 때도 이를 똑같이 적용할 수 있다.

SELECT 
	COLUMN_LIST
FROM 
	X
	LEFT JOIN Y USING (id);

여기서 LEFT JOINX 테이블의 id 컬럼의 값들이 Y 테이블의 id 컬럼의 값들과 같은지 체크한다.

USING 절을 이용한 표현은 다음과 같다.

USING (id)
ON X.id = Y.id

USING 절을 이용한 쿼리 예시

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 JOINLEFT 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;

참고

Oracle LEFT JOIN Clause

profile
낙관적 개발자

0개의 댓글