1. basic
* ์ค๋ผํด ์ ์ ๋ฐฉ๋ฒ
- sqlplus
- sqlplus ์ฌ์ฉ์๋ช
/๋น๋ฒ
* ์ค๋ผํด ๋ช
๋ น์ด
-[1] ์ต๊ณ ๊ด๋ฆฌ์(system/sys)๋ก ์ ์ํ์ฌ ์ฌ์ฉ์์ ๊ณ์ ์ ํ์ด์ค.
: alter user ์ฌ์ฉ์๋ช
account unlock;
-[2] ํ์ฌ ์ ์ํ๊ณ ์๋ ๊ณ์ ํ์ธ
: show user;
-[3] ์ ์ ๊ณ์ ๋ณ๊ฒฝ
: conn ์ฌ์ฉ์๋ช
/๋น๋ฒ
-[4] ์ฌ์ฉ์ ์ํธ ๋ณ๊ฒฝ (์ต๊ณ ๊ด๋ฆฌ์์์๋ง)
: alter user ์ฌ์ฉ์๋ช
identified by ๋ณ๊ฒฝํ ๋น๋ฒ;
-[5] ๊ณ์ ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋ฒ์ ๋ณ๊ฒฝ
: alter user ์ฌ์ฉ์๋ช
identified by ๋ณ๊ฒฝํ ๋น๋ฒ account unlock;
* ์ค๋ผํด ๋ช
๋ น์ด (select๋ฌธ)
-[1] scott ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌํ๋ ํ
์ด๋ธ ๋ชฉ๋ก
: select * from tab;
-[2] ํน์ ํ
์ด๋ธ ๊ตฌ์กฐ ํ์ธ
: desc ํ
์ด๋ธ๋ช
;
-[3] ํน์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ ํ์
: select * from ํ
์ด๋ธ๋ช
-[4] ๋ชจ๋ ์ปฌ๋ผ(ํ๋๋ช
)์ด ์๋, ํ์ํ ์ปฌ๋ผ(ํ๋๋ช
) ๋ด์ฉ๋ง ์ถ๋ ฅ
: select ํ๋๋ช
(์ฌ๋ฌ๊ฐ) from ํ
์ด๋ธ๋ช
-[5] ๊ฐ๊ฐ ํ๋๋ช
์ ๋ณ์นญ์ ์ฃผ์ด์ ์ถ๋ ฅ (์ถ๋ ฅํ๋ ์๊ฐ๋ง)
: select ํ๋๋ช
(as) "๋ณ๋ช
" from ํ
์ด๋ธ๋ช
;
-[6] ์ค๋ณต๋ ๋ฐ์ดํฐ ์ ๊ฑฐํ๊ณ ์ถ๋ ฅ
: select distinct ํ๋๋ช
from ํ
์ด๋ธ๋ช
ex) ์ฌ์๋ค์ ์ง์๋ช
(job)์ ์ค๋ณต์ ์ ๊ฑฐํ ํ ์ถ๋ ฅ.
select distinct job from emp;
-[7] ๊ธ์ฌ๊ฐ 3000์ด์์ธ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
: select empno, ename, sal from emp where sal >= 3000;
-[8] ์ด๋ฆ์ด scott์ธ ์ฌ์์ ์ ๋ณด ์ถ๋ ฅ
: select empon, ename, sal from emp where ename = 'SCOTT';
****๋ฐ์ดํฐ๋ ๋์๋ฌธ์ ๊ตฌ๋ณํจ
-[9] ๋ถ์๋ฒํธ๊ฐ 10์ด๊ณ ์ง์
์ด 'MANAGER'์ธ ์ฌ์ ์ถ๋ ฅ
: select deptno, ename, job from emp
where deptno = 10 and job = 'MANAGER';
-[10] ๋ถ์๋ฒํธ๊ฐ 10์ด๊ฑฐ๋ ์ง์
์ด 'MANAGER'์ธ ์ฌ์ ์ถ๋ ฅ
: select deptno, ename, job from emp
where deptno = 10 or job = 'MANAGER';
-[11] 1985๋
๋ ์ดํ์ ์
์ฌํ ์ฌ์ ์ ๋ณด
: select empno, ename, hiredate from emp
where hiredate >= '1985/01/01';
-[12] ๋ถ์๋ฒํธ๊ฐ 10์ด ์๋ ์ฌ์
: select deptno, ename from emp where not(deptno = 10);
select deptno, ename from emp where deptno <> 10;
-[13] ๊ธ์ฌ๊ฐ 1000~3000 ์ฌ์ด์ธ ์ฌ์์ ์ถ๋ ฅ
: select ename, sal from emp where sal >= 1000 and sal <= 3000;
select ename, sal from emp where sal between 1000 and 3000;
-[14] ๊ธ์ฌ๊ฐ 1300 ๋๋ 1500 ๋๋ 1600์ธ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
: select ename, sal from emp where sal = 1300 or sal = 1500 or sal = 1600;
select ename, sal from emp where sal in (1300, 1500, 1600);
-[15] ์ด๋ฆ์ด 'K'๋ก ์์ํ๋ ์ฌ์ ์ถ๋ ฅ
: select empno, ename from emp where ename like 'K%';
-[16] ์ด๋ฆ์ด 'K'๋ก ๋๋๋ ์ฌ์ ์ถ๋ ฅ
: select empno, ename from emp where ename like '%K';
-[17] ์ด๋ฆ์ 'K'๊ฐ ํฌํจ๋๋ ์ฌ์ ์ถ๋ ฅ
: select empno, ename from emp where ename like '%K%';
-[18] ์ด๋ฆ 2๋ฒ์งธ์ 'A'๊ฐ ๋ค์ด๊ฐ๋ ์ฌ์ ์ถ๋ ฅ
: select empno, ename from emp where ename like '_A%';
-[19] ์ปค๋ฏธ์
์ ๋ฐ์ง ์๋ ์ฌ์
: select empno, ename, comm from emp where comm is null;
-[20] ์ปค๋ฏธ์
์ ๋ฐ๋ ์ฌ์
: select empno, ename, comm from emp where comm is not null;
-[21] ์ฌ๋ฒ์ ์ ๋ ฌ(์ค๋ฆ์ฐจ์)์ผ๋ก ์ถ๋ ฅ
: select empno, ename from emp order by empno (asc);
-[22] ์ฌ๋ฒ์ ์ ๋ ฌ(๋ด๋ฆผ์ฐจ์)์ผ๋ก ์ถ๋ ฅ
: select empno, ename from emp order by empno desc;
-[23] ์ฌ์์ ์ฐ๋ด ๊ณ์ฐ ์ถ๋ ฅ
: select ename, sal, sal*12 from emp;
select ename, sal, sal*12 (as) "์ฐ๋ด" from emp;
-[24] ์ปค๋ฏธ์
์ ํฌํจํ ์ต์ข
์ฐ๋ด ์ถ๋ ฅ (*์ค๋ฅ๋จ)
: select ename, sal, comm, sal*12+comm "์ฐ๋ด" from emp;
-[25] [24]์ ์ค๋ฅ ํด๊ฒฐ๋ฒ (ํ๋ฒ๋ ์
๋ ฅํ์ง์์ ํญ๋ชฉ์ 0์ผ๋ก ์ฑ์ฐ๋ผ๋ ํจ์ ์ด์ฉ)
: select ename, sal, comm, nvl(comm, 0), sal*12+nvl(comm, 0) "์ฐ๋ด" from emp;
2. ๊ทธ๋ฃนํจ์
*์ค๋ผํด ๋ช
๋ น์ด: Group ํจ์
-[1] ํฉ๊ณ > sum()
: select sum(sal) from emp;
-[2] ์นด์ดํธ > count()
: select count(*) from emp;
-[3] ํ๊ท > avg()
: select avg(sal) from emp;
-[4] ์ต๋๊ฐ > max()
: select max(sal) from emp;
-[4] ์ต๋๊ฐ > min()
: select min(sal) from emp;
-[5] Group by ์ > ์ง์
๋ณ ๊ธ์ฌ ํ๊ท
: select job, avg(sal) from emp; (X) -> ๋จ์ผ ํ๋์ ์ฐ๊ดํด์ ์ถ๋ ฅํ๋๊ฑด ์๋จ!
: select job, avg(sal) from emp group by job;
3. ๋ด์ฅํจ์
*์ค๋ผํด ๋ช
๋ น์ด: ๋ด์ฅ ํจ์
-[1] ์ํ ํ
์ด๋ธ์ธ dual ํ
์ด๋ธ (๊ฐ์ํ
์ด๋ธ)
: select * from dual;
-[2] ์์ ๋ฐ์ดํฐ ์ถ๋ ฅ
: select 1234*1234 from dual;
-[3] ๋ฐ์ฌ๋ฆผ > round() (์์๋ ์์ซ์ ์ดํ์๋ฆฌ๋ก, ์์๋ ์ ์์๋ฆฌ๋ก)
: select deptno, round(Sal, -3) from emp where deptno = 30;
select round(12.3456, 3) from dual; -> 12.346
-[4] ๋ชจ๋ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ๋ณํ > lower()
: select lower('Hong Kil Dong') "์๋ฌธ์" from dual;
-[5] ๋ชจ๋ ๋ฌธ์๋ฅผ ๋๋ฌธ์๋ก ๋ณํ > upper()
: select upper('Hong Kil Dong') "๋๋ฌธ์" from dual;
-[6] ์ฒซ๊ธ์๋ง ๋๋ฌธ์๋ก ๋ณํ > initcap()
: select initcap('hong kil dong') "์ฒซ๊ธ์๋ง ๋๋ฌธ์" from dual;
-[7] ๋ฌธ์์ด ์ฐ๊ฒฐ > concat()
: select concat('Hel', 'lo') from dual;
-[8] ๋ฌธ์์ด ๊ธธ์ด > length(), lengthb()
( length๋ ๊ธ์์๋ฅผ , lengthb๋ byte๊ฐ ๋ฐํ -> ํ๊ธ 2byte, ์์ด 1byte ์ ๋์ฝ๋๋ ์์คํค์ฝ๋๋์๋ฐ๋ผ ๋ค๋ฆ)
: select length('์์ด์ฝ'), lengthb('์์ด์ฝ'), length('Acorn'), lengthb('Acorn') from dual;
-[9] ๋ฌธ์์ด ์ถ์ถ > substr(), substrb()
: select substr('๋ฌธ์์ด', ์์์์น, ๋์์น) from ํ
์ด๋ธ๋ช
;
: select substr('ํ๊ธธ๋ ๋ง์ธ', 3, 5) from dual;
: select substrb('ํ๊ธธ๋ ๋ง์ธ', 3, 5) from dual;
-[10] ํน์ฅ ๋ฌธ์์ด์ ์์ ์์น > instr()
: select instr('ํ๊ธธ๋ ๋ง์ธ', '์ธ') from dual;
-[11] ์๋ฆฌ ์ฑ์ฐ๊ธฐ > lpad(), rpad()
: select lpad('๋ฌธ์์ด', ์๋ฆฌ๊ฐฏ์, ๋น๊ณต๊ฐ์์ฑ์์ง๋ฌธ์ ) from dual;
: select lpad('Oracle', 20, '#') from dual; -> #########Oracle
: select rpad('Oracle', 20, '#') from dual; -> Oracle#########
-[12] ์ปฌ๋ผ์ด๋ ๋์ ๋ฌธ์์ด์์ ํน์ ๋ฌธ์๊ฐ ์ฒซ๋ฒ์งธ ๊ธ์์ด๊ฑฐ๋ ๋ง์ง๋ง ๊ธ์์ด๋ฉด
์๋ผ๋ด๊ณ ๋จ์ ๋ฌธ์์ด๋ง ๋ฐํ (๊ณต๋์ ์์ ๋ ค๊ณ ํ ๋ ๋ง์ด ์ฐ์) > trim()
: select trim('a' from 'aaaOracleaaaaaa') from dual; -> Oracle
: select trim(' ' from ' Oracle ') from dual; -> Oracle
-[13] ์ ๋๊ฐ > abs()
: select abs(-10) from dual;
-[14] ์์์๋ฆฌ ๋ฒ๋ฆฌ๊ธฐ > florr()
: select floor(12.3456) from dual;
-[15] ํน์ ์๋ฆฌ ์๋ฅด๊ธฐ > trunc()
: select trunc(12.3456, 3) from dual;
-[16] ๋๋จธ์ง > mod()
: select mod(3, 5) from dual;
-[17] ๋ ์ง > sysdate()
: select sysdate from dual;
-[18] ๊ฐ์ ์ ๊ตฌํ๊ธฐ > months_between() (ํ์ฌ๋ ์ง๊น์ง ๊ฐ์ ์ )
: select ename, months_between(sysdate, hiredate) from emp where deptno = 10;
-[19] ๊ฐ์ ์ ๋ํ๊ธฐ > add_months()
: select add_months(sysdate, 4) from dual; -> ํ์ฌ๋ ์ง์ 4๊ฐ์ ๋ํจ
-[20] ๋ค๊ฐ์ฌ ์์ผ์ ํด๋นํ๋ ๋ ์ง > next_day()
: select next_day(sysdate, '์ผ์์ผ') from dual; -> ์ด๋ฒ์ฃผ ์ผ์์ผ ๋ ์ง ์๋ ค์ค
-[21] ํด๋น ๋ฌ์ ๋ง์ง๋ง ์ผ ์ > last_day()
: select last_day(sysdate) from dual;
-[22] ๋ฌธ์์ด๋ก ๋ณํ > to_char()
: select to_char(sysdate, 'yyyy-mm-dd') from dual;
-[23] ๋ ์งํ์ผ๋ก ๋ณํ > to_date()
: select to_date('2009/12/31', 'yyyy/mm/dd') from dual;
-[24] NULL์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ > nvl()
: select ename, nvl(comm, 0) from emp; -> ์ถ๋ ฅํ๋ ์๊ฐ์๋ง 0์ผ๋ก ๋ฐ๊ฟ์ค
-[25] switch๋ฌธ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ > decode()
: select ename, deptno, decode(deptno, 10, 'ACCOUNT',
20, 'RESEARCH',
30, 'SALES',
40, 'OPERATIONS') as "๋ถ์๋ฒํธ"
from emp;
-[26] if elseif else ๋ฌธ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ > case()
: select ename, deptno,
case when deptno = 10 then 'ACCOUNT'
when deptno = 20 then 'RECEARCH'
when deptno = 30 then 'SALES'
when deptno = 40 then 'OPERATIONS'
end as "๋ถ์๋ช
" from emp;
4. ํ
์ด๋ธ ์์ฑ/ ์์ / ์ญ์
*์ค๋ผํด SQL๋ฌธ : ํ
์ด๋ธ ์์ฑ/์์ /์ญ์
-[1] ํ
์ด๋ธ ์์ฑ : create ๋ฌธ
> create table exam01
(
exno number(2),
exname varchar2(20),
exsal number(7, 2)
);
-> char๋ ๋ฐ์ดํธํ ๋น ๊ทธ๋๋ก varchar2๋ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐ์ดํฐํ ๋น
-> number(ํ ๋น๋ฉ๋ชจ๋ฆฌ ,์ค์๋ฅผ ํํํ ๋ ์์ซ์ ์ดํ ๋์งธ์๋ฆฌ๊น์ง)
-[2] ๊ธฐ์กด ํ
์ด๋ธ๊ณผ ๋์ผํ๊ฒ ํ
์ด๋ธ ๋ง๋ค๊ธฐ
> create table exam02
as
select * from emp;
-[3] ๊ธฐ์กด ํ
์ด๋ธ์์ ์๋ก์ด ์ปฌ๋ผ ์ถ๊ฐ : alter๋ฌธ(ํ๋ ์ถ๊ฐ)
> alter table exam01
add
(
exjob varchar2(10)
);
-[4] ํ
์ด๋ธ ๊ตฌ์กฐ ์์ : ํ๋ ์์
> alter table exam01
modify
(
exjob varchar2(20)
);
-[5] ํ
์ด๋ธ ๊ตฌ์กฐ ์์ : ํ๋ ์ญ์
> alter table exam01
drop column exjob;
-[6] ํ
์ด๋ธ ์ญ์
> drop table exam02;
-> 10 ์ดํ๋ถํฐ ์ค๋ผํด์์ ์์ ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์์ํ
์ด๋ธ ํํ๋ก ๋ณ๊ฒฝ๋์ด์ง๋ค.
-> ๋ค์ ์ฌ์ฉํ๊ณ ์ถ์๋ ์ธ ์ ์๊ฒ ํ๋ ค๊ณ
-> 10๋ฒ์ ๋ถํฐ๋ ์์ํ
์ด๋ธ๋ ์ญ์ ์์ผ์ฃผ์ด์ผํจ
--- ์์ ํ
์ด๋ธ์ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด?
> purge recyclebin;
--- ์ฒ์๋ถํฐ ํ
์ด๋ธ์ ์์ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด?
> drop table exam02 purge;
-[7] ํ
์ด๋ธ ์ด๋ฆ ๋ณ๊ฒฝ
> alter table exam01 rename to exam02;
> rename exam01 to exam02;
-[8] ํ
์ด๋ธ ๋ด์ ๋ชจ๋ ๋ฐ์ดํฐ(๋ ์ฝ๋) ์ญ์
> truncate table exam01;
5. ์๋ฃํ ๋ช
๋ช
๊ท์น
*์ค๋ผํด ์๋ฃํ ํ์
1. ์ ์ํ ํ์
: number(2)๋ ์ด ์๋ฆฌ์๊ฐ 2์๋ฆฌ์ธ ์ ์ํ ๊ฐ์ด ํ๋์ ์ ์ฅ๋๋ค.
2. ์ค์ํ ํ์
: number(6, 2)๋ ์์์ ์ ํฌํจํ ์ด์๋ฆฌ์๊ฐ 6์๋ฆฌ์ด๊ณ , ์์์ ๋์งธ์๋ฆฌ๊น์ง ์๋ ์ค์ํ ๊ฐ์ฑ ์ ์ฅ๋๋ค.
์ฒซ๋ฒ์งธ ์ธ์๊ฐ 6์ ์์์ ์ ํฌํจํ ์ด ์๋ฆฌ์๋ฅผ ์๋ฏธํ๊ณ , ๋๋ฒ์งธ ์ธ์๊ฐ 2๋ ์์์ ์๋ฆฌ์๋ฅผ ์๋ฏธํ๋ค.
3. ๊ฐ๋ณํ ๋ฌธ์์ด : varchar2()
์
๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ค์ ํฌ๊ธฐ๋ฅผ ๋์ด์๋ฉด ๋์ด์ ํฌ๊ธฐ๋งํผ ์๋ฃํ ํฌ๊ธฐ๊ฐ ๋์ด๋์ง ์๋๋ค.
๋ง์ฝ varchar2(10)์ผ๋ก ๋ง๋ค์ด์ง ํ๋์๋ 10์๋ฆฌ๊น์ง๋ง ์ ์ฅ๋๋ค. ์๋ฌธ์๋ก 5์์ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ๋ค๋ฉด,
varchar2๋ ํฌ๊ธฐ๊ฐ ์ค์ ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ 5์ธ๋งํผ ์ค์ด๋ค์ด ์ ์ฅ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ธฐ์ต์ฅ์ ์ ์ฝ์ ์ฅ์ ์ด ์๋ค.
4. ๊ณ ์ ํ ๋ฌธ์์ด : char()
char(10)์ผ๋ก ๋ง๋ค์ด์ง ํ๋์ ์๋ฌธ์ 5 ํฌ๊ธฐ ๋งํผ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ๋ค๋ฉด char ์๋ฃํ์ ๊ณ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ ์ฝ๋ ํฌ๊ธฐ๋งํผ(10) ์ค์ด๋ค์ง ์๊ณ
๊ณ ์ ํ์ผ๋ก ํ ๋น๋๋ค.
* ํ
์ด๋ธ๋ช
, ์ปฌ๋ผ๋ช
๋ช
๋ช
๊ท์น
1. ๋ฐ๋์ ๋ฌธ์๋ก ์์ํด์ผํ๋ค.
2. 1~30์๊น์ง ๊ฐ๋ฅ
3. A~Z๊น์ง์ ๋์๋ฌธ์์ 0~9๊น์ง์ ์ซ์ ์กฐํฉ
ํน์ ๊ธฐํธ๋(_, $, #)๋ง ํฌํจํ ์ ์์
4. ์ค๋ผํด์์ ์ฌ์ฉ๋๋ ์์ฝ์ด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ช
๊ณผ ์ค๋ณต ๋ถ๊ฐ.
5. ๊ณต๋ฐฑ ํ์ฉ ์๋จ.
cf) ์ค๋ผํด์ ๊ฐ์ฒด : ํ
์ด๋ธ, ๋ทฐ, ์ํ์ค, ์ธ๋ฑ์ค
6. ๋ฐ์ดํฐ ์
๋ ฅ/ ์์ / ์ญ์
* ์ค๋ผํด SQL๋ฌธ : ๋ฐ์ดํฐ ์
๋ ฅ/ ์ถ๋ ฅ(select๋ฌธ)/ ์์ / ์ญ์
-[1] ์ํ ํ
์ด๋ธ ์์ฑ
> create table exam02
(
deptno number(2),
dname varchar2(14),
loc varchar2(14)
);
-[2] ๋ฐ์ดํฐ ์
๋ ฅ : insert into ๋ฌธ
> insert into exam02(loc, deptno, dname)
values('NEW YORK', 10, 'ACCOUNT');
-[3] ๋ฐ์ดํฐ ์
๋ ฅ : ํ ์๋ต
> insert into exam02
values(20, 'SALES', 'CHICAGO');
-[4] null ๊ฐ ์
๋ ฅ
> insert into exam02
values(30, 'RESEARCH', null);
-[5] ๋ฐ์ดํฐ ์ถ๋ ฅ : select ๋ฌธ
-[6] ๋ฐ์ดํฐ ์์ : ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ
๋ถ์๋ฒํธ ๋ณ๊ฒฝ
> update exam02
set deptno = 30;
-[7] ๊ธ์ฌ 10% ์ธ์
> update exam03
set sal = sal * 1.1;
-[8] ๋ถ์๋ฒํธ๊ฐ 10์ธ ์ฌ์์ ๋ถ์๋ฒํธ๋ฅผ 20์ผ๋ก ๋ณ๊ฒฝ
> update exam03
set deptno = 20
where deptno = 10;
-[9] ๊ธ์ฌ๊ฐ 3000์ด์์ธ ์ฌ์๋ง ๊ธ์ฌ๋ฅผ 10% ์ธ์
> update exam03
set sal = sal*1.1
where sal >= 3000;
-[10] ์ฌ์ ์ด๋ฆ์ด SCOTT์ธ ์๋ฃ์ ๋ถ์๋ฒํธ๋ฅผ 10,
์ง๊ธ์ MANAGER๋ก ๋ณ๊ฒฝ
> update exam03
set deptno = 10, job = 'MANAGER'
where ename = 'SCOTT';
-[11] 30๋ฒ ๋ถ์ ์ฌ์์ ์ญ์
> delete from exam03
where deptno = 30;
-[12] ๋ชจ๋ ์๋ฃ ์ญ์
> delete from exam03;
--- trunc()์ ์ฐจ์ด์ ?
delete๋ ๋ฐ์ดํฐ๋ง ์ญ์ trunc๋ ํ
์ด๋ธ์ ์ญ์ ํ๋ค์ ๋ค์ ํ
์ด๋ธ์ ์์ฑํด์ฃผ๋ ์ํ์ค.
7. ์กฐ์ธ(Join)
* ์ค๋ผํด SQL ๊ตฌ๋ฌธ : ์กฐ์ธ (Join)
-[1] ์ํ๋ ์ ๋ณด๊ฐ ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ๋๋์ด์ ธ ์์ ๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ
> select deptno from emp where ename = 'SCOTT'; -> 20
> select * from dept where deptno = 20;
-[2] ์กฐ์ธ : ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ๋๋์ด์ ธ ์๋ ๋ฐ์ดํฐ๋ฅผ
ํ๋ฒ์ sql๋ฌธ์ผ๋ก ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ ๊ธฐ๋ฅ.
//cross join : 2๊ฐ ์ด์์ ํ
์ด๋ธ์ ๋จ์ ์ฐ๊ฒฐ
//equi join : ๋์ผ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก join
> select * from emp, dept;
> select *
from emp, dept
where emp.deptno = dept.deptno;
> select *
from emp, dept
where emp.deptno = dept.deptno
and ename = 'SCOTT';
> select emp.ename, dept.dname, emp,deptno
from emp, dept
where emp.deptno = dept.deptno
and emp.ename = 'SCOTT';
> select e.ename, d.dname, e.deptno
from emp e, dept d
where e.deptno =d.deptno
and e.ename = 'SCOTT'
-[๋ฌธ์ ] ์กฐ์ธ์ ์ฌ์ฉํ์ฌ ACCOUTING ๋ถ์ ์์ ์ฌ์์ ์ด๋ฆ๊ณผ ์
์ฌ์ผ์ ์ถ๋ ฅ
> select ename, dname, hiredate
from emp e, dept d
where d.dname = 'ACCOUNTING'
and d.deptno = e.deptno;
8. ์๋ธ์ฟผ๋ฆฌ
* ์ค๋ผํด ๋ช
๋ น์ด : ์๋ธ์ฟผ๋ฆฌ
- SQL : Structed Query Langage
- ์๋ธ์ฟผ๋ฆฌ๋ ํ๋์ select ๋ฌธ์ฅ์ ์ ์์ ํฌํจ๋ ๋ ํ๋์ select ๋ฌธ์ด๋ค.
- ๋ฉ์ธ์ฟผ๋ฆฌ / ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ๋ ๋น๊ต ์ฐ์ฐ์์ ์ค๋ฅธ์ชฝ์ ๊ธฐ์ ํด์ผํ๊ณ ๋ฐ๋์ ๊ดํธ๋ก ๋๋ฌ์์์ผํใทใ
.
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ํ ๋ฒ๋ง ์คํ์ด ๋๋ค.
- ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ / ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
SQL > select deptno
from emp
where ename = 'SCOTT';
SQL > select dname
from dept
where deptno = 20 ;
SQL > select dname
from dept
where deptno = (select deptno
from emp
where ename = 'SCOTT') ;
[๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ]
SQL > select deptno from emp where ename = 'SCOTT';
SQL > select dname from dept where deptno = 20 ;
SQL > select dname
from dept
where deptno = (select deptno
from emp
where ename = 'SCOTT') ;
[๋ฌธ์ ] SCOTT๊ณผ ๋์ผํ ์ง๊ธ(job)์ ๊ฐ์ง ์ฌ์์ ์ถ๋ ฅํ๋ sql๋ฌธ์ ์์ฑํด๋ณด์ธ์ฉ.
SQL > select ename, job
from emp
where job = (select job
from emp
where ename = 'SCOTT');
[๋ฌธ์ ] SCOTT์ ๊ธ์ฌ์ ๋์ผํ๊ฑฐ๋ ๋ ๋ง์ด ๋ฐ๋ ์ฌ์๋ช
๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํด๋ณด์๋ผ
SQL > select ename, sal
from emp
where sal >= (select sal
from emp
where ename = 'SCOTT'
);
[์๋ธ์ฟผ๋ฆฌ & ๊ทธ๋ฃนํจ์]
ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋ ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์๋ค์ ์ถ๋ ฅํด๋ผ.
SQL > select ename, sal
from emp
where sal > (select avg(sal)
from emp
);
[๋ค์คํ ์๋ธ์ฟผ๋ฆฌ]
์ฐ๋ด์ 3000์ด์ ๋ฐ๋ ์ฌ์์ด ์์๋ ๋ถ์์ ๋์ผํ ๋ถ์์์ ๊ทผ๋ฌดํ๋ ์ฌ์๋ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ์ธ์ฌ.
SQL > select ename, deptno
from emp
where sal >= 3000;
-error
SQL > select ename, sal, deptno
from emp
where deptno = (select ename, deptno
from emp
where sal >= 3000 );
[in ์ฐ์ฐ์] ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋น๊ต ์กฐ๊ฑด('=' ์ฐ์ฐ์๋ก ๋น๊ตํ ๊ฒฝ์ฐ)์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ค์
ํ๋๋ผ๋ ์ผ์นํ๋ฉด ์ฐธ์ด๋ค.
๋ฐํ๋๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ, (deptno = 10, 20)
SQL > select ename, sal, deptno
from emp
where deptno in ( select deptno
from emp
where sal >= 3000
);
[๋ฌธ์ ] in ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๊ธ์ฌ๋ฅผ ๋ง์ด ๋ฐ๋ ์ฌ์์ ์ ๋ณด(์ฌ์ ๋ฒํธ,
์ฌ์๋ช
, ๊ธ์ฌ, ๋ถ์๋ฒํธ)๋ฅผ ์ถ๋ ฅํ์ธ์.
SQL > select empno, ename, sal, deptno
from emp
where sal in ( select max(sal)
from emp
group by deptno
);
[all ์ฐ์ฐ์]
: ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋น๊ต ์กฐ๊ฑด์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ชจ๋ ๊ฐ์ด ์ผ์นํ๋ฉด ์ฐธ์ด๋ค.
: ์ฐพ์์ง ๊ฐ์ ๋ํด์ and ์ฐ์ฐ์ ํด์ ๋ชจ๋ ์ฐธ์ด๋ฉด ์ฐธ์ด๋๋ ์
์ด๋๋ค.
: > all์ '๋ชจ๋ ๋น๊ต๊ฐ๋ณด๋ค ํฌ๋'๊ณ ๋ฌป๋ ๊ฒ์ด ๋๋ฏ๋ก ์ต๋๊ฐ๋ณด๋ค ๋ ํฌ๋ฉด ์ฐธ์ด ๋๋ค.
-30๋ฒ ์์ ์ฌ์๋ค ์ค์์ ๊ธ์ฌ๋ฅผ ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ ์ฌ์๋ณด๋ค ๋ ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ๋์
์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํด.
-๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ & ๊ทธ๋ฃนํจ์ ์ด์ฉ
SQL > select ename, sal
from emp
where sal > (select max(sal)
from emp
where deptno = 30
) ;
/error
SQL > select ename, sal
from emp
where sal > (select sal
from emp
where deptno = 30
);
SQL > select ename, sal
from emp
where sal > all ( select sal
from emp
where deptno = 30
) ;
[๋ฌธ์ ] ์์
์ฌ์(saleman)๋ค๋ณด๋ค ๊ธ์ฌ๋ฅผ ๋ง์ด ๋ฐ๋ ์ฌ์๋ค์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋
์์
์ฌ์์ ์ถ๋ ฅ๋์ง ์๊ฒ ๋ช
๋ น๋ฌธ์ ์์ฑํด ๋ณด์ธ์.
>>์์
์ฌ์์ค์ ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ ์ฌ๋?๋ณด๋ค ๋ ๋ง์ด ๋ฐ๋
SQL > select ename, sal
from emp
where sal > all ( select sal
from emp
where job = 'SALESMAN'
);
[any ์ฐ์ฐ์]
: any ์กฐ๊ฑด์ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋น๊ต ์กฐ๊ฑด์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒ์ ๊ฒฐ๊ณผ์ ํ๋ ์ด์๋ง ์ผ์นํ๋ฉด ์ฐธ์ด๋ค.
: > any ๋ ์ฐพ์์ง ๊ฐ์ ๋ํด์ ํ๋๋ผ๋ ํฌ๋ฉด ์ฐธ์ด ๋๋ค.
: ๊ทธ๋ฌ๋ฏ๋ก ์ฐพ์์ง ๊ฐ ์ค์์ ๊ฐ์ฅ ์์ ๊ฐ. ์ฆ, ์ต์๊ฐ ๋ณด๋ค ํฌ๋ฉด ์ฐธ์ด๋๋ค.
- ๋ถ์ ๋ฒํธ๊ฐ 30๋ฒ์ธ ์ฌ์๋ค์ ๊ธ์ฌ ์ค ๊ฐ์ฅ ๋ฎ์ ๊ฐ(950)๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์
์ด๋ฆ, ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ช
๋ น๋ฌธ์ ์์ฑํด๋ดyo
[๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ & ๊ทธ๋ฃนํจ์]
SQL > select ename, sal
from emp
where sal > ( select min(sal)
from emp
where deptno = 30
) ;
[๋ค์คํ ์๋ธ์ฟผ๋ฆฌ]
SQL > select ename, sal
from emp
where sal > any(
select sal
from emp
where deptno = 30
);
[๋ฌธ์ ] ์์
์ฌ์๋ค์ ์ต์ ๊ธ์ฌ๋ณด๋ค ๋ง์ด ๋ฐ๋ ์ฌ์๋ค์ ์ด๋ฆ, ๊ธ์ฌ, ์ง๊ธ์ ์ถ๋ ฅํ๋
์์
์ฌ์์ ์ถ๋ ฅํ์ง ์์ต๋๋ค.
SQL > select ename, sal, job
from emp
where sal > any (
select sal
from emp
where job = 'SALESMAN'
)
and job <> 'SALESMAN' ;
9. ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด
* ์ค๋ผํด - ํ
์ด๋ธ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด
* ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด (Data Interity Constraint Rule)
: ํ
์ด๋ธ์ ๋ถ์ ์ ํ ์๋ฃ(๋ฐ์ดํฐ)๊ฐ ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ํ
์ด๋ธ์ ์์ฑํ ๋
๊ฐ ์ปฌ๋ผ์ ๋ํด์ ์ ์ํ๋ ์ฌ๋ฌ๊ฐ์ง ๊ท์น์ ์๋ฏธ.
- Not null/null : null์ ํ์ฉํ ์ง ์๋๋ฉด ๋ฐ๋์ ์
๋ ฅ๋ฐ๊ฒ ํ ๊ฒ์ธ์ง์ ์กฐ๊ฑด.
- Unuique : ์ง์ ๋ ์ปฌ๋ผ์ ์ค๋ณต๋์ง ์๊ณ ์ ์ผํ ๊ฐ๋ง ์ ์ฅ๋๋ ์กฐ๊ฑด.
- Primary key(๊ธฐ๋ณธํค) : unique + not null
- Check : ํน์ ํ ๊ฐ๋ง ์ ์ฅ๋๋ ํ๋ ์กฐ๊ฑด.
- Default : ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํน์ ๊ฐ์ด ์ ์ฅ๋๋๋ก ์ค์ ํ๋ ์กฐ๊ฑด.
- Foreign key(์ธ๋ํค) : ๋ค๋ฅธ ํ
์ด๋ธ์ ์ปฌ๋ผ์ ๋ค์ด์๋ ๊ฐ๋ง ์ ์ฅ์ ํ์ฉ.
* USER_CONSTRATINT ๋ฐ์ดํฐ ๋์
๋๋ฆฌ ๋ทฐ : ์ ์ฝ ์กฐ๊ฑด์ ๊ดํ ์ ๋ณด๋ฅผ ์๋ ค ์ค.
SQL > desc user_constraints ;
- owner : ์ ์ฝ ์กฐ๊ฑด์ ์์ ํ ์ฌ์ฉ์๋ช
์ ์ ์ฅํ๋ ์นผ๋ผ.
- constraint_name : ์ ์ฝ ์กฐ๊ฑด๋ช
์ ์ ์ฅํ๋ ์ปฌ๋ผ.
- constraint_type : ์ ์ฝ ์กฐ๊ฑด์ ์ ํ์ ์ ์ฅํ๋ ์ปฌ๋ผ.
. P : Primary key
. R : Foriegn key
. U : Unique
. C : Check, Not null
- table_name : ๊ฐ ์ ์ฝ ์กฐ๊ฑด๋ค์ด ์ํ ํ
์ด๋ธ์ ์ด๋ฆ.
- search_condition : ์ด๋ค ๋ด์ฉ์ด ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋์๋์ง ์ค๋ช
.
- r_constraint_name : ์ ์ฝ ์กฐ๊ฑด์ด foreign key์ธ ๊ฒฝ์ฐ ์ด๋ค primary key๋ฅผ
์ฐธ์กฐํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์.
> column constraint_name format a15
> select constraint_name, constraint_type, table_name
from user_constraints;
* user_cons_columns ๋ฐ์ดํฐ ๋์
๋๋ฆฌ ๋ทฐ : ์ด๋ค ์ปฌ๋ผ์ ์ด๋ค ์ ์ฝ ์กฐ๊ฑด์ด ์ง์ ๋์๋์ง ์๋ ค์ฃผ๋
๋ฐ์ดํฐ ๋์
๋๋ฆฌ.
> column owner format a10 (์ปฌ๋ผ ์ถ๋ ฅ์ 10์นธ์ผ๋ก ์ค์ )
> column constraint_name format a15
> column table_name format a15
> column column_name format a15
> select * from user_cons_columns;
== ์ปฌ๋ผ ๋ ๋ฒจ ์ ์ฝ ์กฐ๊ฑด ์ง์ ==
--[1] NOT NULL ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ์ง ์๊ณ ํ
์ด๋ธ ์์ฑ
> drop table emp01;
> create table emp01
(
empno number(4),
ename varchar2(10),
job varchar2(10),
deptno number(2)
);
> insert into emp01
values (null, null, 'SALEMAN', 40);
--[2] not null ์ ์ฝ ์กฐ๊ฑด์ ๊ฑธ๊ณ ํ
์ด๋ธ ์์ฑ
> drop table emp02;
> create table emp02
(
empno number(4) not null,
ename varchar2(10) not null,
job varchar2(10),
deptno number(2)
);
> insert into emp02
values (null, null, 'SALEMAN', 40);
#[err] not null์กฐ๊ฑด์ผ๋ก ์ธํด null ๊ฐ์ ์ฝ์
ํ ์ ์์!!
> insert into emp02
values (null, 'SCOTT', 'SALEMAN', 40);
#[err] ํ๋๋ผ๋ null์ด ์์ผ๋ฉด ์๋จ!
> insert into emp02
values (7499, 'ALLEN', 'SALEMAN', 40);
--[3] Unique ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ์ฌ ํ
์ด๋ธ ์์ฑ
> drop table emp03;
> create table emp03
(
empno number(4) unique,
ename varchar2(10) not null,
job varchar2(10),
deptno number(2)
);
-> unique ์์ฑ์ desc ๋ช
๋ น์ด๋ก ์๋ณด์ธ๋ค.
> insert into emp03
values (7499, 'ALLEN', 'SALEMAN', 40);
> insert into emp03
values (7499, 'JONES', 'MANAGER', 20);
#[err]๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด(SCOTT.SYS_COO11056์ ์๋ฐฐ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์ค๋ณต X
> insert into emp03
values (7566, 'JONES', 'MANAGER', 20); #์ ๋ฃ์ด์ง
> insert into emp03
values (null, 'SMITH', 'CLERK', 30); #๊ทผ๋ฐ NULL๊ฐ์ด ๋ค์ด๊ฐ๋ค?
--[4] not null & unique ์ ์ฝ ์กฐ๊ฑด
- ์ฌ์ฉ์๊ฐ ์ ์ฝ ์กฐ๊ฑด๋ช
์ ์ง์ ํ์ง ์๊ณ ์ ์ฝ ์กฐ๊ฑด๋ง์ ๋ช
์ํ ๊ฒฝ์ฐ
์ค๋ผํด ์๋ฒ๊ฐ ์๋์ผ๋ก ์ ์ฝ ์กฐ๊ฑด๋ช
์ ๋ถ์ฌํ๋ค.
- ์ค๋ผํด์ด ๋ถ์ฌํ๋ ์ ์ฝ ์กฐ๊ฑด๋ช
์ SYS_๋ค์์ ์ซ์๋ฅผ ๋์ดํ๋ค.
- ์ด๋ค ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐฐํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์
์ฌ์ฉ์๊ฐ ์๋ฏธ์๊ฒ ์ ์ฝ ์กฐ๊ฑด๋ช
์ ๋ช
์ํ ์ ์๋๋ก ์ค๋ผํด์ ์ ๊ณต,
> drop table emp04;
> create table emp04
(
empno number(4) constraint emp04_empno_uk unique,
ename varchar2(10) constraint emp04_ename_nn not null,
job varchar2(10),
deptno number(2)
);
# ์๋ฌ๋ฉ์์ง ๋ ๋ ์ ์ฝ ์กฐ๊ฑด ์์ ์ง์ด์ง ์ด๋ฆ์ด ๋ฌ๋ค.
> insert into emp04
values (7499, 'ALLEN', 'SALEMAN', 40);
> insert into emp04
values (7499, 'JONES', 'MANAGER', 20);
#๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด(SCOTT.EMP04_EMPNO_UK)์ ์๋ฐฐ๋ฉ๋๋ค.
> select table_name, constraint_name
from user_constraints
where table_name in ('EMP04');
#ํน์ ํ
์ด๋ธ์ ์ ์ฝ์กฐ๊ฑด๋ค ํ์ธํ ์ ์๋ค. ํ
์ด๋ธ์ด๋ฆ์ ๋ฐ๋์ ๋๋ฌธ์๋ก!
--[5] Primary key(๊ธฐ๋ณธํค) ์ ์ฝ ์กฐ๊ฑด ์ค์ ํ๊ธฐ
- unique + not null
- ๋ฐ๋์ ์
๋ ฅํ๋ ๋ฐ์ดํฐ ์ค๋ณต X
> drop table emp05;
> create table emp05
(
empno number(4) constraint emp05_empno_pk primary key,
ename varchar2(10) constraint emp05_ename_nn not null,
job varchar2(10),
deptno number(2)
);
> insert into emp05
values (7499, 'ALLEN', 'SALEMAN', 40);
> insert into emp05
values (7499, 'JONES', 'MANAGER', 20); #๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด (SCOTT. EMP05_EMPNO_PK)์ ์๋ฐฐ๋ฉ๋๋ค.
> insert into emp05
values (null, 'SMITH', 'CLERK', 30); #null๊ฐ ๋ฃ์ ์ ์๋ค!
--[6] ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ํ Foreign key(์ธ๋ํค) ์ ์ฝ ์กฐ๊ฑด
: ๋ถ๋ชจ ํค๊ฐ ๋๊ธฐ ์ํ ์ปฌ๋ผ์ ๋ฐ๋์ ๋ถ๋ชจ ํ
์ด๋ธ์ ๊ธฐ๋ณธํค(primary key)์ด๊ฑฐ๋,
์ ์ผํค(unique)๋ก ์ค์ ๋์ด ์์ด์ผํ๋ค.
> drop table dept01;
> create table dept01
as
select * from dept;
#๋ณต์ฌ๋ฅผ ํด์ฌ๋ ๋ฐ์ดํฐ๋ง ํด์ค๊ณ ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌํ์ง์๋๋ค!
> create table dept01 (
deptno number(2) constraint dept01_deptno_pk primary key,
deptname varchar2(14),
loc varchar2(13)
);
> insert into dept01
values (10, 'ACCOUTING', 'NEW YORK');
> insert into dept01
values (20, 'RESEARCH', 'DALLAS');
> insert into dept01
values (30, 'SALES', 'CHICAGO');
> create table emp06 (
empno number(4) constraint emp06_empno_pk primary key,
ename varchar2(10) constraint emp06_ename_nn not null,
job varchar2(10),
deptno number(2) constraint emp06_deptno_fk references dept01(deptno)
);
#์์ํ
์ด๋ธ์์ ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ์ด์ค์ผํ๋ค.
> select table_name, constraint_name
from user_constraints
where table_name in ('EMP06');
> insert into emp06
values (7499, 'ALLEN', 'SALEMAN', 30);
> insert into emp06
values (7566, 'JONES', 'MANAGER', 50); #[err] ๋ถ๋ชจํค๊ฐ ์์ต๋๋ค.
--[7] Check ์ ์ฝ ์กฐ๊ฑด ์ค์ ํ๊ธฐ
: ๊ธ์ฌ ์ปฌ๋ผ์ ์์ฑํ๋ ๊ฐ์ 500~5000 ์ฌ์ด์ ๊ฐ๋ง ์ ์ฅ ๊ฐ๋ฅ
: ์ฑ๋ณ ์ ์ฅ ์ปฌ๋ผ์ผ๋ก gender๋ฅผ ์ ์ํ๊ณ 'M', 'F' ๋ ์ค ํ๋๋ง ์ ์ฅ ๊ฐ๋ฅ
> drop table emp07;
> create table emp07(
empno number(4) constraint emp07_empno_pk primary key,
ename varchar2(20) constraint emp07_ename_nn not null,
sal number(7, 2) constraint emp07_sal_ck check(sal between 500 and 5000),
gender varchar2(1) constraint emp07_gender_ck check(gender in ('M', 'F'))
);
> insert into emp07
values (7499, 'ALLEN', 200, 'M'); #[err] ์ฒดํฌ์กฐ๊ฑด์ ์๋ฐฐ!
> insert into emp07
values (7499, 'ALLEN', 700, 'M');
> insert into emp07
values (7499, 'JONES', 900, 'A'); #[err]
--[8] Default ์ ์ฝ ์กฐ๊ฑด ์ค์ ํ๊ธฐ
: ์ง์ญ(loc) ์ปฌ๋ผ์ ์๋ฌด ๊ฐ๋ ์
๋ ฅํ์ง ์์์ ๋ default ๊ฐ์ธ 'SEOUL'์ด ์
๋ ฅ ๋๋๋ก ์ค์
> drop table dept02;
> create table dept02 (
deptno number(2) primary key,
dname varchar2(14),
loc varchar2(12) default 'SEOUL'
);
> insert into dept02(deptno, dname)
values (10, 'ACCOUNTING'); #์๋์ผ๋ก SEOUL์ด ๋ค์ด๊ฐ
> insert into dept02
values (20, 'RESEARCH', 'NEW YORK');
> insert into dept02
values (30, 'SALES'); #[err] ๊ฐ์ ์๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
--[9]
--[10] ์ปฌ๋ผ ๋ ๋ฒจ๋ก ์ ์ฝ ์กฐ๊ฑด๋ช
๋ช
์ํด์ ์ ์ฝ ์กฐ๊ฑด ์ค์ ํ๊ธฐ
> create table emp10 (
empno number(4) constraint emp10_empno_pk primary key,
ename varchar2(10) constraint emp10_ename_nn not null,
job varchar2(10),
deptno number(2) constraint emp10_deptno_fk references dept01(deptno)
);
--[11] ํ
์ด๋ธ ๋ ๋ฒจ ๋ฐฉ์์ผ๋ก ์ ์ฝ์กฐ๊ฑด ์ค์ ํ๊ธฐ
***์ฃผ์ : not null ์ ์ฝ ์กฐ๊ฑด์ ํ
์ด๋ธ ๋ ๋ฒจ ๋ฐฉ์์ผ๋ก ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค.
> create table emp11 (
empno number(4) ,
ename varchar2(10) constraint emp11_ename_nn not null,
job varchar2(10),
deptno number(2),
constraint emp11_empno_pk primary key(empno),
unique(job),
foreign key(deptno) references dept01(deptno)
);
--[12] ์ ์ฝ ์กฐ๊ฑด ์ถ๊ฐํ๊ธฐ
> delete from emp01;
> alter table emp01
add constraint emp01_empno_pk primary key(empno);
> alter table emp01
add constraint emp01_deptno_fk foreign key(deptno) references dept01(deptno);
> select table_name, constraint_name, constraint_type
from user_constraints
where table_name in ('EMP01');
> insert into emp01
values( null, null, 'SAM', 40); #[err]์ ์ฝ์กฐ๊ฑด์ผ๋ก ์ฝ์
X
--[13] not null ์ ์ฝ ์กฐ๊ฑด ์ถ๊ฐ ํ๊ธฐ
> alter table emp01
modify ename constraints emp01_ename_nn not null;
--[14] ์ ์ฝ ์กฐ๊ฑด ์ ๊ฑฐํ๊ธฐ
> alter table emp01
drop primary key;
> alter table emp01
drop emp01_ename_nn;
--[15] ์ ์ฝ ์กฐ๊ฑด(์ธ๋ํค) ์ญ์
> delete from dept01
where deptno = 30; #[err] ์์๋ ์ฝ๋ ๋ฐ๊ฒฌ!
1) ์ ์ฝ ์กฐ๊ฑด์ ๋นํ์ฑํ
- ์์ ํ
์ด๋ธ์ธ ์ฌ์ํ
์ด๋ธ(emp06)์ ๋ถ๋ชจํ
์ด๋ธ(dept01)์ ๊ธฐ๋ณธํค์ธ ๋ถ์๋ฒํธ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
- ๋ถ์ ํ
์ด๋ธ์ 30๋ฒ ๋ถ์๋ ์ฌ์ ํ
์ด๋ธ์ ๊ทผ๋ฌดํ๋ 30๋ฒ ์ฌ์์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ญ์ ํ ์ ์๋ค.
- ๋ถ๋ชจํ
์ด๋ธ์ ๋ถ์๋ฒํธ 30๋ฒ์ด ์ญ์ ๋๋ฉด ์์ํ
์ด๋ธ์์ ์์ ์ด ์ฐธ์กฐํ๋ ๋ถ๋ชจ๋ฅผ ์์ด๋ฒ๋ฆฌ๊ฒ ๋๋ฏ๋ก ์ญ์ ํ ์ ์๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ญ์ ?
<1> ๋ถ์ ํ
์ด๋ธ์ 30๋ฒ ๋ถ์์์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ์ญ์ ํ ํ ๋ถ์ ํ
์ด๋ธ์์ 30๋ฒ ๋ถ์๋ฅผ ์ญ์
<2> ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ๋๋ฌธ์ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก emp06 ํ
์ด๋ธ์ ์ธ๋ํค ์ ์ฝ ์กฐ๊ฑด์ ์ ๊ฑฐํ ํ 30๋ฒ ๋ถ์๋ฅผ ์ญ์ .
- ์ ์ฝ ์กฐ๊ฑด ๋นํ์ฑํ
<1> ํ
์ด๋ธ์์ ์ ์ฝ ์กฐ๊ฑด์ ์ญ์ ํ์ง ์๊ณ ์ผ์์ ์ผ๋ก ์ ์ฉ์ํค์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฝ ์กฐ๊ฑด์ ๋นํ์ฑํ ํ๋ ๋ฐฉ๋ฒ
<2> .DISABLE_CONSTRAINT : ์ ์ฝ์กฐ๊ฑด ์ผ์ ๋นํ์ฑํ
.ENABLE_CONSTRAINT : ๋นํ์ฑํ๋ ์ ์ฝ ์กฐ๊ฑด์ ํด์ ํ์ฌ ๋ค์ ํ์ฑํ.
> alter table emp06
disable constraint emp06_deptno_fk;
> delete from dept01
where deptno = 30;
> alter table emp06
enable constraint emp06_deptno_fk; #[err] ๊ฐ์ด ์ด๋ฏธ ์ง์์ ธ์ ์๋ฌ
> insert into dept01
values(30, 'SALES', 'CHICAGO');
> alter table emp06
enable constraint emp06_deptno_fk; #๋ค์ ๋ฐ์ดํฐ ์์ฑํ๊ณ ํ๋ฉด ์ ์ํ๋จ
2) cascade ์ต์
- ๋ถ๋ชจํ
์ด๋ธ(dept01)๊ณผ ์์ํ
์ด๋ธ(emp06)๊ฐ์ ์ฐธ์กฐ ์ค์ (์ธ๋ํค)์ด ๋์ด ์์ ๋ ๋ถ๋ชจํ
์ด๋ธ์ ์ ์ฝ ์กฐ๊ฑด์ ๋นํ์ฑํํ๋ฉด
์ด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์์ํ
์ด๋ธ์ ์ ์ฝ ์กฐ๊ฑด๊น์ง ๋นํ์ฑํ ์์ผ์ฃผ๋ ์ต์
.
> alter table dept01
disable primary key cascade;
> alter table dept01
drop primary key;
> alter table dept01
drop primary key cascade;
10. ์ํ์ค
*์ค๋ผํด - ์ํ์ค(Sequence)
: ํ
์ด๋ธ ์์ฑ ํ ์ํ์ค(์ผ๋ จ๋ฒํธ)๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
--[1] ์ํํ
์ด๋ธ ์์ฑ
> create table memos
(
num number(4) primary key,
name varchar2(20) not null,
postDate Date default (sysdate)
);
--[2] ํด๋น ํ
์ด๋ธ์ ์ํ์ค ์ค์
> create sequence memos_seq
start with 1 increment by 1; #start with ์์๊ฐ increment by ์ฆ๊ฐ๊ฐ;
--[3] ๋ฐ์ดํฐ ์
๋ ฅ : ์ผ๋ จ๋ฒํธ ํฌํจ
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๊ธธ๋');
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๊ธธ์');
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๊ธธ๋จ');
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๊ธธ๋ถ');
--[4] ํ์ฌ ์ํ์ค๊ฐ ์ด๋๊น์ง ์ฆ๊ฐ๋์ด์ ธ ์๋์ง ํ์ธ
> select memos_seq.currval from dual;
--[5] ์ํ์ค ์์ : ์ต๋ ์ฆ๊ฐ๊ฐ์ 6๊น์ง๋ก ์ ํ
> alter sequence memos_seq maxvalue 6;
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๋จ์ด'); #์ํ์ค 6
> insert into memos (num, name)
values(memos_seq.nextval, 'ํ๋ง์ด'); #[err] ์ํ์ค๊ฐ 7์ด ๋๋ฏ๋ก ์๋ฌ!
--[6] ์ํ์ค ์ญ์
> drop sequence memos_seq; #๋์ด์ ์ด ์ํ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค
cf) ๊ถํ ๋ถ์ฌ (์ํ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ถํ์ด ํ์ํ๋ค / scott์ ์ด๋ฏธ ์์)
- system์ผ๋ก ์ ์ ํ
> grant create sequence to ์ฌ์ฉ์๋ช
;
11. ํธ๋์ญ์
*์ค๋ผํด - ํธ๋์ญ์
(transaction)
- commit : ๋ช
๋ น์ด ์์ ์คํ
- rollback : ๋ช
๋ น์ด ๋๋๋ฆฌ๊ธฐ
--[1] ํ
์ด๋ธ ์์ฑ
> create table trans(
num number(2) primary key,
name varchar2(20) not null,
email varchar2(50),
title varchar2(150),
postDate Date default sysdate,
postIP varchar2(20)
);
--[2] ์ํ์ค(์ผ๋ จ๋ฒํธ) ์์ฑ
> create sequence trans_seq
start with 1 increment by 1;
> insert into trans
values (trans_seq.nextval, 'ํ๊ธธ๋', 'a@a.com', '์๋
ํ์ธ์, ํ๊ธธ๋์
๋๋ค' , sysdate, '127.0.0.1');
# ์ฌ๊ธฐ๊น์งํ๊ณ ๋ค๋ฅธ cmd์ฐฝ์์ select * from trans; ํด๋ณด๋ฉด ์ ํ๋ ๋ ์ฝ๋๊ฐ ์๋ค๊ณ ํ๋ค!
์ด๋ ์๋ ์ฐฝ์์ commit ์ ํ๋ฒ ํด์ฃผ๋ฉด ๋ฌ๋ค~
> insert into trans
values (trans_seq.nextval, 'ํ๊ธธ์', 'b@a.com', '์๋
ํ์ธ์, ํ๊ธธ์์
๋๋ค' , sysdate, '127.0.0.1');
# ์ฌ๊ธฐ๊น์ง ํ๊ณ ์๋์ฐฝ์์ rollback ํ๊ณ ๋ค๋ฅธ ์ฐฝ์์ ๋ณด๋ฉด ๋๋ฒ์งธ ๋ฐ์ดํฐ๋ ์๋ค.
# ์๋์ปค๋ฐ์ ๋ด๋ถ์ ์ผ๋ก ์ง์ํ๊ณ ์๋ค.
๋ง์ง๋ง commit ๋ถํฐ ๋ค์ commit์ฌ์ด๊น์ง๊ฐ rollback์ผ๋ก ๋์๊ฐ ์ ์๋ ์์
12. ๋ทฐ(view)
*์ค๋ผํด - ๋ทฐ(View)
- ๋ฌผ๋ฆฌ์ ์ธ ํ
์ด๋ธ์ ๊ทผ๊ฑฐํ ๋
ผ๋ฆฌ์ ์ธ ๊ฐ์ ํ
์ด๋ธ
- ๊ฐ์์ด๋ ๋จ์ด๋ ์ค์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ์ธ ๊ฒ์ด๊ณ , ํ
์ด๋ธ์ด๋ ๋จ์ด๋ ์ค์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ง ์์ง๋ง ์ฌ์ฉ์๋ ๋ง์น
ํ
์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ๋ทฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ์ธ ๊ฒ.
- ๋ทฐ๋ ๊ธฐ๋ณธ ํ
์ด๋ธ์์ ํ์๋ ๊ฐ์ฒด๋ก์ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ํ ํ๋์ ์ฟผ๋ฆฌ๋ฌธ์.
- ์ค์ ํ
์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ๋ฅผ ํตํด์ ๋ณผ ์ ์๋ค.
- ์ฌ์ฉ์์๊ฒ ์ฃผ์ด์ง ๋ทฐ๋ฅผ ํตํด์ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋จ
- ๋ทฐ๋ ์ด๋ฏธ ์กด์ฌํ๊ณ ์๋ ํ
์ด๋ธ์ ์ ํ์ ์ผ๋ก ์ ๊ทผํ๋๋ก ํ๋ค.
- ๋ทฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ค์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ฌผ๋ฆฌ์ ์ธ ํ
์ด๋ธ์ด ์กด์ฌํด์ผ ํ๋๋ฐ ์ด ํ
์ด๋ธ์ ๊ธฐ๋ณธ ํ
์ด๋ธ์ด๋ค.
--[1] ๋ทฐ์ ๊ธฐ๋ณธ ํ
์ด๋ธ ์์ฑ
: dept ํ
์ด๋ธ์ ๋ณต์ฌ๋ณธ์ dept_copy ๋ก ์์ฑ
> create table dept_copy
as
select * from dept; #๋จ ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌ๋์ง ์์!
: emp ํ
์ด๋ธ์ ๋ณต์ฌ๋ณธ์ emp_copy๋ก ์์ฑ
> create table emp_copy
as
select * from emp;
--[2] ๋ทฐ ์ ์ํ๊ธฐ
: ๋ทฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ create view๋ก ์์ํจ. as ๋ค์์ ๋ง์น ์๋ธ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์ ์ฌํจ.
: ์๋ธ์ฟผ๋ฆฌ์๋ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ฌ์ฉํ๋ select๋ฌธ์ ๊ธฐ์ ํ๋ฉด ๋จ
// ๋ง์ผ 30๋ฒ ๋ถ์์ ์์๋ ์ฌ์๋ค์ ์ฌ๋ฒ๊ณผ ์ด๋ฆ๊ณผ ๋ถ์๋ฒํธ๋ฅผ ์์ฃผ ๊ฒ์ํ๋ค๊ณ ํ๋ค๋ฉด
> select empno, ename, deptno
from emp_copy
where deptno = 30;
> create view emp_view30
as
select empno, ename, deptno
from emp_copy
where deptno = 30;
# view๋ฅผ ์์ฑํ๋ ค๋ฉด ๊ถํ์ด ํ์ํ๋ค! (system์ผ๋ก ์ ์ํด์ ๊ถํ ์ป์ด์จ๋ค.)
> grant create view to ์ฌ์ฉ์๋ช
;
> select * from emp_view30;
# ๋ง์น ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค!
๊ธด ์ฟผ๋ฆฌ๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ค!
--[3] ๋ทฐ์ ๋ด๋ถ๊ตฌ์กฐ์ user_views ๋ฐ์ดํฐ ๋์
๋๋ฆฌ
> desc user_views;
> select view_name, text
from user_views;
--[4] ๋ทฐ์ ๋์ ์๋ฆฌ
1. ์ฌ์ฉ์๊ฐ ๋ทฐ์ ๋ํด์ ์ง์๋ฅผ ํ๋ฉด user_views์์ ๋ทฐ์ ๋ํ ์ ์๋ฅผ ์กฐํํ๋ค.
2. ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ํ ๋ทฐ์ ์ ๊ทผ ๊ถํ์ ์ดํ๋ค.
3. ๋ทฐ์ ๋ํ ์ง์๋ฅผ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ํ ์ง์๋ก ๋ณํํ๋ค.
4. ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ํ ์ง์๋ฅผ ํตํด ๋ฐ์ดํฐ ๊ฒ์ํ๋ค.
5. ๊ฒ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
--[5] ๋ทฐ์ ๊ธฐ๋ณธ ํ
์ด๋ธ ๊ด๊ณ ํ์
: 1. ๋ทฐ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ฅ์ด ๊ฐ๋ฅ?
> insert into emp_view30
values (8000, 'TOM', 30);
> select * from emp_view30;
> select * from emp_copy;
# ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค! emp_copy ํ
์ด๋ธ์๋ ์ ์ฅ์ด ๋์ด์๋ค!
๊ฒฐ๋ก : ๋ทฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ๊ธฐ๋ณธํ
์ด๋ธ์ ์ ์ฅ๋๋ค.
2. insert๋ฌธ์ ๋ทฐ(emp_view30)๋ฅผ ์ฌ์ฉํ์์ง๋ง, ๋ทฐ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ํ ์ด๋ฆ์ผ ๋ฟ ์๋ก์ด ๋ ์ฝ๋๋ ๊ธฐ๋ณธ ํ
์ด๋ธ(emp_copy)์ ์ค์ง์ ์ผ๋ก ์ถ๊ฐ๋๋ ๊ฒ์ด๋ค.
3. ๋ทฐ๋ ์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ณผ ์ ์๋๋ก ํ ํฌ๋ช
ํ ์ฐฝ์ด๋ค.
์ฆ, ๊ธฐ๋ณธ ํ
์ด๋ธ์ ๋ชจ์์ด ๋ฐ๋ ๊ฒ์ด๊ณ ๊ทธ ๋ฐ๋ ๋ด์ฉ์ ๋ทฐ๋ผ๋ ์ฐฝ์ ํตํด์ ๋ณผ ๋ฟ์ด๋ค.
๋ทฐ์ insert ๋ฟ๋ง ์๋๋ผ, update, delete ๋ชจ๋ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด ๋ช
๋ น๋ฌธ ์ญ์ ๋ทฐ์ ํ
์คํธ์ ์ ์ฅ๋์ด ์๋ ๊ธฐ๋ณธ ใ
์ด๋ธ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค.
--[6] ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์
1. ๋ณต์กํ๊ณ ๊ธด ์ฟผ๋ฆฌ๋ฌธ์ ๋ทฐ๋ก ์ ์ํ๋ฉด ์ ๊ทผ์ ๋จ์ํ ์ํฌ ์ ์๋ค.
2. ๋ณด์์ ์ ๋ฆฌํ๋ค.
- ์ฌ์ฉ์๋ง๋ค ํน์ ๊ฐ์ฒด๋ง ์กฐํํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ ์ ์๊ธฐ ๋๋ฌธ
> create view emp_view
as
select empno, ename, job, hiredate, deptno
from emp_copy;
--[7] ๋ทฐ์ ์ข
๋ฅ
: ๋ทฐ๋ ๋ทฐ๋ฅผ ์ ์ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ์์ ๋ฐ๋ผ
- ๋จ์ ๋ทฐ (simple view)
- ๋ณตํฉ ๋ทฐ (complex view)
: ํน์ง
- ๋จ์ ๋ทฐ
+ ํ๋์ ํ
์ด๋ธ๋ก ์์ฑ
+ ๊ทธ๋ฃน ํจ์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
+ distinct ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
+ insert/update/delete(DML) ๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ณตํฉ ๋ทฐ
+ ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ๋ก ์์ฑ
+ ๊ทธ๋ฃน ํจ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅ
+ distinct ์ฌ์ฉ์ด ๊ฐ๋ฅ
+ DML ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
----[7-1] ๋จ์ ๋ทฐ์ ๋ํ ๋ฐ์ดํฐ ์กฐ์
> insert into emp_view30
values (8010, 'HONG', 30);
----[7-2] ๋จ์ ๋ทฐ์ ์ปฌ๋ผ์ ๋ณ์นญ ๋ถ์ฌํ๊ธฐ
> create view emp_view_copy( ์ฌ์๋ฒํธ, ์ฌ์๋ช
, ๊ธ์ฌ, ๋ถ์๋ฒํธ)
as
select empno, ename, sal, deptno
from emp_copy;
----[๋ฌธ์ ] ๋ถ์ 30๋ฒ์ ๊ทผ๋ถํ๋ ์ฌ์ ์ ๋ณด๋ง์ ์ถ๋ ฅํ์ธ์ (์์ ๋ง๋ ๋ทฐ ํ
์ด๋ธ์ ์ด์ฉ)
> select * from emp_view_copy
where ๋ถ์๋ฒํธ = 30; # ๋ณ์นญ์ผ๋ก ์ฌ์ฉํด์ผํ๋ค!
----[7-3] ๊ทธ๋ฃน ํจ์๋ฅผ ์ฌ์ฉํ ๋จ์ ๋ทฐ
: ***์ค์***
๋ทฐ๋ฅผ ์์ฑํ ๋ select์ ๋ค์์ sum์ด๋ผ๋ ๊ทธ๋ฃนํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ทฐ์ ํน์ ์ปฌ๋ผ์ฒ๋ผ ์ฌ์ฉํ๊ฒ ๋จ,
๋ฐ๋ผ์ ๋ฌผ๋ฆฌ์ ์ธ ์ปฌ๋ผ์ด ์กด์ฌํ์ง ์๋ ๊ฐ์ ์ปฌ๋ผ์ด๊ธฐ์ ์ปฌ๋ผ๋ช
๋ ์์ ๋ฐ์ ์ ์๋ค.
๋ทฐ๋ฅผ ์์ฑํ ๋ ๊ฐ์ ์ปฌ๋ผ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ๋ฐ๋์ ์ด๋ฆ(๋ณ๋ช
)์ ๋ฐ๋ก ์ค์ ํด์ผํ๋ค.
> create view view_sal
as
select deptno, sum(sal), avg(sal)
from emp_copy
group by deptno;
#[err] ์ด ์์ ์ด์ ๋ณ๋ช
๊ณผ ํจ๊ป ์ง์ ํด์ผ ํฉ๋๋ค.
> create view view_sal
as
select deptno, sum(sal) as "SalSum", avg(sal) "SalAvg"
from emp_copy
group by deptno;
----[์ฃผ์ - ๋จ์ ๋ทฐ์ ๊ฒฝ์ฐ DML ๋ช
๋ น์ด์ ์กฐ์์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ]
1. ๋ทฐ ์ ์์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ ์ค์ ๊ธฐ๋ณธ ํ
์ด๋ธ์ ์ปฌ๋ผ์ด not null ์ ์ฝ ์กฐ๊ฑด์ด ์ง์ ๋์ด
์๋ ๊ฒฝ์ฐ insert ๋ฌธ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์? ๋ทฐ์ ๋ํ insert๋ฌธ์ ๊ธฐ๋ณธํ
์ด๋ธ์ null ๊ฐ์ ์
๋ ฅํ๋ ํํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
( ๋ทฐ๋ ์ผ๋ถ ์ปฌ๋ผ๋ง ๋ณด์ฌ์ฃผ๋๊น ๋๋จธ์ง ํญ๋ชฉ์ null๋ก ๋ฃ์)
2. sal * 12 ์ ๊ฐ์ด ์ฐ์ ํํ์์ผ๋ก ์ ์๋ ๊ฐ์ ์ปฌ๋ผ์ด ๋ทฐ์ ์ ์๋๋ฉด insert/update๊ฐ ๋ถ๊ฐ๋ฅ
3. distinct๋ฅผ ํฌํจํ ๊ฒฝ์ฐ์๋ DML(Data Manipulation language) ๋ช
๋ น์ ์ฌ์ฉํ ์ ์๋ค.
4. ๊ทธ๋ฃน ํจ์๋ group by์ ์ ํฌํจํ ๊ฒฝ์ฐ์๋ DML๋ช
๋ น์ ์ฌ์ฉ ํ ์ ์๋ค.
>select * from view_sal;
> insert into view_sal
values (40, 30000, 4000); #[err] ์๋จ
> create view veiw_sal_year
as
select ename, sal * 12
from emp_copy; #[err] ์๋ง๋ค์ด์ง~ ๋์ sal * 12 ์ ๋ณ๋ช
์ ๋ถ์ด๋ฉด ๊ฐ๋ฅ!
> insert into view_sal_year
value ('ANGEL', 12000); #[err] ๋ณ๋ช
์ด ๋ถ์ด์๋ ๊ฒฝ์ฐ์๋ insert๋ ์๋จ
----[7-4] ๋ณตํฉ ๋ทฐ
> select empno, ename, sal, e.deptno, dname, loc
from emp e, dept d
where e.deptno = d.deptno
order by empno desc;
> create view emp_view_dept
as
select empno, ename, sal, e.deptno, dname, loc
from emp e, dept d
where e.deptno = d.deptno
order by empno desc;
--[8] ๋ทฐ ์ญ์
> select view_name, text
from user_views;
> drop view emp_view;
--[9] ๋ทฐ ์์ฑ์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ต์
(or replace)
: ์กด์ฌํ์ง ์๋ ๋ทฐ์ด๋ฉด ์๋ก์ด ๋ทฐ๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด์ ์กด์ฌํ๋ ๋ทฐ์ด๋ฉด ๊ทธ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ค.
> create or replace view emp_view30
as
select empno, ename, comm,deptno
from emp_copy
where deptno = 30;
--[10] ๋ทฐ ์์ฑ์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ต์
(force / noforce)
: force - ๊ธฐ๋ณธํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์ ๋๋ ๋ทฐ๋ฅผ ์์ฑํด์ผ ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ต์
noforce - ๊ธฐ๋ณธํ
์ด๋ธ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ๋ทฐ๊ฐ ์์ฑ(default๋ก ์ค์ ๋์ด์์)
> desc employees; #์ด๋ฐ ํ
์ด๋ธ ๋ง๋ค์ด ์ค ์ ์์~
> create or replace view employees_view
as
select empno, ename, deptno
from employees
where deptno = 30; #[err] ๊ธฐ๋ณธํ
์ด๋ธ์ด ์์!
> create or replace force view employees_view
as
select empno, ename, deptno
from employees
where deptno = 30; #์ค๋ฅ๋ ๋ฐ์ํ์ง๋ง ๋ทฐ๋ ๋ง๋ค์ด์ง๋ค!
> select view_name, text
from user_views; #๋ทฐ๊ฐ ๋ง๋ค์ด์ ธ ์๋ ๊ฒ์ ํ์ธ
--[11] ๋ทฐ ์์ฑ์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ต์
(with check option)
: ๋ทฐ๋ฅผ ์์ฑํ ๋ ์กฐ๊ฑด ์ ์์ ์ฌ์ฉ๋ ์ปฌ๋ผ ๊ฐ์ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ํ๋ ๊ธฐ๋ฅ ์ ๊ณต
๋ทฐ๋ฅผ ์ค์ ํ ๋ ์กฐ๊ฑด์ผ๋ก ์ค์ ํ ์ปฌ๋ผ ์ด์ธ์ ๋ค๋ฅธ ์ปฌ๋ผ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์๋ค.
> create or replace view emp_view30
as
select empno, ename, sal, deptno
from emp_copy
where deptno = 30;
> update emp_view30
set
deptno = 20
where sal >= 1200;
> select * from emp_view30; #๋ฐ๋ ๋ ์ฝ๋๋ ๋จ์ง ์๋๋ค.
> create or replace view view_chk30
as
select empno, ename, sal, comm, deptno
from emp_copy
where deptno = 30 with check option;
> update view_chk30
set
deptno = 20
where sal >= 900; #๊ฒฐ๊ณผ : 0ํ์ด ๊ฐฑ์ ๋์์ต๋๋ค.
--[12] ๋ทฐ ์์ฑ์ ์ฌ์ฉ๋๋ ๋ค์ํ ์ต์
(with read only)
: ๊ธฐ๋ณธ ํ
์ด๋ธ์ ์ด๋ค ์ปฌ๋ผ์ ๋ํด์๋ ๋ทฐ๋ฅผ ํตํ ๋ด์ฉ ์์ ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ต์
> update view_chk30
set
comm = 1000;
> create or replace view view_read30
as
select empno, ename, sal, comm, deptno
from emp_copy
where deptno = 30 with read only; #์กฐ๊ฑด ๋ค์ ๋ถ์ด์ง๋ง ์ ์ฒด ์์ ๋ถ๊ฐ!
> update view_read30
set
comm = 1000; #[err] ์ฝ๊ธฐ ์ ์ฉ ๋ทฐ์์๋ DML ์์
์ ์ํ ํ ์ ์์ต๋๋ค.
13. Top์ฟผ๋ฆฌ
*์ค๋ผํด - Top์ฟผ๋ฆฌ
:Top ์ฟผ๋ฆฌ : ์์ ๋ช ๊ฐ์ data๋ง์ ์ถ๋ ฅํ๊ณ ์ถ์ ๋
ex) ์ฌ์ ์ค์์ ์
์ฌ์ผ์ด ๊ฐ์ฅ ๋น ๋ฅธ ์ฌ๋ 5๋ช
(Top-5)๋ง์ ์ป์ด์ค๋ ์ง์๋ฌธ
: Top-N์ ๊ตฌํ๊ธฐ ์ํด rownum & ์ธ๋ผ์ธ๋ทฐ ์ฌ์ฉ (oracle์์๋ง ์ ๊ณต)
> select rownum, empno, ename, hiredate
from emp;
> select rownum, empno, ename, hiredate
from emp
order by hiredate;
# rownum์ insert ํ๋ ์๊ฐ ๋ง๋ค์ด์ง๊ณ ๊ณ ์ ํ ๊ฐ์ด๋ค.
(rownum์ด ์์ฐจ์ ์ผ๋ก ๋์ด์์ง์์)
> create or replace view view_hire
as
select empno, ename, hiredate
from emp
order by hiredate;
> select rownum, empno, ename, hiredate
from view_hire;
#rownum์ด ์์ฐจ์ ์ผ๋ก ํ ๋น๋์ด์๋ค. ์๋๋ฉด ๋ทฐ๋ฅผ ์ธ๋ ์๋กญ๊ฒ
insertํ๋ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์
(๊ฒ์ํ ์์ฑํ๋ฉด์ ์ต๊ทผ ๋ ์ง ์์ผ๋ก ์ผ๋ จ๋ฒํธ ๋ฉ๊ธธ ๋ ๋ง์ด ์ฐ์ธ๋ค.)
--[1] rownum์ ์ด์ฉ
> select rownum, empno, ename, hiredate
from view_hire
where rownum <= 5;
--[2] ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ด์ฉ
:sql๋ฌธ์์ ์ฌ์ฉํ๋ ์๋ธ ์ฟผ๋ฆฌ์ ์ผ์ข
์ผ๋ก ๋ณดํต from ์ ์ ์์นํด์ ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ.
> select rownum, empno, ename, hiredate
from (select empno, ename, hiredate
from emp
order by hiredate)
where rownum <= 5;
14. ์ฌ์ฉ์ ๊ถํ
*์ค๋ผํด - ์ฌ์ฉ์(User) ๊ถํ(Role)
--[1] ๊ถํ์ ์ญํ ๊ณผ ์ข
๋ฅ
- ๊ถํ : ์ฌ์ฉ์๊ฐ ํน์ ํ
์ด๋ธ์ ์ ๊ทผํ ์ ์๋๋ก ํ๊ฑฐ๋ ํด๋น ํ
์ด๋ธ์ sql(select/ insert/ update/ delete)๋ฌธ์ ์ฌ์ฉ ํ ์ ์๋๋ก ์ ํ์ ๋๋ ๊ฒ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณด์์ ์ํ ๊ถํ์ ์์คํ
๊ถํ๊ณผ ๊ฐ์ฒด ๊ถํ์ผ๋ก ๋๋ ์ ์๋ค.
- ์์คํ
๊ถํ : ์ฌ์ฉ์์ ์์ฑ๊ณผ ์ ๊ฑฐ, DB ์ ๊ทผ ๋ฐ ๊ฐ์ข
๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ๊ถํ ๋ฑ DBA์ ๋ถ์ฌ๋จ
- ๊ฐ์ฒด ๊ถํ : ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์ ์๋ ๊ถํ.
--[2] user01 ๊ณ์ ์์ฑ
> conn system/manager
> create user user01 identified by tiger;
--[3] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ๊ถํ
> grant create session to user01;
> create table emp01(
empno number(4),
ename varchar2(10),
job varchar2(10),
deptno number(2)
);
#[err] ๊ถํ์ด ๋ถ์ถฉ๋ถํฉ๋๋ค!
--[4] ํ
์ด๋ธ ์์ฑ ๊ถํ
> conn system/manager
> grant create table to user01;
> create table emp01(
empno number(4),
ename varchar2(10),
job varchar2(10),
deptno number(2)
);
# insert๋ฅผ ๋ฐ๋ก ํ ์ ์๋ค!
--[5] ํ
์ด๋ธ ์คํ์ด์ค ํ์ธ
: ํ
์ด๋ธ ์คํ์ด์ค(table space)๋ ๋์คํฌ ๊ณต๊ฐ์ ์๋นํ๋ ํ
์ด๋ธ๊ณผ ๋ทฐ ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ์ฅ์.
> alter user user01 quota 2m on users(system : ๋ค๋ฅธ๋ฒ์ ); #๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ ํ ๋น
> insert into emp01
values (7369, 'SMITH', 'CLERK', 20);
--[6] with admin option
: ์ฌ์ฉ์์๊ฒ ์์คํ
๊ถํ์ with admin option๊ณผ ํจ๊ป ๋ถ์ฌํ๋ฉด ๊ทธ ์ฌ์ฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์๊ฐ ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๋ถ์ฌ๋ฐ์
์์คํ
๊ถํ์ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ ์ ์๋ ๊ถํ๋ ํจ๊ป ๋ถ์ฌ๋ฐ๋๋ค.
> create user user02 identified by tiger;
> grant create session to user02 with admin option;
> create user user03 identified by tiger;
> conn user02/tiger;
> grant create session to user03; #user02๋ก user03์๊ฒ ๊ถํ ๋ถ์ฌ ๊ฐ๋ฅ!
--[7] ํ
์ด๋ธ ๊ฐ์ฒด์ ๋ํ select ๊ถํ ๋ถ์ฌ (scott/emp -> user01)
1) > conn scott/tiger ๊ณ์ ์ ์
2) > grant select on emp to user01;
3) > conn user01/tiger;
4) > select * from emp; #[err] ํ
์ด๋ธ ๋๋ ๋ทฐ๊ฐ ์กด์ฌํ์ง ์ij์ต๋๋ค
--[8] ์คํค๋ง(SCHEMA) : ๊ฐ์ฒด๋ฅผ ์์ ํ ์ฌ์ฉ์๋ช
์ ์๋ฏธ
1) > select * from scott.emp;
--[9] ์ฌ์ฉ์์๊ฒ ๋ถ์ฌ๋ ๊ถํ ์กฐํ
.user_tab_privs_made : ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ ๊ถํ ์ ๋ณด๋ฅผ ์๋ ค์ค
.user_tab_privs_recd : ์์ ์๊ฒ ๋ถ์ฌ๋ ์ฌ์ฉ์ ๊ถํ์ ์๊ณ ์ถ์ ๋
> select * from user_tab_privs_made;
> select * from user_tab_privs_recd;
--[10] ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์
> alter user user01 identified by user01;
----[์ฐธ๊ณ ] ํ๋ฒ์ ๊ถํ ์ฃผ๊ธฐ
> grant create session, create table, create view to user01;
--[11] ๊ฐ์ฒด ๊ถํ ์ ๊ฑฐํ๊ธฐ
> conn scott/tiger
> select * from user_tab_privs_made;
> revoke select on emp from user01;
--[12] with grant option (6๋ฒ๊ณผ ๋น๊ต~)
: ์ฌ์ฉ์์๊ฒ ๊ฐ์ฒด ๊ถํ์ with grant option๊ณผ ํจ๊ป ๋ถ์ฌํ๋ฉด ์ฌ์ฉ์๋
๊ฐ์ฒด๋ฅผ ์ ๊ทผํ ๊ถํ์ ๋ถ์ฌ ๋ฐ์ผ๋ฉด์ ๊ทธ ๊ถํ์ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ถ์ฌํ
์ ์๋ ๊ถํ๋ ํจ๊ป ๋ถ์ฌ๋ฐ๋๋ค.
> conn scott/tiger
> grant select on scott.emp to user02 with grant option;
> conn user02/tiger # user02๊ฐ user03์๊ฒ scott์ ๊ถํ ๋ถ์ฌํจ
> grant select on scott.emp to user03; #์ฌ๊ธฐ์์๋ scott.emp๋ผ๊ณ ๊ผญ ํด์ค์ผํจ~
--[13] ์ฌ์ฉ์ ๊ณ์ ์ ๊ฑฐ
> conn system/manager;
> drop user user03;
--[14] ๋กค(Role)
: ์ฌ์ฉ์์๊ฒ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๊ถํ์ ๋ถ์ฌํ ์ ์๋๋ก ์ฌ๋ฌ ๊ฐ์ ๊ถํ์ ๋ฌถ์ด ๋์ ๊ฒ.
: ์ฌ์ฉ์๋ฅผ ์์ฑํ์ผ๋ฉด ๊ทธ ์ฌ์ฉ์์๊ฒ ๊ฐ์ข
๊ถํ์ ๋ถ์ฌํด์ผ๋ง ์์ฑ๋ ์ฌ์ฉ์๊ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1) connect role
: ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์คํ
๊ถํ 8๊ฐ์ง๋ฅผ ๋ฌถ์ด ๋์ ๊ถํ
: alter session, create cluster, create database link, create sequence,
create session, create synonym, create table, create view
2) resource role
: ์ฌ์ฉ์ ๊ฐ์ฒด (ํ
์ด๋ธ, ๋ทฐ, ์ํ์ค)๋ฅผ ์์ฑํ ์ ์๋๋ก ์์คํ
๊ถํ์ ๋ฌถ์ด๋์ ๊ฒ
: create cluster, create procedure,
create sequence, create table, create trigger
3) DBA role
: ์ฌ์ฉ์๋ค์ด ์์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์๋ค์ด ์์ฑํ๊ณ ๋ณ๊ฒฝํ๊ณ
์ ๊ฑฐํ ์ ์๋๋ก ํ๋ ๋ชจ๋ ๊ถํ์ ๊ฐ์ง (๊ฐ๊ธ์ ๋ถ์ฌX)
> conn system/manager
> create user user03 identified by tiger;
> grant connect, resource to user03;
> conn user03/tiger;
> select * from dict
where table_name like '%ROLE%';
15. ์ธ๋ฑ์ค
*์ค๋ผํด - ์ธ๋ฑ์ค(Index)
- ์กฐํ๋ฅผ ๋น ๋ฅด๊ฒ(๋น ๋ฅธ ๊ฒ์) ํ๋๋ก ๋์์ค.
- sql ๋ช
๋ น๋ฌธ์ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด์ ์ปฌ๋ผ์ ์์ฑํ๋ ์ค๋ผํด ๊ฐ์ฒด.
- ์ฅ์
. ๊ฒ์ ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
. ์์คํ
์ ๊ฑธ๋ฆฌ๋ ๋ถํ๋ฅผ ์ค์ฌ์ ์์คํ
์ ์ฒด์ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ๋จ์
. ์ธ๋ฑ์ค๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ด ํ์ํ๋ค. (๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ์)
. ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
. ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ ์์
(DML : insert/ update/ delete)์ด ์์ฃผ ์ผ์ด๋ ๊ฒฝ์ฐ,
์คํ๋ ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
--[1] ์ธ๋ฑ์ค ์ ๋ณด ์กฐํ
> select index_name, table_name, column_name
from user_ind_columns
where table_name in ('EMP', 'DEPT'); #ํ
์ด๋ธ๋ช
์ ๋๋ฌธ์๋ก!
--[2] ์กฐํ ์๋ ๋น๊ตํ๊ธฐ
> drop table emp01;
> create table emp01 as select * from emp;
> select index_name, table_name, column_name
from user_ind_columns
where table_name in ('EMP', 'EMP01');
# emp ํ
์ด๋ธ์๋ empno ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ์ง๋ง
# emp๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ณต์ฌํ emp01 ํ
์ด๋ธ์๋ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ์ง ์์
# ->์๋ธ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ณต์ฌํ ํ
์ด๋ธ์ ๊ตฌ์กฐ์ ๋ด์ฉ๋ง ๋ณต์ฌ๋ ๋ฟ ์ ์ฝ์กฐ๊ฑด์
๋ณต์ฌ๋์ง ์๋๋ค.
> insert into emp01
select * from emp01;
# ๊ณ์ ์ถ๊ฐํด์ ๋ฐ์ดํฐ๋๋ฆฌ๊ธฐ~ 917504ํ ์ถ๊ฐ๊น์ง ใ
ใ
> insert into emp01(empno, ename)
values (8000, 'ANGEL');
> set timing on #์๊ฐ์ฌ๊ธฐ 00: 00: 00.18
> select empno, ename
from emp01
where ename = 'ANGEL';
--[3] ์ธ๋ฑ์ค ์์ฑ
: ๊ธฐ๋ณธํค(primary key)๋ ์ ์ผํค(unique key)๊ฐ ์๋ ์ปฌ๋ผ์ ๋ํด์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ ค๋ฉด
create index ๋ช
๋ น์ด ์ฌ์ฉ.
> create index idx_emp01_ename
on emp01(ename); #์ธ๋ฑ์ค ์์ฑํ๋๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆผ
> select index_name, table_name, column_name
from user_ind_columns
where table_name in ('EMP', 'EMP01'); #์ธ๋ฑ์ค ๋ง๋ค์ด์ง๊ฑธ ํ์ธํ ์ ์์
> select empno, ename
from emp01
where ename = 'ANGEL'; # 00: 00: 00.03
--[4] ์ธ๋ฑ์ค ์ ๊ฑฐ
> drop index idx_emp01_ename;
--[5] ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ํ๋จํ๊ธฐ
: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
+ ํ
์ด๋ธ์ ํ(๋ ์ฝ๋)์ ์๊ฐ ๋ง์ ๋
+ where๋ฌธ์ ํด๋น ์ปฌ๋ผ์ด ๋ง์ด ์ฌ์ฉ๋ ๋
+ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ ์ฒด ๋ฐ์ดํฐ์ 2~4% ์ ๋ ์ผ ๋
+ join์ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ด๋ null์ ํฌํจํ๋ ์ปฌ๋ผ์ด ๋ง์ ๊ฒฝ์ฐ
: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ ๊ฒฝ์ฐ
+ ํ
์ด๋ธ์ ํ(๋ ์ฝ๋)์ ์๊ฐ ์ ์ ๋
+ where๋ฌธ์ ํด๋น ์ปฌ๋ผ์ด ์์ฃผ ์ฌ์ฉ๋์ง ์์ ๋
+ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ ์ฒด ๋ฐ์ดํฐ์ 10~15% ์ด์ ์ผ ๋
+ ํ
์ด๋ธ์ DML ์์
์ด ๋ง์ ๊ฒฝ์ฐ(์
๋ ฅ ์์ ์ญ์ ๋ฑ์ด ์์ฃผ ์ผ์ด๋ ๋)
--[6] ์ธ๋ฑ์ค์ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ์ ์ธ๋ฑ์ค์ ์ฌ์์ฑ
> alter index idx_emp01_ename rebuild;
--[7] ์ธ๋ฑ์ค์ ์ข
๋ฅ
1. ๊ณ ์ ์ธ๋ฑ์ค(Unique Index)
: ๊ธฐ๋ณธํค๋ ์ ์ผํค์ฒ๋ผ ์ ์ผํ ๊ฐ์ ๊ฐ๋ ์ปฌ๋ผ์ ๋ํด์ ์์ฑํ๋ ์ธ๋ฑ์ค
> create unique index idx_dept01_deptno
on dept01(deptno);
2. ๋น๊ณ ์ ์ธ๋ฑ์ค(Nonunique Index)
: ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ์ปฌ๋ผ์ ๋ํด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ
> drop table dept01 (cascade constraint);
> create table dept01
as select * from dept;
> insert into dept01 values (10, '์ธ์ฌ๊ณผ', '์์ธ');
> insert into dept01 values (20, '์ด๋ฌด๊ณผ', '์์ธ');
> insert into dept01 values (30, '๊ฐ๋ฐ๋ถ', '๋์ ');
> create unique index idx_dept01_loc
on dept01(loc); #[err] ์ค๋ณต ํค๊ฐ ์์ต๋๋ค.
> create unique index idx_dept01_deptno
on dept01(deptno); #๊ฐ๋ฅ
3. ๋จ์ผ ์ธ๋ฑ์ค(Single Index)
: ํ ๊ฐ์ ์ปฌ๋ผ์ผ๋ก ๊ตฌ์ฑํ ์ธ๋ฑ์ค.
4. ๊ฒฐํฉ ์ธ๋ฑ์ค(Composite Index)
: ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ.
> create index idx_dept01_com
on dept01(deptno, dname);
5. ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค(Funtion Based Index)
> create index idx_emp01_annsal
on emp01(sal *12);
> select index_name, column_name
from user_ind_columns
where table_name = 'EMP01'
16. ์ ์ฅํ๋ก์์ ธ
*์ค๋ผํด - ์ ์ฅํ๋ก์์ (procedure)
-๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ(insert/ update/ delete)๋ค์ ํ์ํ ๋ ๋ง๋ค ๋ค์ ์
๋ ฅํ ํ์์์ด ๊ฐ๋จํ๊ฒ ํธ์ถ๋ง ํด์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์ ์คํ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ฌ ์ ์์
- ์ฑ๋ฅ๋ ํฅ์๋๊ณ , ํธํ์ฑ ๋ฌธ์ ๋ ํด๊ฒฐ
- ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต ํธ์ถํด์ ์ฌ์ฉํ ์ ์๋ ์ฅ์ .
> drop table emp01;
> create table emp01
as
select * from emp;
> ed proc01;
#๋ฉ๋ชจ์ฅ์ด ๋จ๋ฉด์ proc01.sqlํ์ผ์ด ๋ง๋ค์ด์ง
create or replace procedure DEL_ALL
is
begin
delete from emp01
end;
/
#sql์ต์ด ์ ์ ๊ฒฝ๋ก(C:\Users\user) ์ ํ์ผ ์์
> @proc01 #ํ๋ก์์ ์์ฑ
> execute del_all # ์คํ
> show error;
--[1] ์ ์ฅ ํ๋ก์์ ์กฐํํ๊ธฐ
> desc user_source;
> select name, text
from user_source
--[2] ์ ์ฅ ํ๋ก์์ ์ ๋งค๊ฐ๋ณ์
> ed proc02
create or replace procedure del_name(vename emp01.ename%type)
is
begin
delete from emp01 where ename = vename;
end;
/
> @proc02
> execute del_ename('SMITH');
--[3] IN, OUT, INOUT ๋งค๊ฐ๋ณ์
> ed proc03
create or replace procedure sel_empno
( vempno in emp.empno%type,
vename out emp.ename%type,
vsal out emp.sal%type,
vjob out emp.job%type
)
is
begin
select ename, sal, job
into vename, vsal, vjob
from emp where empno = vempno;
end;
/
> @proc03
> variable var_ename varchar2(15); # ๋ฐํ๋ฐ์์จ ๊ฐ๋ค์ ์ถ๋ ฅํ๊ธฐ ์ํ ๋ณ์
> variable var_sal varchar2(15);
> variable var_job varchar2(15);
> execute sel_empno(7788, :var_ename, :var_sal, :var_job);
> print var_ename;
> print var_sal;
> print var_job;
๋ฌธ์ ๋ค
[๋ฌธ์ 1] 10๋ฒ ๋ถ์ ์์์ ์ฌ์ ์ค์์ ์ปค๋ฏธ์
์ ๋ฐ๋ ์ฌ์์ ์๋ฅผ ๊ตฌํด๋ณด์์ค. ?
SQL > select count(*)
from emp
where nvl(comm, 0) > 0
and deptno = 10;
SQL > select count(*)
from emp
where nvl(comm, 0) <> 0
and deptno = 10;
[๋ฌธ์ 1-1] 30๋ฒ ๋ถ์ ์์์ ์ฌ์ ์ค์์ ์ปค๋ฏธ์
์ ๋ฐ๋ ์ฌ์์ ์๋ฅผ ๊ตฌํด๋ณด์์ค. ?
[๋ฌธ์ 2] ๊ฐ์ฅ ์ต๊ทผ์ ์
์ฌํ ์ฌ์์ ์
์ฌ์ผ๊ณผ ์
์ฌํ ์ง ๊ฐ์ฅ ์ค๋๋ ์ฌ์์ ์
์ฌ์ผ์ ์ถ๋ ฅํ๋
์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด ๋ณด์ธ์.
SQL > select min(hiredate), max(hiredate)
from emp;
SQL > select min(hiredate) "Old", max(hiredate) "New"
from emp;
//๋ณ์นญ ๋ถ์ด๊ธฐ. ํฐ๋ฐ์ดํ๋ฅผ ๋ถ์ด๋ฉด ์
๋ ฅ๋ด์ฉ ๊ทธ๋๋ก. ํฐ๋ฐ์ดํ ์์ผ๋ฉด ๊ฒฐ๊ณผ๋ ๋๋ฌธ์๋ก ์ถ๋ ฅ.
[๋ฌธ์ 3] SCOTT๊ณผ ๋์ผํ ๊ทผ๋ฌด์ง์์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ์ด๋ฆ์ ์ถ๋ ฅํ์ธ์.
SQL > select ename
from emp
where deptno = (
select deptno
from emp
where ename='SCOTT'
);
[๋ฌธ์ 4] ์ง๊ธ์ด 'SALESMAN'์ธ ์ฌ์์ด ๋ฐ๋ ๊ธ์ฌ๋ค์ ์ต์ ๊ธ์ฌ๋ณด๋ค ๋ง์ด ๋ฐ๋ ์ฌ์๋ค์
์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ถ์ ๋ฒํธ๊ฐ 20๋ฒ์ธ ์ฌ์์ ์ ์ธํ์ธ์. (๋ค์คํ ์ฐ์ฐ์ ์ด์ฉ)
SQL > select ename, sal, deptno
from emp
where sal > any(
select sal
from emp
where job = 'SALESMAN'
)
and deptno <> 20 ;
-๋จ์ผํ์๋ธ์ฟผ๋ฆฌ ์ด์ฉ
select ename, sal, deptno
from emp
where sal > (
select min(sal)
from emp
where job = 'SALESMAN'
)
and deptno <> 20 ;
[๋ฌธ์ 5] ์ง๊ธ์ด 'SALESMAN'์ธ ์ฌ์์ด ๋ฐ๋ ๊ธ์ฌ๋ค์ ์ต๋ ๊ธ์ฌ๋ณด๋ค ๋ง์ด ๋ฐ๋ ์ฌ์๋ค์
์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ถ์๋ฒํธ๊ฐ 10๋ฒ์ธ ์ฌ์์ ์ ์ธํ์ธ์. (๋ค์คํ ์ฐ์ฐ์ ์ด์ฉ)
SQL > select ename, sal
from emp
where sal > all (
select sal
from emp
where job = 'SALESMAN'
)
and deptno <> 10 ;
[๋ฌธ์ 6] ์ฌ์ํ
์ด๋ธ(emp)๊ณผ ๋ถ์ ํ
์ด๋ธ(dept)์ joinํ์ฌ ์ฌ์ ์ด๋ฆ, ๋ถ์๋ฒํธ, ๋ถ์๋ช
์ ์ถ๋ ฅํ์ธ์.
๋จ, 40๋ฒ ๋ถ์์ ๋ถ์ ์ด๋ฆ๋ ์ถ๋ ฅ๋๋๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ์ธ์. ????????????
SQL > select emp.ename, dept.deptno, dept.dname
from emp, dept
where emp.deptno(+) = dept.deptno ;
//Ansiํ์ค ? ??????????????????????????
select ename, emp.deptno, dname
from emp full outer join dept
on emp.deptno = dept.deptno;
[๋ฌธ์ 7] ๋ด์์์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ์ธ์. (join ์ด์ฉ)
//์ค๋ผํด ์ด๊ธฐ ์
๋ ฅ๋ฐฉ๋ฒ?
SQL > select ename, sal
from emp, dept
where emp.deptno = dept.deptno
and dept.loc = 'NEW YORK';
//ANSI ํ์ค
SQL > select ename, sal
from emp inner join dept
on emp.deptno = dept.deptno
where dept.loc = 'NEW YORK' ;
[๋ฌธ์ 1] ๊ธฐ๋ณธํ
์ด๋ธ์ EMP_COPY๋ก ํฉ๋๋ค. 20๋ฒ ๋ถ์์ ์์๋ ์ฌ์๋ค์ ์ฌ๋ฒ๊ณผ ์ด๋ฆ, ๋ถ์๋ฒํธ์ ์๊ด์ ์ฌ๋ฒ์
์ถ๋ ฅํ๊ธฐ ์ํ select๋ฌธ์ emp_view20์ด๋ผ๋ ์ด๋ฆ์ ๋ทฐ๋ก ์ ์ํด ๋ณด์ธ์.
create or replace view emp_view20
as
select empno, ename, deptno, mgr
from emp_copy;
select * from emp_view20;
[๋ฌธ์ 2] ๊ฐ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ์ ์ต์ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ทฐ๋ฅผ sal_view ๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑํ์ธ์.
create or replace view sal_view
as
select max(sal) "์ต๋ ๊ธ์ฌ", min(sal) "์ต์ ๊ธ์ฌ", deptno
from emp_copy
group by deptno;
select * from sal_view;
[๋ฌธ์ 3] ์ธ๋ผ์ธ๋ทฐ๋ฅผ ์ด์ฉํ์ฌ ๊ธ์ฌ๋ฅผ ๋ง์ด ๋ฐ๋ ์์๋๋ก 3๋ช
๋ง ์ถ๋ ฅํ๋ ๋ทฐ(sal_top3_view)๋ฅผ ์์ฑํ์ธ์.
select rownum, empno, ename, sal
from (select rownum, empno, ename, sal
from emp_copy
order by nvl(sal, 0) desc)
where rownum <= 3;
---------------------------------------------------
create or replace view sal_top3_view
as
select rownum as "์์", empno, ename, sal
from (select empno, ename, sal
from emp_copy
where sal is not null
order by sal desc
)
where rownum <=3;
[๋ฌธ์ 4] acorn/tiger ๊ณ์ ์ ์์ฑํด์ ์๋ฒ/์ฌ์๋ฒํธ/์ด๋ฆ/์ง์
/๊ทผ๋ฌด๋ถ์(์ปฌ๋ผ)์ ํญ๋ชฉ์ ๊ฐ๋ ํ
์ด๋ธ์ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ
์ ์ฅํ๋ ์๋ฒ ๋ฐ์ดํฐ ์
๋ ฅ์ sequence๋ฅผ ์ด์ฉํ์ฌ ์ ์ฅํ๊ณ , view_acorn ๋ทฐ๋ฅผ ์์ฑํด์ ์๋ฒ/์ฌ์๋ฒํธ/์ด๋ฆ๋ง
์ถ๋ ฅํ ์ ์๋๋ก ๋ง๋ค์ด๋ณด์ธ์.
conn system/manager;
create user acorn identified by tiger;
grant connect, resource to acorn;
grant create view to acorn;
conn acorn/tiger;
create table acorn_emp(
num number(2),
empno number(4),
ename varchar2(20),
job varchar2(20),
deptno number(2)
);
create sequence acorn_seq
start with 1 increment by 1;
insert into acorn_emp
values (acorn_seq.nextval, 1111, 'SMITH', 'MANAGER', 10);
insert into acorn_emp
values (acorn_seq.nextval, 2222, 'JONES', 'SALESMAN', 20);
insert into acorn_emp
values (acorn_seq.nextval, 3333, 'TOM', 'PRESIDENT', 30);
create or replace view view_acorn
as
select num, empno, ename
from acorn_emp;
select * from view_acorn;
----------------------------------
conn system/manger;
create user acorn identified by tiger;
grant create session, create table, create sequence, create view to acron;
alter user acorn quota 2m on users;
conn acorn/tiger;
create table emp01 (
no number(2) primary key,
empno number(4) not null,
ename varchar2(10) not null,
job varchar2(10),
deptno number(2)
);
create sequence emp01_seq
start with 1 increment by 1;
insert into emp01
values (emp01_seq.nextval, 7000, 'SMITH', 'SALES', 20);
insert into acorn_emp
values (acorn_seq.nextval, 2222, 'JONES', 'SALESMAN', 20);
create or replace view view_acorn
as
select no, empno, ename
from acorn_emp;
'โ๏ธ ์ด๋ก > ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค/์ฟผ๋ฆฌ๋ฌธ ์ฐ์ต] SUM, MAX, MIN (0) | 2019.12.01 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค/์ฟผ๋ฆฌ๋ฌธ ์ฐ์ต] SELECT (0) | 2019.12.01 |
[๋งํฌ] HTTP ์๋ฒ ์๋ต ์ฝ๋ (Response Code) ์ ๋ฆฌ_1 (0) | 2019.11.22 |
[Mysql/๊ฐ์ข] SQL Full Tutorial Course using MySQL Database (0) | 2019.11.21 |
[๋งํฌ/์นดํ24/์๊ฒฉ๋ฐ์คํฌํฑ์ฐ๊ฒฐ] ์๋์ฐ ์๋ฒ ์ ์ํ๊ธฐ ๊ฐ์ด๋ (0) | 2019.11.21 |