ORACLE (feat. VIEW)

min seung moon·2021년 2월 18일
0

Oracle

목록 보기
15/23

VIEW

  • 뷰는 일반 사용자 입장에서는 테이블과 동일하게 사용하는 개체임.

1. VIEW의 생성 및 출력

-- VIEW 생성
CREATE VIEW v_userTBL
	AS SELECT userID, userName, addr FROM userTBL;
    
-- VIEW 출력
SELECT * FROM v_userTBL; -- 뷰를 테이블이라고 생각해도 무방

-- VIEW 수정
CREATE OR REPLACE VIEW v_userTBL AS SELECT userID, userName, addr FROM userTBL WHERE addr = '서울';

2. VIEW의 장점

  • 뷰를 사용해서 얻을 수 있는 장점
    • 보안에 도움이 됨
    • 복잡한 쿼리를 단순화 시켜줄 수 있음
-- 기본적인 뷰의 생성 시에 뷰에서 사용될 열의 이름을 변경할 수도 있다

CREATE OR REPLACE VIEW v_userbuyTBL
	AS SELECT U.userID AS "USER ID", U.userName AS "USER NAME",
       		  B.prodName AS "PRODUCT NAME", U.addr, 
              	  CONCAT(U.mobile1, U.mobile2) AS "MOBILE PHONE"
    	   FROM userTBL U
    	   	INNER JOIN buyTBL B
    	   		ON U.userID = B.userID;
    
SELECT "USER ID", "USER NAME" FROM v_userbuyTBL;

3. VIEW 예제 실습

-- 뷰의 수정은 생성 시와 마찬기지로 CRATE OR REPLACE VIEW 구문을 사용하면 된다
-- 한글의 열 이름도 가능하다(호환성 문제로 별로 권장하지 않는다)
CREATE OR REPLACE VIEW v_userbuyTBL
	AS SELECT U.userID AS "사용자 아이디", U.userName AS "이름", B.prodName AS "제품 이름",
              	  U.addr, CONCAT(U.mobile1, U.mobile2) AS "전화 번호"
    	   FROM userTBL U
    	   	INNER JOIN buyTBL B
    			ON U.userID = B.userID;
                
SELECT "이름", "전화 번호" FROM v_userbuyTBL;

-- 뷰에 대한 정보는 시스템 뷰인 USER_에, 딕셔너비 뷰인 USER_VIEWS에 들어있다
CREATE OR REPLACE VIEW v_userTBL
    AS SELECT userID, userName, addr FROM userTBL;
SELECT * FROM USER_VIEWS;

-- 뷰를 통해서 데이터를 변경, 수정, 뷰가 수정되면 원본 테이블도 수정된다
UPDATE v_userTBL SET addr = '부산' WHERE userID = 'JKW';
SELECT * FROM v_userTBL;
SELECT * FROM userTBL;

-- 데이터 입력
INSERT INTO v_userTBL(userID, userName, addr) VALUES('KBM','김병만','충북');

-- WITH READ ONLY문 사용
CREATE OR REPLACE VIEW v_userTBL
    AS SELECT userID, userName, addr
       FROM userTBL
       WITH READ ONLY;
    
-- 읽기 전용 뷰라는 오류 발생
UPDATE v_userTBL SET addr = '태국' WHERE userID = 'SSK';

-- 그룹함수를 포함하는 뷰를 정의 GROUP BY
CREATE OR REPLACE VIEW v_sum
    AS SELECT userID, SUM(price*amount) AS "Total"
       FROM buyTBL GROUP BY userID;
    
SELECT * FROM v_sum;

-- 지정한 범위로 뷰를 생성하고 데이터 입력
CREATE OR REPLACE VIEW v_height177
    AS SELECT * FROM userTBL
    WHERE height >= 177;
    
SELECT * FROM v_height177;

-- 데이터 삭제
DELETE FROM v_height177 WHERE height < 177;

-- 데이터 입력
INSERT INTO v_height177 VALUES('MMS', '문민승', '경기', '010', '55555555' ,158, '2019-01-01');

-- 두개 이상의 테이블이 관련되는 복합 뷰를 생성하고 데이터 입력
CREATE OR REPLACE VIEW v_userbuyTBL
    AS SELECT U.userID, U.userName, B.prodName, U.mobile1 || U.mobile2 AS mobile
    FROM userTBL U
    INNER JOIN buyTBL B
        ON U.userID = B.userID;
    
SELECT * FROM v_userbuyTBL;

-- 두개의 테이블을 같이 사용하면 둘다 같이 입력해줘야 한다
INSERT INTO v_userbuyTBL VALUES('PKL', '박경리', '운동화', '경기', '00000000000');

DROP TABLE userTBL CASCADE CONSTRAINTS;
SELECT * FROM v_userbuyTBL;
profile
아직까지는 코린이!

0개의 댓글