개요
MySQL에서 INNER 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' 테이블에는 고객 ID와 이름이 저장되어 있고, 'Reserve' 테이블에는 예약자 ID와 예약 날짜가 기록되어 있습니다. 여기서 ID 2번 고객(Yashpal)은 두 번, ID 1번(Rahul)과 3번(Gaurav)은 각각 한 번씩 예약했으며, ID 4번(Virender)은 예약 기록이 없습니다.
INNER JOIN으로 뷰 생성하기
다음 쿼리는 두 테이블을 INNER JOIN으로 연결하여 'customer_V'라는 이름의 뷰를 생성합니다. INNER JOIN의 특성상 양쪽 테이블에서 조인 조건이 일치하는 행만 결과에 포함되므로, 이 뷰에는 자동차를 한 번 이상 예약한 고객의 이름만 나타나게 됩니다. 또한 DISTINCT 키워드를 사용해 여러 번 예약한 고객의 이름이 중복 출력되지 않도록 처리했습니다.
mysql> CREATE VIEW customer_V AS
-> Select DISTINCT Name FROM customers c
-> INNER JOIN Reserve R ON R.id = c.customer_id;
Query OK, 0 rows affected (0.08 sec)생성된 뷰 조회하기
뷰는 일반 테이블과 동일한 방식으로 SELECT 문을 사용해 조회할 수 있습니다.
mysql> Select * from customer_V; +---------+ | Name | +---------+ | Rahul | | Yashpal | | Gaurav | +---------+ 3 rows in set (0.02 sec)
결과 분석
출력 결과에서 확인할 수 있듯이, 예약 기록이 있는 세 명의 고객(Rahul, Yashpal, Gaurav)만 뷰에 포함되었습니다. 반면 예약 이력이 전혀 없는 Virender는 INNER JOIN 조건에 맞는 행이 없기 때문에 결과에서 자연스럽게 제외됩니다. 또한 Yashpal은 두 번 예약했지만 DISTINCT 덕분에 이름이 한 번만 표시됩니다.
이처럼 INNER JOIN과 뷰를 함께 활용하면, 여러 테이블에 흩어진 데이터를 조인한 결과를 하나의 가상 테이블로 만들어 필요할 때마다 간편하게 재사용할 수 있다는 장점이 있습니다.