UPDATE 를 이용해 데이터를 수정해보자. 

SELECT * FROM emp_score;
UPDATE emp_score SET com=90, excel=95;
-- 조건없이 데이터를 수정하면 모두 수정됨.

SELECT * FROM emp_score;

ROLLBACK; -- 수정 취소

UPDATE 테이블명 SET 컬럼 = 값; 을 이용해서 수정한다. WHERE이 없으면 컬럼에 모든 행에 값을 대입하므로 그냥 WHERE이 있다고 생각해두고 외우자.

UPDATE emp_score SET com=90, excel=95 WHERE empNo = '1002';
SELECT * FROM emp_score;
COMMIT;

ALTER TABLE emp_score ADD(
    tot NUMBER(3) GENERATED ALWAYS AS (com+excel+word) VIRTUAL,
    ave NUMBER(4, 1) GENERATED ALWAYS AS ( ROUND( (com+excel+word) / 3, 1 ) ) VIRTUAL
);

WHERE empNo 에 1002를 줘서 해당 행의 com컬럼과 excel컬럼의 값을 90과 95로 바꾸어 주었다.

 

ALTER을 통해 해당 테이블에 없던 tot와 ave를 가상컬럼으로 추가해주었다.

 

 

다음 문제를 풀어보자. ( UPDATE와 관련 없음 )

더보기

-- emp_score테이블의 다음을 출력한다.

empNo, name, com, excel, word, tot, ave, grade

grade 는 모든 점수가 40점 이상이고 평균이 60점 이상이면 합격

grade 는 평균이 60점이상이고 한과목이라도 40점 미만이면 과락

grade 는 평균이 60점 미만이면 불합격

SELECT empNo, com, excel, word, tot, ave, 
    (CASE
        WHEN com >= 40 AND excel >= 40 AND word >=40 AND ave >=60 THEN '합격'
        WHEN ave>=60 THEN '과락'
        ELSE '불합격'        
    END) grade 
FROM emp_score;

 

CASE 를 통해 WHEN의 조건에 부합하면 THEN을 통해 '합격', '과락, '불합격' 이란 값들을 grade 컬럼에 추가해주었다. 위에서 아래로 실행되는 구조이기 때문에 과락에는 평균의 점수가 60점 이상일 때만의 조건만 주었다. (위에서 모든 과목 40점 이상인 사람들이 걸러지기 때문에 밑에서는 이미 과락 혹은 불합격인 사람들만 남았기 때문이다.)

 

 

 

 

개발부 사람들의 excel 점수를 100점 더해주기

SELECT empNo FROM emp WHERE dept='개발부';
SELECT * FROM emp_score;

UPDATE emp_score SET excel = excel + 100
WHERE empNo IN (SELECT empNo FROM emp WHERE dept='개발부');

SELECT * FROM emp_score; -- 잘 들어 갔는지 확인

ROLLBACK;

개발부인 사람들만 먼저 뽑아보았다. 그 후 UPDATE에서 WHERE ~ IN 서브쿼리를 통해 값을 수정했다.

UPDATE 테이블명 SET 컬럼 = (값) WHERE 조건 IN (이 곳에 있는 컬럼들과 조건이 부합하면 값을 수정한다.)

 

UPDATE 사용시

  • 제약조건을 위반하는 값으로 변경할 수 없다.
  • 데이터 타입이 다르거나 데이터 폭보다 큰 데이터로 수정할 수 없다.

예시

UPDATE emp_score SET empNo = '1002' WHERE empNo = '1001';
-- 에러 : ORA-00001. 기본키는 중복값을 가질 수 없다.

empNo은 PRIMARY KEY로 중복값을 가질 수 없다. 1002는 이미 존재하는 값이기 때문에 1001의 값을 1002로 바꿀 수 없다.

+ Recent posts