View

[SQL] 20190605

다슬다슬 2019. 6. 5. 16:08

병행처리 (스케줄링)

VIEW
- SELECT, INSERT, UPDATE, DELETE 가능
- 가상의 테이블이기 때문에 물리적인 저장 공간을 필요로 하지 않음

CREATE VIEW STU_VIEW (STU_NO, STU_NAME, STU_GENDER)
AS SELECT STU_NO, STU_NAME, STU_GENDER
FROM STUDENT;

select * from stu_view;

create view emp_view (empno, ename, dname) as
select emp.empno, emp.ename, dept.dname
from emp natural join dept;

문제 1. EMP 테이블로부터 10, 20번 부서의 사원들로 이루어진 뷰를 생성하시오.
create view emp_view (empno, deptno) as
select empno, deptno
from emp
where deptno = 10
or deptno = 20;

create view empno_view as
select *
from emp
where deptno in (10, 20);

CREATE VIEW EMPNO_VIEW(EMPNO, ENAME, DEPTNO) AS
SELECT EMPNO,ENAME,DEPTNO FROM EMP WHERE ENAME = 
(SELECT ENAME FROM EMP WHERE DEPTNO =10 OR DEPTNO =20);

*** 문제 2. 사원번호, 사원이름, 부서이름, 상급자 이름으로 구성된 뷰를 생성하시오.
create view emp4(empno, ename, dname, mgr_name) as
select e1.empno, e1.ename, d.dname, e2.ename
from emp e1, emp e2, dept d
where e1.mgr = e2.empno 
and e1.deptno = d.deptno;

e1의 매니저번호가 e2의 사원번호와 같아야함
e1의 부서번호를 d의 부서번호에서 가져옴

문제 3. 학과별 평균 몸무게와 평균 키를 가지는 뷰를 생성하시오.
create view student_view (stu_dept, stu_weight, stu_height) as
select stu_dept, round(avg(stu_weight), 2), round(avg(stu_height), 2)
from student
group by stu_dept;


보안 관리를 위한 View
- 보안 등급에 맞추워 컬럼 및 범위를 정하고 Privilege 부여
- Table의 명칭이나 Column의 명칭을 숨기기 위함

CREATE [UNIQUE] INDEW i_stu_weight
ON student(stu_weight, ...)

INDEX 삭제
DROP INDEW i_stu_weight;

INDEX 검색
user_indexes, iser_id_columns


Sequence 생성
CREATE SEQUENCE sequence_name
 STEAT WITH n
 INCREMENT BY n
 MAXVALUE n | NOMAXVALUE
 MINVALUE n | NOMINVALUE
 CYCLE | NOCYCLE -> default 값은 nocycle
 CACHE | NOCACHE -> default 값은 nocache

create sequence seq1
INCREMENT by 1 -> 1씩 증가
start with 1 -> 1부터 시작
MAXVALUE 100; -> max값 : 100

select seq1.nextval from dual;

select seq1.nextval, ename from emp;

create table emp_vv as
select seq1.nextval, ename from emp;

BMI지수= 몸무게(kg) ÷ (신장(m) × 신장(m))
round(weight / (height*height), 2)

문제 4. 학생이름, 키, 몸무게, BMI 지수를 가지는 뷰를 생성하시오.
create view student_test_view(stu_name, stu_height, stu_weight, BMI) as
select stu_name, stu_height, stu_weight, round(stu_weight / ((stu_height/100)*(stu_height/100)), 2)
from student;

create view student_test_view(stu_name, stu_height, stu_weight, BMI) as
select stu_name, stu_height, stu_weight, round(stu_weight / ((stu_height/100)*(stu_height/100)), 2)
from student
where stu_height is not null
and stu_weight is not null;

문제 5. 사원 이름, 급여, 커미션, 전체수입(급여+커미션)을 가지는 뷰를 생성하시오.
create view emp_test_view(ename, sal, comm, total_sal) as
select ename, sal, nvl(comm, 0), sal+(nvl(comm, 0))
from emp;

문제 6. 초기값 1, 증감값 1, 최대값 1000인 시퀀스를 만들고 시퀀스를 이용해서
학생들에게 숫자를 지정하는 새로운 테이블을 만드시오.
student_seq(seq_no, stu_no, stu_name, stu_grade, stu_class, stu_gender)

create sequence seq2
increment by 1
start with 1
maxvalue 1000;

create table student_seq(seq_no, stu_no, stu_name, stu_grade, stu_class, stu_gender) as
select seq2.nextval, stu_no, stu_name, stu_grade, stu_class, stu_gender
from student;

ROWID, ROWNUM
-> 행ID, 행NUMBER

select ename
from emp;

select rowid, deptno
from emp;

select rowid, deptno
from emp
where rowid = AAAR9eAAHAAAACUAAC;

AAAR9eAAHAAAACUAAC : 16진수

select rownum, deptno
from emp;

select stu_height, rownum
from student;

select stu.stu_height, rownum
from (select stu_height
      from student
      order by stu_height) stu;

select stu.stu_height, rownum
from (select stu_height
      from student
      order by stu_height) stu
where rownum < 4;

문제 7. 수입(급여+커미션)이 높은 상위 5명의 사원번호, 사원이름 부서명을 출력하는 뷰를 만드시오.

create view total_sal_view(ename, empno, dname, total_sal) as
select ename, empno, dname, sal+(nvl(comm, 0))
from emp natural join dept;

?
select ename, empno, dname, total_sal, rownum
from (select ename, empno, dname, sal+(nvl(comm, 0))
      from emp
      order by total_sal) emp_total
where rownum < 5;

-------------

CREATE VIEW V_STU_INCOME AS
SELECT *
FROM (SELECT EMPNO, ENAME, DNAME, (SAL+NVL(COMM, 0)) INCOME
         FROM EMP NATURAL JOIN DEPT
         ORDER BY 4 DESC) STU_INCOME
WHERE ROWNUM < 6;

문제 8. 부서별 평균 급여가 작은 부서 2개의 부서이름을 뷰로 출력하시오.

CREATE VIEW V_AGV_DEPT AS
SELECT *
FROM (SELECT DEPTNO, ROUND(AVG(SAL)) AS AVG_SAL
         FROM EMP
         GROUP BY DEPTNO
         ORDER BY 2) AVG_DEPT
WHERE ROWNUM < 3;

 

7, 8번 미해결

'SQL' 카테고리의 다른 글

[SQL] 20190604  (0) 2019.06.04
[SQL] 20190603  (0) 2019.06.03
[SQL] 20190531  (0) 2019.06.03
[SQL] 20190530  (0) 2019.05.30
[SQL] 20190529  (0) 2019.05.29
Share Link
reply
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31