[Day10] Oracle 10 [10/11]
--1. ์ค๋ผํด ๊ฐ DataType ์ ๋ํด ์์ธํ ์ค๋ช
ํ์ธ์
ใฑ. ๋ฌธ์,๋ฌธ์์ด ''
ใด ๊ณ ์ ๊ธธ์ด char,[n]char 2000 byte
ใด ๊ฐ๋ณ๊ธธ์ด varchar2(== varchar ์๋
ธ๋), nvarchar2 4000byte
Long 2GB
ใด. LOB
ใด CLOB
ใด BLOB
ใด NCLOB
ใท. ์ซ์
ใด ์ ์ NUMBER( p, 0) == NUMBER( p )
ใด ์ค์ NUMBER( p, s )
p 38, s 127
NUMBER == NUMBER( 38, 127 )
FLOAT = ์ค์ NUMBER
ใน. ๋ ์ง
ใด Date ๋ ์ง + ์/๋ถ/์ด
ใด TIMESTAMP(n=6) ms, ns
๋ฑ๋ฑ
--2. emp ํ
์ด๋ธ์์ [๋
๋๋ณ] [์๋ณ] ์
์ฌ์ฌ์์ ์ถ๋ ฅ.( PIVOT() ํจ์ ์ฌ์ฉ )
--
-- [์คํ๊ฒฐ๊ณผ]
-- 1982 1 0 0 0 0 0 0 0 0 0 0 0
-- 1980 0 0 0 0 0 0 0 0 0 0 0 1
-- 1981 0 2 0 1 1 1 0 0 2 0 1 2
ใฑ. ํผ๋ด๋์
SELECT EXTRACT( YEAR FROM hiredate) hiredate_year
, EXTRACT( MONTH FROM hiredate) hiredate_month
FROM emp;
ใด.
SELECT *
FROM (
SELECT EXTRACT( YEAR FROM hiredate) hiredate_year
, EXTRACT( MONTH FROM hiredate) hiredate_month
FROM emp
)
PIVOT( COUNT(*) FOR hiredate_month IN ( 1,2,3,4,5,6,7,8,9,10,11,12 ) );
--2-2. emp ํ
์ด๋ธ์์ ๊ฐ JOB๋ณ ์
์ฌ๋
๋๋ณ 1์~ 12์ ์
์ฌ์ธ์์ ์ถ๋ ฅ. ( PIVOT() ํจ์ ์ฌ์ฉ )
-- [์คํ๊ฒฐ๊ณผ]
-- ANALYST 1981 0 0 0 0 0 0 0 0 0 0 0 1
-- CLERK 1980 0 0 0 0 0 0 0 0 0 0 0 1
-- CLERK 1981 0 0 0 0 0 0 0 0 0 0 0 1
-- CLERK 1982 1 0 0 0 0 0 0 0 0 0 0 0
-- MANAGER 1981 0 0 0 1 1 1 0 0 0 0 0 0
-- PRESIDENT 1981 0 0 0 0 0 0 0 0 0 0 1 0
-- SALESMAN 1981 0 2 0 0 0 0 0 0
--
SELECT *
FROM (
SELECT job
, EXTRACT( YEAR FROM hiredate) hiredate_year
, EXTRACT( MONTH FROM hiredate) hiredate_month
FROM emp
)
PIVOT( COUNT(*) FOR hiredate_month IN ( 1,2,3,4,5,6,7,8,9,10,11,12 ) )
ORDER BY job ASC;
--3. empํ
์ด๋ธ์์ ์
์ฌ์ผ์๊ฐ ์ค๋๋ ์์ผ๋ก 3๋ช
์ถ๋ ฅ ( TOP 3 )
-- [์คํ๊ฒฐ๊ณผ]
-- 1 7369 SMITH CLERK 7902 80/12/17 800 20
-- 2 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
-- 3 7521 WARD SALESMAN 7698 81/02/22 1250 500 30
ใฑ. TOP-N ๋ฐฉ์
1) ์
์ฌ์ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์๋ธ์ฟผ๋ฆฌ
2) ROWNUM ์์ฌ์ปฌ๋ผ
SELECT ROWNUM seq, t.*
FROM (
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
FROM emp
ORDER BY hiredate ASC
) t
WHERE ROWNUM <=3;
ใด. RANK ํจ์
WITH
temp AS (
SELECT emp.*
, RANK() OVER( ORDER BY hiredate ASC ) seq
FROM emp
)
SELECT *
FROM temp
WHERE seq <= 3;
--4. SMS ์ธ์ฆ๋ฒํธ ์์์ 6์๋ฆฌ ์ซ์ ์ถ๋ ฅ ( dbms_random ํจํค์ง ์ฌ์ฉ )
SELECT dbms_random.value
, dbms_random.value(100000, 1000000)
FROM dual;
--4-2. ์์์ ๋์๋ฌธ์ 5๊ธ์ ์ถ๋ ฅ( dbms_random ํจํค์ง ์ฌ์ฉ )
SELECT dbms_random.string('A',5)
FROM dual;
--5. ๊ฒ์๊ธ์ ์ ์ฅํ๋ ํ
์ด๋ธ ์์ฑ
-- ใฑ. ํ
์ด๋ธ๋ช
: tbl_test
-- ใด. ์ปฌ๋ผ
-- ๊ธ๋ฒํธ seq ์๋ฃํ ํฌ๊ธฐ ๋ํ์ฉ์ฌ๋ถ ๊ณ ์ ํค
-- ์์ฑ์ writer
-- ๋น๋ฐ๋ฒํธ passwd
-- ๊ธ์ ๋ชฉ title
-- ๊ธ๋ด์ฉ content
-- ์์ฑ์ผ regdate
-- ใท. ๊ธ๋ฒํธ, ์์ฑ์, ๋น๋ฐ๋ฒํธ, ๊ธ ์ ๋ชฉ์ ํ์ ์
๋ ฅ ์ฌํญ์ผ๋ก ์ง์
-- ใน. ๊ธ๋ฒํธ๊ฐ ๊ธฐ๋ณธํค( PK )๋ก ์ง์ : PK_TABLE_COLUMN
-- ใ
. ์์ฑ์ผ์ ํ์ฌ ์์คํ
์ ๋ ์ง๋ก ์๋ ์ค์
CREATE TABLE tbl_test(
seq NUMBER(38) NOT NULL CONSTRAINT PK_TBLTEST_SEQ PRIMARY KEY -- SYS_????
, writer NVARCHAR2(10) NOT NULL
, passwd VARCHAR2(15) NOT NULL
, title NVARCHAR2(30) NOT NULL
, content NCLOB
, regdate DATE DEFAULT SYSDATE
);
-- Table TBL_TEST์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
--5-2. ์กฐํ์ read ์ปฌ๋ผ์ ์ถ๊ฐ ( ๊ธฐ๋ณธ๊ฐ 0 ์ผ๋ก ์ค์ )
ALTER TABLE TBL_TEST
ADD read NUMBER DEFAULT 0; -- ํ๊ฐ์ ์ปฌ๋ผ ์ถ๊ฐํ ๋๋ () ๊ดํธ ์๋ต ๊ฐ๋ฅ
ADD ();
-- Table TBL_TEST์ด(๊ฐ) ๋ณ๊ฒฝ๋์์ต๋๋ค.
--5-3. ํ
์ด๋ธ ๊ตฌ์กฐ ํ์ธ
DESC TBL_TEST;
--5-4. CRUD ( insert, select, update, delete )
-- ใฑ. ์์์ ๊ฒ์๊ธ 5๊ฐ๋ฅผ ์ถ๊ฐ insert
INSERT INTO TBL_TEST (SEQ, WRITER,PASSWD,TITLE, CONTENT ) VALUES (1, '๊ด๋ฆฌ์', '1234$', 'test-1', 'test-1');
-- 1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
-- 00947. 00000 - "not enough values"
INSERT INTO TBL_TEST VALUES (2, 'ํ๊ธธ๋', '1234$', 'test-2', 'test-2', SYSDATE, 0);
--1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
-- SQL ์ค๋ฅ: ORA-00913: too many values
INSERT INTO TBL_TEST (SEQ, WRITER,PASSWD,TITLE ) VALUES (3, '๊น๊ธฐ์', '1234$', 'test-3' );
COMMIT;
-- ์ปค๋ฐ ์๋ฃ.
-- ใด. ๊ฒ์๊ธ ์กฐํ select
SELECT *
FROM tbl_test;
-- ใท. 3๋ฒ ๊ฒ์๊ธ์ ๊ธ ์ ๋ชฉ, ๋ด์ฉ ์์ update
-- ORA-01722: invalid number
UPDATE tbl_test
SET title = '[e]' || title , content = 'edit content'
wHERE seq = 3;
-- ใน. 4๋ฒ ๊ฒ์๊ธ ์ญ์ delete
DELETE FROM tbl_Test
WHERE seq = 3;
COMMIT;
--5-5. tbl_board ํ
์ด๋ธ ์ญ์
DROP TABLE tbl_test PURGE;
--Table TBL_TEST์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
--6-1. ์ค๋์ ๋ ์ง์ ์์ผ ์ถ๋ ฅ
-- [์คํ๊ฒฐ๊ณผ]
--์ค๋๋ ์ง ์ซ์์์ผ ํ์๋ฆฌ์์ผ ์์ผ
---------- --- ------ ------------
--22/04/15 6 ๊ธ ๊ธ์์ผ
SELECT SYSDATE
, TO_CHAR( SYSDATE, 'D' )
, TO_CHAR( SYSDATE, 'DY' )
, TO_CHAR( SYSDATE, 'DAY' )
-- ์ผ DD
FROM dual;
--6-2. ์ด๋ฒ ๋ฌ์ ๋ง์ง๋ง ๋ ๊ณผ ๋ ์ง๋ง ์ถ๋ ฅ
-- [์คํ๊ฒฐ๊ณผ]
--์ค๋๋ ์ง ์ด๋ฒ๋ฌ๋ง์ง๋ง๋ ์ง ๋ง์ง๋ง๋ ์ง(์ผ)
---------- -------- --------------------
--22/04/15 22/04/30 30 30
SELECT SYSDATE
, LAST_DAY( SYSDATE )
, TO_CHAR( LAST_DAY( SYSDATE ) , 'DD' )
FROM dual;
--6-3.
-- [์คํ๊ฒฐ๊ณผ]
--์ค๋๋ ์ง ์์์ฃผ์ฐจ ๋
์์ฃผ์ฐจ ๋
์ ์ฃผ์ฐจ
---------- ---- ---- ----
--22/04/15 3 15 15
-- IW, WW ์ฐจ์ด์ ~ ( ๊ธฐ์ต )
SELECT SYSDATE
, TO_CHAR( SYSDATE, 'W')
, TO_CHAR( SYSDATE, 'IW')
, TO_CHAR( SYSDATE, 'WW')
FROM dual;
DESC tbl_member;
์ด๋ฆ ๋? ์ ํ
----- -------- --------------
ID NOT NULL NVARCHAR2(10)
NAME NOT NULL NVARCHAR2(10)
AGE NUMBER(3)
BIRTH DATE
TEL NOT NULL CHAR(13)
ETC NVARCHAR2(100)
1) ์ปฌ๋ผ ์ถ๊ฐ : tel, etc
2) etc ์ปฌ๋ผ์ ์๋ฃํ์ ํฌ๊ธฐ NVARCHAR2(100) -> 200 ์์
ALTER TABLE MODIFY
ใํ์ใ
ALTER TABLE ํ
์ด๋ธ๋ช
MODIFY (์ปฌ๋ผ๋ช
datatype [DEFAULT ๊ฐ]
[,์ปฌ๋ผ๋ช
datatype]...);
• ๋ฐ์ดํฐ์ type, ***[size]***, default ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. • ๋ณ๊ฒฝ ๋์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ null ๊ฐ๋ง ์กด์ฌํ ๊ฒฝ์ฐ์๋ [ size๋ฅผ ์ค์ผ ์ ์๋ค.] • ๋ฐ์ดํฐ ํ์ ์ ๋ณ๊ฒฝ์ CHAR์ VARCHAR2 ์ํธ๊ฐ์ ๋ณ๊ฒฝ๋ง ๊ฐ๋ฅํ๋ค. • *** ์ปฌ๋ผ ํฌ๊ธฐ์ ๋ณ๊ฒฝ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ณด๋ค ๊ฐ๊ฑฐ๋ ํด ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค. ** • NOT NULL ์ปฌ๋ผ์ธ ๊ฒฝ์ฐ์๋ size์ ํ๋๋ง ๊ฐ๋ฅํ๋ค. • ์ปฌ๋ผ์ ๊ธฐ๋ณธ๊ฐ ๋ณ๊ฒฝ์ ๊ทธ ์ดํ์ ์ฝ์ (INSERT)๋๋ ํ๋ถํฐ ์ํฅ์ ์ค๋ค. • ์ปฌ๋ผ์ด๋ฆ์ [์ง์ ์ ์ธ ๋ณ๊ฒฝ]์ ๋ถ๊ฐ๋ฅํ๋ค. • ์ปฌ๋ผ์ด๋ฆ์ ๋ณ๊ฒฝ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํตํ ํ ์ด๋ธ ์์ฑ์ alias๋ฅผ ์ด์ฉํ์ฌ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. • alter table ... modify๋ฅผ ์ด์ฉํ์ฌ ์ ์ฝ์กฐ๊ฑด(constraint)๋ฅผ ์์ ํ ์ ์๋ค |
ALTER TABLE tbl_member
MODIFY ( etc NVARCHAR2(200) ); -- ์๋ฃํ, ํฌ๊ธฐ ํ๋, ์ถ์(์ ์ฝ)
-- Table TBL_MEMBER์ด(๊ฐ) ๋ณ๊ฒฝ๋์์ต๋๋ค.
3) etc ์ปฌ๋ผ๋ช
์ bigo ์ปฌ๋ผ๋ช
์ผ๋ก ์์ .
ใฑ. ๋ณ์นญ( alias ) ์ฌ์ฉ
SELECT etc AS "bigo"
FROM tbl_member;
ใด RENAME ์ปฌ๋ผ๋ช
์ ์์ .
ALTER TABLE tbl_member
RENAME COLUMN etc TO bigo;
-- Table TBL_MEMBER์ด(๊ฐ) ๋ณ๊ฒฝ๋์์ต๋๋ค.
4) bigo ์ปฌ๋ผ์ ์ญ์ .
ALTER TABLE DROP COLUMN
ใํ์ใ
ALTER TABLE ํ
์ด๋ธ๋ช
DROP COLUMN ์ปฌ๋ผ๋ช
;
• ์ปฌ๋ผ์ ์ญ์ ํ๋ฉด ํด๋น ์ปฌ๋ผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ํจ๊ป ์ญ์ ๋๋ค. • ํ๋ฒ์ ํ๋์ ์ปฌ๋ผ๋ง ์ญ์ ํ ์ ์๋ค. • ์ญ์ ํ ํ ์ด๋ธ์๋ ์ ์ด๋ ํ๋์ ์ปฌ๋ผ์ ์กด์ฌํด์ผ ํ๋ค. • DDL๋ฌธ์ผ๋ก ์ญ์ ๋ ์ปฌ๋ผ์ ๋ณต๊ตฌํ ์ ์๋ค. |
ALTER TABLE tbl_member
DROP COLUMN bigo;
-- Table TBL_MEMBER์ด(๊ฐ) ๋ณ๊ฒฝ๋์์ต๋๋ค.
5) tbl_member ํ
์ด๋ธ์ ์ด๋ฆ์ tbl_customer ๋ณ๊ฒฝ(์์ )
RENAME tbl_member TO tbl_customer;
-- ํ
์ด๋ธ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค.
-- ํ
์ด๋ธ ์์ฑ (์๋ธ์ฟผ๋ฆฌ)
1) ํ
์ด๋ธ์ ๋ง๋๋ ๊ฐ์ฅ ๋จ์ํ๋ฉด์๋ ์ผ๋ฐ์ ์ธ ๋ช
๋ น ํ์์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ.
2) SUBQUERY๋ฅผ ์ด์ฉํ ํ
์ด๋ธ์ ์์ฑ ๋ฐฉ๋ฒ.
ใฑ. ์ด๋ฏธ ์กด์ฌํ๋ ํ
์ด๋ธ์ด ์๊ณ ,
ใด. SELECT ~ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์
ใท. ์๋ก์ด ํ
์ด๋ธ ์์ฑ + ๋ฐ์ดํฐ ์๋ ์ถ๊ฐ.
ใน. ํ์)
CREATE TABLE ํ
์ด๋ธ๋ช
[ ์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๋ช
... ]
AS ์๋ธ์ฟผ๋ฆฌ;
ใ
) ๋ค๋ฅธ ํ
์ด๋ธ์ ์กด์ฌํ๋ ํน์ ์ปฌ๋ผ๊ณผ ํ์ ์ด์ฉํ ํ
์ด๋ธ์ ์์ฑํ๊ณ ์ถ์ ๋ ์ฌ์ฉ.
ใ
) ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ํ
์ด๋ธ์ด ์์ฑ๋๋ค.
ใ
)CREATE TABLE ํ
์ด๋ธ๋ช
[ ์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๋ช
... ]
์ปฌ๋ผ๋ช
์ ๋ช
์ํ ๊ฒฝ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์์ ๊ฐ๊ฒ ๋ช
์ํด์ผ ๋๋ค.
ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ๋ช
๊ณผ ๊ฐ๊ฒ ๋๋ค.
ใ
) ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌ๋์ง ์๋๋ค. ( PK X, FK X, NN ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌ๊ฐ ๋๋ค. )
SELECT *
FROM user_constraints
WHERE table_name = UPPER( 'tbl_emp10' );
WHERE table_name = UPPER( 'emp' ); -- PK, FK
user_ ์ ๋์ด, dba_ , all_
FROM user_tables; -- tabs
FROM user_users;
-- ์) emp ํ
์ด๋ธ์ ์ฌ์๋ฒํธ,์ฌ์๋ช
, ์
์ฌ์ผ์, pay ์ปฌ๋ผ๋ง ๊ฐ์ง๋ ํ
์ด๋ธ ์์ฑ
+ 10๋ฒ ๋ถ์์๋ง ๋ฐ์ดํฐ๋ก ์ถ๊ฐ
--CREATE TABLE tbl_emp10 -- [ ์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๋ช
... ] ์๋ต
CREATE TABLE tbl_emp10 ( eno, name, hdate , pay )
AS (
SELECT empno, ename, hiredate, sal + NVL( comm, 0 ) pay
FROM emp
WHERE deptno = 10
);
-- Table TBL_EMP10์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
์ด๋ฆ ๋? ์ ํ
-------- -- ------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
HIREDATE DATE
PAY NUMBER -- sal + comm
ใ
) ์๋ ํ
์ด๋ธ ( CRUD X ) ๋ณด์กดํ์ฑ๋ก ๋ณต์ฌ ํ
์ด๋ธ
CREATE TABLE tbl_empCopy
AS ( SELeCT * FROM emp );
-- Table TBL_EMPCOPY์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
SELECT *
FROM tbl_empcopy; -- delete, update, insert ๋ฑ๋ฑ
ํ
์ด๋ธ ์ญ์
DROP TABLE tbl_emp10 PURGE;
DROP TABLE tbl_empcopy PURGE;
-- Table TBL_EMP10์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
-- Table TBL_EMPCOPY์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
ใ
) (๋ฌธ์ ) ๊ธฐ์กด ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ ๋ณต์ฌํด์ ์๋ก์ด ํ
์ด๋ธ์ ์์ฑ
+ ๋ฐ์ดํฐ ๋ณต์ฌ X
CREATE TABLE tbl_empcopy
AS (
SELECT *
FROM emp
WHERE 1 = 0 -- ์ด ์กฐ๊ฑด์ ์ฃผ๋ฉด ๊ตฌ์กฐ๋ง ๋ณต์ฌ๋๊ณ ๋ฐ์ดํฐ๋ ๋ณต์ฌ์๋จ!
);
DML - INSERT , UPDATE, DELETE ( COMMIT, ROLLBACK ) -- TRUNCATE
1. tbl_member ํ
์ด๋ธ ํ์ธ
SELECT *
FROM tabs
WHERE REGEXP_LIKE( table_name , 'member', 'i' );
2. tbl_member ํ
์ด๋ธ ํ์ธ -> ์ญ์
DROP TABLE tbl_member PURGE;
3. tbl_member ํ
์ด๋ธ ์์ฑ.
๋ฉค๋ฒ(ํ์์ ๋ณด)
์ถ์ถ ์์ฑ( ๋์ด, ์์ผ, ์ฑ๋ณ ์ปฌ๋ผ ) X -> ์ ? ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ
NOT NULL NN
PRIMARY KEY PK
CREATE TABLE tbl_member(
id VARCHAR2(10) NOT NULL CONSTRAINT PK_TBLMEMBER_ID PRIMARY KEY -- PK
, name VARCHAR2(20) NOT NULL
, age NUMBER(3)
, birth DATE
, regdate DATE DEFAULT SYSDATE
, point NUMBER DEFAULT 100
);
-- Table TBL_MEMBER์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
-- TBL_MEMBER ํ
์ด๋ธ์ ์ ์ฝ์กฐ๊ฑด ํ์ธ ( ์๊ธฐ )
SELECT *
FROM user_constraints
WHERE table_name = 'TBL_MEMBER';
PK : PK_TBLMEMBER_ID / P
NN : SYS_C009024 / C
NN : SYS_C009025 / C
์ ์ฝ์กฐ๊ฑด๋ช
์ ์ง์ ํ์ง ์์ผ๋ฉด SYS_ ์ ๋์ฌ๋ก ์๋ ์ง์ ๋๋ค.
-- FK / R
INSERT INTO tbl_member ( id, name, age, birth, regdate, point )
VALUES ( 'admin', '๊ด๋ฆฌ์', 40, TO_DATE('01/23/1980', 'MM/DD/YYYY'), SYSDATE, 1000);
ORA-00001: unique constraint (SCOTT.PK_TBLMEMBER_ID) violated
์ ์ผ์ฑ ์ ์ฝ์กฐ๊ฑด
PK (= UK +NN ) ์ ์ฝ์กฐ๊ฑด ์๋ฐฐ๋๋ค. - ID๋ ์ค๋ณต X ( ๊ณ ์ ํ ํค )
INSERT INTO tbl_member ( id, name, age, birth, regdate, point )
VALUES ( 'admin', 'ํ๊ธธ๋', 20, TO_DATE('11/20/2003', 'MM/DD/YYYY'), SYSDATE, 1000);
INSERT INTO tbl_member ( id, name, age, birth )
VALUES ( 'hong', 'ํ๊ธธ๋', 20, TO_DATE('11/20/2003', 'MM/DD/YYYY') );
-- ORA-00933: SQL command not properly ended
INSERT INTO tbl_member ( id, name, age )
VALUES ( 'park', '๋ฐ์ง์', 25 );
-- 1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
INSERT INTO tbl_member ( id, name )
VALUES ( 'kim', '๊น์ง์' );
-- 00947. 00000 - "not enough values"
INSERT INTO tbl_member VALUES ( 'lee', '์ด์ง์', null, null , SYSDATE, 100 );
-- 1 ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ INSERT ๋ฌธ
INSERT INTO ํ
์ด๋ธ๋ช
[ ( ์ปฌ๋ผ๋ช
.... ) ] VALUES ( ์ปฌ๋ผ๊ฐ...);
INSERT INTO ํ
์ด๋ธ๋ช
( ์๋ธ์ฟผ๋ฆฌ );
1) tbl_emp10 ํ
์ด๋ธ -> ์์ฑ
CREATE TABLE tbl_emp10
AS (
SELECT *
FROM emp
WHERE 1 = 0
)
2)
SELECT *
FROM tbl_emp10;
3) 3๊ฐ ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
INSERT INTO tbl_emp10 (
SELECT *
FROM emp
WHERE deptno = 10
);
COMMIT;
DROP TABLE tbl_emp10 PURGE;
-- [ Multitable insert ๋ฌธ ] --
-- ํ๋์ INSERT ๋ฌธ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ์ ๋์์ ํ์ ์
๋ ฅํ๋ ๋ฌธ
-- 4๊ฐ์ง
1) unconditional insert all
์กฐ๊ฑด์ด ์๋
2) conditional insert all
์กฐ๊ฑด์ด ์๋
3) conditional first insert
4) pivoting insert
[ 1) unconditional insert all ]
์กฐ๊ฑด๊ณผ ์๊ด์์ด ๊ธฐ์ ๋์ด์ง ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ค.
• ์๋ธ์ฟผ๋ฆฌ๋ก๋ถํฐ ํ๋ฒ์ ํ๋์ ํ์ ๋ฐํ๋ฐ์ ๊ฐ๊ฐ insert ์ ์ ์ํํ๋ค.
• into ์ ๊ณผ values ์ ์ ๊ธฐ์ ํ ์ปฌ๋ผ์ ๊ฐ์์ ๋ฐ์ดํฐ ํ์
์ ๋์ผํด์ผ ํ๋ค.
ใํ์ใ
INSERT ALL | FIRST
[INTO ํ
์ด๋ธ1 VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)]
[INTO ํ
์ด๋ธ2 VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)]
.......
Subquery;
์ฌ๊ธฐ์
ALL : ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ํด๋นํ๋ insert ์ ์ ๋ชจ๋ ์
๋ ฅ
FIRST : ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ํด๋นํ๋ ์ฒซ ๋ฒ์งธ insert ์ ์ ์
๋ ฅ
subquery : ์
๋ ฅ ๋ฐ์ดํฐ ์งํฉ์ ์ ์ํ๊ธฐ ์ํ ์๋ธ์ฟผ๋ฆฌ๋ ํ ๋ฒ์ ํ๋์ ํ์ ๋ฐํํ์ฌ ๊ฐ insert ์ ์ํ
์) emp ํ
์ด๋ธ์ 12๋ช
์ฌ์ ์กด์ฌ
SELECT * FROM emp;
tbl_emp10 ํ
์ด๋ธ์์ฑ
tbl_emp20 ํ
์ด๋ธ์์ฑ
tbl_emp30 ํ
์ด๋ธ์์ฑ
tbl_emp40 ํ
์ด๋ธ์์ฑ
CREATE TABLE tbl_emp10
AS
(
SELECT *
FROM emp
WHERE deptno = 10
)
CREATE TABLE tbl_emp20
AS
(
SELECT *
FROM emp
WHERE deptno = 20
)
CREATE TABLE tbl_emp30
AS
(
SELECT *
FROM emp
WHERE deptno = 30
)
CREATE TABLE tbl_emp40
AS
(
SELECT *
FROM emp
WHERE deptno = 40
)
-- ํ
์ด๋ธ ๊ตฌ์กฐ ๋ณต์ฌ + ๋ฐ์ดํฐ ๋ณต์ฌ
์ ๋ถ๋ค ๋ค์ด๊ฐ ํํ์
CREATE TABLE tbl_emp10 AS ( SELECT * FROM emp WHERE 1 = 0 );
CREATE TABLE tbl_emp20 AS ( SELECT * FROM emp WHERE 1 = 0 );
CREATE TABLE tbl_emp30 AS ( SELECT * FROM emp WHERE 1 = 0 );
CREATE TABLE tbl_emp40 AS ( SELECT * FROM emp WHERE 1 = 0 );
INSERT ALL
INTO tbl_emp10 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
INTO tbl_emp20 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
INTO tbl_emp30 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
INTO tbl_emp40 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
SELECT * FROM emp;
-- 48๊ฐ ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
[ 2) conditional insert all ]
ใํ์ใ
INSERT ALL
WHEN ์กฐ๊ฑด์ 1 THEN
INTO [ํ
์ด๋ธ1] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
WHEN ์กฐ๊ฑด์ 2 THEN
INTO [ํ
์ด๋ธ2] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
........
ELSE
INTO [ํ
์ด๋ธ3] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
Subquery;
• subquery๋ก๋ถํฐ ํ๋ฒ์ ํ๋์ฉ ํ์ ๋ฆฌํด๋ฐ์ WHEN...THEN์ ์์ ์ฒดํฌํ ํ, ์กฐ๊ฑด์ ๋ง๋ ์ ์ ๊ธฐ์ ๋ ํ
์ด๋ธ์ insert ์ ์ ์ํํ๋ค.
• VALUES ์ ์ ์ง์ ํ DEFAULT ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค. ๋ง์ฝ default๊ฐ์ด ์ง์ ๋์ด ์์ง ์๋ค๋ฉด, MULL ๊ฐ์ด ์ฝ์
๋๋ค.
INSERT ALL
WHEN deptno = 10 THEN
INTO tbl_emp10 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
WHEN deptno = 20 THEN
INTO tbl_emp20 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
WHEN deptno = 30 THEN
INTO tbl_emp30 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
ELSE
INTO tbl_emp40 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
SELECT * FROM emp;
-- 12๊ฐ ํ ์ด(๊ฐ) ์ฝ์
๋์์ต๋๋ค.
3) conditional first insert ๋ฌธ
WHEN ~ THEN ์กฐ๊ฑด ์๋
Conditional first insert ๋ฌธ์ conditional insert all ๋ฌธ๊ณผ ๋์ผํ๊ฒ ํน์ ์กฐ๊ฑด๋ค์ ๊ธฐ์ ํ์ฌ ๊ทธ ์กฐ๊ฑด์ ๋ง๋ ํ(row)๋ค์ ์ํ๋ ํ
์ด๋ธ์ ๋๋์ด ์ฝ์
ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ์ง๋ง, conditional insert all ๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ฒซ ๋ฒ์งธ when ์ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ ๊ฒฝ์ฐ ๋ค์์ when ์ ์ ์ํํ์ง ์๋๋ค.
์๋ธ์ฟผ๋ฆฌ๋ก๋ถํฐ ํ๋ฒ์ ํ๋์ ํ์ ๋ฐํ๋ฐ์ when ... then ์ ์์ ์กฐ๊ฑด์ ์ฒดํฌํ ํ ์กฐ๊ฑด์ ๋ง๋ ์ ์ ๊ธฐ์ ๋ ํ
์ด๋ธ์ insert ์ ์ ์ํํ๋ค.
์ฌ๋ฌ ๊ฐ์ when ... then ์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ค. ๋จ, ์ฒซ ๋ฒ์งธ when ์ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด into ์ ์ ์ํํ ํ ๋ค์์ when ์ ์ ์ํํ์ง ์๋๋ค.
ใํ์ใ
INSERT FIRST
WHEN ์กฐ๊ฑด์ 1 THEN
INTO [ํ
์ด๋ธ1] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
WHEN ์กฐ๊ฑด์ 2 THEN
INTO [ํ
์ด๋ธ2] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
........
ELSE
INTO [ํ
์ด๋ธ3] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
Sub-Query;
• conditional INSERT FIRST๋ ์กฐ๊ฑด์ ์ ๊ธฐ์ ํ์ฌ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ๋ค์ ์ํ๋ ํ
์ด๋ธ์ ์ฝ์
ํ ์ ์๋ค.
• ์ฌ๋ฌ ๊ฐ์ WHEN...THEN์ ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์กฐ๊ฑด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋จ, ์ฒซ ๋ฒ์งธ WHEN ์ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด, INTO ์ ์ ์ํํ ํ ๋ค์์ WHEN ์ ๋ค์ ๋ ์ด์ ์ํํ์ง ์๋๋ค.
• subquery๋ก๋ถํฐ ํ ๋ฒ์ ํ๋์ฉ ํ์ ๋ฆฌํด ๋ฐ์ when...then์ ์์ ์กฐ๊ฑด์ ์ฒดํฌํ ํ ์กฐ๊ฑด์ ๋ง๋ ์ ์ ๊ธฐ์ ๋ ํ
์ด๋ธ์ insert๋ฅผ ์ํํ๋ค.
• ์กฐ๊ฑด์ ๊ธฐ์ ํ when ์ ๋ค์ ๋ง์กฑํ๋ ํ์ด ์์ ๊ฒฝ์ฐ else์ ์ ์ฌ์ฉํ์ฌ into ์ ์ ์ํํ ์ ์๋ค. else์ ์ด ์์ ๊ฒฝ์ฐ ๋ฆฌํด ๋ ๊ทธํ์ ๋ํด์๋ ์๋ฌด๋ฐ ์์
๋ ๋ฐ์ํ์ง ์๋๋ค.
7934 MILLER CLERK 7782 82/01/23 1300 10
10๋ฒ ๋ถ์์์ด๋ฉด์ ์ก์ด CLERK ์ธ ๋ฐ๋ฌ ์ฌ์
INSERT FIRST
WHEN deptno = 10 THEN
INTO tbl_emp10 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
WHEN job = 'CLERK' THEN
INTO tbl_emp20 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
ELSE
INTO tbl_emp40 VALUES ( empno, ename, job, mgr, hiredate, sal, comm, deptno )
SELECT * FROM emp;
4) Pivoting insert ๋ฌธ
pivoting insert ๋ฌธ์ unconditional insert all ๋ฌธ๊ณผ ๊ฑฐ์ ๋์ผํ๋ into ์ ์ ๋จ ํ ๊ฐ์ ํ
์ด๋ธ๋ง ์ฌ ์ ์๋ค.
๋๋ถ๋ถ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ์ ์์ฑํ ๋ ์ ์ฌํ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์ปฌ๋ผ์ ํ๋์ ๊ณตํต ์ปฌ๋ผ์ผ๋ก ์ค๊ณํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณดํต์ด๋ค.
ํ์ง๋ง, ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ์ค๊ณํ์ง ์๊ณ ๊ฐ๊ฐ ํ์ํ ์ปฌ๋ผ์ ๋ฐ๋ก ์ค๊ณํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
pivoting insert ๋ฌธ์ ์ด์ ๊ฐ์ด ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ์ ์ปฌ๋ผ์ ์ฝ์ด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด ์
๋ ฅ์ํฌ ๋ ์ฌ์ฉํ๋ค.
์ฌ๋ฌ ๊ฐ์ into ์ ์ ์ฌ์ฉํ ์ ์์ง๋ง, into ์ ๋ค์ ์ค๋ ํ
์ด๋ธ์ ๋ชจ๋ ๋์ผํด์ผ ํ๋ค.
ใํ์ใ
INSERT ALL
WHEN ์กฐ๊ฑด์ 1 THEN
INTO [๋์ผํ ํ
์ด๋ธ1] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
INTO [๋์ผํ ํ
์ด๋ธ1] VALUES (์ปฌ๋ผ1,์ปฌ๋ผ2,...)
..........
Sub-Query;
• ์ฃผ๋ก ์ฌ๋ฌ ๊ณณ์ ์์คํ
์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์์
ํ๋ dataware house์ ์ ํฉํ๋ค. ์ ๊ทํ ๋์ง ์์ data source๋ค์ด๋ ๋ค๋ฅธ format์ผ๋ก ์ ์ฅ๋ data source๋ค์ Oracle์ ๊ด๊ณํ DB์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ ํํ๋ก ๋ณํํ๋ค.
• ์ ๊ทํ ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ oracle์ด ์ ๊ณตํ๋ relationalํ ํํ๋ก ํ
์ด๋ธ์ ๋ณ๊ฒฝํ๋ ์์
์ pivoting์ด๋ผ๊ณ ํ๋ค.
create table tbl_sales(
employee_id number(6) ,
week_id number(2) ,
sales_mon number(8, 2), -- ์ ํ๋งค๋
sales_tue number(8, 2) ,
sales_wed number(8, 2) ,
sales_thu number(8, 2) ,
sales_fri number(8, 2) -- ๊ธ ํ๋งค๋
);
-- Table TBL_SALES์ด(๊ฐ) ์์ฑ๋์์ต๋๋ค.
insert into tbl_sales values(1101,4,100,150,80,60,120);
insert into tbl_sales values(1102,5,300,300,230,120,150);
COMMIT;
create table tbl_sales_data(
employee_id number(6),
week_id number(2),
sales number(8,2)
);
-- [ PIVOTING INSERT. ๋ฌธ ] == UNC~ INSERT ALL
insert all
into tbl_sales_data values(employee_id, week_id, sales_mon)
into tbl_sales_data values(employee_id, week_id, sales_tue)
into tbl_sales_data values(employee_id, week_id, sales_wed)
into tbl_sales_data values(employee_id, week_id, sales_thu)
into tbl_sales_data values(employee_id, week_id, sales_fri)
select employee_id, week_id, sales_mon, sales_tue, sales_wed,
sales_thu, sales_fri
from tbl_sales;
ex) a) 1101๋ฒ ์ฌ์์ด 4์งธ์ฃผ ์์์ผ 100๊ฐ ํ์์ผ 120๊ฐ ์์์ผ 320๊ฐ ๋ชฉ์์ผ 500๊ฐ ~ ๋ฅผ ํ ์ด๋ธ์ b) 1101 4์งธ์ฃผ ์์์ผ 100๊ฐ 1101 4์งธ์ฃผ ํ์์ผ 120๊ฐ . . . ๊ตฌํํ๊ธฐ ์ํด์ ์ฆ a ๋ฐ์ดํฐ๋ฅผ b์ ์ง์ด๋ฃ๊ธฐ ์ํด์ Pivot insert ์ฌ์ฉ |
-- UPDATE / DELETE
-- ์ด๋ฏธ ์กด์ฌํ๋ ํ
์ด๋ธ์ ์ฌ์ฉํด์ ์๋ก์ด ํ
์ด๋ธ ์์ฑ
--( ๋ฌธ์ 1 ) insaํ
์ด๋ธ์์ num, name ์ปฌ๋ผ๋ง ๋ณต์ฌํด์ tbl_score ํ
์ด๋ธ ์์ฑ
-- ์กฐ๊ฑด) num <=1005 ๋ ์ฝ๋ ๋ณต์ฌ
CREATE TABLE tbl_score
AS (
SELECT num, name
FROM insa
WHERE num <= 1005
);
--( ๋ฌธ์ 2 ) tbl_score ํ
์ด๋ธ์ kor, eng, mat, tot, avg, grade, rank ์ปฌ๋ผ ์ถ๊ฐ
ALTER TABLE tbl_score
ADD (
kor NUMBER(3) DEFAULT 0
, eng NUMBER(3) DEFAULT 0
, mat NUMBER(3) DEFAULT 0
, tot NUMBER(3)
, avg NUMBER(5,2)
, grade CHAR(1 CHAR)
, rank NUMBER(3)
);
-- ( ๋ฌธ์ 3 ) kor, eng, mat ์ ์๋ฅผ ์์์ ์ ์( 0~100)๋ก ์์ .
UPDATE tbl_score
SET kor = TRUNC( dbms_random.value( 0, 101 ) )
, eng = TRUNC( dbms_random.value( 0, 101 ) )
, mat = FLOOR( dbms_random.value( 0, 101 ) );
--WHERE ;
COMMIT;
-- ( ๋ฌธ์ 4 ) ๋ชจ๋ ํ์๋ค์ tot, avg ๊ณ์ฐ , ์์ ( UPDATE )
-- 100.81733122398513865487065964899694120306 -> tbl_socre - kor, eng, mat
UPDATE tbl_score
SET tot = kor + eng +mat
, avg = (kor + eng +mat)/3; 87.12[3 ๋ฐ์ฌ๋ฆฝ]131312313123132 number(5,2)
-- WHERE;
-- ( ๋ฌธ์ 5 ) ํ๊ท ๋ฌด์กฐ๊ฑด ์์์ 2์๋ฆฌ ๊น์ง ์ถ๋ ฅ 22.70
SELECT num, name, kor, eng, mat, tot
, TO_CHAR( avg , '999.00' ) avg
, grade, rank
FROm tbl_score;
-- ( ๋ฌธ์ 6 ) grade ๋ฑ๊ธ ์ปฌ๋ผ ์์
-- ํ๊ท ์ด 90 ์ด์ A, 80 ์ด์ B, 70 ์ด์ C , 60 ์ด์ D, ๊ทธ์ธ F char(1 char)
UPDATE tbl_score
SET grade = 'A'
WHERE avg BETWEEN 90 AND 100;
UPDATE tbl_score
SET grade = 'B'
WHERE avg BETWEEN 80 AND 89;
UPDATE tbl_score
SET grade = 'C'
WHERE avg BETWEEN 70 AND 79;
UPDATE tbl_score
SET grade = 'D'
WHERE avg BETWEEN 60 AND 69;
UPDATE tbl_score
SET grade = 'F'
WHERE avg BETWEEN 0 AND 59;
-- CASE ํจ์
UPDATE tbl_score
SET grade = CASE
WHEN avg >= 90 THEN 'A'
WHEN avg >= 80 THEN 'B'
WHEN avg >= 70 THEN 'C'
WHEN avg >= 60 THEN 'D'
ELSE 'F'
END;
-- DECODE ํจ์ : = ๋น๊ต์ฐ์ฐ์๋ง ์ฌ์ฉ.
UPDATE tbl_score
SET grade = DECODE( TRUNC( avg/10 ) , 10, 'A', 9 , 'A', 8, 'B', 7, 'C', 6 , 'D', 'F') ;
-- ( ๋ฌธ์ 6 ) rank ๋ฑ์ ์ฒ๋ฆฌ....
UPDATE tbl_score a
SET rank = ( SELECT COUNT(*) + 1 FROM tbl_Score WHERE tot > a.tot );
SET rank = (
SELECT r
FROM (
SELECT num, tot, RANK() OVER( ORDER BY tot DESC ) r
FROM tbl_score
) t
WHERE a.num = t.num
);
COMMIT;
-- ( ๋ฌธ์ 7 ) ๊ตญ์ด๋ฌธ์ 1๊ฐ ์ ๋ต ์์ด์..
-- ๋ชจ๋ ํ์์ ๊ตญ์ด ์ ์๋ฅผ 5์ ์ฆ๊ฐ.
UPDATE tbl_score
SET kor = CASE
WHEN kor >= 95 THEN 100
ELSE kor + 5
END ;
-- ( ๋ฌธ์ 8 *** ) 1001 ๋ฒ ํ์์ ๊ตญ์ด,์์ด ์ ์๋ฅผ 1005๋ฒ ํ์์ ๊ตญ์ด, ์์ด ์ ์๋ก ์์
UPDATE tbl_score
SET kor = ( SELECT kor FROM tbl_score WHERE num = 1005 )
, eng = ( SELECT eng FROM tbl_score WHERE num = 1005 )
WHERE num = 1001;
-- **** (๊ธฐ์ต)
UPDATE tbl_score
SET ( kor, eng ) = ( SELECT kor, eng FROM tbl_score WHERE num = 1005 )
WHERE num = 1001;
COMMIT;
-- ( ๋ฌธ์ 9 )tbl_score ํ
์ด๋ธ์์ [์ฌํ์]๋ค๋ง ์์ด ์ ์๋ฅผ 5์ ์ฉ ์ฆ๊ฐ์ํค๋ ์ฟผ๋ฆฌ ์์ฑ.
UPDATE tbl_score
SET eng = CASE
WHEN eng >= 95 THEN 100
ELSE eng + 5
END
WHERE num IN (
SELECT num
FROM insa
WHERE MOD( SUBSTR( ssn, -7, 1 ), 2 ) = 0
);
-- ANY ์ฐ์ฐ์ --
UPDATE tbl_score
SET eng = CASE
WHEN eng >= 95 THEN 100
ELSE eng + 5
END
WHERE num = ANY ( -- >= ALL ์ต๊ณ ๊ธ์ฌ์
SELECT num
FROM insa
WHERE MOD( SUBSTR( ssn, -7, 1 ), 2 ) = 0
);
-- ์๊ด ์๋ธ ์ฟผ๋ฆฌ
UPDATE tbl_score
SET eng = CASE
WHEN eng >= 95 THEN 100
ELSE eng + 5
END
WHERE num = (
SELECT ts.num
FROM tbl_score ts,(
SELECT num, DECODE (MOD( SUBSTR(ssn, -7,1),2),0,'์ฌ์') gender
FROM insa)i
WHERE ts.num = i.num AND gender IS NOT NULL
) ;
-- MERGE( ํฉ๋ณํ๋ค, ํฉ์น๋ค ) : ๋ณํฉ, ํตํฉ.
1) ๊ตฌ์กฐ๊ฐ ๊ฐ์ ๋ ๊ฐ์ ํ
์ด๋ธ์ ๋น๊ตํ์ฌ ํ๋์ ํ
์ด๋ธ๋ก ํฉ์น๊ธฐ ์ํ ๋ฐ์ดํฐ ์กฐ์์ด๋ค.
A B => A, B
2) ์๋ฅผ ๋ค์ด, ํ๋ฃจ์ ์๋ง๊ฑด์ฉ ๋ฐ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ํ
์ด๋ธ์ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ๋๋์ ๋ฐ์ดํฐ๋ก ์ธํด ์ง์๋ฌธ์ ์ฑ๋ฅ์ด ์ ํ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ, ์ง์ ๋ณ๋ก ๋ณ๋์ ํ
์ด๋ธ์์ ๊ด๋ฆฌํ๋ค๊ฐ ๋
๋ง์ ์ข
ํฉ ๋ถ์์ ์ํด ํ๋์ ํ
์ด๋ธ๋ก ํฉ์น ๋ merge ๋ฌธ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค.
3) mergeํ๊ณ ์ ํ๋ ์์ค ํ
์ด๋ธ์ ํ์ ์ฝ์ด ํํท ํ
์ด๋ธ์ ๋งค์น๋๋ ํ์ด ์กด์ฌํ๋ฉด ์๋ก์ด ๊ฐ์ผ๋ก UPDATE๋ฅผ ์ํํ๊ณ , ๋ง์ผ ๋งค์น๋๋ ํ์ด ์์ ๊ฒฝ์ฐ ์๋ก์ด ํ์ ํํท ํ
์ด๋ธ์์ INSERT๋ฅผ ์ํํ๋ค.
A
ํ๊ธธ๋ 15 UPDATE
๊น๊ธธ๋ 5 INSERT
4) merge ๋ฌธ์์ where ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋์ on์ด ์ฌ์ฉ๋๋ค. ๋ํ when matched then ์ ๊ณผ when not matched then ์ ์๋ ํ
์ด๋ธ๋ช
๋์ alias๋ฅผ ์ฌ์ฉํ๋ค.
5.ใํ์ใ
MERGE [hint] INTO [schema.] {table ¦ view} [t_alias]
USING {{[schema.] {table ¦ view}} ¦ subquery} [t_alias]
ON (condition) [merge_update_clause] [merge_insert_clause] [error_logging_clause];
ใmerge_update_clause ํ์ใ
WHEN MATCHED THEN UPDATE SET {column = {expr ¦ DEFAULT},...}
[where_clause] [DELETE where_clause]
ใmerge_insert_clause ํ์ใ
WHEN NOT MATCHED THEN INSERT [(column,...)]
VALUES ({expr,... ¦ DEFAULT}) [where_clause]
ใwhere_clause ํ์ใ
WHERE condition
ใerror_logging_clause ํ์ใ
LOG ERROR [INTO [schema.] table] [(simple_expression)]
[REJECT LIMIT {integer ¦ UNLIMITED}]
6) ํ
์คํธ
CREATE TABLE tbl_emp(
id number not null constraint PK_tblEmp_id primary key
, name varchar2(10) not null
, salary number
, bonus number default 100
);
insert into tbl_emp(id,name,salary) values(1001,'jijoe',150);
insert into tbl_emp(id,name,salary) values(1002,'cho',130);
insert into tbl_emp(id,name,salary) values(1003,'kim',140);
COMMIT;
CREATE TABLE tbl_bonus(
id number
, bonus number default 100
);
INSERT INTO tbl_bonus ( id ) ( SELECT id FROM tbl_emp );
COMMIT;
INSERT INTO tbl_bonus VALUES ( 1004, 50 );
tbl_bonus
1001 100
1002 100
1003 100
1004 50
tbl_emp
1001 jijoe 150 100
1002 cho 130 100
1003 kim 140 100
-- MERGE : tbl_emp + tbl_bonus ๋ ํ
์ด๋ธ ๋ณํฉ
-- ORA-00942: table or view does not exist
-- USING tbl_emp e 4์ปฌ๋ผ X
USING ( SELECT id, salary FROM tbl_emp ) e
ON ( b.id = e.id )
WHEN MATCHED THEN -- UPDATE
UPDATE SET b.bonus = b.bonus + e.salary * 0.01
WHEN NOT MATCHED THEN -- INSERT
INSERT (b.id, b.bonus) VALUES ( e.id, e.salary * 0.01 );
-- ๋ณํฉ ๋ฌธ์ )
CREATE TABLE tbl_merge1
(
id number primary key
, name varchar2(20)
, pay number
, sudang number --
);
INSERT INTO tbl_merge1 (id, name, pay, sudang) VALUES (1, 'a', 100, 10);
INSERT INTO tbl_merge1 (id, name, pay, sudang) VALUES (2, 'b', 150, 20);
INSERT INTO tbl_merge1 (id, name, pay, sudang) VALUES (3, 'c', 130, 0);
COMMIT;
CREATE TABLE tbl_merge2
(
id number primary key
, sudang number --
);
INSERT INTO tbl_merge2 (id, sudang) VALUES (2,5);
INSERT INTO tbl_merge2 (id, sudang) VALUES (3,10);
INSERT INTO tbl_merge2 (id, sudang) VALUES (4,20);
COMMIT;
-- [ tbl_merge2 ] ํ
์ด๋ธ์ ๋ ๊ฐ ํ
์ด๋ธ์ ์๋น์ ๋ณํฉํด์ ์ถ๋ ฅ(์กฐํ)
SELECT id, sudang
FROM tbl_merge1;
1 10 X INSERT
2 20 O UPDATE
3 0 O UPDATE
SELECT id, sudang
FROM tbl_merge2;
2 5
3 10
4 20
-- ๋ณํฉ ์ฟผ๋ฆฌ ์์ฑ, ํ์ธ.--
1 10 INSERT
2 15 UPDATE
3 10 UPDATE
4 20
MERGE INTO tbl_merge2 t2
USING ( SELECT id, sudang FROM tbl_merge1 ) t1
ON ( t1.id = t2.id )
WHEN MATCHED THEN -- UPDATE
UPDATE
SET t2.sudang = t2.sudang + t1.sudang
WHEN NOT MATCHED THEN -- INSERT
INSERT ( t2.id, t2.sudang ) VALUES ( t1.id, t1.sudang );
-- ์ ์ฝ ์กฐ๊ฑด( constraint ) --
1. ์ ์ฝ์กฐ๊ฑด์ ํ์ธ : user_constraints ๋ทฐ(View) -- (์ํ)
SELECT *
FROM user_constraints
WHERE table_name = 'EMP';
2. ์ ์ฝ์กฐ๊ฑด ์ฌ์ฉํ๋ ๋ชฉ์ ?
ใฑ. ํ
์ด๋ธ์ ํ์ ์ถ๊ฐ, ์์ , ์ญ์ ( DML )ํ ๋ ์ ์ฉ๋๋ ๊ท์น
DATA INTERGRITY( ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ )์ ์ํด์ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ค.
์) ID ๊ณ ์ ํ๊ฐ - ์ค๋ณต X, ์ ์ผํ ๊ฐ
ID ์์ X
์) kor NUMBER(3) -999~999 101์ถ๊ฐ , ์์
3. ๋ฌด๊ฒฐ์ฑ(integrity )
- ๋ฐ์ดํฐ์ ์ ํ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ๋ฐ์ดํฐ์ ๊ฒฐ์๊ณผ ๋ถ์ ํฉ์ด ์์์ ๋ณด์ฆํ๋ ๊ฒ
- ์๋ฅผ ๋ค์ด,
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ(data integrity)์ด๋ผ ํ๋ฉด
๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ , ํญ์ ์ ์์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๊ฒ
3-2. ๋ฌด๊ฒฐ์ฑ 3๊ฐ์ง ์ข
๋ฅ
• 1) ๊ฐ์ฒด ๋ฌด๊ฒฐ์ฑ(Entity Integrity) : pk ์ค๋ณต์๋จ
emp PK- empno ์ฌ์๋ฒํธ
7369 SMITH~
INSERT empno 7369 KENIK X
• 2) ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ(Relational Integrity) : dept ํ
์ด๋ธ์ deptno๋ฅผ ์ฐธ์กฐํ๋๋ฐ ์์ผ๋ฉด ์๋จ
dept
deptno 10,20,30,40
emp
INSERT deptno 50 X
• 3) ๋๋ฉ์ธ ๋ฌด๊ฒฐ์ฑ(domain integrity) : ํ
์ด๋ธ ๋ง๋ค๋ ์ซ์ 3๊ฐ๋ก ์ค์ ํ๋๋ฐ ๋ค๋ฅธ ๋ฌธ์๋ ์๋จ
zipcode 000-000 12A-12B X
ssn 14 15 X
4. ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ๋ ์ด์ : ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์งํค๊ธฐ ์ํด ์ ์ฝ์กฐ๊ฑด ์ฌ์ฉ
5. ์ ์ฝ์กฐ๊ฑด์ ํน์ง
• DML ์์
์์ ์๋ชป๋๋ ๊ฒ์ ์ ์ฝ์กฐ๊ฑด์ ์ํด [๋ฐฉ์ง]ํ๋ค. • ๋ชจ๋ ์ ๋ณด๊ฐ [***๋ฐ์ดํฐ ์ฌ์ ***]์ ์ ์ฅ๋๋ค. • ์ธ์ ๋ ์ง ์ ์ฝ์กฐ๊ฑด์ disable, enable์ํฌ ์ ์๋ค. • ์ฒ๋ฆฌ๊ฒฐ๊ณผ๊ฐ ์ฆ์ ์ฌ์ฉ์์๊ฒ ๋๊ฒจ์ง๋ค. • ํ ์ปฌ๋ผ์ ์ฌ๋ฌ ๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค. • ํ๋์ ์ปฌ๋ผ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ์ปฌ๋ผ์ ์กฐํฉํ์ฌ ํ๋์ key๋ฅผ ๊ตฌ์ฑํ๋ composit key(๋ณตํฉํค)๋ฅผ ๋ง๋ค ์ ์๋ค. ์: PRIMARY KEY(pno, ename) **** • ์ ์ฝ์กฐ๊ฑด์ ๊ด๋ฆฌ๋ DB server๊ฐ ๋ด๋นํ๋ค. |
6. ์ ์ฝ์กฐ๊ฑด ์ ์ธ ๋ฐ ์์ ํ ์ ์๋ค.
• CREATE TABLE
• ALTER TABLE
• CREATE VIEW
• ALTER VIEW
-- ์ ์ฝ์กฐ๊ฑด ๋ณต์ฌ X,
CREATE TABLE tbl_empcopy -- empno ์ปฌ๋ผ PK ์ ์ฝ์กฐ๊ฑด ์ค์ ํด ์ค์ผ ๋๋ค.
AS
( SELECT * FROM emp );
--
SELECT *
FROM tbl_empcopy;
-- ID๊ฐ ๋๊ฐ์ ๋ค๋ฅธ ์ฌ์์ ์ถ๊ฐ
INSERT INTO tbl_empcopy (empno, ename) VALUES ( 7369, 'KENIK' );
7. ์ ์ฝ์กฐ๊ฑด( constraint )์ ์์ฑํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
1) IN-LINE ์ ์ฝ์กฐ๊ฑด ๋ฐฉ๋ฒ (== COLUMN LEVEL )
2) OUT-OF-LINE ์ ์ฝ์กฐ๊ฑด ๋ฐฉ๋ฒ( == TABLE LEVEL )
8. ์ ์ฝ ์กฐ๊ฑด์ 5๊ฐ์ง ์ข
๋ฅ
1) PRIMARY KEY( PK )
2) FOREIGN KEY( FK )
3) NOT NULL ( NN )
4) UNIQUE KEY ( UK )
5) CHECK ( CK )
'๐จโ๐ป Web Development > Oracle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Day12] Oracle 12 - CROSS JOIN, DB Modeling (0) | 2022.10.13 |
---|---|
[Day11] Oracle 11 - PURGE, ์ ์ฝ์กฐ๊ฑด2, JOIN (0) | 2022.10.12 |
[Day9] Oracle 9 - PIVOT, ์๋ฃํ(CHAR, VARCHAR, NUMBER, CLOB), CREATE/DROP/ALTER (0) | 2022.10.07 |
[Day8] Oracle 8 - RANK, HAVING, ROLLUP, CUBE (0) | 2022.10.06 |
[Oracle/Table] ์ค๋ผํด ํ ์ด๋ธ (0) | 2022.10.06 |
์ต๊ทผ๋๊ธ