SQL서버 SQL강좌: 7-1. 뷰(VIEW) 소개

코난(김대우) 2023.08.18 16:41 Views : 39 Upvote:1

안녕하세요. SQLER의 코난 김대우입니다. 
이번 강좌에서는, 7-1. 뷰(VIEW) 소개를 진행 하겠습니다.


SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록

 

이번에 진행할 강좌는 뷰(VIEW) 소개입니다.

 

 

 

TL;DR

뷰는 SQL 쿼리로 정의하는 가상 테이블로, 테이블의 데이터를 원하는 대로 다양한 목적에 맞게 거울처럼 비추는 역할을 합니다. 뷰를 사용해 민감한 정보를 보호하거나, 복잡한 JOIN 구문을 단순화시킬 수 있으며, 뷰 정의를 통해 테이블 접근 권한을 제어할 수 있습니다.

 


뷰는 SQL 쿼리로 정의하는 특수한 가상 테이블입니다. 간략히, 뷰는 테이블을 비추는 거울입니다. 거울이지만, 테이블을 원하는 대로 다양한 목적에 맞춰 비출 수 있습니다.


뷰 예제를 보면서 말씀드리겠습니다.

 

 

SQL 쿼리로 뷰 생성

USE AdventureWorks;
GO

-- employee 테이블 생성
CREATE TABLE Employee (
  emp_num INT PRIMARY KEY,
  emp_login_pwd NVARCHAR(15),
  emp_name NVARCHAR(10),
  email NVARCHAR(15),
  emp_salary BIGINT
);
GO

-- employee 테이블에 예제 데이터 삽입
INSERT INTO Employee (emp_num, emp_login_pwd, emp_name, email, emp_salary)
VALUES
  (1, N'password1234', N'김대우',  N'kdw@example.com', 20000000),
  (2, N'password!@#$', N'손석구', N'ssk@example.com', 100000000),
  (3, N'asdfqwer!@#$', N'박은빈', N'peb@example.com', 120000000);
GO

-- 테이블 직접 조회
SELECT * FROM Employee;
GO

 

실행해 보면, 데이터베이스 사용자 또는 개발자가 업무를 보면서 Employee 테이블에 접근이 가능하다면, 개인정보나 연봉 데이터 등 큰 문제가 됩니다. 물론 비밀번호는 당연히 Hash 암호화되어 있겠지만, 연봉 정보나 개인정보를 볼 수 있다면 여러 문제가 발생할 수 있습니다. 그렇다고, 업무를 보거나, 개발을 하는데, Employee 테이블 접근을 막을 수도 없습니다. 어떻게 해야 할까요?


이럴 때 뷰가 유용합니다. Employee 테이블에 접근을 막고, 뷰를 생성해 뷰에 접근 권한을 허가합니다. 뷰 생성 구문을 확인해 보겠습니다.

-- 뷰를 생성해서 비밀번호나 연봉 같은 민감한 정보로부터 보호
-- v_Employee 뷰를 생성
CREATE VIEW v_Employee
AS
SELECT emp_num, emp_name, email FROM Employee;
GO

-- 뷰 조회
SELECT * FROM v_Employee;
GO

 

이렇게 생성한 뷰는 민감한 정보를 보호할 수 있습니다.

 

앗, 뷰가 바라보는 Employee 테이블에 로우 데이터가 추가되거나
삭제되면 뷰는 어떻게 되나요?


뷰는 거울입니다. 그대로 정의에 따라 테이블 데이터를 반영합니다.

 

-- employee "테이블"에 데이터 추가
INSERT INTO Employee (emp_num, emp_login_pwd, emp_name, email, emp_salary)
VALUES(4, N'zxcvasdf', N'김우빈', N'kwb@example.com', 130000000);
GO

-- 뷰 조회
SELECT * FROM v_Employee;
GO

Employee 테이블의 최신 데이터를 그대로 반영합니다.

 

복잡한 테이블을 뷰로 생성해 단순화 가능

뷰를 이용해 개발자와 사용자 모두에게, 꼭 필요한 데이터만 초점을 맞출 수 있도록 설정할 수 있습니다. 예를 들어, 세 개의 테이블을 JOIN 하는 SQL 구문을 매번 사용한다면 쿼리가 길고 번잡할 수 있습니다. 이럴 경우 뷰로 생성하고, 필요한 컬럼만 SELECT 절에 리스트 하면 더 단순화시킬 수 있습니다.


다음과 같은 제품, 고객, 주문 테이블을 뷰로 생성합니다. 

-- 테이블이 존재하면 삭제
IF OBJECT_ID(N'dbo.orders', N'U') IS NOT NULL  
   DROP TABLE dbo.orders;  
IF OBJECT_ID(N'dbo.customers', N'U') IS NOT NULL  
   DROP TABLE dbo.customers;  
IF OBJECT_ID(N'dbo.products', N'U') IS NOT NULL  
   DROP TABLE dbo.products;  

-- customers 테이블 생성
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name NVARCHAR(10),
  email NVARCHAR(15)
);
GO

-- products 테이블 생성
CREATE TABLE products (
  product_id INT PRIMARY KEY,
  product_name NVARCHAR(10),
  price DECIMAL(10, 0)
);
GO

-- orders 테이블 생성
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  product_id INT,
  order_date DATE,
  total_amount DECIMAL(10, 0),
  FOREIGN KEY (customer_id) REFERENCES customers (customer_id),
  FOREIGN KEY (product_id) REFERENCES products (product_id)
);
GO

