뷰(View)는 데이터베이스에서 특정 쿼리의 결과를 마치 하나의 테이블처럼 사용할 수 있도록 만들어진 가상의 테이블입니다. 뷰는 실제 데이터를 저장하지 않고, 기존 테이블의 데이터에서 추출된 결과를 저장하는 쿼리로 구성됩니다. 뷰를 통해 테이블의 복잡한 데이터를 쉽게 조회하고, 특정 사용자에게 필요한 정보만 제한적으로 제공할 수 있습니다.
CREATE VIEW 뷰이름 AS
SELECT 열1, 열2, ...
FROM 테이블명
WHERE 조건;
-- 테이블의 유형을 확인하는 명령 ( 뷰와 테이블 구분 가능 )
SHOW FULL TABLES;
-- 뷰 생성
CREATE VIEW emp_vu AS
SELECT *
FROM emp;
뷰를 통해 emp 테이블의 데이터를 조회할 수 있습니다.
SELECT * FROM emp_vu;
emp_vu 뷰에서 모든 데이터를 조회합니다. 이 명령어는 emp 테이블을 직접 조회하는 것과 동일한 결과를 반환하지만, 뷰를 통해 간접적으로 데이터를 접근하게 됩니다.뷰에서도 특정 열만 선택적으로 조회할 수 있습니다.
SELECT ename, job FROM emp_vu;
emp_vu 뷰에서 ename(이름)과 job(직업) 열만 조회하여 필요한 정보만 출력할 수 있습니다.뷰에서도 WHERE 절을 사용하여 조건을 추가할 수 있습니다.
SELECT * FROM emp_vu WHERE job = 'MANAGER';
emp_vu 뷰에서 job 열이 MANAGER인 직원들만 조회합니다. 뷰는 테이블과 마찬가지로 필터링된 데이터를 반환할 수 있습니다.CREATE VIEW emp_vu_10 AS
SELECT empno, ename, mgr, job
FROM emp
WHERE deptno = 10;
SELECT * FROM emp_vu_10;
+-------+--------+------+-----------+
| empno | ename | mgr | job |
+-------+--------+------+-----------+
| 7782 | CLARK | 7839 | MANAGER |
| 7839 | KING | NULL | PRESIDENT |
| 7934 | MILLER | 7782 | CLERK |
+-------+--------+------+-----------+
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 |
+------+-------+------+---------+
CREATE VIEW emp_sal AS
SELECT
empno,
ename,
sal,
(sal * 12 + IFNULL(comm, 0)) AS annual_salary
FROM emp;
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 뷰이름 (\G);
서브쿼리를 이용해 임시로 생성한 가상의 테이블을 말하며, 주로 SELECT 문 내에서 사용되는 일회성 뷰. 인라인 뷰는 데이터베이스에 영구적으로 저장되지 않으며, 특정 쿼리에서만 일시적으로 사용됩니다.
SUM, MAX, AVG와 같은 집계 함수를 사용해 요약된 데이터를 임시로 가공하고, 이를 기반으로 추가 필터링이나 계산을 수행할 수 있습니다.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;
(SELECT * FROM emp WHERE deptno IN (10, 20)) eemp 테이블에서 부서 번호(deptno)가 10 또는 20인 직원만 필터링하여 선택합니다.e: 인라인 뷰에 별칭 e를 지정하여, 외부 쿼리에서 가상의 테이블로 사용할 수 있게 했습니다.e가 생성됩니다INNER JOIN dept d ON e.deptno = d.deptnoe 인라인 뷰와 dept 테이블을 deptno를 기준으로 내부 조인(INNER JOIN)합니다. 즉, e.deptno와 d.deptno`가 같은 행만 결과에 포함됩니다.CREATE OR REPLACE VIEW emp_sal AS
SELECT empno, ename, job, sal * 12 + IFNULL(comm, 0) AS annsal
FROM emp;
emp_sal이라는 뷰를 생성하거나, 이미 존재한다면 기존 뷰를 새 정의로 교체합니다.CREATE OR REPLACE VIEW를 통해 뷰를 재정의할 수 있으므로, emp 테이블 구조나 연봉 계산 방식이 변경되면 뷰를 쉽게 수정할 수 있습니다.