안녕하세요.
https://blog.naver.com/sysysy0302여니입니다 :)
/*
2. UPDATE
테이블에 기록된 기존의 데이터를 수정하는 구문
[표현법]
UPDATE 테이블명
SET 컬럼명 = 바꿀값,
컬럼명 = 바꿀값,
... -- 여러개의 칼럼값을 동시변경 가능 이때 AND 가 아니라 , 로 나열한다
WHERE 조건; -- WHERE절은 생략 가능한데, 생략시 모든테이블의 모든행이 바뀌게 된다.
*/
-- 복사본 테이블 만든 후 작업.
CREATE TABLE DEPT_COPY
AS SELECT *
FROM DEPARTMENT;
SELECT * FROM DEPT_COPY;
-- DEPT_COPY 테이블에서 D9부서의 부서명을 전략기획팀으로 수정
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀'; -- 9개 행이 수정
-- 전체 행의 모든 DEPT_TITLE값들이 모두 전략기획팀으로 수정됨. 이렇게 하면 안되구!
-- 참고) 변경사항에 대해서 되돌리는 명령어 : ROLLBACK;
ROLLBACK; -- 되돌리다 (UPDATE전으로)
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9' -- 1행이 수정
;
SELECT * FROM DEPT_COPY;
CREATE TABLE EMP_SALARY
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS
FROM EMPLOYEE;
SELECT * FROM EMP_SALARY;
-- EMP_SALARY 테이블에서 노옹철 사원의 급여를 1000만원으로 변경
UPDATE EMP_SALARY
SET SALARY = 10000000
WHERE EMP_NAME = '노옹철';
SELECT * FROM EMP_SALARY;
-- EMP_SALARY테이블에서 선동일 사원의 급여를 700만원, 보너스를 0.2로 변경
UPDATE EMP_SALARY
SET SALARY = 7000000,
BONUS = 0.2
WHERE EMP_NAME = '선동일';
--UPDATE EMP_SALARY
--SET BONUS = 0.2
--WHERE EMP_NAME = '선동일';
SELECT * FROM EMP_SALARY;
-- EMP_SALARY테이블에서 전체사원의 급여를 기존의 급여에 20% 인상한 금액으로 변경
UPDATE EMP_SALARY
SET SALARY = SALARY*1.2;
SELECT * FROM EMP_SALARY;
/*
UPDATE시 서브쿼리 사용
서브쿼리를 수행한 결과값으로 기존의 값으로부터 변경하겠다.
- CREATE시에 서브쿼리 사용시 : 서브쿼리 수행한 결과로 테이블을 만들겠다.
- INSERT시에 서브쿼리 사용시 : 서브쿼리 수행한 결과를 해당 테이블 새롭게 삽입하겠다.
[표현법]
UPDATE 테이블명
SET 칼럼명 = (서브쿼리)
WHERE 조건;
*/
-- EMP_SALARY 테이블에 김소연 사원의 부서코드를 선동일 사원의 부서코드로 변경
UPDATE EMP_SALARY
SET DEPT_CODE = (
SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '선동일'
)
WHERE EMP_NAME = '김소연';
SELECT * FROM EMP_SALARY;
-- 방명수 사원의 급여와 보너스를 유재식 사원의 급여와 보너스값으로 변경
UPDATE EMP_SALARY
--SET SALARY = ( SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME = '유재식')
--, BONUS = ( SELECT BONUS FROM EMPLOYEE WHERE EMP_NAME = '유재식')
SET (SALARY, BONUS) = (SELECT SALARY, BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';
-- 주의사항 : UPDATE 시에도 변경할 값에 대해서 해당 칼럼의 제약조건에 위배되면 안됨.
-- 송종기 사원의 사번을 200으로 변경
UPDATE EMPLOYEE
SET EMP_ID = 200
WHERE EMP_NAME = '송종기';
-- unique constraint (KH.EMPLOYEE_PK) violated : PRIMARY KEY 제약조건 위배.
UPDATE EMPLOYEE
SET EMP_ID = NULL
WHERE EMP_ID = 200;
-- ORA-01407: cannot update ("KH"."EMPLOYEE"."EMP_ID") to NULL
-- NOT NULL 제약조건 위배.
COMMIT;
-- 모든 변경사항을 확정하는 명령어
/*
4. DELETE
테이블에 기록된 데이터를 "행"단위로 삭제하는 구문
[표현법]
DELETE FROM 테이블명
WHERE 조건; -- WHERE절 생략 가능. 단, 생략시 해당 테이블의 모든 행이 삭제.
*/
DELETE FROM EMPLOYEE;
SELECT * FROM EMPLOYEE;
ROLLBACK; -- 롤백시 마지막 커밋시점으로 돌아간다.
-- EMPLOYEE 테이블로부터 김소연, 김소연2 사원의 정보를 지우기
DELETE FROM EMPLOYEE
WHERE EMP_NAME IN ('김소연','김소연2');
COMMIT;
-- DEPARTMENT테이블로부터 DEPT_ID가 D1인부서를 삭제
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
-- 만약에 EMPLOYEE 테이블의 DEPT_CODE 컬럼에서 외래키 제약조건이 추가되었을 경우, 삭제가 되지 않았을것!
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D3'; -- 외래키 제약조건이 자식테이블에서 걸려있었더라도, 사용하지 않았으므로 삭제가 잘 됐을것!
ROLLBACK;
/*
*TRUNCATE : 테이블의 전체 행을 다 삭제할때 사용하는 구문
DELETE 구문보다 수행속도가 훨씬 빠름
별도의 조건을 제시 불가
ROLLBACK이 불가능함.(신중하게 삭제해야한다)
[표현법]
TRUNCATE TABLE 테이블명;
DELETE 구문과 비교
TRUNCATE TABLE 테이블명; | DELETE FROM 테이블명;
----------------------------------------------------------------------------
별도의 조건제시 불가(WHERE X) | 특정조건 제시 가능(WHERE O)
수행속도가 빠름 | 수행속도가 느림
ROLLBACK 불가능 | ROLLBACK 가능
*/
SELECT * FROM EMP_SALARY;
DELETE FROM EMP_SALARY;
ROLLBACK; --DELETE문은 롤백 가능.
TRUNCATE TABLE EMP_SALARY; -- 롤백하고 전체조회 해봐도 데이터가 비어있다.