-- customers 테이블에 데이터 삽입
INSERT INTO customers (customer_id, customer_name, email)
VALUES
  (1, N'김대우', N'kdw@example.com'),
  (2, N'손석구', N'ssk@example.com'),
  (3, N'박은빈', N'peb@example.com');
GO

-- products 테이블에 데이터 삽입
INSERT INTO products (product_id, product_name, price)
VALUES
  (1, N'초코파이', 1200),
  (2, N'칸쵸', 800),
  (3, N'포테토칩', 1800),
  (4, N'꼬북칩', 1300);
GO

-- orders 테이블에 데이터 삽입
INSERT INTO orders (order_id, customer_id, product_id, order_date, total_amount)
VALUES
  (1, 1, 1, '2022-01-01', 100.50),
  (2, 1, 3, '2022-02-05', 75.20),
  (3, 2, 2, '2022-03-10', 150.80),
  (4, 2, 2, '2022-04-15', 200.00);
GO

-- 자주 봐야 하는 복잡한 세 개 테이블 JOIN 구문
SELECT 
  products.product_name,
  customers.customer_name, 
  orders.order_date, 
  orders.total_amount 
FROM 
  customers 
  INNER JOIN orders ON customers.customer_id = orders.customer_id
  INNER JOIN products ON products.product_id = orders.product_id;
 GO

 

이렇게 세 개의 테이블을 JOIN 하는 긴 SQL 구문이 자주 발생합니다. 이럴 경우 복잡한 JOIN 구문을 사용하기보다는 뷰를 생성해 조회하는 것도 한 방법입니다.
 

-- 복잡한 SQL 구문을 뷰로 생성해 처리. v_Orders 뷰를 생성
CREATE VIEW v_Orders
AS
SELECT 
  products.product_name,
  customers.customer_name, 
  orders.order_date, 
  orders.total_amount 
FROM 
  customers 
  INNER JOIN orders ON customers.customer_id = orders.customer_id
  INNER JOIN products ON products.product_id = orders.product_id;
GO

 -- v_Orders 뷰 조회
 SELECT * FROM v_Orders;
 SELECT * FROM v_Orders WHERE customer_name LIKE N'손석구';

 

이렇게 뷰를 조회하는 루틴으로 복잡한 SQL 쿼리를 단순화시킬 수 있습니다.

 

뷰의 정의만 잊지 마세요.
뷰는 SQL 쿼리로 정의하는 특수한 가상 테이블입니다. 간략히, 뷰는 테이블을 비추는 거울입니다. 거울이지만, 테이블을 원하는 대로 다양하게 목적에 맞춰 비출 수 있습니다.


다음 강좌에서 뷰에 대해 좀 더 살펴보겠습니다.
 

 

SQL 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 22024
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12251
2274 SQL강좌: 8-3. 저장 프로시저 - 매개변수(파라미터) 코난(김대우) 2023.08.18 48
2273 SQL강좌: 8-2. 저장 프로시저 - 생성과 실행 코난(김대우) 2023.08.18 43
2272 SQL강좌: 8-1. 저장 프로시저(Stored Procedure) - 소개 코난(김대우) 2023.08.18 53
2271 SQL강좌: 7-10. 실무에서 뷰 사용 코난(김대우) 2023.08.18 31
2270 SQL강좌: 7-9. 인덱싱된 뷰(Indexed View) file 코난(김대우) 2023.08.18 36
2269 SQL강좌: 7-8. 분할 뷰(Partitioned View) file 코난(김대우) 2023.08.18 25
2268 SQL강좌: 7-7. 뷰에서 데이터 수정 코난(김대우) 2023.08.18 27
2267 SQL강좌: 7-6. 뷰에서 뷰 생성 코난(김대우) 2023.08.18 26
2266 SQL강좌: 7-5. 뷰 옵션 코난(김대우) 2023.08.18 19
2265 SQL강좌: 7-4. 뷰 삭제 코난(김대우) 2023.08.18 12
2264 SQL강좌: 7-3. 뷰 수정 코난(김대우) 2023.08.18 27
2263 SQL강좌: 7-2. 뷰 생성 file 코난(김대우) 2023.08.18 27
» SQL강좌: 7-1. 뷰(VIEW) 소개 코난(김대우) 2023.08.18 39
2261 SQL강좌: 6-9. 데이터 무결성 - 데이터 무결성 주의사항 file 코난(김대우) 2023.08.18 39
2260 SQL강좌: 6-8. 데이터 무결성 - 트리거(TRIGGER) file 코난(김대우) 2023.08.18 65
2259 SQL강좌: 6-7. 데이터 무결성 - 사용자 정의 형식(User-Defined Type - UDT) 코난(김대우) 2023.08.18 26
2258 SQL강좌: 6-6. 데이터 무결성 - 기본값(DEFAULT) file 코난(김대우) 2023.08.18 18
2257 SQL강좌: 6-5. 데이터 무결성 - 규칙(RULE) 코난(김대우) 2023.08.18 29
2256 SQL강좌: 6-4. 데이터 무결성 - 체크 제약(CHECK Constraint) file 코난(김대우) 2023.08.18 34
2255 SQL강좌: 6-3. 데이터 무결성 - 기본 키(Primary Key) 제약, UNIQUE 제약, 외래 키(Foreign Key) 제약 file 코난(김대우) 2023.08.18 48





XE Login