DAY05. SQL Basic DML (INSERT, UPDATE, DELETE), Sequence
๋ฐ์ดํฐ ์กฐ์์ด (DML)
- INSERT, UPDATE, DELETE : commit ๋์ (๊ตฌ์กฐ๋ณ๊ฒฝ)
- SELECT : commit ๋์ ์๋ (๋จ์ ๊ฒ์. ๊ตฌ์กฐ ๋ณ๊ฒฝ ์์)
- ๋จ์ผ query / sub query ์ด์ฉ
INSERT/UPDATE/DELETE - ๋ฉ์ธ์ฟผ๋ฆฌ
SELECT์ - 1์ฐจ ์๋ธ์ฟผ๋ฆฌ
โ
ํ ์ด๋ธ ์ญ์
DROP TABLE dept01 PURGE;
โ
ํ ์ด๋ธ ์์ฑ
CREATE TABLE DEPT01(
DEPTNO NUMBER(4),
DNAME VARCHAR2(30),
LOC VARCHAR2(20)
);
โ
1. ๋ ์ฝ๋ ์ฝ์ (insert)
1) ๊ธฐ๋ณธ qeury ์ด์ฉ
INSERT INTO dept01(deptno, dname, loc)
VALUES(10, 'ACCOUNTING', 'NEW YORK');
โ
๋ชจ๋ ์นผ๋ผ์ ์๋ฃ ์ ๋ ฅ : ์นผ๋ผ๋ช ์๋ต
INSERT INTO DEPT01
VALUES (20, 'RESEARCH', 'DALLAS');
SELECT * FROM dept01;
โ
โ
1. EMP ํ ์ด๋ธ์ 4๊ฐ ์นผ๋ผ์ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ SAM01 ํ ์ด๋ธ์ ์์ฑํ์์ค.
CREATE TABLE sam01
AS
SELECT empno, ename, job,sal FROM emp
WHERE 1=0;
โ
2. SAM01 ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์์ค.
INSERT INTO SAM01 VALUES(1000, 'APPLE', 'POLICE', 10000);
INSERT INTO SAM01 VALUES(1001, 'BANANA', 'NURSE', 15000);
INSERT INTO SAM01 VALUES(1002, 'ORANGE', 'DOCTOR', 25000);
SELECT * FROM sam01;
DESC sam01;
โ
์์์ (๋ฌต์์ ) NULL ์ ๋ ฅ
INSERT INTO dept01 (deptno, dname)
VALUES (30, 'SALES'); -- loc์นผ๋ผ ์๋ต, null๊ฐ์ด ์๋์ผ๋ก ์ฝ์
โ
โ๋ช ์์ NULL ์ ๋ ฅ
INSERT INTO dept01
VALUES (40, 'OPERATIONS', NULL);
INSERT INTO dept01
VALUES (50, '', 'CHICAGO'); -- ''์์ ๊ณต๋ฐฑ๋ ๋ฌธ์์ทจ๊ธ๋๋ฏ๋ก ๊ณต๋ฐฑ๋ ์์ด์ผํจ
SELECT*FROM dept01;
โ
โ
3. ๋ฌธ์ 1์์ ์์ฑํ SAM01 ํ ์ด๋ธ์ JOB ์นผ๋ผ์ด NULL๊ฐ์ ๊ฐ๋ 2๊ฐ์ ํ์ ์ถ๊ฐํ์์ค.
SELECT * FROM sam01;
INSERT INTO sam01 VALUES(1030, 'VERY', '', 25000);
INSERT INTO sam01 VALUES(1040, 'CAT', '', 2000);
โ
โ
2) sub query๋ฅผ ์ด์ฉํด ํ ์ด๋ธ ์ฝ์
1. ์๋ธ ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ธฐ ์ํด์ ์ฐ์ ํ ์ด๋ธ์ ์์ฑํ๋ ๋ฐ์ดํฐ๋ ๋ณต์ฌํ์ง ์๊ณ ๋น ํ ์ด๋ธ๋ง ์์ฑ
CREATE TABLE DEPT02
AS
SELECT * FROM DEPT WHERE 1=0;
โ
๋ ์ฝ๋ ์ถ๊ฐ (ASํค์๋ ์์. DDL๊ณผ DML์ ์ฐจ์ด)
INSERT INTO dept02
SELECT*FROM dept;
โ
4. ๋ฌธ์ 1์์ ์์ฑํ SAM01 ํ ์ด๋ธ์ ์๋ธ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ EMP ์ ์ ์ฅ๋ ์ฌ์ ์ค 10๋ฒ ๋ถ์ ์์์ฌ์์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์์ค.
SELECT*FROM sam01;
INSERT INTO sam01
SELECT empno, ename, job, sal
FROM emp
WHERE deptno=10;
โ
โ
โ2. ๋ค์ค ํ ์ด๋ธ์ ๋ค์ค ํ ์ ๋ ฅํ๊ธฐ
1) ๋ค์ค ํ ์ด๋ธ ์์ฑ
CREATE TABLE emp_hir
AS
SELECT empno, ename, hiredate
FROM emp
WHERE 1=0;
CREATE TABLE emp_mgr
AS
SELECT empno, ename, mgr
FROM emp
WHERE 1=0;
โ
โ2) ๋ค์ค ๋ ์ฝ๋ ์ฝ์
INSERT ALL
INTO emp_hir VALUES(empno, ename, hiredate) -- 2. ๊ฐ๊ฐ ํ
์ด๋ธ์ ๋ฟ๋ ค์ ์ฝ์
ํ ์ ์์
INTO emp_mgr VALUES(empno, ename, mgr)
SELECT empno, ename, hiredate, mgr -- 1. ์๋ธ์ฟผ๋ฆฌ์์ ์ถ๋ ฅํ ์นผ๋ผ์ ๊ฐ๊ฐ ํ
์ด๋ธ์ ๋ฟ๋ ค์ ์ฝ์
ํ ์ ์์
FROM EMP
WHERE DEPTNO=20;
SELECT * FROM emp_hir;
SELECT * FROM emp_mgr;
โ
โ
โ3. ๋ ์ฝ๋ ์์ (UPDATE)
CREATE TABLE emp01 -- empํ
์ด๋ธ์ ๋ด์ฉ+๊ตฌ์กฐ๋ฅผ ๋ชจ๋ ์ฎ๊ฒจ์ด
AS
SELECT * FROM emp;
โ
WHERE์ ์์ -> ์ ์ฒด ๋ ์ฝ๋ ์์
1. ๋ชจ๋ ์ฌ์์ ๋ถ์๋ฒํธ๋ฅผ 30๋ฒ์ผ๋ก ์์
UPDATE emp01
SET deptno=30;
โ
2. ๋ชจ๋ ์ฌ์์ ๊ธ์ฌ๋ฅผ 10% ์ธ์์ํค๋
UPDATE emp01
SET sal = sal*1.1;
โ
3. 3. ๋ชจ๋ ์ฌ์์ ์ ์ฌ์ผ์ ์ค๋๋ก ์์
UPDATE emp01
SET hiredate = sysdate;
โโ
WHERE์ ์์ -> ํน์ ๋ ์ฝ๋ ์์
1. ๋ถ์๋ฒํธ๊ฐ 10๋ฒ์ธ ์ฌ์์ ๋ถ์๋ฒํธ๋ฅผ 30๋ฒ์ผ๋ก ์์
UPDATE emp01
SET deptno=30
WHERE deptno=10;
โ
2. ๊ธ์ฌ๊ฐ 3000 ์ด์์ธ ์ฌ์๋ง ๊ธ์ฌ๋ฅผ 10% ์ธ์
UPDATE emp01
SET sal = sal * 1.1
WHERE sal >= 3000;
โ
3. 1987๋ ์ ์ ์ฌํ ์ฌ์์ ์ ์ฌ์ผ์ ์ค๋๋ก ์์ ํ๋ค. ์ฌ์์ ์ ์ฌ์ผ์ ์ค๋๋ก ์์ ํ ํ์ ํ ์ด๋ธ ๋ด์ฉ ๋ณด๊ธฐ
UPDATE emp01
SET hiredate = SYSDATE
WHERE SUBSTR(hiredate, 1, 2)='87';
โ
5. SAM01 ํ ์ด๋ธ์ ์ ์ฅ๋ ์ฌ์ ์ค ๊ธ์ฌ๊ฐ 10000 ์ด์์ธ ์ฌ์๋ค์ ๊ธ์ฌ๋ง 5000์์ฉ ์ญ๊ฐํ์์ค.
UPDATE sam01
SET sal = sal-5000
WHERE sal>=10000;
โโ
ํ ์ด๋ธ์์ 2๊ฐ ์ด์์ ์นผ๋ผ ๊ฐ ๋ณ๊ฒฝ
1. SCOTT ์ฌ์์ ๋ถ์๋ฒํธ 20๋ฒ, ์ง๊ธ์ MANAGER๋ก ํ๊บผ๋ฒ์ ์์
UPDATE emp01
SET deptno=20, JOB='MANAGER'
WHERE ename='SCOTT';
โ
2. SCOTT ์ฌ์์ ์ ์ฌ์ผ์๋ ์ค๋, ๊ธ์ฌ๋ฅผ 50, ์ปค๋ฏธ์ ์ 4000 ์์
UPDATE emp01
SET hiredate = SYSDATE, sal=50, comm=4000
WHERE ename='SCOTT'; -- ์ฌ๋ฌ ๊ฐ์ ์์ ์ ์ฝค๋ง๋ก ๊ตฌ๋ถ
โ
โ
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ ์ฝ๋ ์์ ํ๊ธฐ
1. 20๋ฒ ๋ถ์์ ์ง์ญ๋ช ์ 10๋ฒ ๋ถ์์ ์ง์ญ๋ช ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด์ ์๋ธ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉ
UPDATE dept01
SET loc=(SELECT loc FROM dept01 WHERE deptno=10) -- ์๋ธ์ฟผ๋ฆฌ ์กฐ๊ฑด์
WHERE deptno=20; -- ๋ฉ์ธ์ฟผ๋ฆฌ์์ ๋ฐ์ 20๋ฒ ๋ถ์์ ์์น๋ฅผ ๋ฐ๊พผ๋ค
โ
6. ์๋ธ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ EMP ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ํน์ ์ปฌ๋ผ๋ง์ผ๋ก ๊ตฌ์ฑ๋ SAM02 ํ ์ด๋ธ์ ์์ฑํ์์ค.
CREATE TABLE sam02
AS
SELECT ename, sal, hiredate, deptno FROM emp;
7. ์์ฑ ํ DALLAS ์ ์์นํ ๋ถ์ ์์ ์ฌ์๋ค์ ๊ธ์ฌ๋ฅผ 1000 ์ธ์ํ์์ค.
SELECT * FROM sam02;
UPDATE sam02
SET sal=sal+1000
WHERE deptno=(SELECT deptno FROM dept WHERE loc='DALLAS'); -- DALLAS์ ํด๋นํ๋ ๋ถ์ ๋ฒํธ๋ 20.
โ
โ
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ ๊ฐ ์ด์์ ์นผ๋ผ ๊ฐ ๋ณ๊ฒฝ
/* ํ์ UPDATE table_name
SET (column_name1, column_name2, …) = (sub_query)
WHERE ์กฐ๊ฑด
*/
UPDATE dept01
SET (dname, loc)=(SELECT DNAME, LOC FROM DEPT01 WHERE DEPTNO=10)
WHERE DEPTNO=50;
-- [ํด์] 10๋ฒ ๋ถ์์ ์ด๋ฆ๊ณผ ์์น๋ฅผ 50๋ฒ ๋ถ์์ ์ด๋ฆ๊ณผ ์์น๊ฐ๊ณผ ๋์ผํ๊ฒ ์์ ํ๊ฒ ๋ค.
โ
8. ์๋ธ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ SAM02 ํ ์ด๋ธ์ ๋ชจ๋ ์ฌ์์ ๊ธ์ฌ์ ์ ์ฌ์ผ์ ์ด๋ฆ์ด KING์ธ ์ฌ์์ ๊ธ์ฌ์ ์ ์ฌ์ผ๋ก ๋ณ๊ฒฝํ์์ค.
UPDATE sam02
SET (sal, hiredate) = (SELECT sal,hiredate FROM sam02 WHERE ename='KING');
โ
โโ
4. ๋ ์ฝ๋ ์ญ์ (DELETE)
1) ๋จ์ผ query
DELETE FROM dept01
WHERE deptno = 30;
โ
2) ์ ์ฒด ๋ ์ฝ๋ ์ญ์
DELETE FROM dept01;
โ
9. SAM01 ํ ์ด๋ธ์์ ์ง์ฑ ์ด ์ ํด์ง์ง ์์ ์ฌ์์ ์ญ์ ํ์์ค.
DELETE FROM sam01
WHERE job IS NULL;
โ
โ
โ
2) sub query ์ด์ฉ
์ฌ์ ํ ์ด๋ธ์์ ๋ถ์๋ช ์ด SALES์ธ ์ฌ์์ ๋ชจ๋ ์ญ์
DELETE FROM emp01
WHERE deptno=(SELECT deptno FROM dept WHERE dname='SALES'); -- ๋ถ์๋ฒํธ 30๋ฒ
SELECT*FROM emp01;
โ
DB๋ฐ์
commit;
โ
๋ช ๋ น ์ด์ ์ผ๋ก ๋ณต์
ROLLBACK; -- ๋จ, commit ์ด์ DML๋ช
๋ น๋ง ๋ณต์๋จ
Sequence (์ํ์ค)
CREATE SEQUENCE deptno_seq -- deptno_seq๋ฅผ ๊ฐ์ฒด๋ผ๊ณ ํํ
INCREMENT BY 1 -- 1์ฉ ์ฆ๊ฐํ๋
START WITH 1; -- 1๋ถํฐ ์์ํ๊ณ
IN~๊ณผ ST~์ ์์๋ ์๊ด์์
โ
1. ์ํ์ค ์์ฑ
CREATE SEQUENCE emp_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 100000;
-- ์์ ๊ฐ์ด 1์ด๊ณ , 1์ฉ ์ฆ๊ฐํ๊ณ , ์ต๋๊ฐ์ด 100000์ด ๋๋ ์ํ์ค emp_seq๋ฅผ ์์ฑํ๋ค.
โ
2. ํ ์ด๋ธ ์์ฑ
DROP TABLE emp01 PURGE;
CREATE TABLE emp01( -- ํ
์ด๋ธ ์์ฑ
empno NUMBER(4) PRIMARY KEY, --๊ธฐ๋ณธํค
ename VARCHAR2(10),
hiredate DATE
);
โ
3. ๋ ์ฝ๋ ์ฝ์ : ์ํ์ค ์ด์ฉ
INSERT INTO EMP01
VALUES(emp_seq.NEXTVAL, 'JULIA' , SYSDATE); -- (emp_seq.NEXTVAL) -> (๊ฐ์ฒด.๋ฉค๋ฒ)์ ๊ด๊ณ
-- [ํด์] ๊ธฐ๋ณธ ํค ์ค์ ์ด ๋ ํ
์ด๋ธ empno์ ์นผ๋ผ ๊ฐ์ ์ํ์ค๋ก ๋์ฒดํ๋ค.
-- NEXTVAL์ ์ํ์ค ๊ฐ 1์ด ์
๋ ฅ๋๋ค.
INSERT INTO EMP01
VALUES(emp_seq.NEXTVAL, 'HONG' , SYSDATE); -- empno์ ๊ฐ์ด +1 ๋์ด 2๋ก ์ค์ ๋์์
โ
4. ๋ฐ์ดํฐ ์ฌ์ ๋ทฐ : ์ํ์ค ์ ๋ณด ํ์ธ
SELECT * FROM USER_SEQUENCES; -- ์ํ์ค ํ์ธ
SELECT * FROM USER_TABLES; -- ํ
์ด๋ธ ํ์ธ
โโ
5. ์ํ์ค ์ญ์ (PURGE ๋ช ๋ น์ด ํ์X)
DROP SEQUENCE emp_seq;
์ค์ต
CREATE SEQUENCE dept_deptno_seq -- ์ํ์ค ์์ฑ
START WITH 10
INCREMENT BY 10
MAXVALUE 30;
โ
ํ ์ด๋ธ ์์ฑ (๊ตฌ์กฐ๋ง)
CREATE TABLE dept_exam
AS
SELECT * FROM dept
WHERE 1=0;
โ
๋ ์ฝ๋ ์ถ๊ฐ
INSERT INTO dept_exam VALUES (dept_deptno_seq.NEXTVAL, '์ธ์ฌ๊ณผ', '์์ธ์');
INSERT INTO dept_exam VALUES (dept_deptno_seq.NEXTVAL, '๊ฐ๋ฐ๋ถ', '๋์ ์');
INSERT INTO dept_exam VALUES (dept_deptno_seq.NEXTVAL, '์ด๋ฌด๋ถ', '์์ธ์');
INSERT INTO dept_exam VALUES (dept_deptno_seq.NEXTVAL, '์ด๋ฌด๋ถ', '์์ธ์'); -- error ๋ฐ์. WHY? ์ต๋๊ฐ์ด 30์ด๋ฏ๋ก
โโ
6. ์ํ์ค ์์
ALTER SEQUENCE dept_deptno_seq MAXVALUE 1000; -- ์ต๋๊ฐ์ 1000์ผ๋ก ์์
INSERT INTO dept_exam VALUES (dept_deptno_seq.NEXTVAL, '์ด๋ฌด๋ถ', '์์ธ์'); -- error ๋ฐ์ํ์ง ์์
โ
โ 7. ๋ฐ์ดํฐ ์ฌ์ ๋ทฐ : ์ํ์ค ๊ตฌ์กฐ ํ์ธ
SELECT*FROM USER_SEQUENCES;