[Day13] Oracle 13 - ์ ๊ทํ, ์ด์ํ์, ๋ทฐ, ์ํ์ค
[Day13] Oracle13 [10/14]
๋ฆด๋ ์ด์
= ํ
์ด๋ธ ํํ = ๋ ์ฝ๋(ํ) ์์ฑ = ์ปฌ๋ผ |
์ ๊ทํ
- ์ด์ํ์(์ฝ์
,๊ฐฑ์ ,์ญ์ ), ํจ์ ์ข
์์ฑ ( X->Y ), 1NF~ 5NF
- ERD->๊ด๊ณ์คํค๋ง ์์ฑ ํ ์ข
์์ฑ ์ด๋ก ์ ์ด์ฉํด์ ์๋ชป๋ ์ค๊ณ๋ ๊ด๊ณ ์คํค๋ง๋ฅผ ๋ ์์ ์์ฑ์ ๋ฐ๋์งํ ์คํค๋ง๋ก ๋ง๋ค์ด ๊ฐ๋ ๊ณผ์ ์ ์ ๊ทํ ๋ผ๊ณ ํ๋ค.
- DB ์ค๊ณ ๋ฌธ์ ์ ( ๋ฐ์ดํฐ ์ค๋ณต )์ด ์์ ๊ฒฝ์ฐ ์ฝ์
,๊ฐฑ์ ,์ญ์ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ "์ด์ํ์"์ด๋ผ๊ณ ํ๋ค. ์ด๋ฐ ์ด์ํ์์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ๊ทํ๋ผ๊ณ ํ๋ค.
๋ฐ์ดํฐ ์ค๋ณต ์ ๊ฑฐ ๊ณผ์ (์์
) == ์ ๊ทํ
ํจ์์ ์ข
์์ฑ(FD;Functional Dependency)
- ์ ๊ทํ ํ ์ด๋ธ์ ์์ฑ๋ค๊ฐ์ ๊ด๋ จ์ฑ
DEPT(๋ถ์ํ
์ด๋ธ) PK ๊ฒฐ์ ์ ์ข ์์ X Y [deptno] dname loc 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON |
* Y ์์ฑ์ X ์์ฑ์ ํจ์์ ์ข
์์ ์ด๋ค.
* X -> Y
1) ์์ ํจ์์ ์ข
์
- ์ด๋ค ๋ฆด๋ ์ด์
R์์ ์์ฑA๊ฐ ์์ฑ ์งํฉ์ผ ๋, ์์ฑ B๊ฐ ์์ฑA์ ํจ์์ ์ข
์ํ๋ฉด์, ์์ฑ A์ ์ด๋ค ์ง๋ถ๋ถ ์งํฉ์๋ ํจ์์ ์ผ๋ก ์ข
์ํ์ง ์์ผ๋ฉฐ, ์์ฑ B๊ฐ ์์ฑ A์ ์์ ํ๊ฒ ํจ์์ ์ผ๋ก ์ข
์ํ๋ค.
- ์ฌ๋ฌ ๊ฐ์ ์์ฑ์ด ๋ชจ์ฌ์ ํ๋์ ๊ธฐ๋ณธํค๋ฅผ ์ด๋ฃฐ ๊ฒฝ์ฐ ( ๋ณตํฉํค ) ๋ณตํฉํค ์ ์ฒด์ ์ด๋ค ์์ฑ์ด ์ข
์์ ์ผ ๋ "์์ ํจ์์ ์ข
์"์ด๋ผ ํ๋ค.
๋ณตํฉํค [๊ณ ๊ฐID] [์ด๋ฒคํธID] A B C kenik E001 [ X + Y ] -> A [ X + Y ] -> B [ X + Y ] -> C |
2) ๋ถ๋ถ ํจ์์ ์ข
์
- ์์ ํจ์์ ์ข
์์ด ์๋๋ฉด ๋ถ๋ถ ํจ์์ ์ข
์์ด๋ค.
๋ณตํฉํค [๊ณ ๊ฐID] [์ด๋ฒคํธID] ํฉ๊ฒฉ์ฌ๋ถ ๋ฑ๊ธ kenik E001 Y gold ๋ณตํฉํค -> ํฉ๊ฒฉ์ฌ๋ถ O ๋ณตํฉํค -> ๋ฑ๊ธ X ๊ณ ๊ฐID -> ๋ฑ๊ธ O |
3) ์ดํ ํจ์์ ์ข
์
X->Y, Y->Z
๊ฒฐ์ ์
dept ํ
์ด๋ธ ๊ฒฐ์ ์ PK X -> Y Y -> Z [deptno] dname ๋ถ์์ฅ ๋ถ์์ฅ์ฑ๋ณ ๋ถ์๋ฒํธ ๋ถ์๋ช ํ๊ธธ๋ ๋จ์ |
-- ์ ๊ทํ --
์๋ถ์ด๊ฒฐ๋ค์กฐ
1 : ์์๊ฐ์ด ์๋ ๋๋ฉ์ธ ๋ถํด 2 : ๋ถ๋ถํจ์ ์ข ์์ฑ ์ ๊ฑฐ 3 : ์ดํํจ์ ์ข ์์ฑ ์ ๊ฑฐ 4 : ๊ฒฐ์ ์์ด๋ฉด์ ํ๋ณดํค ์๋ ๊ฒ ์ ๊ณ 5 : ๋ค์น์ข ์ ์ ๊ฑฐ 6 : ์กฐ์ธ ์ข ์์ฑ ์ด์ฉ |
1) ์ 1์ ๊ทํ( NOrmal Form ) 1NF
- ๋ฆด๋ ์ด์
์ ์ํ ๋ชจ๋ ์์ฑ์ ๋๋ฉ์ธ์ด ์์ ๊ฐ(atomic value)์ผ๋ก๋ง ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ 1์ ๊ทํ์ ์ํ๋ค.
deptno dname loc 10 ์ด๋ฌด๋ถ l_id(FK) 1 20 ์์ ๋ถ 2 30 ์์ฐ๋ถ 1 40 ์์ฌ๋ถ 2 : [๋ถ์์ง์ญ ํ ์ด๋ธ] PK l_id 1 ์์ธ ... ... 2 ๋ถ์ฐ 3 ๋๊ตฌ |
2) ์ 2์ ๊ทํ (2NF)
- ๋ฆด๋ ์ด์
์ด ์ 1์ ๊ทํ์ ์ํ๊ณ , ๊ธฐ๋ณธํค๊ฐ ์๋ ๋ชจ๋ ์์ฑ์ด ๊ธฐ๋ณธํค์ ์์ ํจ์ ์ข
์๋๋ฉด ์ 2์ ๊ทํ์ ์ํ๋ค.
- ๋ถ๋ถ ํจ์์ ์ข
์ -> ์ ๊ฑฐ
๋ณตํฉํค [๊ณ ๊ฐID + ์ด๋ฒคํธID ] ๋น์ฒจ์ฌ๋ถ ๊ณ ๊ฐ๋ช ๊ณ ๊ฐ๋ฑ๊ธ |
->
์ด๋ฒคํธ ํ
์ด๋ธ E001 ๋ ธํธ๋ถ 30% ์์์ผ ์ข ๋ฃ์ผ ... E002 ๋ ธํธ๋ถ 20% E003 ํฐ 50% E001 ๋ ธํธ๋ถ 30% |
์ด๋ฒคํธ <์ ์ฒญ> ์ ์ฒญ๋ฒํธ(PK) ๊ณ ๊ฐID ์ด๋ฒคํธID ์ ์ฒญ์ผ ๋น์ฒจ์ฌ๋ถ 1 ๊ณ ๊ฐ1 E001 22.1.1 Y |
๊ณ ๊ฐํ
์ด๋ธ ๊ณ ๊ฐID ๊ณ ๊ฐ๋ช ๊ณ ๊ฐ๋ฑ๊ธ ๊ณ ๊ฐ1 |
3)์ 3์ ๊ทํ( 3NF )
- ๋ฆด๋ ์ด์
์ด ์ 2์ ๊ทํ์ ์ํ๊ณ , ๊ธฐ๋ณธํค๊ฐ ์๋ ๋ชจ๋ ์์ฑ์ด ๊ธฐ๋ณธํค์ [์ดํ์ ํจ์ ์ข
์]์ด ๋์ง ์์ผ๋ฉด ์ 3์ ๊ทํ์ ์ํ๋ค.
- ์ดํ์ ํจ์ ์ข
์ -> ์ ๊ฑฐ
PK X -> Y X -> Z Y -> T deptno ๋ถ์์ฅ ๋ถ์๋ช ๋ถ์์ฅ์ฐ๋ฝ์ฒ X->Y, Y->Z |
->
๋ถ์ํ
์ด๋ธ ๋ถ์๋ฒํธ ๋ถ์์ฅ์ฌ์์ฝ๋(FK) ๋ถ์๋ช |
์ฌ์ํ
์ด๋ธ ์ฌ์์ฝ๋(PK) ์ฌ์๋ช ์ง๊ธ๋ช ์ฐ๋ฝ์ฒ |
4) ๋ณด์ด์ค/์ฝ๋ ์ ๊ทํ( BCNF )
๋ฆด๋ ์ด์
์ ํจ์ ์ข
์ ๊ด๊ณ์์ ๋ชจ๋ ๊ฒฐ์ ์(๋ณตํฉํค)๊ฐ ํ๋ณดํค์ด๋ฉด ๋ณด์ด์ค/์ฝ๋ ์ ๊ทํ์ ์ํ๋ค.
๋ณตํฉํค
[๊ณ ๊ฐ์์ด๋ ์ธํฐ๋ท๊ฐ์ข] ๋ด๋น๊ฐ์ฌ๋ฒํธ [ X Y ] -> Z ์์ ํจ์ ์ข ์ Y <- Z |
ํ
์ด๋ธ [ X Z ]
ํ
์ด๋ธ [Z] Y
* ์ 3์ ๊ทํ๋ฅผ ๋ง์กฑํ๋ฉด BCNF ์ ๊ทํ ๊ฑฐ์ ์๋ค. X
* ๋ฌผ๋ฆฌ์ dB ๋ชจ๋ธ๋ง
- ์ญ์ ๊ทํ - ์ฑ๋ฅ
* EXERD DB ๋ชจ๋ธ๋ง -> ์ค๋ผํด DB ์๋ฒ ( ์คํค๋ง ์์ฑ )
* ์์
, ๋ฉ๋ชจ์ฅ -> INSERT ์๋
๋ทฐ( View )
1. ํ
์ด๋ธ์ ๋ณด๊ธฐ ์ํ ์ฐฝ๋ฌธ ์ ๋๋ก ์๊ฐ.
2. ๊ฐ์ํ
์ด๋ธ = 1๊ฐ ์ด์์ ํ
์ด๋ธ ๋๋ ๋ทฐ๋ฅผ ์ด์ฉํด์ ์์ฑ๋๋ค.
3. ๋ทฐ๋ "๋ฐ์ดํฐ ์ฌ์ "์ ์ ์ ๋ถ๋ถ๋ง ์ ์ฅ๋๊ณ , ์ค์ ๋ฐ์ดํฐ๋ ์ ์ฅ X
4. ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์ (์ด์ )
1) ๋ณด์
2) ํธ๋ฆฌ์ฑ
5. ๋ทฐ - SELECT, INSERT, UPDATE, DELETE ๊ฐ๋ฅ
6. ์ ์ฝ ์กฐ๊ฑด ์ค์ ๊ฐ๋ฅ
7. user_views : ๋ทฐ ์กฐํ.
user_tables : ํ
์ด๋ธ ์ ๋ณด ์กฐํ
SELECT *
FROM user_views;
8. ๋ทฐ ์ข
๋ฅ
1) ๋จ์๋ทฐ ( simple view ) - 1 ๊ฐ
2) ๋ณตํฉ๋ทฐ ( complex view ) - 2๊ฐ ์ด์.~
9. ๋ทฐ ์์ฑ ํ์
ใํ์ใ
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW ๋ทฐ์ด๋ฆ
[(alias[,alias]...]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY];
OR REPLACE : ๊ฐ์ ์ด๋ฆ์ ๋ทฐ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฌด์ํ๊ณ ๋ค์ ์์ฑ FORCE : ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ ๋ฌด์ ์๊ด์์ด ๋ทฐ๋ฅผ ์์ฑ NOFORCE : ๊ธฐ๋ณธ ํ ์ด๋ธ์ด ์์ ๋๋ง ๋ทฐ๋ฅผ ์์ฑ ALIAS : ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด๋ฆ๊ณผ ๋ค๋ฅด๊ฒ ์ง์ ํ ๋ทฐ์ ์ปฌ๋ผ๋ช ๋ถ์ฌ WITH CHECK OPTION : ๋ทฐ์ ์ํด access๋ ์ ์๋ ํ(row)๋ง์ด ์ฝ์ , ์์ ๊ฐ๋ฅ WITH READ ONLY : DML ์์ ์ ์ ํ(๋จ์ง ์ฝ๋ ๊ฒ๋ง ๊ฐ๋ฅ) |
์) ํ๋งค๋ ํ์ธ - ์ฟผ๋ฆฌ
SELECT b.b_id, title, price, g.g_id, g_name, p_date, p_su
FROM book b JOIN danga d ON b.b_id = d.b_id
JOIN panmai p ON b.b_id = p.b_id
JOIN gogaek g ON p.g_id = g.g_id;
-- ๋ทฐ ์์ฑ
GRANT CREATE VIEW TO scott;
CREATE OR REPLACE FORCE VIEW panView
( bookid, booktitle, bookprice, gogaekid, gogaekname, pdate, psu )
AS (
SELECT b.b_id , title, price, g.g_id, g_name, p_date, p_su
FROM book b JOIN danga d ON b.b_id = d.b_id
JOIN panmai p ON b.b_id = p.b_id
JOIN gogaek g ON p.g_id = g.g_id
);
-- ๋ทฐ๋ฅผ ์ฌ์ฉํด์ ์ ์ฒด ํ๋งค ๊ธ์ก
SELECT SUM( psu * BOOKPRICE ) ์ ์ฒดํ๋งค๊ธ์ก
FROM panview;
-- ๋ทฐ ์์ฑ : gogaekview
-- ๋
๋, ์, ๊ณ ๊ฐ์ฝ๋, ๊ณ ๊ฐ๋ช
, ํ๋งค๊ธ์ก์ดํฉ ( ๋
๋๋ณ ์๋ณ ) ์กฐํ
-- panmai : p_date ( year, month ) , p_su
-- gogaek : g_id, gname
-- danga : price
-- ORA-00979: not a GROUP BY expression
-- ORA-00907: missing right parenthesis
CREATE OR REPLACE FORCE VIEW gogaekview
-- [alias,,,,]
AS
SELECT
-- p_date
TO_CHAR( p_date, 'YYYY') year
, TO_CHAR( p_date, 'MM') month
, g.g_id, g_name
, SUM( p_su * price ) amt
FROM panmai p JOIN gogaek g ON p.g_id = g.g_id
JOIN danga d ON d.b_id = p.b_id
GROUP BY TO_CHAR( p_date, 'YYYY')
, TO_CHAR( p_date, 'MM'), g.g_id, g_name
ORDER BY year
, month
-- ๋ทฐ๋ฅผ ์ฌ์ฉํด์ DML ์์
--
CREATE TABLE tbl_view1(
aid number primary key
, name varchar2(20) not null
, tel varchar2(20) not null
, memo varchar2(100)
)
-- Table TBL_VIEW1์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
CREATE TABLE tbl_view2(
bid number primary key
, aid number CONSTRAINT FK_tblview2_aid
REFERENCES tbl_view1(aid) ON DELETE CASCADE -- FK
, score number(3)
)
INSERT INTO tbl_view1 (aid, NAME, tel) VALUES (1, 'a', '1');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (2, 'b', '2');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (3, 'c', '3');
INSERT INTO tbl_view1 (aid, name, tel) VALUES (4, 'd', '4');
INSERT INTO tbl_view2 (bid, aid, score) VALUES (1, 1, 80);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (2, 2, 70);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (3, 3, 90);
INSERT INTO tbl_view2 (bid, aid, score) VALUES (4, 4, 100);
COMMIT;
-- ๋จ์๋ทฐ : 1๊ฐ ํ
์ด๋ธ
CREATE OR REPLACE VIEW aView
AS
-- SELECT aid, name, memo -- , tel varchar2(20) not null X
SELECT aid, name,tel
FROM tbl_view1;
-- ๋ทฐ๋ฅผ ์ฌ์ฉํด์ DML ์์
INSERT INTO AVIEW (aid, name, memo ) VALUES ( 5, 'f', null );
-- ORA-01400: cannot insert NULL into ("SCOTT"."TBL_VIEW1"."TEL")
-- ์? -> tbl_view1์ NOT NULL ์กฐ๊ฑด์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์
INSERT INTO AVIEW (aid, name, tel ) VALUES ( 5, 'f', '5' );
--๋ทฐ : 1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
-- ๋จ์๋ทฐ
-- ๋ณตํฉ๋ทฐ
CREATE OR REplace VIEW abview
AS
SELECT a.aid, name, tel, bid, score
FROM tbl_view1 a JOIN tbl_view2 b ON a.aid = b.aid
WITH READ ONLY; -- SELECT ์กฐํ๋ง ํ๊ฒ ๋ค, I/U/D X ์ฝ๊ธฐ ์ ์ฉ
-- View ABVIEW์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
SELECT *
FROM abview;
-- ๋ทฐ ์ญ์
DROP TABLE
DROP VIEW aview;
DROP VIEW abview;
-- View ABVIEW์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
[ WITH CHECK OPTION ]
- ๋ทฐ์ ์ํด access๋ ์ ์๋ ํ(row)๋ง์ด ์ฝ์
, ์์ ๊ฐ๋ฅ
SELECT *
FROM tbl_view2;
bid aid score 1 1 80 2 2 70 3 3 90 4 4 100 |
CREATE OR REPLACE VIEW bview
AS
SELECT bid, aid, score
FROM tbl_view2
WHERE score >= 90;
UPDATE bview
SET score = 70
WHErE bid = 3;
VS
CREATE OR REPLACE VIEW bview
AS
SELECT bid, aid, score
FROM tbl_view2
WHERE score >= 90
WITH CHECK OPTION CONSTRAINT CK_BVIEW;
UPDATE bview
--SET score = 70 -- UPDATE X
SET score = 170 -- UPDATE O
WHERE bid = 3; -- 90
-- ORA-01402: view WITH CHECK OPTION where-clause violation
INSERT INTO bview ( bid, aid, score) VALUES ( 5, 4, 10);
-- ORA-01402: view WITH CHECK OPTION where-clause violation
INSERT INTO bview ( bid, aid, score) VALUES ( 5, 4, 110);
--1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
๋ทฐ ์ฌ์ฉ์ด์ ? -- ์์ฃผ ์ฌ์ฉ๋๋ ๊ธด ์ฟผ๋ฆฌ( SELECT ) -> ๋ทฐ ์์ฑ , ๋ณด์, ํธ๋ฆฌ์ฑ |
[์ํ์ค SEQUENCE ]

