[ORACLE]SQL DEVELOPER 7日目-ビュー(VIEW)

7170 ワード

VIEW


ROWNUM:検索行の順序を指定するキーワード

  • 今日の勉強で一番大切なのは、必要な範囲の行だけを検索すること
  • SELECT EMPNO,ENAME,SAL FROM EMP;
    SELECT ROWNUM,EMPNO,ENAME,SAL FROM EMP;
    
    질의 결과 - 오른쪽이 ROWNUM 적용 

    ROWNUMキーワードではなくROW NUMBER()ランキング関数を使用して行番号を返し、検索-OVER()分析関数を使用します.
    SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) NUM,EMPNO,ENAME,SAL FROM EMP;
    
    질의 결과

    EMPテーブルでは、すべての従業員の従業員番号、従業員名、および給与を昇給順に検索し、5未満の行のみを検索する行番号を指定します.
    --원도우 함수(그룹함수,순위함수,순서함수 등)를 WHERE 구문에서 사용할 경우 에러 발생
    SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) NUM,EMPNO,ENAME,SAL FROM EMP WHERE ROW_NUMBER() OVER(ORDER BY SAL DESC)<5;
    
    --조건식에서 컬럼의 별칭을 사용할 경우 에러 발생
    SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) NUM,EMPNO,ENAME,SAL FROM EMP WHERE NUM<5;
    EMPテーブルで、すべての従業員の従業員番号、従業員名、および報酬を昇給順にソートしてEMPビューを作成します.
    CREATE OR REPLACE VIEW EMP_VIEW AS SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC;
    SELECT * FROM EMP_VIEW;
    
    --다른 검색대상을 테이블(뷰)의 모든 컬럼과 같이 표현하고자 할 경우 테이블(뷰).* 형식으로 표현 가능
    --EMP_VIEW 뷰에 행번호를 제공하여 검색하되 행번호가 5보다 작은 행들만 검색
    -- >> ROWNUM 키워드는 WHERE 구문의 조건식에서 사용 가능
    SELECT ROWNUM,EMP_VIEW.* FROM EMP_VIEW WHERE ROWNUM<5;
    
    스크립트 출력, 질의 결과 


    *インラインビュー(INLINE VIEW):SELECTコマンドのFROM構文を使用したサブクエリによって一時的に作成および使用されるビュー

    SELECT EMPNO,ENAME,SAL FROM EMP;--테이블을 이용하여 검색
    SELECT EMPNO,ENAME,SAL FROM (SELECT * FROM EMP);--인라인 뷰를 이용하여 검색
    SELECT EMPNO,ENAME,SAL FROM (SELECT * FROM EMP WHERE DEPTNO=10);
    
    --인라인 뷰에 없는 컬럼을 검색할 경우 에러 발생
    SELECT EMPNO,ENAME,SAL,DEPTNO FROM (SELECT EMPNO,ENAME,SAL FROM EMP);
    
    질의 결과 - 인라인뷰 이용

    「行内ビュー」で別名を設定して検索します.すべての列を表すには、「行内ビュー」の別名を使用します.
    SELECT ROWNUM,TEMP.* FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TEMP;
    ロー・ビューを使用すると、ROWNUMキーの別名が条件式で使用可能になります.
    SELECT * FROM (SELECT ROWNUM RN,TEMP.* FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TEMP) WHERE RN=10;
    
    질의 결과

    条件式で別名を使用中にエラー(ROWNUMキーワードで別名を使用)
    SELECT ROWNUM RN,TEMP.* FROM (SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TEMP WHERE RN=10;
    *コア+毒性の最良の方法-彼だけが知っていてもいい!
    EMPテーブルでは、すべての従業員の従業員番号、従業員名、および給与を昇給順に検索し、検索行に行番号を入力して検索します.行番号が6~10の行のみを検索します.
    SELECT * FROM (SELECT ROWNUM RN,TEMP.* FROM 
    	(SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) TEMP) WHERE RN BETWEEN 6 AND 10;
        
    질의 결과    

    EMPテーブルでは、従業員番号7844で従業員の従業員番号、従業員名、検索行の前の行の従業員番号および従業員名、検索行の後の行の従業員番号および従業員名を従業員番号の昇順で検索します.
    ただし、前の行または後の行がない場合は、検索する従業員番号は0、従業員名はNULLです.
    --WHERE 구문이 먼저 실행되어 검색되므로 직전행과 직후행이 존재하지 않아 직전행과 직후행의 컬럼값 대신 0과 NULL 검색
    
    SELECT EMPNO,ENAME,LAG(EMPNO,1,0) OVER(ORDER BY SAL) BEFORE_EMPNO,LAG(ENAME,1,NULL) OVER(ORDER BY SAL) BEFORE_ENAME
        ,LEAD(EMPNO,1,0) OVER(ORDER BY SAL) AFTER_EMPNO,LEAD(ENAME,1,NULL) OVER(ORDER BY SAL) AFTER_ENAME FROM EMP WHERE EMPNO=7844;  
        
    질의 결과    

    *行ビューを使用してすべての従業員を検索し、必要な行の検索結果を表示します.
    SELECT * FROM (SELECT EMPNO,ENAME,LAG(EMPNO,1,0) OVER(ORDER BY SAL) BEFORE_EMPNO,LAG(ENAME,1,NULL) OVER(ORDER BY SAL) BEFORE_ENAME
        ,LEAD(EMPNO,1,0) OVER(ORDER BY SAL) AFTER_EMPNO,LEAD(ENAME,1,NULL) OVER(ORDER BY SAL) AFTER_ENAME FROM EMP) WHERE EMPNO=7844;
        
    질의 결과 - 인라인 뷰 이용    

    *シーケンス(SEQUENCE):数値(整数)を格納して、自動的に増加するオブジェクトを提供します。


    シーケンスの作成
    フォーマット)CREATE SEQUENCEシーケンス名[開始WITH初期値][増分BY増分値][最大値][最小値][CYCLE][CACHE数]
  • START WITH初期値:シーケンスオブジェクトに格納されている初期値の設定-スキップ:NULL値自動
  • INCREMENT BY増分:自動増分の数値設定-スキップ:1増分
  • MAXVALUE最大値:シーケンスオブジェクトに格納可能な最大値の設定-省略:数値として表示可能な最大値の設定
  • MINVALUE最小値:シーケンスオブジェクトに格納可能な最小値の設定-スキップ:1
  • CYCLE:シーケンスオブジェクトに最大値を超える値を繰り返し格納する場合に最小値から提供する機能
  • CACHE数:一時記憶領域に予め自動増分値を作成して提供可能数を設定する機能を提供する-省略:20
  • --USER2 테이블 생성 : 번호(숫자형-PRIMARY KEY),이름(문자형),생년월일(날짜형)
    CREATE TABLE USER2(NO NUMBER(2) PRIMARY KEY, NAME VARCHAR2(20),BIRTHDAY DATE);
    DESC USER2;
    
    --USER2 테이블의 NO 컬럼값으로 저장될 자동 증가값을 제공하기 위한 시퀀스 객체 생성
    CREATE SEQUENCE USER2_SEQ;
    
    --시퀸스 확인 - USER_SEQUENCES : 시퀀스 정보를 제공하는 딕셔너리
    SELECT SEQUENCE_NAME,MAX_VALUE,MIN_VALUE,INCREMENT_BY FROM USER_SEQUENCES;
    
    --시퀀스에 저장된 숫자값 확인 - 형식)시퀀스명.CURRVAL
    --시퀀스에 NULL이 저장된 경우 숫자값을 확인하면 에러 발생
    SELECT USER2_SEQ.CURRVAL FROM DUAL;
    
    스크립트 출력, 질의 결과 - 테이블 생성, 시퀀스 객체, 시퀀스 확인 


    シーケンスを使用して、自動増分(フォーマット)シーケンス名を指定します.NEXTVAL
  • シーケンスクイーンにNULLを格納すると、シーケンスの最小値が与えられ、シーケンスは自動的に与えられた数値に変更される
  • シーケンスに数値が格納されている場合は増加値に等しい数値が与えられ、シーケンスは自動的に与えられた数値に変更される
  • SELECT USER2_SEQ.NEXTVAL FROM DUAL;-- 1(최소값)이 검색되고 시퀸스 숫자값 변경
    SELECT USER2_SEQ.CURRVAL FROM DUAL;--시퀸스 현재값 : 1
    SELECT USER2_SEQ.NEXTVAL FROM DUAL;--증가값 : 1 >> 2가 검색되고 시퀸스 숫자값 변경
    SELECT USER2_SEQ.CURRVAL FROM DUAL;--시퀸스 현재값 : 2
    
    -*-USER2 테이블에 행 삽입 - 시퀸스의 자동 증가값을 NO 컬럼에 전달하여 저장 - 중복되지 않는 값 
    INSERT INTO USER2 VALUES(USER2_SEQ.NEXTVAL,'홍길동','00/01/01');
    INSERT INTO USER2 VALUES(USER2_SEQ.NEXTVAL,'임꺽정','01/12/31');
    INSERT INTO USER2 VALUES(USER2_SEQ.NEXTVAL,'전우치','02/12/21');
    SELECT * FROM USER2;
    COMMIT;
    
    질의 결과 - USER2

    シーケンスの変更


    フォーマット)ALTER SEQUENCEシーケンス名{MAXVALUE|MINVALUE|INCREMENTBY}変更値
    USER 2 SEQシーケンスの最大値は99、増分は5
    SELECT SEQUENCE_NAME,MAX_VALUE,MIN_VALUE,INCREMENT_BY FROM USER_SEQUENCES;
    ALTER SEQUENCE USER2_SEQ MAXVALUE 99 INCREMENT BY 5;
    SELECT SEQUENCE_NAME,MAX_VALUE,MIN_VALUE,INCREMENT_BY FROM USER_SEQUENCES;
    
    --USER2 테이블에 행 삽입 - 시퀸스의 자동 증가값을 NO 컬럼에 전달하여 저장 - 중복되지 않는 값 
    INSERT INTO USER2 VALUES(USER2_SEQ.NEXTVAL,'일지매','03/9/09'); --5 증가
    SELECT * FROM USER2;
    COMMIT;
    
    질의 결과 - 최대값 변경전, 변경후 

    シーケンスの削除


    フォーマット)DROP SEQUENCEシーケンス名
    USER 2 SEQシーケンスの削除
    DROP SEQUENCE USER2_SEQ;
    SELECT SEQUENCE_NAME,MAX_VALUE,MIN_VALUE,INCREMENT_BY FROM USER_SEQUENCES;
    
    질의 결과