๐โโ๏ธ DML(Data Manipulation Language)์ด๋,
๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ์ธ์ด๋ก์จ, ํ ์ด๋ธ์ ๊ฐ์ ์ฝ์ ํ๊ฑฐ๋ ์์ ํ๊ฑฐ๋ ์ญ์ ํ๊ฑฐ๋ ์กฐํ(SELECT)ํ๋ ์ธ์ด
- INSERT, UPDATE, DELETE์ SELECT๊น์ง DML์ ํฌํจ
๐โโ๏ธ INSERT(์ฝ์ )๋,
์๋ก์ด ํ์ ์ถ๊ฐํ๋ ๊ตฌ๋ฌธ์ผ๋ก, ํ ์ด๋ธ์ ํ ๊ฐฏ์๊ฐ ์ฆ๊ฐ
INSERT INTO ํ
์ด๋ธ๋ช
(์ปฌ๋ผ๋ช
, ์ปฌ๋ผ๋ช
, ...) VALUES (๋ฐ์ดํฐ, ๋ฐ์ดํฐ, ...);
INSERT INTO ํ
์ด๋ธ๋ช
VALUES (๋ฐ์ดํฐ, ๋ฐ์ดํฐ, ...);
INSERT
INTO EMPLOYEE
(
EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE, DEPT_CODE, JOB_CODE, SAL_LEVEL,
SALARY, BONUS, MANAGER_ID, HIRE_DATE, ENT_DATE, ENT_YN
)
VALUES
(
'900', '์ฅ์ฑํ', '901123-2080503', 'jang_ch@greedy.com', '01055691254',
'D1', 'J7', 'S3', 4300000, 0.2, '200', SYSDATE, NULL, DEFAULT
);
๐ Ref.
* DEFAULT : ๋ฐ๋ก ๊ฐ์ ์
๋ ฅํ์ง์๊ณ 'N'์ด๋ผ๋ ENT_YN์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ง์
CREATE TABLE EMP_01 ( -- ํ
์คํธ์ฉ ํ
์ด๋ธ
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
INSERT
INTO EMP_01
(
EMP_ID
, EMP_NAME
, DEPT_TITLE
)
(
SELECT >>> VALUES ๋์ SELECT ๊ตฌ๋ฌธ (SELECT๋ก ์กฐํํ 24๊ฐ ํ์ ํ๊บผ๋ฒ์ ์ฝ์
)
EMP_ID
, EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
);
INSERT์์ ์ฌ์ฉํ๋ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ INSERT ALL์ ์ด์ฉํ์ฌ ํ ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ ์ ์์
(๋จ, ์๋ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ด ๊ฐ์์ผํจ)
CREATE TABLE EMP_DEPT_D1
AS
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
FROM EMPLOYEE
WHERE 1 = 0;
>>> 1 = 0์ด๋ผ๋ FALSE ์กฐ๊ฑด์ ๋ฃ์ด ํ๋ค์ ์ ์ธํ ๊ตฌ์กฐ๋ง ๋ณต์ฌ (์๋์ ์ผ๋ก ํ ์ถ๋ ฅX)
CREATE TABLE EMP_MANAGER
AS
SELECT
EMP_ID
, EMP_NAME
, MANAGER_ID
FROM EMPLOYEE
WHERE 1 = 0;
INSERT ALL
INTO EMP_DEPT_D1
VALUES >>> ์๋์ SELECT๊ตฌ๋ฌธ์์ ๊ฐ์ ธ์ด
(
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
)
INTO EMP_MANAGER
VALUES >>> ์๋์ SELECT๊ตฌ๋ฌธ์์ ๊ฐ์ ธ์ด
(
EMP_ID
, EMP_NAME
, MANAGER_ID
)
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';
๐โโ๏ธ UPDATE(์์ )๋,
ํ ์ด๋ธ์ ๊ธฐ๋ก ๋ ์ปฌ๋ผ์ ๊ฐ์ ์์ ํ๋ ๊ตฌ๋ฌธ (ํ ์ด๋ธ์ ์ ์ฒด ํ ๊ฐฏ์๋ ๋ณํ X)
UPDATE ํ ์ด๋ธ๋ช SET ์ปฌ๋ผ๋ช = ๋ฐ๊ฟ๊ฐ, ์ปฌ๋ผ๋ช = ๋ฐ๊ฟ๊ฐ, ... [WHERE ์ปฌ๋ผ๋ช ๋น๊ต์ฐ์ฐ์ ๋น๊ต๊ฐ];
UPDATE
DEPT_COPY >>> ํ
์ด๋ธ๋ช
SET DEPT_TITLE = '์ ๋ต๊ธฐํํ' >>> ์ฌ๊ธฐ์ ์คํํ๋ฉด ๋ค ์ ๋ต๊ธฐํํ์ผ๋ก ๋ณ๊ฒฝ๋จ
WHERE DEPT_ID = 'D9'; >>> DEPT_ID D9 ํ๋ง ๋ฐ๊พธ๋ ์กฐ๊ฑด์ ๋ฌ์์ค
UPDATE ํ
์ด๋ธ๋ช
SET ์ปฌ๋ผ๋ช
= (์๋ธ์ฟผ๋ฆฌ)
-- ๋ฐฉ๋ช
์ ์ฌ์์ ๊ธ์ฌ์ ๋ณด๋์ค์จ์ ์ ์ฌ์ ์ฌ์๊ณผ ๋์ผํ๊ฒ ๋ณ๊ฒฝ
UPDATE
EMP_SALARY
SET (SALARY, BONUS) = (SELECT >>> ์ ์ฌ์์ ๊ธ์ฌ์ ๋ณด๋์ค๋ฅผ ์กฐํํ๋ ์๋ธ์ฟผ๋ฆฌ
SALARY
, BONUS
FROM EMP_SALARY
WHERE EMP_NAME = '์ ์ฌ์'
)
WHERE EMP_NAME = '๋ฐฉ๋ช
์';
-- ์์์ ๊ทผ๋ฌด ์ง์ญ์ ๊ทผ๋ฌดํ๋ ์ง์์ ๋ณด๋์ค๋ฅผ 0.5๋ก ๋ณ๊ฒฝํ๋ UPDATE ๊ตฌ๋ฌธ ์์ฑ
UPDATE
EMP_SALARY ES
SET ES.BONUS = 0.5
WHERE ES.EMP_ID IN (SELECT
E1.EMP_ID
FROM EMPLOYEE E1
JOIN DEPARTMENT D1 ON (D1.DEPT_ID = E1.DEPT_CODE)
JOIN LOCATION L1 ON (L1.LOCAL_CODE = D1.LOCATION_ID)
WHERE L1.LOCAL_NAME LIKE 'ASIA%'
);
UPDATE์, ๋ณ๊ฒฝ ๊ฐ์ ํด๋น ์ปฌ๋ผ์ ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐฐ๋์ง ์์์ผ ํจ
-- EMPLOYEE ํ
์ด๋ธ์ DEPT_CODE์ ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
ALTER TABLE EMPLOYEE ADD FOREIGN KEY (DEPT_CODE) REFERENCES DEPARTMENT (DEPT_ID);
>>> DEPARTMENT ํ
์ด๋ธ์ DEPT_ID๋ก์ ์กด์ฌํ์ง ์๋ ๊ฐ์ผ๋ก UPDATE x
>>> ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด์ ์๋ฐฐ (๋ถ๋ชจํค ์์)
UPDATE
EMPLOYEE
SET DEPT_CODE = '20'
WHERE DEPT_CODE = 'D6';
>>> NOT NULL ์ ์ฝ ์กฐ๊ฑด ์๋ฐฐ
UPDATE
EMPLOYEE
SET EMP_NAME = NULL
WHERE EMP_ID = '200';
>>> NULL๋ก ("C##EMPLOYEE"."EMPLOYEE"."EMP_NAME")์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค ์ค๋ฅ
>>> (NOT NULL ์ค์ ๋์ด์๊ธฐ๋๋ฌธ)
๐โโ๏ธ DELETE(์ญ์ )๋,
ํ ์ด๋ธ์ ํ์ ์ญ์ ํ๋ ๊ตฌ๋ฌธ (ํ ์ด๋ธ์ ํ์ ๊ฐฏ์๊ฐ ์ค์ด๋ฌ)
DELETE FROM ํ ์ด๋ธ๋ช WHERE ์กฐ๊ฑด
- ๋ง์ฝ WHERE์ ๋ก ์กฐ๊ฑด์ ์ค์ ํ์ง์์ผ๋ฉด ๋ชจ๋ ํ์ด ๋ค ์ญ์ ๋จ
DELETE
FROM EMPLOYEE
WHERE EMP_NAME = '์ฅ์ฑํ';
>>> ์ด ํ ์ญ์ (ํ์ธ ์, ํ 23๊ฐ ๋จ์์์)
FK ์ ์ฝ ์กฐ๊ฑด์ด ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ, ์ฐธ์กฐ ๋๊ณ ์๋ ๊ฐ ๋ํด์๋ ์ญ์ ๋ถ๊ฐ
(์ฐธ์กฐ ๋๊ณ ์์ง ์๋ ๊ฐ์ ๋ํด์๋ ์ญ์ ๊ฐ๋ฅ)
DELETE
FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
>>> ์ญ์ ๋ถ๊ฐ. D1์ ์ฌ์ฉํ๊ณ ์๋ ์์ ๋ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก
>>> '๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด(C##EMPLOYEE.SYS_C008099)์ด ์๋ฐฐ๋์์ต๋๋ค- ์์ ๋ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค' ์ค๋ฅ
>>> FK ์ ์ฝ ์กฐ๊ฑด์ด ์ค์ ๋์ด ์์ด๋ ์ฐธ์กฐ ๋๊ณ ์์ง ์๋ ๊ฐ์ ๋ํด์๋ ์ญ์ ๊ฐ๋ฅ
DELETE
FROM DEPARTMENT
WHERE DEPT_ID = 'D3';
๐โโ๏ธ TRUNCATE ๋,
ํ ์ด๋ธ์ ์ ์ฒด ํ์ ์ญ์ ํ ์ ์ฌ์ฉ
- DELETE๋ณด๋ค ์ํ ์๋๊ฐ ๋ ๋น ๋ฅด๋ฉฐ ROLLBACK์ ํตํด ๋ณต๊ตฌ X
-- ํ์ฌ ์์ ์ ์ฅ
COMMIT;
DELETE
FROM EMP_SALARY;
SELECT
ES.*
FROM EMP_SALARY ES;
ROLLBACK;
TRUNCATE TABLE EMP_SALARY;
-- 'Table EMP_SALARY์ด(๊ฐ) ์๋ ธ์ต๋๋ค.' ์ถ๋ ฅ
>>> DELETE์ ๋ฌ๋ฆฌ ROLLBACK์ผ๋ก ๋ณต๊ตฌ ๋ถ๊ฐ
ROLLBACK;
>>> ROLLBACKํด์ ์กฐํํด๋ด๋ ํ์ ๋ณต๊ตฌ๋์ง์์
๐โโ๏ธ MERGE(๋ณํฉ)๋,
๊ตฌ์กฐ๊ฐ ๊ฐ์ ๋ ๊ฐ์ ํ ์ด๋ธ์ ํ๋๋ก ํฉ์น๋ ๊ธฐ๋ฅ
ํ ์ด๋ธ์์ ์ง์ ํ๋ ์กฐ๊ฑด์ ๊ฐ์ด ์กด์ฌํ๋ฉด UPDATE(์์ ), ์กฐ๊ฑด์ ๊ฐ์ด ์์ผ๋ฉด INSERT(์ฝ์ )๋จ
MERGE INTO ๋ณํฉํ ํ ์ด๋ธ USING ์ด์ฉํ ํ ์ด๋ธ ON (๊ธฐ์ค) WHEN MATCHED THEN UPDATE SET ์ผ์นํ๋๊ฒ๋งค์นญ WHEN NOT MATCHED THEN INSERT (๋ณํฉํ ํ ์ด๋ธ์ปฌ๋ผ๋ช ) VALUES (์ด์ฉํ ํ ์ด๋ธ์ปฌ๋ผ๋ช )
MERGE
INTO EMP_M01 M1
USING EMP_M02 M2
ON (M1.EMP_ID = M2.EMP_ID) -- EMP_ID๊ฐ ๊ฐ์ ๊ฒ๋ผ๋ฆฌ ๋ณํฉ
WHEN MATCHED THEN
UPDATE
SET M1.EMP_NAME = M2.EMP_NAME -- EMP_ID๊ฐ ์ด๋ฏธ ๊ธฐ์ค์ด๋ฏ๋ก ์ฌ๊ธฐ์๋ ์ํ์ง X
, M1.EMP_NO = M2.EMP_NO
, M1.EMAIL = M2.EMAIL
, M1.PHONE = M2.PHONE
, M1.DEPT_CODE = M2.DEPT_CODE
, M1.JOB_CODE = M2.JOB_CODE
, M1.SAL_LEVEL = M2.SAL_LEVEL
, M1.SALARY = M2.SALARY
, M1.BONUS = M2.BONUS
, M1.MANAGER_ID = M2.MANAGER_ID
, M1.HIRE_DATE = M2.HIRE_DATE
, M1.ENT_DATE = M2.ENT_DATE
, M1.ENT_YN = M2.ENT_YN
WHEN NOT MATCHED THEN
INSERT
(
M1.EMP_ID, M1.EMP_NAME, M1.EMP_NO, M1.EMAIL, M1.PHONE
, M1.DEPT_CODE, M1.JOB_CODE, M1.SAL_LEVEL, M1.SALARY, M1.BONUS
, M1.MANAGER_ID, M1.HIRE_DATE, M1.ENT_DATE, M1.ENT_YN
)
VALUES
(
M2.EMP_ID, M2.EMP_NAME, M2.EMP_NO, M2.EMAIL, M2.PHONE
, M2.DEPT_CODE, M2.JOB_CODE, M2.SAL_LEVEL, M2.SALARY, M2.BONUS
, M2.MANAGER_ID, M2.HIRE_DATE, M2.ENT_DATE, M2.ENT_YN
);
๐โโ๏ธ ํธ๋์ญ์ (Transaction)์ด๋,
ํ๊บผ๋ฒ์ ์ํ๋์ด์ผํ ์ต์์ ์์ ๋จ์ ๋ฐ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์(Logical Unit of Work : LUW)
- ํ๋์ ํธ๋์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์์ ์ ๋ฐ๋์ ํ๊บผ๋ฒ์ ์๋ฃ(COMMIT) ๋์ด์ผํ๋ฉฐ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ํ๊บผ๋ฒ์ ์ทจ์(ROLLBACK)๋์ด์ผํจ
๐โโ๏ธ COMMIT์ด๋,
ํธ๋์ญ์ ์์ ์ด ์ ์ ์๋ฃ ๋๊ณ ๋๋ฉด ๋ณ๊ฒฝ ๋ด์ฉ์ ์๊ตฌํ ์ ์ฅ
- DML(INSERT, UPDATE, DELETE) ๊ตฌ๋ฌธ์ ๋ฐ๋์ COMMIT์ ํด์ผ ์ต์ข ์ ์ผ๋ก ๋ฐ์ ๐ฅ์ค์๐ฅ
๐โโ๏ธ ROLLBACK์ด๋,
ํธ๋์ญ์ ์์ ์ ์ทจ์ํ๊ณ ์ต๊ทผ COMMITํ ์์ ์ผ๋ก ์ด๋
๐โ ์ ๊น ! ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ SAVEPOINT๋ ์์๋ด ์๋ค !
SAVEPOINT ์ธ์ด๋ธํฌ์ธํธ๋ช
: ํ์ฌ ํธ๋์ ์ ์์ ์์ ์ ์ด๋ฆ์ ์ ํด์ค. ํ๋์ ํธ๋์ ์ ์์์ ๊ตฌ์ญ์ ๋๋ROLLBACK TO ์ธ์ด๋ธํฌ์ธํธ๋ช
: ํธ๋์ ์ ์์ ์ ์ทจ์ํ๊ณ SAVEPOINT ์์ ์ผ๋ก ์ด๋
CREATE TABLE TBl_USER(
USERNO NUMBER UNIQUE,
ID VARCHAR2(20) PRIMARY KEY,
PASSWORD CHAR(20) NOT NULL
);
INSERT -- ์คํ ์, ํธ๋์ญ์
์์ (์ต์ข
๋ฐ์X)
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
1, 'test1', 'pass1'
);
INSERT -- ์คํ ์, ํธ๋์ญ์
์์ (์ต์ข
๋ฐ์X)
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
2, 'test2', 'pass2'
);
INSERT -- ์คํ ์, ํธ๋์ญ์
์์ (์ต์ข
๋ฐ์X)
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
3, 'test3', 'pass3'
);
COMMIT; >>> ์ต์ข
๋ฐ์ ์๋ฃ
SELECT
UT.*
FROM TBL_USER UT;
>>> ์คํํด๋ ๋ณด์ด๊ธฐ๋ ํจ, ํธ๋์ญ์
์์
์ด ์คํ๋ ๊ฒ ๋ฟ
INSERT
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
4, 'test4', 'pass4'
);
ROLLBACK; >>> ์ปค๋ฐํ ์์ ์ผ๋ก ๋์๊ฐ 4๋ฒ์ด ์ฌ๋ผ์ง
INSERT
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
4, 'test4', 'pass4'
);
SAVEPOINT SP1;
INSERT
INTO TBL_USER
(
USERNO, ID, PASSWORD
)
VALUES
(
5, 'test5', 'pass5'
);
>>> 12345 ๋ค ์๋ ์ํ
SELECT
UT.*
FROM TBL_USER UT;
>>> ์คํ ์, 1234๋ง ์๋ ์ํ๋ก ๋์๊ฐ
ROLLBACK TO SP1;
>>> ์คํ ์, 123๋ง ์๋ ์ํ๋ก ๋์๊ฐ
ROLLBACK;