MySQL에서 LEFT JOIN을 활용해 뷰(View)를 만드는 방법을 예제와 함께 살펴보겠습니다. 이번 예제에서는 'Customers'(고객) 테이블과 'Reserve'(예약) 테이블의 데이터를 사용합니다.
예제 데이터 준비
먼저 두 테이블에 저장된 데이터를 확인해 보겠습니다.
mysql> Select * from customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec) mysql> Select * from reserve; +------+------------+ | ID | Day | +------+------------+ | 1 | 2017-12-30 | | 2 | 2017-12-28 | | 2 | 2017-12-25 | | 1 | 2017-12-24 | | 3 | 2017-12-26 | +------+------------+ 5 rows in set (0.00 sec)
'customers' 테이블에는 총 4명의 고객 정보가 있고, 'reserve' 테이블에는 차량 예약 기록이 저장되어 있습니다. 여기서 주목할 점은 고객 ID 4번(Virender)은 예약 기록이 없다는 것입니다.
LEFT JOIN으로 뷰 생성하기
다음 쿼리는 두 테이블에 LEFT JOIN을 적용하여 'customer_VLeft'라는 이름의 뷰를 생성합니다. 이 뷰는 어떤 차량도 예약하지 않은 고객의 이름만 보여줍니다.
mysql> Create view customer_Vleft AS SELECT NAME FROM customers LEFT JOIN RESERVE ON customer_id = id WHERE id IS NULL; Query OK, 0 rows affected (0.13 sec)
쿼리 동작 원리
LEFT JOIN은 왼쪽 테이블(customers)의 모든 행을 유지하면서 오른쪽 테이블(reserve)에서 일치하는 행을 찾습니다. 만약 일치하는 예약 기록이 없다면 오른쪽 테이블의 컬럼 값은 NULL이 됩니다. 따라서 WHERE id IS NULL 조건을 추가하면 예약 기록이 전혀 없는 고객만 필터링할 수 있습니다.
뷰 조회 결과 확인
생성된 뷰를 조회하면 다음과 같은 결과를 얻을 수 있습니다.
mysql> Select * from customer_Vleft; +----------+ | NAME | +----------+ | Virender | +----------+ 1 row in set (0.00 sec)
결과에서 알 수 있듯이, 예약 기록이 없는 유일한 고객인 'Virender'만 뷰에 포함되었습니다.
정리
이처럼 LEFT JOIN과 IS NULL 조건을 조합하면 두 테이블 간의 관계에서 매칭되지 않는 데이터를 손쉽게 찾아낼 수 있습니다. 이러한 로직을 뷰로 만들어 두면 복잡한 쿼리를 매번 작성할 필요 없이 간단하게 재사용할 수 있다는 장점이 있습니다.