UPDATE 테이블
SET 컬럼 = 수정데이터,
컬럼2 = 수정데이터2,
..
WHERE 조건문
UPDATE EMP_CP100
SET ename = '이현규', job = '대리'
WHERE empno = 7782;
-- ex) 부서번호가 10인 사원정보의 입사일을 오늘로 변경하고, sal을 10%인상금액으로 처리.
UPDATE EMP_CP100
SET hiredate = sysdate, sal = sal*1.1
WHERE deptno = 10;
- set 부분 subquery 활용
한개의 컬럼 : set 컬럼명 = (결과가 1개인 컬럼데이터)
두개 이상의 컬럼 : set (컬럼명1, 컬럼명2, ...) = (결과가 2개인 컬럼데이터)
-- 부서번호가 10인 사원정보의 급여를 부서번호 20인 사원의 최고 급여로 변경 처리
--테이블 복사해서 생성
CREATE TABLE EMP_CP101 AS SELECT * FROM emp;
-- 수정
UPDATE EMP_CP101
SET sal = (
SELECT max(sal)
FROM EMP_CP101
WHERE deptno = 20
)
WHERE deptno = 10;
-- ex) 직책이 SALESMAN인 사원 평균급여를 사원번호 7499에 급여로 수정처리하세요.
UPDATE EMP_CP101
SET sal = (
SELECT AVG(SAL)
FROM EMP_CP101
WHERE JOB = 'SALESMAN'
)
WHERE empno = 7499;
-- 두개 열에 대한 subquery 처리
-- 부서별 최고 급여 중에 최고 급여가 3000 미만인 부서 번호와 급여를 사원번호 7369로 변경
처리
UPDATE EMP_CP101
SET (deptno,sal) = (
SELECT deptno, max(sal)
FROM EMP_CP101
GROUP BY deptno
HAVING max(sal)<3000
)
WHERE empno = 7369;
-- ex) 직책별로 최고 급여자 중에 SALESMAN의 직책과 급여를 사원번호 7782로 변경 처리
UPDATE EMP_CP101
SET (job, sal) = (
SELECT JOB, MAX(SAL)
FROM EMP_CP101
WHERE job = 'SALESMAN'
GROUP BY JOB
)
WHERE empno = 7782;
DELETE
FROM 테이블명
WHERE 조건
DELETE FROM EMP_CP100 ec
WHERE empno = 7782;
--테이블 복사해서 생성
CREATE TABLE EMP01
AS SELECT * FROM emp;
-- ex) 급여가 2000 이상이고 부서가 30인 데이터를 삭제처리하세요.
DELETE
FROM EMP01
WHERE sal >=2000 AND deptno = 30;
1) row인 경우
DELETE FROM 테이블
WHERE (컬럼명1, 컬럼명2..._ = (select ... from 테이블 where)
2) 다중의 row인 경우
DELETE FROM 테이블
WHERE(컬럼명1, 컬럼명2...) in (select .. from 테이블)
cf) 다중 컬럼인 경우에 해당 컬럼 데이터가 1개 row에 같이 있을 때, 삭제 된다.
-- 부서별 최고 급여자 삭제
DELETE FROM emp01
WHERE (deptno, sal) in (
SELECT deptno, max(sal) sal
FROM EMP01
GROUP BY deptno
);
-- ex) 분기별 최저 급여자를 삭제하세요.
DELETE FROM EMP01
WHERE (to_char(hiredate, 'Q'), sal) IN (
SELECT to_char(hiredate, 'Q') div, min(sal) sal
FROM emp01
GROUP BY to_char(hiredate, 'Q')
);
-- 과제) emp02로 복사테이블을 만들고, delete subquery를 이용하여, 상/하반기 최고 급여자를
삭제처리하세요.
-- 테이블 생성
CREATE TABLE emp02
AS SELECT * FROM emp;
-- 상반기 삭제
DELETE FROM emp02
WHERE (to_char(hiredate, 'Q'), sal) IN (
SELECT to_char(hiredate, 'Q') div, max(sal) sal
FROM EMP02
WHERE (hiredate, 'Q') <= 2;
GROUP BY to_char(hiredate, 'Q')
);
-- 하반기 삭제
DELETE FROM emp02
WHERE (to_char(hiredate, 'Q'), sal) IN (
SELECT to_char(hiredate, 'Q') div, max(sal) sal
FROM EMP02
WHERE to_char(hiredate, 'Q') >= 3
GROUP BY to_char(hiredate, 'Q')
);
merge into 목적테이블명
using 비교할 테이블 및 subquery
on 두 테이블의 비교 조건
when matched then 비교조건이 일치할 때, 수정 구문 처리
when not matched then 비교조건이 일치하지 않을 떄, 등록 구문 처리
-- 테이블 복사 생성
CREATE TABLE emp03
AS SELECT * FROM emp;
SELECT * FROM emp03;
-- 사원번호 기준으로 해당 데이터가 있으면 수정 처리, 데이터가 없으면 등록 처리
-- # merge를 쓰지 않을 때
-- 1) 임시테이블을 만든다. - 등록할 정보를 설정
CREATE TABLE EMP04
AS SELECT *
FROM emp
WHERE deptno = 10;
-- 2) 수정 처리
UPDATE EMP03
SET ename = '김길동'
WHERE empno = 7782;
-- 3) 등록 처리
INSERT INTO emp03 VALUES(8001, '이길동', '사원', 7782, sysdate, 3000, NULL, 20);
-- # merge를 사용할 때
-- 1) 임시테이블 만들기
-- 2) merge를 통한 조건 처리
-- 3) 조건이 true일 때, 처리할 내용
-- 4) 조건이 false일 때, 처리할 내용
SELECT * FROM emp04; -- 입력 또는 수정할 정보가 있는 테이블
MERGE INTO emp03 t
USING emp04 s
ON(t.empno = s.empno)
WHEN MATCHED THEN -- empno가 있을 때
UPDATE SET t.ename = s.ename
WHEN NOT MATCHED THEN -- empno가 없을 때
INSERT VALUES(s.empno, s.ename, s.job, s.mgr, s.hiredate, s.sal, s.comm,
s.deptno);
-- ex1) emp05와 emp06을 머지처리
CREATE TABLE emp05 -- 기능테이블 (입력할 테이블)
AS SELECT *
FROM emp
WHERE deptno=20;
CREATE TABLE emp06 -- 목적테이블 (등록/수정할 테이블)
AS SELECT *
FROM emp;
MERGE INTO emp05 p
USING emp06 m
ON(p.empno = m.empno)
WHEN MATCHED THEN
UPDATE SET p.ename = m.ename
WHEN NOT MATCHED THEN
INSERT VALUES(m.empno, m.ename, m.job, m.mgr, m.hiredate, m.sal, m.comm,
m.deptno);
-- 입력하는 데이터에는 사원번호가 있을 때는 수정이 되고, 사원번호가 없을 때는 등록 처리
-- 1. 목적테이블 선언
-- 2. 입력할 가상 테이블 dual 활용 입력/수정 내용 설정
-- 3. merge into 처리
CREATE TABLE emp07
AS SELECT * FROM emp;
-- empno가 있는 경우
SELECT 7369 empno, '홍길동' ename, '사원' job, 7902 mgr, sysdate hiredate, 2000 sal,
100 comm, 10 deptno
FROM dual;
-- empno가 없는 경우
SELECT 8001 empno, '오영심' ename, '대리' job, 7902 mgr, sysdate hiredate, 4000 sal,
100 comm, 10 deptbo
FROM dual;
MERGE INTO emp07 t
USING (SELECT 7369 empno, '홍길동' ename, '사원' job, 7902 mgr, sysdate hiredate,
2000 sal, 100 comm, 10 deptno FROM dual) s
ON (t.empno = s.empno)
WHEN MATCHED THEN
UPDATE SET t.ename = s.ename,
t.job = s.job,
t.mgr = s.mgr,
t.hiredate = s.hiredate,
t.sal = s.sal,
t.comm = s.comm,
t.deptno = s.deptno
WHEN NOT MATCHED THEN
INSERT values(s.empno, s.ename, s.job, s.mgr, s.hiredate, s.sal, s.comm, s.deptno);
MERGE INTO emp07 t
USING (SELECT 8001 empno, '오영심' ename, '대리' job, 7902 mgr, sysdate hiredate,
4000 sal, 100 comm, 10 deptno FROM dual) s
ON (t.empno = s.empno)
WHEN MATCHED THEN
UPDATE SET t.ename = s.ename,
t.job = s.job,
t.mgr = s.mgr,
t.hiredate = s.hiredate,
t.sal = s.sal,
t.comm = s.comm,
t.deptno = s.deptno
WHEN NOT MATCHED THEN
INSERT values(s.empno, s.ename, s.job, s.mgr, s.hiredate, s.sal, s.comm, s.deptno);