뷰(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)) e
emp
테이블에서 부서 번호(deptno
)가 10 또는 20인 직원만 필터링하여 선택합니다.e
: 인라인 뷰에 별칭 e
를 지정하여, 외부 쿼리에서 가상의 테이블로 사용할 수 있게 했습니다.e
가 생성됩니다INNER JOIN dept d ON e.deptno = d.deptno
e
인라인 뷰와 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 테이블 구조나 연봉 계산 방식이 변경되면 뷰를 쉽게 수정할 수 있습니다.