yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/DB(SQL)

가상 테이블인 뷰

2022. 4. 11. 19:46

-- 가상 테이블인 '뷰'

-- 기본 테이블 생성하기

DROP TABLE DEPT_COPY;

CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPT;

DROP TABLE EMP_COPY;

CREATE TABLE EMP_COPY
AS
SELECT * FROM EMP;

SELECT * FROM DEPT_COPY;

SELECT * FROM EMP_COPY;


-- 뷰 정의하기

CREATE OR REPLACE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30; -- "insufficient privileges"

SELECT * FROM EMP_VIEW30;


-- 단순 뷰의 컬럼에 별칭 부여하기

DESC EMP_VIEW30; -- 기본 테이블 EMP_COPY의 서브커리문

CREATE OR REPLACE VIEW EMP_VIEW(사원번호, 사원명, 부서번호)
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY;

SELECT * FROM EMP_VIEW;

SELECT * FROM EMP_VIEW WHERE 부서번호=30;


-- 복합 뷰 만들기

CREATE OR REPLACE VIEW EMP_VIEW_DEPT
AS
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO
ORDER BY EMPNO DESC;

SELECT * FROM EMP_VIEW_DEPT;


-- 뷰 삭제

SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;

SELECT * FROM EMP_VIEW;

DROP VIEW EMP_VIEW;


-- OR REPLACE 옵션

CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30; -- "name is already used by an existing object"

CREATE OR REPLACE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;

SELECT * FROM EMP_VIEW30;


-- FROCE 옵션으로 기본 테이블 없이 뷰 생성하기

DESC EMPLOYEES;

CREATE OR REPLACE VIEW EMPLOYEES_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30; -- "table or view does not exist"

CREATE OR REPLACE FORCE VIEW EMPLOYEES_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30; -- 경고: 컴파일 오류와 함께 뷰가 생성되었습니다.

SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;

CREATE OR REPLACE NOFORCE VIEW EMPLOYEES_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30; -- NOFORCE는 생략한 것과 같음


-- 조건 컬럼값을 변경하지 못하게 하는 WITH CHECK OPTION

CREATE OR REPLACE VIEW VIEW_CHK30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH CHECK OPTION;

UPDATE VIEW_CHK30 SET DEPTNO=20
WHERE SAL>=1200; -- view WITH CHECK OPTION where-clause violation

SELECT * FROM VIEW_CHK30;


-- 기본 테이블 변경을 막는 WITH READ ONLY 옵션 WITH CHECK OPTION 비교

DROP TABLE EMP_COPY;

CREATE TABLE EMP_COPY
AS
SELECT * FROM EMP;

SELECT * FROM EMP_COPY;

CREATE OR REPLACE VIEW VIEW_CHK30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH CHECK OPTION;

SELECT * FROM VIEW_CHK30;

UPDATE VIEW_CHK30
SET DEPTNO=20
WHERE SAL <= 1200; -- view WITH CHECK OPTION where-clause violation

UPDATE VIEW_CHK30
SET COMM=1000; -- 6개 행 이(가) 업데이트되었습니다.

CREATE OR REPLACE VIEW VIEW_READ30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH READ ONLY;

UPDATE VIEW_READ30
SET COMM=1000; -- "cannot perform a DML operation on a read-only view"

 

-- ROWNUM 컬럼 성격 파악하기

SELECT * FROM EMP;

SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP;

SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE; -- ROWNUM은 테이블에 데이터가 들어온 순서를 보관하는 컬럼이다.


--  인라인 뷰로 구하는 TOP-N의 개념

SELECT * FROM EMP ORDER BY SAL DESC;

SELECT ROWNUM, ENAME, SAL FROM EMP ORDER BY SAL DESC;

SELECT ROWNUM RNUM, ENAME, SAL FROM
(SELECT * FROM EMP ORDER BY SAL DESC); -- 새로운 테이블을 만들었기 때문에 들어온 순서가 새로 작성됨

-- 급여(SAL)를 많이 받는 6~10번째 사원을 출력하세요.
SELECT ROWNUM, RNUM, ENAME, SAL FROM
(SELECT ROWNUM RNUM, ENAME, SAL FROM
(SELECT * FROM EMP ORDER BY SAL DESC))
WHERE RNUM BETWEEN 6 AND 10;

-- 급여가 가장 낮은 TOP3 사원명과 급여를 출력하세요.
SELECT ROWNUM, RNUM, ENAME, SAL FROM
(SELECT ROWNUM RNUM, ENAME, SAL FROM
(SELECT * FROM EMP ORDER BY SAL ASC))
WHERE RNUM BETWEEN 10 AND 12;


-- 예제

-- 사원 테이블(EMP)에서 가장 최근에 입사한 사원들중에 3~5번째의 사번과 사원명을 출력하는 SQL문을 작성하세요.

SELECT ROWNUM, RNUM, EMPNO, ENAME FROM
(SELECT ROWNUM RNUM, EMPNO, ENAME FROM
(SELECT * FROM EMP ORDER BY HIREDATE DESC))
WHERE RNUM BETWEEN 3 AND 5;

'~2023.02 > DB(SQL)' 카테고리의 다른 글

저장 프로시저와 저장 함수  (0) 2022.04.14
PL/SQL  (0) 2022.04.12
사용자 관리  (0) 2022.04.12
시퀀스  (0) 2022.04.11
데이터 무결성을 위한 제약 조건  (0) 2022.04.11
    '~2023.02/DB(SQL)' 카테고리의 다른 글
    • PL/SQL
    • 사용자 관리
    • 시퀀스
    • 데이터 무결성을 위한 제약 조건
    yooniiverse
    yooniiverse

    티스토리툴바