DB

DB 03/13

SangssI 2023. 3. 13. 10:33

VIEW(가상의 테이블) : 원하는 정보들로만 구성된 조회 목적의 테이블

--기본 형식

CREATE or REPLACE view 테이블 이름 (컬럼에 대한 별칭 혹은 컬럼 이름) AS
SELECT


-- 부서테이블로 부터 사번,입사일,직종,이름만을 조회하는 view를 생성

CREATE or REPLACE view MYEMP (empno, hire, job, name) AS
SELECT employee_id, hire_date, job_id, first_name
FROM employees;

--만들어진 view 조회

SELECT * FROM MYEMP;

--MYEMP로부터 이름이 Julia인 사원을 '홍길동'으로 변경

UPDATE MYEMP SET name = '홍길동'
WHERE name = 'Julia'
commit;

--MYEMP에 정보를 추가해보자
--MYEMP에 정보를 추가하려면 employees테이블에 있는 모든 컬럼에 대한 정보가
   insert 되어야 하므로, 아래의 문장처럼 VALUES에 일부의 데이터만 추가되어 있는 경우 insert가 불가

insert into MYEMP values(108,'03/13/2023',IT_PROG','박상수')  -- 오류
commit;

--별칭 및 employees의 컬럼을 지정을 하지 않고 * 을 사용했을때

CREATE or REPLACE view MYEMP AS  -- (컬럼에 대한 별칭 혹은 컬럼 이름) 이 없으면 원래 employees에 있는 컬럼 이름으로 나온다.
SELECT *       -- employee_id, hire_date, job_id, first_name 컬럼을 지정하지 않고 * 을 사용하면 전체 컬럼의 정보를 가져온다.
FROM employees;

-- 사원테이블의 모든 정보 (s.*)에 full_name을 추가한 VIEW

CREATE or REPLACE view MYEMP AS
SELECT s.*, concat(first_name,last_name) full_name -- employees테이블이 s의 모든 컬럼과, full_name이라는 새로운 컬럼을 만들고 MYEMP VIEW 생성
FROM (SELECT * FROM employees) s;  -- employees 의 테이블에 대한 별칭 s 지정

--VIEW 삭제하기

DROP VIEW myemp;


--성적확인을 위한 테이블 생성


1. 시퀀스 생성

CREATE SEQUENCE SEQ_SCORE_NO;


2. 성적관리 테이블 생성

CREATE table SCORE (
no NUMBER(3) primary key,
kor NUMBER(3) not null,
eng NUMBER(3) not null,
math NUMBER(3) not null
);

3.성적관리 테이블에 값 추가

INSERT into SCORE values( SEQ_SCORE_NO.nextVal, 100, 70, 100 );
INSERT into SCORE values( SEQ_SCORE_NO.nextVal, 92, 40, 40 );
INSERT into SCORE values( SEQ_SCORE_NO.nextVal, 80, 60, 40 );
commit;

4. Score 테이블에 총점과 평균을 추가한 view를 생성

RANK() OVER

CREATE or REPLACE VIEW SCORE_view AS
SELECT s.* , ( kor + eng + math ) total, round((kor+eng+math)/3, 1) avg, 
         RANK() OVER (order by (kor+eng+math) DESC ) rank  -- RANK() OVER 기본형식, 순위를 매기고 값을 지정함
FROM ( select * from score) s;
ORDER BY no;