SELECT *
FROM dept;
deptno ๋ถ์๋ฒํธ ์๋ ์ค์ ..
INSERT INTO dept VALUES ( 50, OPERATIONS BOSTON );
INSERT INTO dept VALUES ( 60, OPERATIONS BOSTON );
INSERT INTO dept VALUES ( 70, OPERATIONS BOSTON );
ex) ์ํ ์
๋ฌด ์ฒ๋ฆฌ ์ ์ผ ๋จผ์ ํด์ผ ๋ ์ผ ? ์์ - ๋ฒํธํ ๋ฝ์์. ์ํ์ค == [์ํ ๋ฒํธ ์ฅ์น] ์ฒญ์๊ฒฝ์ฐฐ 10๊ฐฏ์ -> chache / ์บ์๊ธฐ๋ฅ (์ฑ๋ฅ ๋์ผ ์ ์์) |
ใํ์ใ
CREATE SEQUENCE ์ํ์ค๋ช
[ INCREMENT BY ์ ์] 1
[ START WITH ์ ์] 1
[ MAXVALUE n ยฆ NOMAXVALUE] 100
[ MINVALUE n ยฆ NOMINVALUE] 5
[ CYCLE ยฆ NOCYCLE]
[ CACHE n ยฆ NOCACHE];
-- ์ํ์ค
CREATE SEQUENCE seq_dept
INCREMENT BY 10
START WITH 50
MAXVALUE 90
NOCYCLE
NOCACHE;
-- Sequence SEQ_DEPT์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
INSERT INTO dept VALUES ( seq_dept.nextval , 'QC', 'SEOUL' );
SELECT seq_dept.currval
From dual;
INSERT INTO dept VALUES ( seq_dept.nextval , 'XX', 'SEOUL' );
COMMIT;
CREATE SEQUENCE
ALTER SEQUENCE
DROP SEQUENCE seq_dept;