โ ๋ทฐ(View)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ฐ์์ ํ ์ด๋ธ์ด๋ค. ๋ทฐ๋ ํ๋ ์ด์์ ๊ธฐ๋ณธ ํ ์ด๋ธ(๋๋ ๋ค๋ฅธ ๋ทฐ)์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋ ํ์์ผ๋ก ์ ๊ณตํ๋ฉฐ ์ด๋ ๋ฐ์ดํฐ ์ ๊ทผ์ฑ์ ๊ฐ์ ํ๊ณ , ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ณด์์ ์ ์งํ๊ณ ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ์ ๊ฐ์ํํ๋ ๋ฐ ๋์์ด ๋๋ค.
| ํน์ง | ๋จ์ ๋ทฐ | ๋ณตํฉ ๋ทฐ |
|---|---|---|
| ํ ์ด๋ธ ์ | ํ๋ | ๋ ์ด์ |
| ํจ์ ํฌํจ | ์์ | ์์ |
| ๋ฐ์ดํฐ ๊ทธ๋ฃน ํฌํจ | ์์ | ์์ |
| ๋ทฐ๋ฅผ ํตํ DML | ์์ | ์์ |
โ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌ๋ ROLE๋ฅผ ํ์ธํ๊ฑฐ๋ ๊ถํ์ ์ฒดํฌํ์ฌ ๋ทฐ๋ฅผ ์์ฑํ ์ ์๋์ง ํ์ธํ์ฌ์ผ ํ๋ค.
โ CREATE VIEW ๋ฌธ์ฅ ๋ด์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
-- ๋ทฐ ์ ๋ณด ํ์ธ
SELECT * FROM USER_VIEWS;
-- ๋ทฐ ๊ตฌ์กฐ ํ์ธ
DESC EMP_DETAILS_VIEW;
SELECT * FROM EMP_DETAILS_VIEW;
-- ๋ทฐ ์์ฑ ๊ถํ ํ์ธ
SELECT * FROM USER_ROLE_PRIVS;
SELECT * FROM USER_SYS_PRIVS;
-- ๋ทฐ ์์ฑ
CREATE VIEW EMP_VIEW_DEPT60
AS SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 60;
DESC EMP_VIEW_DEPT60;
SELECT * FROM EMP_VIEW_DEPT60;
DROP VIEW EMP_VIEW_DEPT60;
CREATE VIEW EMP_DEPT60_SALARY
AS SELECT
EMPLOYEE_ID AS EMPNO,
FIRST_NAME || ' ' || LAST_NAME AS NAME,
SALARY AS MONTHLY_SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMP_DEPT60_SALARY;
-- ๋ทฐ๋ฅผ ์์ฑํ๋ฉด USER_VIEWS์ ์์ฑํ ๋ทฐ๊ฐ ๋ช
์๋์ด ์์์ ์ ์ ์๋ค.
SELECT * FROM USER_VIEWS;
โ CREATE OR PEPLACE๋ฅผ ์ฌ์ฉํ์ฌ ์กด์ฌํ์ง ์์ผ๋ฉด ์์ฑ, ์กด์ฌํ๋ฉด ์์ ์ ํ๋ค. MERGE๋ฅผ ์๊ฐํ๋ฉด ์ดํด์ ๋์์ด ๋ ๊ฑฐ ๊ฐ๋ค.
-- ๋ทฐ ์์
-- CREATE OR REPLACE = MERGE์ฒ๋ผ ์์ผ๋ฉด ์์ฑ ์์ผ๋ฉด ์์
CREATE OR REPLACE VIEW EMP_DEPT60_SALARY
AS SELECT EMPLOYEE_ID AS EMPNO,
FIRST_NAME || ' ' || LAST_NAME AS NAME,
JOB_ID AS JOB,
SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_Id = 60;
-- ๋ทฐ ๊ตฌ์กฐ ๋ณ๊ฒฝ ํ์ธ
SELECT * FROM EMP_DEPT60_SALARY;
โ ๋ทฐ๋ฅผ ์์ฑํ ์ฌ์ฉ์, ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ง ๋ทฐ๋ฅผ ์ญ์ ํ ์ ์๋ค.
-- ๋ง๋ ์ฌ๋ ๋๋ DROP ANY VIEW ๊ถํ์ ๊ฐ์ง ์ฌ๋๋ง ๋ทฐ๋ฅผ ์ญ์ ํ ์ ์๋ค.
DROP VIEW EMP_DEPT60_SALARY;
โ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์ด์ฉํ์ฌ ๋ณตํฉ ๋ทฐ๋ฅผ ์์ฑํ ์ ์๋ค.
-- ๋ณตํฉ ๋ทฐ ์์ฑ
CREATE VIEW EMP_VIEW
AS SELECT
e.EMPLOYEE_ID AS ID,
e.FIRST_NAME AS NAME,
d.DEPARTMENT_NAME AS DEPARTMENT,
j.JOB_TITLE AS JOB
FROM EMPLOYEES e
JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
JOIN JOBS j ON e.JOB_ID = j.JOB_ID;
SELECT * FROM EMP_VIEW;
-- hr ์คํค๋ง์ ๋ํ์ ์ธ ๋ณตํฉ ๋ทฐ
SELECT * FROM EMP_DETAILS_VIEW;
โ ๋ทฐ๊ฐ ๊ทธ๋ฃนํจ์, GROUP BY, DISTINCT๋ฅผ ํฌํจํ๋ค๋ฉด ํ์ ์ ๊ฑฐํ ์ ์๋ค.
โ ํ์ ์ ๊ฑฐํ ์ ์๋ ์กฐ๊ฑด, ํํ์์ผ๋ก ์ ์๋ ์ด, ROWNU ์์ฌ์ด์ด๋ฉด ์์ ํ ์ ์๋ค.
โ ์ ๊ฑฐ์ ์์ ํ ์ ์๋ ์กฐ๊ฑด, ๋ทฐ์ ์ํด ์ ํ๋์ง ์์ NOT NULL์ด์ด ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
-- ๋ทฐ๋ฅผ ์ด์ฉํ DML์ฐ์ฐ
CREATE TABLE EMPS AS SELECT * FROM EMPLOYEES;
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT * FROM EMPS WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMP_DEPT60;
SELECT * FROM EMP_DEPT60 WHERE EMPLOYEE_ID = 104;
SELECT * FROM EMPS WHERE EMPLOYEE_ID = 104;
-- ๋ทฐ ์ญ์
DELETE FROM EMP_DEPT60 WHERE EMPLOYEE_ID = 104;
-- EMPS ํ
์ด๋ธ์ EMPLOYEE_ID 104๋ฒ ์ฌ์์ ์ ๋ณด๊ฐ ์ญ์ ๋ ๊ฒ์ ํ์ธ
SELECT * FROM EMPS WHERE EMPLOYEE_ID = 104;
-- DISTINCT๋ก ๋ทฐ ์์ฑ
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT DISTINCT * FROM EMPS WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMP_DEPT60;
-- ERROR = DISTINCT, GROUP BY, ๊ทธ๋ฃน ํฉ์ ๋ฑ์ ํฌํจํ ๋ทฐ๋ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
DELETE FROM EMP_DEPT60 WHERE EMPLOYEE_ID = 106;
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT EMPLOYEE_ID,
FIRST_NAME || ' ' || LAST_NAME AS NAME,
SALARY * 12 AS ANNUAL_SALARY
FROM EMPS WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMP_DEPT60;
-- ERROR = ํํ์์ผ๋ก ์ ์๋ ์ด, ROWNUM ์์ฌ์ด, ์ ํ์ ์ ๊ฑฐํ ์ ์๋ ์กฐ๊ฑด๋ค์ ์์ ํ ์ ์๋ค.
UPDATE EMP_DEPT60 SET ANNUAL_SALARY = ANNUAL_SALARY * 1.1
WHERE EMPLOYEE_ID = 106;
DELETE FROM EMP_DEPT60 WHERE EMPLOYEE_ID = 106;
-- EMPS ํ
์ด๋ธ์ ํ๊น์ง ์ญ์
SELECT * FROM EMPS WHERE EMPLOYEE_ID = 106;
--
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT EMPLOYEE_ID,
FIRST_NAME,
LAST_NAME,
EMAIL,
SALARY
FROM EMPS
WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMP_DEPT60;
SELECT * FROM EMPS;
-- ๋ทฐ์ ์ํด ์ ํ๋์ง ์์ NOT NULL์ด์ด ๊ธฐ๋ณธ ํ
์ด๋ธ์ ์์ ๋ (HIRE_DATE, JOB_ID)
INSERT INTO EMP_DEPT60
VALUES (500, 'JinKyoung', 'Heo', 'HEOJK', 8000);
-- EMP_DEPT60 ์ญ์ ํ EMP ํ ์ญ์ ํ์ธ
DELETE FROM EMP_DEPT60 WHERE EMPLOYEE_ID = 103;
SELECT * FROM EMPS WHERE EMPLOYEE_ID = 103;
-- EMP_DEPT60 ์์ ํ EMPS ํ ์์ ํ์ธ
UPDATE EMP_DEPT60 SET SALARY = 5000 WHERE EMPLOYEE_ID = 107;
SELECT * FROM EMPS WHERE EMPLOYEE_ID = 107;
โ DML์ ์ํํ๋๋ฐ ์์ด์ ์กฐ๊ฑด์ ์ ์ค๋ ์ปฌ๋ผ์ ์์ ํ ์ ์๋ค.
-- WHERE ์กฐ๊ฑด DEPARTMENT_ID๋ฅผ ์์ ํ ์ WITH CHECK OPTION ์๋ฌ๋ฅผ ์ค์
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT EMPLOYEE_ID,
FIRST_NAME,
HIRE_DATE,
SALARY,
DEPARTMENT_ID
FROM EMPS
WHERE DEPARTMENT_ID = 60
WITH CHECK OPTION;
-- ERROR = WITH CHECK OPTION ์๋ฌ
UPDATE EMP_DEPT60 SET DEPARTMENT_ID = 10 WHERE EMPLOYEE_ID = 105;
โ ๋ทฐ๋ฅผ ์์ฑํ ๋ WITH READ ONLY๋ฅผ ๋ช ์ํ๋ฉด ๋ทฐ๋ฅผ ์ด์ฉํ DML ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ค.
-- WITH READ ONLY
CREATE OR REPLACE VIEW EMP_DEPT60
AS SELECT EMPLOYEE_ID,
FIRST_NAME,
HIRE_DATE,
SALARY,
DEPARTMENT_ID
FROM EMPS
WHERE DEPARTMENT_ID = 60
WITH READ ONLY;
-- ERROR
DELETE FROM EMP_DEPT60
WHERE EMPLOYEE_ID = 105;
โ ์ธ๋ผ์ธ ๋ทฐ ์๋ธ์ฟผ๋ฆฌ๋ FROM ์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์จ ๊ฒ์ ๋งํ๋ค. ๋ณดํต FROM ์ ์๋ ํ ์ด๋ธ ๋๋ ๋ทฐ๊ฐ ์ฌ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์๋ธ์ฟผ๋ฆฌ๋ฅผ FROM ์ ์ ์ฌ์ฉํด ํ๋์ ํ ์ด๋ธ ๋๋ ๋ทฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ ๋ฟ ์๋๋ผ ๋ทฐ๋ ํ๋์ SELECT๋ฌธ์ด๋ฏ๋ก FROM์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ ํ๋์ ๋ทฐ๋ก ๋ณผ ์ ์๋ค. ๊ทธ๋์ FROM์ ์ ์ค๋ ๋ทฐ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ํ๋ค.
-- ์ธ๋ผ์ธ ๋ทฐ
SELECT ROW_NUMBER, FIRST_NAME, SALARY
FROM (SELECT FIRST_NAME, SALARY,
ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS ROW_NUMBER
FROM EMPLOYEES
ORDER BY SALARY DESC)
WHERE ROW_NUMBER BETWEEN 1 AND 10;
์ธํ๋ฐ ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค