-
SQL - DML, ํธ๋์ญ์ TCLDATABASE 2020. 7. 23. 08:31
๐ฏ SQL DML ๋ช ๋ น์ด์ ํธ๋์ญ์ ์ ์์๋ณธ๋ค.
DML(Data Manipulation Language)
๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ(INSERT), ์์ (UPDATE), ์ญ์ (DELETE), ๋ณํฉ(MERGE) ํ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์กฐ์์ด
INSERT
ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ ์กฐ์์ด
๋จ์ผํ INSERT : ํ๋ฒ์ ํ๋์ ํ์ ํ ์ด๋ธ์ ์ ์ฅ
๋ค์คํ INSERT : ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด ํ๊บผ๋ฒ์ ์ฌ๋ฌํ ๋์์ ์ฅ
๋จ์ผํ INSERT ๋ฌธ
INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (90, '์ธ์ฌ๊ณผ', '์์ธ'); -- ์ด๋ค ํ ์ด๋ธ์ ๋ฃ์๊ฑฐ๋ค (์ปฌ๋ผ๋ช ) -- ๋ฐ์ดํฐ๊ฐ์ (์ ์ปฌ๋ผ์ด๋ ์ผ๋์ผ ๋์์ด ๋์ด์ผํจ)
์ปฌ๋ผ 3๊ฐ ๋ฃ์ด์ฃผ๊ธฐ๋ก ํ์ผ๋ฉด ๋ฐธ๋ฅ๋ ๋๊ฐ์ด 3๊ฐ๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
์ ๋ ฅ๋๋ ๋ฐ์ดํฐ ํ์ ์ด ์ปฌ๋ผ์ ๋ฐ์ดํฐํ์ ๊ณผ ๊ฐ์์ผํ๋ค.
๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ ํ ์ด๋ธ ๋ง๋ค๋ ๋ง๋ค์ด์ง ์ปฌ๋ผํฌ๊ธฐ์ ๊ฐ๊ฑฐ๋ ์์์ผํ๋ค.
๋ฌธ์ ๋ฐ์ดํฐํ์ ์ด VARCHAR(10) ์ด๋ผ๋ฉด 10๊ธ์๋ฅผ ๋์ผ๋ฉด ์๋จ!
INSERT INTO DEPT VALUES(80, '์์ธ', '์ธ์ฌ๊ณผ');
INTO์ ์ ์ปฌ๋ผ์ ์๋ตํด๋ ํ ์ด๋ธ์ ์ปฌ๋ผ ์์์ ๋ฐ๋ผ VALUES์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์์์ ์ ๋ฃ์ด์ค๋ค. ์ด ๊ฒฝ์ฐ์ VALUES ์ ์๋ ๋ฐ๋์ ๊ทธ ์ปฌ๋ผ์ ๋ชจ๋ ์ปฌ๋ผ๊ฐ์ ๋๋ฝํ์ง ์๊ณ ์์๋๋ก ์ง์ ํด์ผํ๋ค. ๋น ๋จ๋ฆฌ๋๊ฒ ์์ผ๋ฉด ๊ฐ์ ์๊ฐ ์ถฉ๋ถํ์ง ์๋ค๋ ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ค.
DEPTNO๋ ์ค๋ณต๋ถ๊ฐ ์ ์ฝ์กฐ๊ฑด(๊ธฐ๋ณธํค)์ด ๊ฑธ๋ ค์์ด์ ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ๋ง๋ค๊ณ ๋ ๋ง๋ค ์ ์๋ค
NULL๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์ ์์ ํด๋น ์ปฌ๋ผ๊ฐ์ ๋ชจ๋ฅด๊ฑฐ๋ ํ์ ๋์ง ์์์ ๊ฒฝ์ฐ ํด๋น ์ปฌ๋ผ๊ฐ์ ๋๊ฐ์ ์ ์ฅํ ์ ์๋ค.
๋ฌต์์ ๋ฐฉ๋ฒ
INSERT INTO DEPT(DEPTNO, DNAME) VALUES(91, '์ธ์ฌ๊ณผ');
INTO์ ์์ ํด๋น ์ปฌ๋ผ๋ช ๊ณผ ๊ฐ์ ์๋ตํ๋ฉด ์๋์ผ๋ก ๋๊ฐ์ ์ ์ฅํด์ค๋ค. ๋จ, ํด๋น ์ปฌ๋ผ์ NOT NULL ์ ์ฝ์กฐ๊ฑด์ด ์ง์ ๋ ๊ฒฝ์ฐ์ ์๋ต ๋ถ๊ฐ.
ํ ์ด๋ธ์ ์กด์ฌํ๋ LOC ์ปฌ๋ผ์ ์ฐ์ง ์์์ ์๋์ผ๋ก NULL ๊ฐ์ด ์ ์ฅ๋๋ค.
๋ช ์์ ๋ฐฉ๋ฒ
VALUES์ ์ปฌ๋ผ๊ฐ์ ์ง์ NULL ๊ฐ ๋๋ '' ๋น๋ฌธ์์ด์ ์ ๋ ฅํ๋ค.
๋ค์คํ INSERT ๋ฌธ
์๋ธ์ฟผ๋ฆฌ ์ ์ ์ด์ฉํ์ฌ ํ๋์ INSERT ๋ช ๋ น๋ฌธ์ ์ฌ๋ฌ ํ์ ๋์์ ์ ๋ ฅ๊ฐ๋ฅํ๋ค.
-- EMP ์ฐ์ต์ฉ ๋ณต์ ํ ์ด๋ธ ์์ฑ CREATE TABLE COPY_EMP AS SELECT EMPNO, ENAME FROM EMP WHERE 1=2; -- EMP ํ ์ด๋ธ์์ EMPNO, ENAME ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ค์ ๋ณต์ INSERT INTO COPY_EMP(EMPNO, ENAME) SELECT EMPNO, ENAME FROM EMP;
๊ธฐ์กด์ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด ๋ณต์ฌํ ํ INSERT๋ฌธ์ผ๋ก ์๋ก์ด ํ์ ์์ฑํ๋ค. (*CTAS)
INTO์ ์์ ์ง์ ํ ์ปฌ๋ผ ๊ฐ์์ ๋ฐ์ดํฐํ์ ์ด ์๋ธ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ์ ๋ฐ๋์ ๋์ผํด์ผ ํ๋ค.
์กด์ฌํ๋ ํ ์ด๋ธ ์ฌ์ฉํ์ฌ ์ ํ ์ด๋ธ ์์ํ๋ ๋ฐฉ๋ฒ CTAS
CREATE TABLE ํ ์ด๋ธ๋ช [(์ปฌ๋ผ๋ช , ์ปฌ๋ผ๋ช 2)] AS SELECT * FROM ํ ์ด๋ธ -- ์๋ธ์ฟผ๋ฆฌ ์์ WHERE 1=2; ์๋ธ์ฟผ๋ฆฌ์์ WHERE์ ์กฐ๊ฑด์ด FALSE์ด๋ฉด ๊ฒ์๋ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ง ๋ณต์ฌ๋์ด ์๋ก์ด ํ ์ด๋ธ ์์ฑ >> ๋น ํ ์ด๋ธ ์กฐ๊ฑด์ด TRUE ๊ฑฐ๋ WHERE์ ์ ์๋ตํ๋ฉด ์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋ฐ์ดํฐ๊น์ง ํฌํจํ์ฌ ์๋ก์ด ํ ์ด๋ธ ์์ฑ ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ง ๋ณต์ฌํ๊ธฐ ์ํด WHERE ์ ์ ์กฐ๊ฑด์์ด FALSE๊ฐ ๋๋๋ก 1=2 ๊ฐ์ด ์ค์ ํ๋๊ฒ. ์ด๊ฒ ๋ NOT NULL ์ ์ฝ์กฐ๊ฑด ์ ์ธํ ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌ๋์ง ์์ ๋ฐ๋ผ์ DEPTNO ์ปฌ๋ผ์ ๊ธฐ๋ณธํค ์ค์ ์๋์ด์๋ ์ํ๋ก ์์ฑ๋จ. as๋ ๋ณ์นญ์ด ์๋๋ผ ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค ๋ผ๋ ์๋ฏธ๋ก์ฐ์ CREATE TABLE MYDEPT AS SELECT * FROM DEPT WHERE 1=2; -- DEPT ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ง ๋ณต์ฌํจ INSERT INTO MYDEPT SELECT DEPTNO, DNAME, LOC FROM DEPT; -- DEPT ํ ์ด๋ธ์ ๋ช๊ฐ์ง ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ํ ์ด๋ธ์ ๋ฃ์ด์ค๋ค
๋ฌธ์ฅ์ ์๊ธ์๋ฅผ ๋ฐ์ CTAS๋ผ๊ณ ๋ถ๋ฅธ๋ค. INTO์ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ธ์ฟผ๋ฆฌ ์คํํ๋ค. ์๋ธ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ด์ฉํด INSERT๋ฌธ์ด ์คํ๋๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด ์๋์ผ๋ก ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๊ฐ INSERT๋๋ค.
CREATE TABLE COPY_EMP AS SELECT EMPNO, ENAME FROM EMP WHERE 1=2; INSERT INTO COPY_EMP (EMPNO, ENAME) SELECT EMPNO, ENAME FROM EMP; SELECT * FROM COPY_EMP;
์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ๋ณด๋ฉด, EMPํ ์ด๋ธ์์ ์ ๋์ปฌ๋ผ๋ง ๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ๋ณต์ฌํด์์ ์ ํ ์ด๋ธ์ ๋ง๋ ๋ค. ๊ทธ ๋ค์ EMP์ ๋ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ํ ์ด๋ธ ์์ ๊ทธ๋๋ก ๋ฃ๋๋ค. ํญ์ ์๋ธ์ฟผ๋ฆฌ ์คํ๊ฒฐ๊ณผ์ INTO์ ์ปฌ๋ผ ๊ฐ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ ๊ฒ.
๋ค์ค ํ ์ด๋ธ์ ๋ํ ๋ค์คํ INSERT ๋ฌธ
ํ๋ฒ์ INSERT๋ก ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
๋ฌด์กฐ๊ฑด INSERT ALL
์กฐ๊ฑด INSERT ALL
์กฐ๊ฑด INSERT FIRST
๋ฌด์กฐ๊ฑด INSERT ALL
ํ๋ฒ์ ๋ค์คํ ์ด๋ธ์ ๋ค์ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
ํน๋ณํ ์กฐ๊ฑด ์์ด ์ฌ๋ฌํ ์ด๋ธ์ ์ ์ฅ์ด ๋๋ค.
when์ ์กฐ๊ฑด์์ ์๋ตํ๋ ๊ฒฝ์ฐ(์กฐ๊ฑด์ด ์์)๋ฅผ ๋ฌด์กฐ๊ฑด INSERT ALL ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ INTO์ ์์ ์ง์ ํ ํ ์ด๋ธ1๊ณผ ํ ์ด๋ธ2์ ์๋์ผ๋ก INSERT๋๋ค.
๋จผ์ ์๋ธ์ฟผ๋ฆฌ์์ ํ์ํ ์๋ฃ๋ฅผ ๋ค ๋ฝ์์ค๊ณ
INSERT๋ฌธ์์ ํ์ํ ์ปฌ๋ผ๋ค์ ํ ์ด๋ธ ๊ฐ๊ฐ์ ๋ฐ๋ก ์ ์ด์ค๋ค.
๋ฐธ๋ฅ ์ ์ ์ฌ์ฉ๋ ์ปฌ๋ผ๋ช ๊ณผ ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋ ์ปฌ๋ผ๋ช ์ด ๋ฐ๋์ ๋์ผํด์ผ๋๋ค.
-- ํ ์ด๋ธ 2๊ฐ ๋จผ์ ์์ฑ CREATE TABLE SAL_HISTORY AS SELECT EMPNO, HIREDATE, SAL FROM EMP WHERE 1=2; CREATE TABLE MGR_HISTORY AS SELECT EMPNO, MGR, SAL FROM EMP WHERE 1=2; -- ๋ฐ์ดํฐ ์ ๋ ฅ INSERT ALL INTO SAL_HISTORY VALUES (EMPNO, HIREDATE, SAL) INTO MGR_HISTORY VALUES (EMPNO, MGR, SAL) SELECT EMPNO, HIREDATE, SAL, MGR FROM EMP; -- ๋ฐ์ดํฐ๊ฐ ์ ๋ค์ด๊ฐ๋์ง ํ์ธ SELECT * FROM SAL_HISTORY; SELECT * FROM MGR_HISTORY;
์กฐ๊ฑด INSERT ALL
WHEN์ ์์ ์ง์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ง INSERTํ๋ ๋ฐฉ๋ฒ
-- ๋๋์ผ๋ก ์ด๋ฏธ ์์ฑ๋์ด ์๋ ํ ์ด๋ธ์ ๋จผ์ ์ญ์ ํด์ค์ผ ๋ค์ ์์ ์ฐ์ต์ ํ ์์์ DROP TABLE SAL_HISTORY; DROP TABLE MGR_HISTORY; -- ํ ์ด๋ธ ์์ฑ CREATE TABLE SAL_HISTORY AS SELECT EMPNO, HIREDATE, SAL FROM EMP WHERE 1=2; CREATE TABLE MGR_HISTORY AS SELECT EMPNO, MGR, SAL FROM EMP WHERE 1=2; -- ์กฐ๊ฑด์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ์ ์ฅ INSERT ALL WHEN SAL < 2500 THEN INTO SAL_HISTORY VALUES(EMPNO, HIREDATE, SAL) WHEN SAL > 2500 THEN INTO MGR_HISTORY VALUES (EMPNO, MGR, SAL) SELECT EMPNO, HIREDATE, SAL, MGR FROM EMP; -- ํ์ธ SELECT * FROM SAL_HISTORY; SELECT * FROM MGR_HISTORY;
์กฐ๊ฑด INSERT FIRST
WHEN ์ ์ ์ง์ ๋ ์กฐ๊ฑด์ด ์ค๋ณต๋๋ ๊ฒฝ์ฐ์ ์ฒซ๋ฒ์งธ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ ์ด๋ธ๋ง ์ ์ฅ๋๊ณ ์ดํ์๋ ์กฐ๊ฑด์ด ์ผ์นํด๋ ํ ์ด๋ธ์ ์ ์ฅ๋์ง ์๋ ๋ฐฉ๋ฒ. INSERT ALL ์ INSERT FIRST๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
DROP TABLE SAL_HISTORY; DROP TABLE MGR_HISTORY; -- ํ ์ด๋ธ 3๊ฐ ์์ฑ CREATE TABLE SAL_HISTORY AS SELECT EMPNO, HIREDATE, SAL FROM EMP WHERE 1=2; CREATE TABLE MGR_HISTORY AS SELECT EMPNO, MGR, SAL FROM EMP WHERE 1=2; CREATE TABLE TEST_HISTORY AS SELECT EMPNO, SAL FROM EMP WHERE 1=2; -- ๋ฐ์ดํฐ ์ ์ฅ INSERT FIRST WHEN SAL=800 THEN INTO SAL_HISTORY VALUES(EMPNO, HIREDATE, SAL) WHEN SAL <2500 THEN INTO MGR_HISTORY VALUES (EMPNO, MGR, SAL) ELSE INTO TEST_HISTORY VALUES (EMPNO, SAL) SELECT EMPNO, HIREDATE, SAL, MGR FROM EMP; -- sal 800์ ๋๊ฐ์ง ์กฐ๊ฑด์ ์ค๋ณต๋์ด ๋ ํ ์ด๋ธ์ ๋์์ ๋ค์ด๊ฐ ์ ์๋ค. -- INSERT FIRST๋ฅผ ์ฌ์ฉํ๋ฉด sal 800์ ์ฒซ๋ฒ์งธ ์กฐ๊ฑด์๋ง ์ ์ฅ๋๋ค. -- ELSE๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ ๋ฐ์ ๋ฐ์ดํฐ๋ ์ ๋ฆฌํ ์ ์๋ค. SELECT * FROM SAL_HISTORY; -- ์๊ธ์ด 800 ์ธ ์ ๋ง ์ฌ๊ธฐ ๋ค์ด๊ฐ๊ณ SELECT * FROM MGR_HISTORY; -- 2500 ๋ณด๋ค ๋ฎ์ ์ ๋ค์ ์ฌ๊ธฐ SELECT * FROM TEST_HISTORY; -- ๊ทธ๋ฐ์ ์ ๋ค์ ๋ค ์ฌ๊ธฐ.
UPDATE
ํ ์ด๋ธ์ ์ ์ฅ๋ ํ๋ค์ ์์ ํ๋ ๋ช ๋ น์ด๋ค.
ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ ํ์ ์ ๋ฐ์ดํธ ๊ฐ๋ฅ.
UPDATE DEPT SET DNAME = '๊ฒฝ๋ฆฌ๊ณผ', LOC = '๋ถ์ฐ' WHERE DEPTNO = 90; SELECT * FROM DEPT;
DEPT ํ ์ด๋ธ์์ WHERE ์กฐ๊ฑด์ ํด๋น๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ์ SET ์ ์ ์ ํ๋๋ก ์์ ํ๋ค.
WHERE๊ฐ ๋น ์ ธ๋ฒ๋ฆฌ๋ฉด ์ด ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ ์ฒด๊ฐ ์์ ๋๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ถ๋ถ๋ง ์กฐ๊ฑด์ ์ก๊ณ ์์ ํด์ผํ๋ค
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ณต์ ์ปฌ๋ผ ๋ณ๊ฒฝ UPDATE EMP SET JOB = (SELECT JOB FROM EMP WHERE EMPNO =7900), SAL = (SELECT SAL FROM EMP WHERE EMPNO =7844) WHERE EMPNO = 9001; SELECT * FROM EMP;
set์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ปฌ๋ผ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค
MYDEPTํ ์ด๋ธ์์ ๋ถ์๋ฒํธ๊ฐ 60์ธ ์ฌ์์ ๋ถ์๋ช ์ DEPT ํ ์ด๋ธ์ ๋ถ์๋ฒํธ๊ฐ 10์ธ ๋ถ์์ ๋ถ์๋ช ์ผ๋ก ์์ ํ๊ณ ๋ถ์์์น๋ DEPT์์ ๋ถ์๋ฒํธ๊ฐ 20์ธ ๋ถ์์์น๋ก ์์ UPDATE MYDEPT SET DNAME = (SELECT DEPTNO FROM DEPT WHERE DEPTNO = 10), LOC = (SELECT LOC FROM DEPT WHERE DEPTNO = 20) WHERE DEPTNO = 60;
์๋ธ์ฟผ๋ฆฌ๋ SET ์ ์ ์จ์ฃผ๊ณ ์ ๋ฐ์ดํธ ๋ฌธ ์์ฒด์ WHERE ์กฐ๊ฑด์ ์ ๋ฌ์์ฃผ๋ ๊ฑฐ ์์ง๋ง๊ธฐ.
DELETE
ํ ์ด๋ธ์ ์ ์ฅ๋ ํ๋ค์ ์ญ์ ํ๋ ๋ช ๋ น๋ฌธ
DELETE [FROM] TABLE [WHERE ์กฐ๊ฑด];
WHERE์ ์ ์กฐ๊ฑด์ ์ง์ ํด์ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ๋ค๋ง ์ญ์ ํ๋ค.
์กฐ๊ฑด์์ด ์์ผ๋ฉด ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ ์ฃผ์ํด์ผ ํ๋ค.
DELETE FROM DEPT WHERE DEPTNO =91; SELECT * FROM DEPT; -- ์๋ธ์ฟผ๋ฆฌ ๋ฐ ๋ค๋ฅธ ํ ์ด๋ธ ๊ธฐ๋ฐ์ ์ด์ฉํ ๋ฐ์ดํฐ ์ญ์ DELETE FROM EMP WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = '๊ฒฝ๋ฆฌ๊ณผ');
DELETE๋ฌธ์ WHERE์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธ์ฟผ๋ฆฌ ์คํ๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์๋ค. ๋ค๋ฅธํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ฐ์ดํฐ ์ญ์ ๊ฐ๋ฅ!
MERGE
์ปฌ๋ผ์ ๊ตฌ์กฐ๊ฐ ๊ฐ์ 2๊ฐ์ ํ ์ด๋ธ์ ๋น๊ตํ์ฌ ํ๋์ ํ ์ด๋ธ๋ก ํฉ์น๊ธฐ ์ํ ๋ช ๋ น์ด.
MERGE INTO ํ ์ด๋ธ1 ๋ณ์นญ -- ๋ณํฉํ ๊ฒฐ๊ณผ ์ ์ฅ๋๋ ํ ์ด๋ธ๋ช ์ง์ USING (ํ ์ด๋ธ๋ช 2 | ๋ทฐ | ์๋ธ์ฟผ๋ฆฌ) ๋ณ์นญ -- ๋ณํฉํ ํ ์ด๋ธ๋ช OR์ญ์ฟผ๋ฆฌ ON (์กฐ์ธ์กฐ๊ฑด) -- INTO์ ์ ํ ์ด๋ธ๊ณผ USING์ ์ ํ ์ด๋ธ๊ฐ์ ์กฐ์ธ์กฐ๊ฑด WHEN MATCHED THEN -- ์กฐ์ธ์กฐ๊ฑด์ด ์ผ์นํ๋ฉด UPDATE ๋ฌธ์ฅ ์คํ UPDATE SET ์ปฌ๋ผ๋ช = ๊ฐ, ์ปฌ๋ผ๋ช 1=๊ฐ1 [WHERE ์กฐ๊ฑด์] [DELETE WHERE ์กฐ๊ฑด์] WHEN NOT MATCHED THEN --์กฐ์ธ์กฐ๊ฑด ์ผ์นํ์ง ์์ผ๋ฉด INSERT์คํ INSERT (์ปฌ๋ผ๋ชฉ๋ก) VALUES (๊ฐ ๋ชฉ๋ก) [WHERE ์กฐ๊ฑด์];
WHEN ์ ์ ์กฐ๊ฑด์ ์์ ๋์ ํ ์ด๋ธ์ ํด๋น ํ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด UPDATE ๊ฐ ์คํ ๋๊ณ ์กด์ฌํ์ง ์์ผ๋ฉด INSERT๊ฐ ์คํ๋๋ค.
์ ์์๊ฑฐ๋ ํ์ฌ์์ ํ๋งค ํํฉ์ ์๋ณ๋ก ๊ด๋ฆฌํ๊ณ ์ฐ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ ๋ MERGE๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
-- ํ ์ด๋ธ ์์ฑ -- 1์ํ๋งค์ ๋ณด CREATE TABLE PT_01 (ํ๋งค๋ฒํธ VARCHAR2(8), ์ ํ๋ฒํธ NUMBER, ์๋ NUMBER, ๊ธ์ก NUMBER); -- 2์ ํ๋งค์ ๋ณด CREATE TABLE PT_02 (ํ๋งค๋ฒํธ VARCHAR2(8), ์ ํ๋ฒํธ NUMBER, ์๋ NUMBER, ๊ธ์ก NUMBER); -- ํตํฉ ํ๋งค์ ๋ณด CREATE TABLE P_TOTAL (ํ๋งค๋ฒํธ VARCHAR2(8), ์ ํ๋ฒํธ NUMBER, ์๋ NUMBER, ๊ธ์ก NUMBER); -- ๋ฐ์ดํฐ ์ ๋ ฅ INSERT INTO PT_01 VALUES ('20150101', '1000', 10, 500); INSERT INTO PT_01 VALUES ('20150102', '1000', 10, 400); INSERT INTO PT_01 VALUES ('20150103', '1000', 10, 300); INSERT INTO PT_02 VALUES ('20150201', '1000', 5, 500); INSERT INTO PT_02 VALUES ('20150202', '1000', 5, 400); INSERT INTO PT_02 VALUES ('20150203', '1000', 5, 300); COMMIT; -- ๋ณํฉ MERGE INTO P_TOTAL TOTAL -- ๋ณํฉ๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์ํ ํตํฉํ ์ด๋ธ USING PT_01 P01 ON (TOTAL.ํ๋งค๋ฒํธ = P01.ํ๋งค๋ฒํธ) WHEN MATCHED THEN UPDATE SET TOTAL.์ ํ๋ฒํธ = P01.์ ํ๋ฒํธ WHEN NOT MATCHED THEN INSERT VALUES (P01.ํ๋งค๋ฒํธ, P01.์ ํ๋ฒํธ, P01.์๋, P01.๊ธ์ก); MERGE INTO P_TOTAL TOTAL USING PT_02 P02 ON (TOTAL.ํ๋งค๋ฒํธ = P02.ํ๋งค๋ฒํธ) WHEN MATCHED THEN UPDATE SET TOTAL.์ ํ๋ฒํธ = P02.์ ํ๋ฒํธ WHEN NOT MATCHED THEN INSERT VALUES (P02.ํ๋งค๋ฒํธ, P02.์ ํ๋ฒํธ, P02.์๋, P02.๊ธ์ก); -- ํ์ธ SELECT * FROM P_TOTAL;
์๋ณ ํ ์ด๋ธ๊ณผ ํตํฉ ํ ์ด๋ธ์ ์กฐ์ธ์กฐ๊ฑด์ ON์ ์ ์ด ํ๋งค๋ฒํธ์ธ๋ฐ, ํตํฉํ ์ด๋ธ์ ์๋ฌด๊ฒ๋ ๋ค์ด์์ง ์๊ธฐ ๋๋ฌธ์ ๋ ํ ์ด๋ธ๊ฐ ์ผ์นํ๋๋ฐ์ดํฐ๊ฐ ํ๋๋ ์๋ ์ํ์ด๋ค. ๋ฐ๋ผ์ WHEN NOT MATCHED์ INSERT๋ฌธ์ด ์คํ๋๋ค.
์คํ ๊ฒฐ๊ณผ ํ ํ ํ ์ด๋ธ์ ์๋ณ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
๋ง์ฝ ์๋ณ ๋ฐ์ดํฐ๊ฐ ์๋ชป๋์ด ์์ ํด์ผํ๋ ์ํฉ์ด๋ผ๋ฉด ํ ํ ํ ์ด๋ธ๊ณผ ๋ค์ ๋ณํฉํ ๋ WHEN์ ์กฐ๊ฑด์ด ์ผ์นํด์ UPDATE๋ฌธ์ด ์คํ๋๋ค.
CREATE TABLE EMP_M2 AS SELECT EMPNO, JOB, SAL FROM EMP WHERE 1=2; MERGE INTO EMP_M2 M2 USING EMP B ON (M2.EMPNO = B.EMPNO) WHEN MATCHED THEN UPDATE SET M2.JOB = B.JOB, M2.SAL = B.SAL WHERE B.JOB='CLERK' -- ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํ ์ ์๋ค WHEN NOT MATCHED THEN INSERT(M2.EMPNO, M2.JOB, M2.SAL) VALUES (B.EMPNO, B.JOB, B.SAL) WHERE B.JOB='CLERK'; -- ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํ ์ ์๋ค SELECT * FROM EMP_M2;
CREATE TABLE EMP_M3 AS SELECT EMPNO, JOB, SAL FROM EMP; MERGE INTO EMP_M3 M3 USING EMP B ON (M3.EMPNO = B.EMPNO) WHEN MATCHED THEN UPDATE SET M3.JOB = B.JOB, M3.SAL = B.SAL + 1000 DELETE WHERE (M3.JOB='CLERK') -- MERGE UPDATE๋ฌธ์ DELETE๋ฌธ์ ํฌํจํ ์ ์๋ค. WHEN NOT MATCHED THEN INSERT(M3.EMPNO, M3.JOB, M3.SAL) VALUES (B.EMPNO, B.JOB, B.SAL+500); SELECT * FROM EMP_M3;
ํธ๋์ญ์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์
ํธ๋์ญ์ ๋์์ด ๋๋ SQL ๋ฌธ์ DML๋ฌธ์ด๋ค.
— ์ ๋ ํธ๋ฌธ์ ์ง์ ์ ํธ๋์ญ์ ๋์ ์๋์ง๋ง SELECT * FROM EMP FOR UPDATE; ๋ฑ์ ๋ฌธ์ฅ์ ๋์์ด ๋ ์ ์๋ค.
DML๋ช ๋ น์ด ์์๋๋ฉด(์ถ๊ฐ,์์ ,์ญ์ ์ด๊ฒ๋ค์) ํธ๋์ญ์ ๊ณผ์ ์ด ์๋๋ฐ์๋๋ฉฐ ๋ฐ๋์ ํธ๋์ญ์ ์ข ๋ฃํด์ค์ผ ํ๋ค.
ํธ๋์ญ์ ์ ALL(์ ์์ฒ๋ฆฌ ๋์ด ๋๋ ์ํ) or NOTHING(์์๋ณต๊ตฌ ๋์ด ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์์ ์ํ) ์ด๋ค. ์์ ๋จ์๋ฅผ ์ ๋ถ ์ ์ฉํ๊ฑฐ๋ ์ ๋ถ ์ทจ์ํ๋ค.
ํธ๋์ญ์ ์ด ์คํ๋ ๋ค์์ ๋ง์ง๋ง์ ์ปค๋ฐ(๋ฐ์)์ ํ ๊ฑฐ๋ ๋กค๋ฐฑ(์์๋ณต๊ตฌ)์ ํ ๊ฑฐ๋ ๋ช ๋ น์ ์ค์ผํ๋ค. ์๊ฒ TCL๋ฌธ์ฅ์ด๋ค.(ํธ๋์ญ์ ์ ์ด ๋ช ๋ น์ด)
์ผ๋จ DML๋ฌธ์ ์์ฑํ๊ณ ์ ๋ ํธ๋ก ํ์ธ๋ ๊ฒฐ๊ณผ๋ ๋๋ง ๋ณผ ์ ์๋ค.
์ปค๋ฐ์ ๋ ๋ฆฌ๊ธฐ ์ ๊น์ง ๋๋ง๋ณด๋ ์๋ฃ๋ค.
๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง๋ ๋ชจ๋ ์์์ ์ธ ์ํ๋ค.
๋ณ๊ฒฝ๋ ํ์ LOCK์ํ๊ฐ ๋๋ฉฐ ํธ๋์ญ์ ์ข ๋ฃ ํ ์ ๊ธ์ด ํด์ ๋๋ค.
๋ฐ์ดํฐ ์ผ๊ด์ฑ
์ฌ์ฉ์๋ค์๊ฒ ๊ฐ์ฅ ์ต๊ทผ์ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋ค.
๋ค๋ฅธ ์ฌ์ฉ์๋ค์ด ๋ณ๊ฒฝ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์ฌ์ฉ์์ ๋ณ๊ฒฝํ๋ ์ฌ์ฉ์๋ค ์ฌ์ด์ ์ผ๊ด์ ์ธ ๊ด์ ์ ์ ๊ณตํ๋ค.
TCL ํธ๋์ญ์ ์ ์ด ๋ช ๋ น์ด
COMMIT
๋ชจ๋ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ตฌ ๋ฐ์ํ๋ค.
SAVEPOINT
์งํ์ค์ธ ํธ๋์ญ์ ์ ํน์ ์ด๋ฆ์ผ๋ก ์ง์ ํ๋ ๋ช ๋ น์ด. ์ฑ ๊ฐํผ ๊ธฐ๋ฅ์ด๋ค.
ํ๋์ DML ๋ค์์ 'SAVEPOINT ์ด๋ฆ' ์ด๋ ๊ฒ ์ง์ ํด๋๋ฉด ๋์ค์ ๋กค๋ฐฑ์ ํ๋๋ผ๋ ํน์ ์์ ๋ง ์ทจ์ํ ์ ์๋ค.
ROLLBACK
๋ชจ๋ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ๊ณ ๋ณ๊ฒฝ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๋ค.
LOCK ๊ฒฝํฉ
DML ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ๋์ ํธ๋์ญ์ ์ ์ข ๋ฃ์์ผ์ผ ํ๋ค.
A์ฌ์ฉ์์ B์ฌ์ฉ์๊ฐ ๋์์ ํ ์ด๋ธ์ ํน์ ๋ ์ฝ๋๋ฅผ ์์ ํ๋ค๊ณ ํ์. A๊ฐ ๋จผ์ ์คํํ์ ๊ฒฝ์ฐ ์๊ฐ ํธ๋์ญ์ ์ ๋ช ์์ ์ผ๋ก ์ข ๋ฃํ์ง ์์ผ๋ฉด B์ ๋ช ๋ น์ ์คํ๋์ง ์๊ณ ๋ฌดํ ๋๊ธฐํ๊ฒ ๋๋ค. ์ด๋ฐ ์ํฉ์ LOCK๊ฒฝํฉ์ด๋ผ๊ณ ํ๋ฉฐ ๋ฌดํ๋๊ธฐ๋ ์ค๋ผํด์ ์ฑ๋ฅ์ ๊ฐ์์ํค๋๊น ์ฃผ์ํ ๊ฒ.
๐ NEXT : SQL DDL ๊ณต๋ถํ๊ธฐ
๋ฐ์ํ'DATABASE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL - ๋ทฐ, ์ํ์ค, ์ธ๋ฑ์ค, ์ฌ์ฉ์ ๊ด๋ฆฌ (0) 2020.07.25 SQL - DDL ๋ช ๋ น์ด, ํ ์ด๋ธ ์์ฑ ์ ์ฝ์กฐ๊ฑด (0) 2020.07.24 SQL ์กฐ์ธ, ์๋ธ์ฟผ๋ฆฌ ์ฐ์ต๋ฌธ์ ํ์ด๋ณด๊ธฐ (0) 2020.07.22 SQL - Join, ์๋ธ์ฟผ๋ฆฌ (0) 2020.07.21 SQL - ๊ทธ๋ฃนํจ์, GROUP BY์ , HAVING์ (0) 2020.07.20