SQL-INLINE VIEW, SEQUENCE

2019. 12. 19. 09:30Security/sql

* INLINE VIEW(인라인 뷰)

from절에 테이블이 아닌 서브쿼리문을 사용한 것

 

SELECT ...
FROM (SELECT 문장 : sub query) [별명]

 

[예제 1] 각 부서별 최소 급여자를 검색한다.

SELECT eno, ename, d.dno, sal, msal
FROM emp e,
(SELECT dno, MIN(sal) msal

FROM emp
GROUP BY dno) d // d는 sql문으로부터 나온 결과값을 d라는 테이블로 사용 
WHERE e.dno = d.dno
AND sal = msal;

 

ROWNUM을 이용한 Top-N 분석

row의 갯수. 부등호만을 사용한다. 최상위, 최하위를 검색하고 싶을때 사용.


SELECT ROWNUM, [컬럼, 컬럼, ...]
FROM (SELECT ... ORDER BY ...)
WHERE ROWNUM <= N;

 

[예제 2] Emp 테이블로부터 3행까지만 검색한다.

SELECT ROWNUM, eno, ename, job, mgr, hdate

FROM emp

WHERE ROWNUM <= 3;

SELECT ROWNUM, eno, ename, job, mgr, hdate

FROM emp;

SELECT eno, ename, job, mgr, hdate

FROM emp

WHERE ROWNUM <= 3;

 

[예제 3] 최상위 연봉을 지급 받는 3인을 검색한다.

SELECT ROWNUM, eno, ename, ansal
FROM (SELECT eno, ename, sal*12+NVL(comm,0) ansal
          FROM emp
          ORDER BY ansal DESC)
WHERE ROWNUM <= 3;

 

sub query문을 먼저 실행해주고 ROWNUM을 해줘야 출력이 된다. 

 

[실습] 
1. 4.5 환산 평점이 가장 높은 3인의 학생을 검색한다.

SELECT ROWNUM, sno, sname, avg_fourfive 환산평점
FROM (SELECT sno, sname, TO_CHAR(AVG(avr*4.5/4.0), '0.99') avg_fourfive
          FROM student
          GROUP BY sno, sname
          ORDER BY avg_fourfive DESC)
WHERE ROWNUM <= 3;


2. 화학과 학생 중 기말고사 유기화학 점수가 최하위인 학생 3명을 검색한다.

SELECT ROWNUM, sno, sname, major, cname, result
FROM (SELECT s.sno, s.sname, s.major, c.cname, r.result
          FROM student s, course c, score r
         WHERE s.sno = r.sno AND c.cno = r.cno
         AND cname = '유기화학' AND major = '화학'
         ORDER BY result)
WHERE ROWNUM <= 3; 


3. 기말고사 과목별 평균이 높은 3과목을 검색한다.

SELECT ROWNUM, cno, cname, avg_result
FROM (SELECT c.cno, c.cname, TO_CHAR(AVG(result), '00.99') avg_result
          FROM course c, score r
          WHERE c.cno = r.cno
          GROUP BY c.cno, c.cname
         ORDER BY avg_result DESC)
WHERE ROWNUM <= 3;


4. 학과별 학년별 기말고사 평균이 순위 3위까지를 검색.(학과, 학년, 평균점수를 검색한다.)

SELECT ROWNUM, cname, syear, avg_result
FROM (SELECT c.cname, s.syear, TO_CHAR(AVG(result), '00.99') avg_result
          FROM course c, student s, score r
          WHERE c.cno = r.cno AND s.sno = r.sno
          GROUP BY c.cname, s.syear
          ORDER BY avg_result DESC)
WHERE ROWNUM <= 3;


5. 기말고사 성적이 높은 과목을 담당하는 교수 3인을 검색.(교수 이름, 과목명과 평균점수를 검색한다.)

SELECT ROWNUM, pname, cname, avg_result 평점
FROM (SELECT pname, cname, TO_CHAR(AVG(result), '00.99') avg_result
          FROM professor p, course c, score r
          WHERE p.pno = c.pno AND c.cno = r.cno
          GROUP BY pname, cname
          ORDER BY avg_result DESC)
WHERE ROWNUM <= 3;


6. 교수별로 현재 수강중인 학생의 수가 많은 순서대로 10인을 검색한다.

SELECT ROWNUM, pname, 학생수
FROM (SELECT pname, COUNT(DISTINCT s.sno) 학생수 
          FROM professor p, student s, course c, score r
          WHERE p.pno = c.pno AND s.sno = r.sno AND c.cno = r.cno
          GROUP BY pname
          ORDER BY 학생수 DESC)
WHERE ROWNUM <= 10;

 

* SEQUENCE(시퀀스)

 

시퀀스 생성과 확인
CREATE SEQUENCE 시퀀스
[ START WITH 시작_값
INCREMENT BY 증가_값
MAXVALUE [상한_값 | NOMAXVALUE]
MINVALUE [하한_값 | NOMINVALUE]
CYCLE | NOCYCLE
CACHE [cache_개수| NOCACHE]];

 

