은은하게 코드 뿌시기

[DB] 뷰(view) /인라인뷰/ ROWNUM 본문

Database -Mysql,Oracle

[DB] 뷰(view) /인라인뷰/ ROWNUM

은은하게미친자 2022. 8. 26. 17:28
728x90

뷰?

: 가상테이블 (virtual table), 뷰, 하나 이상의 테이블을 조회하는 select문을 저장한 객체,

데이터를 따로 저장하지 않습니다.

편리성, 보안성(테이블의 열을 노출 하고싶지 않을 경우) 을 위해 사용합니다.

서브쿼리
SELECT *
FROM VW_EMPSAL1000;
1
2
3
SELECT * FROM ( select empno, ename, job 
               from scott.emp
               where (SAL > 1000)  ) AS B;
cs

뷰 생성하기

오라클 기준 뷰생성 구문 

CREATE [OR REPLACE] [FORCE |NOFORCE] VIEW 뷰이름(열이름1, 열이름2, ...)
AS (저장할 SELECT 문)
[WITH CHECK OPTION [CONSTRAINT 제약조건]]

[WITH READ ONLT [CONSTRAINT 제약조건]];
요소 설명
OR REPLACE 같은 이름의 뷰가 이미 존재할경우 현재 생성할 뷰로 대체 하며 생성(선택)
FORCE 뷰가 저장할 SELECT문의 기반 테이블이 존재하지 않아도 강제로 생성(선택)
NOFORCE 뷰가 저장할 SELECT문의 기분 테이블이 존재할 경우에만 생성(기본값,선택)
뷰이름 생성할 뷰이름 지정
열이름  SELECT문에 명시된 이름대신 사용할 열이름 지정 (생략가능, 선택)
저장할 SLECT문 생성할 뷰에 저장할 SLELECT문 지정(필수)
WITH CHECK OPTION  지정한 제약 조건을 만족하는 데이터에 한해 DML작업이 가능하도록 뷰 생성(선택)
WITH READ ONLY 뷰의 열람, 즉 SELECT만 가능하도록 뷰 생성(선택)

오라클의 경우 뷰의 시스템 계정으로 접속한 후에 계정에 권한을 부여해 주어야 합니다.

SQL PLUS SYSTEM/oracle

GRANT CREATE VIEW TO SCOTT;

생성 구문 예제

뷰 생성하기
1
2
3
4
create view VW_EMPSAL1000
AS ( select empno, ename, job 
               from scott.emp
               where (SAL > 1000)  );
cs
+ MYSQL에서도 실행됨
뷰 확인하기
1
SELECT * FROM VW_EMPSAL1000;
cs

뷰 삭제하기

1
DROP VIEW VW_EMPSAL1000;
cs

 

인라인뷰를 사용한 TOP-N SQL문 / ROWNUM

인라인뷰 : CREATE 문을 통해 객체로 만들어지는 뷰외에 SQL문에서 일회성으로 만들어서 사용하는 뷰를 인라인 뷰라고합니다.

 

ROWNUM :  의사열이라고하는 특수열입니다. 의사열은 데이터가 저장되는 실제테이블에 존재하지는 않지만 특정 목적을 위해 테이블에 저장되어 잇는 열처럼 사용 가능한 열

 

EMP 테이블을 SAL 열 기준으로 정렬하기
오라클
SELECT ROWNUM, E*
FROM EMP E
ORDER BY SAL DESC;
MYSQL

1
2
3
4
5
6
SET @ROWNUM=0;
 
SELECT @ROWNUM:=@ROWNUM+1 , E.*
FROM EMP E
ORDER BY SAL DESC;
 
cs




MY SQL의 경우

0 으로 설정하고
SELECT 했을경우 1부터 COUNT가 세져서
출력된다.

SELECT 전에 초기값을 0 으로 주지않으면
변수형식으로 작용하여

다음 출력시에는 데이터가 쌓여 출력된다.


위와 같은 문제로

SET을 매번 0 으로 날려주는 방식 으로 
처리하거나
FROM절이나 , WHERE절에 포함하여 초기화 하는
방법도있다. 그에 대한 예제는 다음과 같다.

1
2
3
4
5
6
7
8
9
-- WHERE절에서 초기화
SELECT @ROWNUM:=@ROWNUM+1 , E.*
FROM EMP E
WHERE (@ROWNUM:=0)=0
ORDER BY SAL DESC;

-- FROM절에서 초기화
SELECT @ROWNUM:=@ROWNUM+1 , E.*
FROM EMP E , (SELECT @ROWNUM:=0) TMP
ORDER BY SAL DESC;
cs
728x90
Comments