[oracle] ๋ทฐ(VIEW)

์žฌํ˜„ยท2024๋…„ 6์›” 16์ผ
0
post-thumbnail

๐Ÿ” ๋ทฐ

โœ ๋ทฐ(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;

๐Ÿ” ๋ทฐ๋ฅผ ์ด์šฉํ•œ DML

โœ ๋ทฐ๊ฐ€ ๊ทธ๋ฃนํ•จ์ˆ˜, 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;

๐Ÿ” WITH CHECK OPTION

โœ 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

โœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ 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;

๐Ÿ“– REFERENCE

์ธํ”„๋Ÿฐ ์˜ค๋ผํด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

profile
์šด๋™๊ณผ ์ฝ”๋”ฉ

0๊ฐœ์˜ ๋Œ“๊ธ€