2) UPDATE: 데이터 수정(cell 단위로 수정하며 여러 셀 수정이 가능함)
여러 행의 특정 컬럼 값 하나를 수정이 가능하다.
여러 컬럼 동시에 수정이 가능하나 권하지 않으며 지양해야하는 점이 있다.
먼저 문법은,
UPDATE table_name
set 수정대상 = 수정값
[where 조건]
예)
select * from emp_t2;
update emp_t2
set sal = 3000
where name = 'KING';
과 같이 KING의 sal 변경이 가능하다.
예제) student_t1 테이블에서 박동호와 같은 학년 학생의 제2전공번호를 101으로 수정하여라
select *
from student_t1
where grade = (select grade
from student_t1
where name ='박동호');
위 쿼리 근거로
update student_t1
set deptno2 = 101
where grade = (select grade
from student_t1
where name ='박동호');
데이터 확인 후 commit; 하면 된다.
예제) emp2_t1 생성(원본과 동일)하고, emp2_t1테이블에서 각 직원의 급여를 모두 직급별 급여로 수정하여라
update emp2_t1
set pay = (select round(avg(pay))
from emp2_t1 e1
group by emp_type);
매 행마다 pay 업데이트 되는데 각 행마다 하나씩 보내는데 오른쪽은 다수의 행을 가지므로 업데이트가 되지 않음.
따라서 잘못된 쿼리이다.
아래와 같이 수행하면 된다.
update emp2_t1 e1
set pay = (select round(avg(pay))
from emp2_t1 e2
where e2.emp_type = e1.emp_type);
그런데 결과적으로 봤을 때 정규직을 제외하고는 업데이트를 하지 않는 게 맞다.
계약직, 수습직, 인턴직은 pay가 동일하기 때문에 평균 및 업데이트를 하는 것이 의미가 없기 때문이다.
만일 테이블이 100억건인데 실제 업데이트하고자 하는 자료가 1억건이라면 1억건만 수행되도록 하는 쿼리를 짜는 것이 속도에 더 유리하다(성능진단에 유리).
다중컬럼도 update가 가능하다. SQLD에 나올 수 있다.
문법은,
update 테이블명
set 수정대상1 = 수정값1,
수정대상2 = 수정값2,
...
[where 조건];
다중컬럼서브쿼리 문장을 업데이트 문장에 쓴다면
update 테이블명
set (수정대상1, 수정대상2) = (select 값1, 값2)
[where 조건];
연습문제1. emp_t11을 만들고 emp_t11에서 KING의 부서번호는 30, 급여는 10%증가값으로 수정하여라
update emp_t11 e1
set deptno = 30
sal = (select sal*1.1
from emp_t11 e2
where e1.empno = e2.empno)
where ename = 'KING';
이 쿼리는 성능에 좋지 않다.
연습문제2. emp_11에서 각 직원의 급여를 부서별 최대 급여로 수정, 부서번호는 이제 4자리로 표현하기로 함 (00 붙임)
먼저 내 풀이이다.
다음은 선생님 해설이다.
다중컬럼 서브쿼리라서 in이 들어와야 맞지만 여기서는 한 행씩 검토하므로 = 가 들어왔다.
따라서 이렇게 수정되는데 마지막 쿼리를 살펴보면 되겠다.
보통 이런 update는 결측치 대치할 때 사용되기도 한다.
결측치란 값이 잘못들어왔거나 안들어온값(DBMS는 null로 결측치 표현, 파이썬이나 R은 NA로 표현)이다.
결측치를 대치하는 방법으로는
(1) DBMS에서 직접 수정(update)
(2) raw data를 최대한 안 건드리겠다면(1처럼 하지 않겠다면) 분석도구에서 수정(원본은 바뀌지 않음)
이는 데이터 품질을 높이기 위함이다.
분석의 최종결론 목적은 현업에 적용할 수 있을만한 강력한 모델을 만드는 것이다.
분석엔진의 정확도를 높이기 위해서 raw data의 품질을 조금씩 바꿔가며 목적에 맞게끔 여러가지 형태로 변환 및 가공하는 것이다.
일단 update는 여기까지 하겠다.
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 MERGE + 복습후기(20231108) (0) | 2023.11.10 |
---|---|
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 DELETE (0) | 2023.11.10 |
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 INSERT (0) | 2023.11.09 |
[실습문제] 2023. 11. 7.(화) 문제 풀이(3문제) (0) | 2023.11.09 |
[복습] data를 unload 하는 방법 및 데이터 DB화 방법 두 가지 + 복습(20231107) (1) | 2023.11.09 |