Backend/SQL

[SQL] 뷰(VIEW)

해로몬 2024. 10. 29. 16:20

뷰(View)

뷰(View)는 데이터베이스에서 특정 쿼리의 결과를 마치 하나의 테이블처럼 사용할 수 있도록 만들어진 가상의 테이블입니다. 뷰는 실제 데이터를 저장하지 않고, 기존 테이블의 데이터에서 추출된 결과를 저장하는 쿼리로 구성됩니다. 뷰를 통해 테이블의 복잡한 데이터를 쉽게 조회하고, 특정 사용자에게 필요한 정보만 제한적으로 제공할 수 있습니다.

뷰의 특징

  • 가상 테이블
  • 특정 쿼리의 결과를 테이블처럼 사용
  • 보안 및 접근 제한

[기본구조]

CREATE VIEW 뷰이름 AS
SELECT 열1, 열2, ...
FROM 테이블명
WHERE 조건;
  • 데이터베이스 내 뷰 확인
-- 테이블의 유형을 확인하는 명령 ( 뷰와 테이블 구분 가능 )
SHOW FULL TABLES;

 

예제 : 부서 번호가 20인 직원 정보만 조회할 수 있도록 별칭을 설정한 뷰

CREATE VIEW emp_vu_20 AS
SELECT empno AS no, ename AS name, mgr, job
FROM emp
WHERE deptno = 20;
+------+-------+------+---------+
| no   | name  | mgr  | job     |
+------+-------+------+---------+
| 7369 | SMITH | 7902 | CLERK   |
| 7566 | JONES | 7839 | MANAGER |
| 7788 | SCOTT | 7566 | ANALYST |
| 7876 | ADAMS | 7788 | CLERK   |
| 7902 | FORD  | 7566 | ANALYST |
+------+-------+------+---------+

-- empno → no: 직원 번호를 의미하며, 열 이름을 no로 지정하여 간단하게 표현.
-- ename → name: 직원 이름을 의미하며, 열 이름을 name으로 지정하여 이해하기 쉽게 표현.

 

 

실습 : 사원번호, 사원이름, 담당업무, 연봉 정보, 호봉을 조회할 수 있는 emp_salgrade 뷰를 생성

CREATE VIEW emp_salgrade AS
SELECT 
    e.empno, 
    e.ename, 
    e.job, 
    (e.sal * 12 + IFNULL(e.comm, 0)) AS annsal, 
    s.grade
FROM emp e
INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

SELECT * FROM emp_salgrade;
+-------+--------+-----------+----------+-------+
| empno | ename  | job       | annsal   | grade |
+-------+--------+-----------+----------+-------+
|  7369 | SMITH  | CLERK     |  9600.00 |     1 |
|  7499 | ALLEN  | SALESMAN  | 19500.00 |     3 |
|  7521 | WARD   | SALESMAN  | 15500.00 |     2 |
|  7566 | JONES  | MANAGER   | 35700.00 |     4 |
|  7654 | MARTIN | SALESMAN  | 16400.00 |     2 |
|  7698 | BLAKE  | MANAGER   | 34200.00 |     4 |
|  7782 | CLARK  | MANAGER   | 29400.00 |     4 |
|  7788 | SCOTT  | ANALYST   | 36000.00 |     4 |
|  7839 | KING   | PRESIDENT | 60000.00 |     5 |
|  7844 | TURNER | SALESMAN  | 18000.00 |     3 |
|  7876 | ADAMS  | CLERK     | 13200.00 |     1 |
|  7900 | JAMES  | CLERK     | 11400.00 |     1 |
|  7902 | FORD   | ANALYST   | 36000.00 |     4 |
|  7934 | MILLER | CLERK     | 15600.00 |     2 |
+-------+--------+-----------+----------+-------+
  • 이 뷰는 emp 테이블과 salgrade 테이블을 조인하여, 사원번호, 사원이름, 담당업무, 연봉, 호봉 정보를 조회할 수 있게 설정되었습니다.

 

[뷰 정의 확인하기]

  • 현재 데이터베이스의 모든 뷰 목록 확인
SHOW FULL TABLES WHERE Table_type = 'VIEW';
  • 특정 데이터베이스의 모든 뷰 정보 확인
SELECT * 
FROM information_schema.views 
WHERE table_schema = '데이터베이스이름';

-- 예시
SELECT TABLE_NAME AS view_name,
       VIEW_DEFINITION AS view_definition
FROM information_schema.views
WHERE table_schema = 'sample';
  • 특정 뷰의 생성 쿼리 확인
SHOW CREATE VIEW 뷰이름;

 

인라인 뷰

서브쿼리를 이용해 임시로 생성한 가상의 테이블을 말하며, 주로 SELECT 문 내에서 사용되는 일회성 뷰. 인라인 뷰는 데이터베이스에 영구적으로 저장되지 않으며, 특정 쿼리에서만 일시적으로 사용됩니다.

  • 데이터 그룹화
  • 집계 함수 활용
  • 조건부 데이터 생성
  • 예시
SELECT e.empno, e.ename, d.deptno, d.dname
FROM (SELECT * FROM emp WHERE deptno IN (10, 20)) e --인라인 뷰
INNER JOIN dept d
ON e.deptno = d.deptno;

 

[CREATE OR REPLACE]

CREATE OR REPLACE VIEW emp_sal AS
SELECT empno, ename, job, sal * 12 + IFNULL(comm, 0) AS annsal
FROM emp;
  • emp_sal이라는 뷰를 생성하거나, 이미 존재한다면 기존 뷰를 새 정의로 교체합니다.
  • 이를 통해 기존 뷰가 있을 경우 DROP 없이도 수정 가능합니다.
  • CREATE OR REPLACE VIEW를 통해 뷰를 재정의할 수 있으므로, emp 테이블 구조나 연봉 계산 방식이 변경되면 뷰를 쉽게 수정할 수 있습니다.

'Backend > SQL' 카테고리의 다른 글

[SQL] DCL(Data Control Language)  (0) 2024.10.29
[SQL] 데이터베이스 사용자  (1) 2024.10.29
[SQL] 제약조건(Constraints)  (3) 2024.10.29
[SQL] 참조키 : 기본키, 외래키  (0) 2024.10.29
[SQL] DDL(Data Definition Language)  (0) 2024.10.28