DB (5) MySQL 튜토리얼 (3) - 뷰와 조인
데이터베이스는 일반적으로 정규화 과정을 거쳐 여러 테이블로 나뉘어 구성된다.
하지만 실제로 사용자들이 필요로 하는 데이터는 전체가 아닌,
특정 조건에 맞는 일부 데이터만 필요한 경우가 대부분이다.
또 DB의 모든 자료에 사용자가 접근해버리면.. 그것도 문제가 된다.
만약 테이블을 직접 수정할수 있는 악의적인 사용자가 DROP TABLE을 해버린다면.
회사는 비상이 걸리게 될 것이고 서버관리자는 시말서를 작성해야할 것이다.
이 문제를 해결하기 위해
여러 테이블의 데이터 중 특정 조건에 맞는 데이터만을 추출하여,
사용자가 필요한 형태로 보여주는 가상의 테이블인 뷰(View)에 대해서 알아보자.
앞서 배운 SELECT도 이러한 뷰의 기본적인 기능을 수행하지만,
더 유용한 뷰를 만들어주기 위해서 우리는 SQL의 Join문을 알아놓을 필요가 있다.
---
앞선 과정에서 만든 데이터들 상에서
조인문을 이용해서 뷰를 만들어주자.
SELECT * FROM restaurants INNER JOIN addresses ON restaurants.address_id = addresses.id
위와 같이 restaurants 테이블의 id, name, address_id, type_id 뿐만아니라
address_id가 addresses.id와 일치하는 레코드들에 대해서
addresses 테이블의 id, street, street_number, city, postal가 추가적으로 조인된것을 볼 수 있다.
---
조인을 통해서 아래와 같이 여러 테이블에서 레코드을 참조하고
SELECT의 파라미터에 아래와 같이 참조한 속성들을 나열하고 얼라이어싱(Aliasing, AS)하는 방식으로
만족스러운 뷰를 생성할 수 있는 것을 확인할 수 있다.
SELECT restaurants.id, restaurants.name, addresses.*, types.name AS type_name FROM restaurants
INNER JOIN addresses ON restaurants.address_id = addresses.id
INNER JOIN types ON restaurants.type_id = types.id
SELECT restaurants.id, restaurants.name, addresses.*, types.name AS type_name FROM restaurants
INNER JOIN addresses ON restaurants.address_id = addresses.id
INNER JOIN types ON restaurants.type_id = types.id
WHERE addresses.city = 'Munich'
---
최종적으로
아래와 같이 깔끔하게 뷰를 만들어주는
SQL 쿼리문을 작성해주어 보았다.
SELECT reviews.id, reviews.reviewer_name, reviews.rating, reviews.date, restaurants.name AS restaurant_name, addresses.street, addresses.street_number, addresses.city, addresses.postal_code, types.name AS restaurant_type FROM reviews
INNER JOIN restaurants ON reviews.restaurant_id = restaurants.id
INNER JOIN addresses ON restaurants.address_id = addresses.id
INNER JOIN types ON restaurants.type_id = types.id
WHERE rating >3
MySQL 튜토리얼은 여기까지고.
다음 시간부터는 MySQL이 NodeJS서버와 상호작용하는 과정을 배우게 될 것이다.
더 배우고 싶은 것은
자세한것은 MySQL documentation을 참조하거나..
Max가 강의한 SQL 심화 강의를 참조하는게 좋을 듯 하다.