[DB] ORACLE - 7์ผ
in DB
ORACLE
์ค๋ผํด 7์ผ
[ VIEW ]
๋ค๋ฅธ ํ ์ด๋ธ์ด๋ ๋ทฐ์ ํฌํจ๋ ๋ง์ถคํํ(virtual table)
joinํ๋ ํ ์ด๋ธ์ ์๊ฐ ๋์ด๋๊ฑฐ๋ ์ง์๋ฌธ์ด ๊ธธ๊ณ ๋ณต์กํด์ง๋ฉด ์์ฑ์ด ์ด๋ ค์์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ธ ์ ์๋ค.
์ด๋ด๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด๋๊ฑฐ๋ stored query๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์ ์ฅํด๋๋ฉด ํ์ํ ๋ ๋ง๋ค ํธ์ถํด์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ทฐ์ ํ ์ด๋ธ์ ์ฐจ์ด๋ ๋ทฐ๋ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ง ์๋ค๋ ์ ์ด๋ค.
- ๋ฒ ์ด์คํ ์ด๋ธ(Base table) : ๋ทฐ๋ฅผ ํตํด ๋ณด์ฌ์ง๋ ์ค์ ํ ์ด๋ธ
- ์ ํ์ ์ธ ์ ๋ณด๋ง ์ ๊ณต ๊ฐ๋ฅ
[ํ์]
create [or replace] [force | noforce ] view ๋ทฐ์ด๋ฆ [(alias [,alias,.....)] as ์๋ธ์ฟผ๋ฆฌ
[with check option [constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ]]
[with read only [constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ]]
- create or replace : ์ง์ ํ ์ด๋ฆ์ ๋ทฐ๊ฐ ์์ผ๋ฉด ์๋ก ์์ฑ, ๋์ผ์ด๋ฆ์ด ์์ผ๋ฉด ์์
- force / noforce
- force : ๋ฒ ์ด์คํ ์ด๋ธ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ๋ทฐ ์์ฑ๊ฐ๋ฅ
- noforce : ๋ฒ ์ด์คํ ์ด๋ธ์ด ์กด์ฌํ์ง ์์๋ ๋ทฐ ์์ฑ๊ฐ๋ฅ
- alias
- ๋ทฐ์์ ์์ฑํ ํํ์ ์ด๋ฆ(ํ ์ด๋ธ์ ์ปฌ๋ผ ์ด๋ฆ์๋ฏธ)
- ์๋ตํ๋ฉด ์๋ธ์ฟผ๋ฆฌ์ ์ด๋ฆ์ ์ฉ
- alias์ ๊ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฐ์์ ๋์ผํด์ผ ํจ
- ์๋ธ์ฟผ๋ฆฌ
- ๋ทฐ์์ ํํํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ select๊ตฌ๋ฌธ
์ ์ฝ์กฐ๊ฑด
with check option : ๋ทฐ๋ฅผ ํตํด ์ ๊ทผ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๋ํด์๋ง DML์์ ๊ฐ๋ฅ
- with read only : ๋ทฐ๋ฅผ ํตํด DML์์ ์๋จ
- ์ ์ฝ์กฐ๊ฑด์ผ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ๋ณ๋์ ์ด๋ฆ์ง์ ๊ฐ๋ฅ
[๋ทฐ - ์ธ๋ผ์ธ(inline)๊ฐ๋ ]
- ๋ณ์นญ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ (์ผ๋ฐ์ ์ผ๋ก from์ ์์ ์ฌ์ฉ)
[๋ทฐ - Top N๋ถ์]
Top N๋ถ์ : ์กฐ๊ฑด์ ๋ง๋ ์ต์์(์ตํ์) ๋ ์ฝ๋๋ฅผ N๊ฐ ์๋ณํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
์) ์ต์์ ์๋์3๋ช
โ ์ต๊ทผ 6๊ฐ์๋์ ๊ฐ์ฅ ๋ง์ด ํ๋ฆฐ ์ ํ3๊ฐ์ง
โ ์ค์ ์ด ๊ฐ์ฅ ์ข์ ์์ ์ฌ์ 5๋ช
- ์ค๋ผํด์์ Top N๋ถ์์๋ฆฌ
- ์ํ๋ ์์๋๋ก ์ ๋ ฌ
- rownum ์ด๋ผ๋ ๊ฐ์์ ์ปฌ๋ผ์ ์ด์ฉํ์ฌ ์์๋๋ก ์๋ฒ๋ถ์ฌ
- ๋ถ์ฌ๋ ์๋ฒ์ ์ด์ฉํ์ฌ ํ์ํ ์๋งํผ ์๋ณ
- rownum๊ฐ์ผ๋ก ํน์ ํ์ ์ ํํ ์ ์์ (๋จ, Result Set 1st ํ(rownum=1)์ ์ ํ๊ฐ๋ฅ)
ex1 ) ์ฌ์ํ ์ด๋ธ์์ ๋ถ์๊ฐ 90์ธ ์ฌ์๋ค์ v_view1์ผ๋ก ๋ทฐํ ์ด๋ธ์ ๋ง๋์์ค
(์ฌ์ID,์ฌ์์ด๋ฆ,๊ธ์ฌ,๋ถ์ID๋ง ์ถ๊ฐ)
create or replace view v_view1
as select employee_id, last_name, salary, department_id from employees
where department_id=90;
[๋ฌธ์ 1] ์ฌ์ํ ์ด๋ธ์์ ๊ธ์ฌ๊ฐ 5000 ์ด์ 10000 ์ดํ์ธ ์ฌ์๋ค๋ง v_view2์ผ๋ก ๋ทฐ๋ฅผ ๋ง๋์์ค
(์ฌ์ID, ์ฌ์์ด๋ฆ, ๊ธ์ฌ, ๋ถ์ID)
ex2 ) v_view2 ํ ์ด๋ธ์์ 103์ฌ์์ ๊ธ์ฌ๋ฅผ 9000.00์์ 12000.00์ผ๋ก ์์ ํ์์ค
select * from v_view2;
update v_view2 set salary=12000 where employee_id=103;
select * from v_view2; โ 103์ฌ์์ด ๋น ์ก์(๋ฒ์๋ฅผ ๋ฒ์ด๋จ)
[๋ฌธ์ 2] ์ฌ์ํ ์ด๋ธ๊ณผ ๋ถ์ํ ์ด๋ธ์์ ์ฌ์๋ฒํธ, ์ฌ์๋ช , ๋ถ์๋ช ์ v_view3๋ก ๋ทฐ ํ ์ด๋ธ์ ๋ง๋์์ค
์กฐ๊ฑด1) ๋ถ์๊ฐ 10, 90์ธ ์ฌ์๋ง ํ์ํ์์ค
์กฐ๊ฑด2) ํ์ดํ์ ์ฌ๋ฒ, ์ด๋ฆ, ๋ถ์์ด๋ฆ์ผ๋ก ์ถ๋ ฅํ์์ค
์กฐ๊ฑด3) ์ฌ์๋ฒํธ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์์ค
[๋ฌธ์ 3] ๋ถ์ID๊ฐ 10,90๋ฒ ๋ถ์์ธ ๋ชจ๋ ์ฌ์๋ค์ ๋ถ์์์น๋ฅผ ํ์ํ์์ค
์กฐ๊ฑด1) v_view4๋ก ๋ทฐ ํ ์ด๋ธ์ ๋ง๋์์ค
์กฐ๊ฑด2) ํ์ดํ์ ์ฌ์๋ฒํธ, ์ฌ์๋ช , ๊ธ์ฌ, ์ ์ฌ์ผ, ๋ถ์๋ช , ๋ถ์์์น(city)๋ก ํ์ํ์์ค
์กฐ๊ฑด3) ์ฌ์๋ฒํธ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์์ค
์กฐ๊ฑด4) ๊ธ์ฌ๋ ๋ฐฑ๋จ์ ์ ์ญํ๊ณ , ์ธ์๋ฆฌ ๋ง๋ค ์ฝค๋ง์ โ์โ์ ํ์ํ์์ค
์กฐ๊ฑด5) ์ ์ฌ์ผ์ โ2004๋ 10์ 02์ผโ ํ์์ผ๋ก ํ์ํ์์ค
ex3 ) ๋ทฐ์ ์ ์ฝ์กฐ๊ฑด๋ฌ๊ธฐ
์ฌ์ํ ์ด๋ธ์์ ์ ๋ฌดID โIT_PROGโ์ธ ์ฌ์๋ค์ ์ฌ์๋ฒํธ, ์ด๋ฆ, ์ ๋ฌดID๋ง v_view5 ๋ทฐ ํ ์ด๋ธ์ ์์ฑํ์์ค,
๋จ ์์ ๋ถ๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์์ค
create or replace view v_view5
as select employee_id, last_name, job_id
from employees
where job_id='IT_PROG'
with read only;
select * from v_view5;
delete from v_view5;
ex4 ) ๋ทฐ์ ์ ์ฝ์กฐ๊ฑด ๋ฌ๊ธฐ
์ฌ์ํ ์ด๋ธ์์ ์ ๋ฌดID โIT_PROGโ์ธ ์ฌ์๋ค์ ์ฌ์๋ฒํธ, ์ด๋ฆ, ์ด๋ฉ์ผ, ์ ์ฌ์ผ, ์ ๋ฌดID๋ง v_view6 ๋ทฐ ํ ์ด๋ธ์ ์์ฑํ์์ค,
๋จ ์ ๋ฌดID๊ฐ โIT_PROGโ์ธ ์ฌ์๋ค๋ง ์ถ๊ฐ,์์ ํ ์ ์๋ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์์ค
create or replace view v_view6
as select employee_id, last_name, email, hire_date, job_id
from employees
where job_id='IT_PROG'
with check option;
select * from v_view6;
insert into v_view6(employee_id, last_name, email, hire_date, job_id)
values(500,'kim','candy','2004-01-01','Sales');
โ ์๋ฌ:with check option์ ์ฝ์กฐ๊ฑด์ ์๋ฐฐ
update v_view6 set job_id='Sales' where employee_id=103;
โ ์๋ฌ:with check option์ ์ฝ์กฐ๊ฑด์ ์๋ฐฐ
insert into v_view6(employee_id, last_name, email, hire_date, job_id)
values(500,'kim','candy','2004-01-01','IT_PROG');
select * from v_view6;
[๋ฌธ์ 4]
TableName : bookshop
isbn varchar2(10) ๊ธฐ๋ณธํค(์ ์ฝ์กฐ๊ฑด๋ช
:PISBN) ISBN
title varchar2(50) ๋๊ฐ ํ์ฉX (์ ์ฝ์กฐ๊ฑด๋ช
:CTIT) ์ฑ
์ ๋ชฉ
author varchar2(50) ์ ์
price number ๊ธ์ก
company varchar2(30) ์ถํ์ฌ
-------------------------------------------------------
is001 ์๋ฐ3์ผ์์ฑ ๊น์๋ฐ 25000 ์ผ๋ฉ๋ฃจ์ถํ์ฌ
pa002 JSP๋ฌ์ธ๋๊ธฐ ์ด๋ฌ์ธ 28000 ๊ณต๊ฐ๋ท์ปด
or003 ์ค๋ผํด๋ฌด์์ ๋ฐ๋ผํ๊ธฐ ๋ฐ๋ฐ๋ผ 23500 ์ผ๋ฉ๋ฃจ์ถํ์ฌ
-------------------------------------------------------
TableName : bookorder
idx number primary key ์ผ๋ จ๋ฒํธ
isbn varchar2(10) FKISBN bookshop์ isbn์ ์์ํค
qty number ์๋
-----------------------------------
์ํ์ค๋ช
: idx_seq ์ฆ๊ฐ๊ฐ: 1 ์์๊ฐ 1
-----------------------------------
1 is001 2
2 or003 3
3 pa002 5
4 is001 3
5 or003 10
โ ์ํ์ค๊ฐ์ฒด ์ด์ฉ
ViewName : bs_view
์ฑ
์ ๋ชฉ ์ ์ ์ดํ๋งค๊ธ์ก
---------------------------------------
์กฐ๊ฑด1) ์ดํ๋งค๊ธ์ก์ qty * price๋ก ํ์์ค
์กฐ๊ฑด2) ์์ ๋ถ๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์์ค
ex5 ) ๋ทฐ โ ์ธ๋ผ์ธ(ํ๋์ ํ ์ด๋ธ์ ์ญํ ) select ~ from (select ~~)
์ฌ์ํ ์ด๋ธ์ ๊ฐ์ง๊ณ ๋ถ์๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๋ทฐ(v_view7)๋ก ์์ฑํ์์ค
์กฐ๊ฑด1) ๋ฐ์ฌ๋ฆผํด์ 1000๋จ์๊น์ง ๊ตฌํ์์ค
์กฐ๊ฑด2) ํ์ดํ์ ๋ถ์ID,๋ถ์ํ๊ท
์กฐ๊ฑด3) ๋ถ์๋ณ๋ก ์ค๋ฆ์ฐจ์์ ๋ ฌํ์์ค
์กฐ๊ฑด4) ๋ถ์ID๊ฐ ์๋ ๊ฒฝ์ฐ 5000์ผ๋ก ํ์ํ์์ค
VIEW ๊ฐ์ฒด ์ด์ฉ
create or replace view v_view7("๋ถ์ID", "๋ถ์ํ๊ท ")
as select nvl(department_id, 5000),
round( avg(salary), -3)
from employees
group by department_id
order by department_id asc;
select * from v_view7;
VIEW โ INLINE
select ๋ถ์ID, ๋ถ์ํ๊ท
from (select nvl(department_id, 5000) "๋ถ์ID",
round( avg(salary), -3) "๋ถ์ํ๊ท "
from employees
group by department_id
order by department_id asc);
[๋ฌธ์ 5] ๋ถ์๋ณ ์ต๋๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ๋ถ์๋ช , ์ต๋๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ์์ค
โ 1๋ฒ ๋ฌธ์ ์ ์ต๋๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ์ด๋ฆ๋ ๊ตฌํ์์ค
ex6 ) Top N๋ถ์
๊ธ์ฌ๋ฅผ ๊ฐ์ฅ๋ง์ด ๋ฐ๋ ์ฌ์3๋ช ์ ์ด๋ฆ,๊ธ์ฌ๋ฅผ ํ์ํ์์ค
select rownum, last_name, salary
from (select last_name, nvl(salary,0)as salary from employees order by 2 desc)
๋จผ์ ์ํ๋๋ค.
where rownum<=3;
ex7 ) ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์1๋ช ์ ๊ตฌํ์์ค
select rownum, last_name, salary
from (select last_name, nvl(salary,0)as salary from employees order by 2 desc)
where rownum=1; โ rownum=2๋ error (ํน์ ํ์ ์ฌ์ฉํ ์ ์์)
ex8 ) ๊ธ์ฌ์ ์์๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ํ์ ๋, 3๊ฐ์ฉ ๋ฌถ์ด์ 2๋ฒ์งธ ๊ทธ๋ฃน์ ์ถ๋ ฅํ์์ค
(4,5,6 ์์์ ์ฌ์์ถ๋ ฅ ==> ํ์ด์ง ์ฒ๋ฆฌ ๊ธฐ๋ฒ)
select * from (select rownum , ceil(rownum/3) as page, tt.*
๋๋ฒ์งธ๋ก ์ํ tt์์๋ ๋ชจ๋ ํญ๋ชฉ์ ๊ฐ์ ธ์๋ผ
from (select last_name, nvl(salary,0)as salary from employees order by salary desc)tt
์ฒซ๋ฒ์งธ๋ก์ํ ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๋ฌผ์ tt๋ผ๊ณ ๋ช
์
) where page=2;
์ธ๋ฒ์งธ๋ก ์ํ
โป
select * from
(select rownum rn, tt.* from
๋๋ฒ์งธ๋ก ์ํ tt์์๋ ๋ชจ๋ ํญ๋ชฉ์ ๊ฐ์ ธ์๋ผ
(select last_name, nvl(salary,0)as salary from employees order by 2 desc)tt
์ฒซ๋ฒ์งธ๋ก์ํ ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ๋ฌผ์ tt๋ผ๊ณ ๋ช
์
) where rn>=4 and rn<=6;
์ํ๋ ๊ฐ ์๋ฌด๊ฑฐ๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.
[๋ฌธ์ 6] ์ฌ์๋ค์ ์ฐ๋ด์ ๊ตฌํ ํ ์ตํ์ ์ฐ๋ด์ 5๋ช ์ ์ถ์ถํ์์ค
์กฐ๊ฑด1) ์ฐ๋ด = ๊ธ์ฌ12+(๊ธ์ฌ12*์ปค๋ฏธ์ )
์กฐ๊ฑด2) ํ์ดํ์ ์ฌ์์ด๋ฆ , ๋ถ์๋ช , ์ฐ๋ด
์กฐ๊ฑด3) ์ฐ๋ด์ ๏ฟฆ25,000 ํ์์ผ๋ก ํ์์ค
