본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 UPDATE

728x90
반응형

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는 여기까지 하겠다.

728x90
반응형