ALTER SEQUENCE 시퀀스

INCREMENT BY 증가_값

MAXVALUE [상한_값 | NOMAXVALUE]

MINVALUE [하한_값 | NOMINVALUE]

CYCLE | NOCYCLE

CACHE cache_개수| NOCACHE;

 

DROP SEQUENCE 시퀀스;

 

SELECT sequence_name, max_value, min_value, increment_by,

          cache_size, last_number, cycle_flag

FROM user_sequences;

 

... 시퀀스.NEXTVAL ...
... 시퀀스.CURRVAL ...

 

[예제 1]실습용 시퀀스를 생성하고 생성된 시퀀스의 설정을 검색한다.
CREATE SEQUENCE emp_eno_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOMINVALUE
NOCYCLE
CACHE 20;

// 거의 사용하지 않는다.

 

CREATE SEQUENCE dept_dno_seq;

// 이렇게만 써줘도 위의 명령어와 똑같이 생성.

 

SELECT sequence_name, max_value, min_value, increment_by,

          cache_size, last_number, cycle_flag

FROM user_sequences; 

-> 시퀀스를 조회하는 명령어

 

[예제 2]순환 시퀀스를 생성하고 생성된 시퀀스의 설정을 검색.
CREATE SEQUENCE co_cno_seq
MAXVALUE 5
CYCLE;

// cache값보다 크게 만들어야 함. 

 

CREATE SEQUENCE co_cno_seq

MAXVALUE 50

CYCLE; // cache값보다 더 커지니까 만들어 짐.

 

SELECT sequence_name, max_value, min_value, increment_by,
          cache_size, last_number, cycle_flag
FROM user_sequences;

 

[예제 3] [예제 1]에서 생성한 emp_eno_seq 시퀀스에게 값을 할당 받아 사용. 실습전 emp 테이블의 모든 데이터 삭제

DELETE FROM emp;

COMMIT;

 

SELECT sequence_name, max_value, min_value, increment_by,
          cache_size, last_number, cycle_flag
FROM user_sequences; // 시퀀스는 그대로 존재함.

 

INSERT INTO emp (eno, ename) VALUES (emp_eno_seq.nextval, '첫 번째');

 

SELECT emp_eno_seq.currval FROM dual;

 

SELECT eno, ename FROM emp;

 

ROLLBACK;

 

INSERT INTO emp (eno, ename) VALUES (emp_eno_seq.nextval, '두 번째');

 

COMMIT;

 

SELECT eno, ename FROM emp;

 

SELECT sequence_name, max_value, min_value, increment_by,
          cache_size, last_number, cycle_flag

FROM user_sequences; 

// emp_eno_seq의 값은 2개밖에 안 썼지만 LAST_NUMBER는 21이 나온다.

  내가 사용한 값이 아닌 내가 할당 받을 수 있는 번호중 가장 마지막 번호가 나옴.

 

* SQL에서 반드시 활용할 수 있어야 하는 것

1. 조인

 

2. ERD와 테이블 상세 도표를 보고 -> SQL문을 작성할 수 있어야함.

 

3. TO_CHAR : 날짜나 숫자를 문자로 변환. 출력 서식을 맞추고 싶을때, 내가 원하는 형태로 출력하고 싶을때 사용.

                  주로 SELECT 에서 많이 사용. 출력 서식을 지정하고 싶을때

   TO_DATE : 데이터를 날짜형으로 해석. 주로 INSERT나 WHERE절에서 많이 사용. 정확히 날짜로 해석할 수 있도록 사용

 

4. 그룹

 

* dictionary

user_tables : 테이블의 정보를 조회해 줌

user_constraints : 유저가 소유한 제약조건을 모두 조회

user_cons_columns : 컬럼에 할당된 제약조건을 조회

dba_tablespaces : 테이블의 스페이스를 확인할때 사용.

dba_users : DB에 있는 모든 사용자 목록을 조회

user_tab_columns  : 테이블, 뷰, 클러스터의 칼럼과 관련된 정보 조회

user_indexes : 테이블이 가지고 잇는 인덱스 목록 조회

user_ind_columns : 인덱스의 컬럼 조회

user_ind_experession : 함수 기반 인덱스의 컬럼 정보 확인

user_view : 뷰에 대한 정보를 조회

user_sequences : 생성된 시퀀스의 정보를 조회

'Security > sql' 카테고리의 다른 글

SQL-VIEW  (0) 2019.12.18
SQL-INDEX  (0) 2019.12.17
SQL-제약 조건 이해와 설정-UK, NOT NULL, CHECK  (0) 2019.12.16
SQL-제약 조건 이해와 설정-PK, FK  (0) 2019.12.13
SQL-테이블 생성과 데이터 타입의 이해  (0) 2019.12.12