📊 [SQL] 제42장 VIEW - 복잡한 SELECT를 저장해 둘 수 있을까요?
제42장. VIEW
"복잡한 SELECT를 저장해 둘 수 있을까요?"
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- VIEW가 무엇인지 설명할 수 있다.
- VIEW를 생성할 수 있다.
- VIEW를 이용하여 데이터를 조회할 수 있다.
- VIEW와 실제 테이블의 차이를 설명할 수 있다.
이런 경험이 있나요?
다음 SQL을 살펴봅시다.
SELECT
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
우리는 이미 JOIN을 배웠기 때문에
이 SQL이 무엇을 하는지 이해할 수 있습니다.
하지만 문제가 있습니다.
매일 이 조회를 사용해야 한다면 어떨까요?
매번 긴 SQL을 다시 입력해야 합니다.
조금 불편합니다.
그래서 MySQL은
자주 사용하는 SELECT를 저장해 둘 수 있는 기능
을 제공합니다.
그것이 바로
VIEW입니다.
VIEW란 무엇일까요?
VIEW는
SELECT 결과를
마치 하나의 테이블처럼 저장해 두는 기능입니다.
하지만 중요한 특징이 있습니다.
VIEW는 데이터를 저장하지 않습니다.
실제 데이터는 원래 테이블에 있습니다.
VIEW는
필요할 때마다
원래 테이블을 조회하여
결과를 보여줍니다.
그림으로 이해하기
Customers
Orders
↓
SELECT 실행
↓
결과 생성
↓
VIEW
VIEW는
결과를 보여주는
"창문(Window)"
과 비슷합니다.
실제 데이터는 뒤에 있고
우리는 VIEW를 통해서만 보는 것입니다.
VIEW 만들기
다음과 같이 작성합니다.
CREATE VIEW CustomerOrders AS
SELECT
Customers.CustomerName,
Orders.OrderID,
Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
SQL를 한 줄씩 살펴보기
CREATE VIEW CustomerOrders AS
CustomerOrders라는 VIEW를 생성합니다.
SELECT ...
이 SELECT 결과가
VIEW 안에 저장됩니다.
VIEW 사용하기
VIEW가 만들어졌다면
일반 테이블처럼 사용할 수 있습니다.
SELECT *
FROM CustomerOrders;
결과
CustomerNameOrderIDOrderDate
| Alfreds | 10248 | 1996-07-04 |
| Ana Trujillo | 10249 | 1996-07-05 |
| Antonio Moreno | 10250 | 1996-07-08 |
정말 테이블처럼 보입니다.
하지만 실제 테이블은 아닙니다.
VIEW의 장점
장점 ①
복잡한 SQL을 다시 작성하지 않아도 된다.
원래
SELECT ...
INNER JOIN ...
INNER JOIN ...
매번 입력
↓
VIEW 생성
↓
SELECT * FROM CustomerOrders;
한 줄로 사용
장점 ②
실수를 줄일 수 있다.
복잡한 JOIN 문을
여러 사람이 반복해서 작성하면
실수할 가능성이 높습니다.
VIEW를 만들어 두면
항상 같은 결과를 얻을 수 있습니다.
장점 ③
업무를 단순하게 만들 수 있다.
직원은
복잡한 JOIN을 몰라도
VIEW만 조회하면 됩니다.
실제 업무에서는?
예를 들어 쇼핑몰에는
다음과 같은 테이블이 있을 수 있습니다.
- Customers
- Orders
- OrderDetails
- Products
관리자는
"고객이 무엇을 주문했는가?"
만 보고 싶습니다.
매번 JOIN을 작성하는 대신
미리 VIEW를 만들어 둡니다.
CREATE VIEW OrderSummary AS
SELECT ...
그리고
SELECT *
FROM OrderSummary;
만 사용합니다.
VIEW도 최신 데이터를 보여줄까요?
많은 학생들이 궁금해합니다.
예를 들어
새로운 주문이 추가됩니다.
INSERT INTO Orders ...
그 후
SELECT *
FROM CustomerOrders;
를 실행하면?
새로운 주문도 보입니다.
왜냐하면
VIEW는 데이터를 저장하지 않고
조회 결과를 보여주기 때문입니다.
VIEW와 테이블의 차이
구분테이블VIEW
| 실제 데이터 저장 | O | X |
| SELECT 가능 | O | O |
| 결과 표시 | O | O |
| 데이터 보관 | O | X |
VIEW 삭제하기
VIEW가 필요 없으면 삭제할 수 있습니다.
DROP VIEW CustomerOrders;
주의!
DROP VIEW
는
VIEW만 삭제합니다.
원본 테이블은 삭제되지 않습니다.
많이 하는 실수
실수 ①
VIEW가 데이터를 저장한다고 생각한다.
VIEW는 결과를 저장하는 것이 아니라
SELECT 문을 저장합니다.
실수 ②
VIEW와 테이블을 혼동한다.
VIEW는 실제 데이터가 아닙니다.
실수 ③
원본 테이블을 삭제한다.
DROP TABLE Customers;
를 실행하면
VIEW도 정상적으로 동작하지 않을 수 있습니다.
한눈에 정리
기능설명
| CREATE VIEW | VIEW 생성 |
| SELECT FROM VIEW | VIEW 조회 |
| DROP VIEW | VIEW 삭제 |
이번 장 핵심 정리
✅ VIEW는 SELECT 결과를 테이블처럼 사용할 수 있게 해준다.
✅ VIEW는 실제 데이터를 저장하지 않는다.
✅ 복잡한 SELECT를 간단하게 사용할 수 있다.
✅ 원본 데이터가 변경되면 VIEW 결과도 함께 변경된다.
✅ VIEW는 실제 업무에서 매우 많이 사용된다.
연습 문제
기본 문제
① CustomerList라는 VIEW를 생성하는 SQL을 작성하시오.
SELECT CustomerName, Country
FROM Customers;
② CustomerList VIEW를 조회하는 SQL을 작성하시오.
응용 문제
다음 VIEW를 삭제하는 SQL을 작성하시오.
CustomerList
도전 문제
다음 중 VIEW에 대한 설명으로 올바른 것을 모두 고르시오.
① 실제 데이터를 저장한다.
② SELECT 결과를 저장한다.
③ 테이블처럼 조회할 수 있다.
④ 원본 데이터가 변경되면 결과도 변경될 수 있다.
정답
기본 문제
CREATE VIEW CustomerList AS
SELECT CustomerName, Country
FROM Customers;
SELECT *
FROM CustomerList;
응용 문제
DROP VIEW CustomerList;
도전 문제
정답
③, ④
💡 실무 이야기
실무에서는 VIEW를 단순한 편의 기능 이상으로 활용합니다.
예를 들어 학교 시스템이라면
학생 정보 테이블에는
- 이름
- 전화번호
- 주소
- 보호자 정보
등이 모두 들어 있을 수 있습니다.
하지만 일반 교사는
학생 이름과 학번만 필요할 수도 있습니다.
이때 VIEW를 만들어 필요한 정보만 보여줄 수 있습니다.
즉,
VIEW는 단순히 SQL을 짧게 만드는 기능이 아니라
"필요한 정보만 보여주는 창문"
역할도 수행합니다.
✨ 다음 장 예고
다음 장에서는 INDEX(인덱스)를 배워 보겠습니다.
데이터가 수십 개일 때는 문제가 없지만,
수십만 개, 수백만 개가 되면 조회 속도가 느려질 수 있습니다.
그때 사용하는 것이 바로 INDEX입니다.
학생들은 이를 통해
"왜 어떤 검색은 빠르고 어떤 검색은 느릴까?"
를 이해하게 될 것입니다.
제 개인적인 판단으로는 제43장 INDEX는 지금까지 만든 교재 중 가장 "실무적인 장"이 될 가능성이 높습니다. 학생들이 처음으로 DB 서버 성능과 검색 속도라는 개념을 만나게 되기 때문입니다. 특히 선생님께서 이전에 말씀하셨던 "서브쿼리의 임시 테이블과 하드웨어 성능" 이야기와도 자연스럽게 연결될 수 있습니다.