-
SQL - DML(Data Manipulation Language) INSERT, UPDATE, UPDATE시 주의사항DataBase/Oracle 2022. 1. 27. 02:06728x90반응형
- INSERT
- UPDATE
- UPDATE시 주의사항
DML(Data manipulation Language)
- 데이터 조작 언어
- 테이블에 값을 삽입, 수정, 삭제, 조회하는 언어
INSERT
INSERT INTO 테이블명 (컬럼명, 컬럼명, ..) VALUES (데이터, 데이터, ..)
- 새로운 행을 추가하는 구문
- 테이블의 행 개수가 증가한다.
INSERT - 기본
INSERT INTO EMPLOYEE E( E.EMP_ID, E.EMP_NAME, E.EMP_NO, E.EMAIL, E.PHONE ) VALUES( '900', '장채현', '901123-2080503', 'jang_ch@greedy.com', '01055569512' );
INSERT - VALUES 대신 서브 쿼리 사용
- 서브 쿼리를 이용한 INSERT 방식
- 서브 쿼리에서 추출한 행들로 INSERT 할 수 있다.
INSERT INTO EMP_01 A( A.EMP_ID , A.EMP_NAME , A.DEPT_TITLE ) ( SELECT E.EMP_ID , E.EMP_NAME , D.DEPT_TITLE FROM EMPLOYEE E LEFT JOIN DEPARTMENT D ON(E.DEPT_CODE = D.DEPT_ID) );
INSERT ALL
- INSERT시에 사용하는 조건절이 같은 서브 쿼리를 가지고 두 개 이상의 테이블에
INSERT ALL을 이용하여 한번에 데이터를 삽입할 수 있다. - 단, 각서브 쿼리의 조건절이 같아야 한다.
INSERT ALL INTO EMP_DEPT_D1 VALUES( EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE ) INTO EMP_MANAGER VALUES( EMP_ID, EMP_NAME, MANAGER_ID ) SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE, E.HIRE_DATE, E.MANAGER_ID FROM EMPLOYEE E WHERE E.DEPT_CODE = 'D1';
위 쿼리를 실행하면 서브 쿼리에서 추출된 행들이 각 EMP_DEPT_D1, EMP_MANAGER 테이블에 삽입이 이루어진다.
INSERT ALL의 WEHN/THEN을 이용한 조건에 따른 행 추가
- 조건이 같은 서브 쿼리의 추출된 행들을 WHEN/THEN을 이용하여
원하는 조건의 서브 쿼리의 추출된 행들을 삽일 할 수 있다.
INSERT ALL WHEN HIRE_DATE < '2000/01/01' THEN INTO EMP_OLD VALUES ( EMP_ID , EMP_NAME , HIRE_DATE , SALARY ) WHEN HIRE_DATE >= '2000/01/01' THEN INTO EMP_NEW VALUES ( EMP_ID , EMP_NAME , HIRE_DATE , SALARY ) SELECT E.EMP_ID , E.EMP_NAME , E.HIRE_DATE , E.SALARY FROM EMPLOYEE E;
UPDATE
UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값, ... [WHERE 컬럼명 비교연산자 비교값]
- 테이블에 기록된 칼럼의 값을 수정하는 구문
UPDATE - 기본
UPDATE DEPT_COPY DC SET DC.DEPT_TITLE = '전략기획팀' WHERE DC.DEPT_ID = 'D9';
참고로 WHERE 조건을 안 넣으면 모든 행의 DEPT_TITLE 값들이 '전략기획팀'으로 수정된다.
UPDATE - 서브 쿼리 이용
-- 평상시 유재식 사원을 부러워하던 방명수 사원의 -- 급여와 보너스율을 유재식 사원과 동일하게 변경해 주기로 했다. -- 이를 반영하는 UPDATE문을 작성해보세요 UPDATE EMP_SALARY ES SET ES.SALARY = (SELECT E1.SALARY FROM EMPLOYEE E1 WHERE E1.EMP_NAME = '유재식' ) , ES.BONUS = (SELECT E2.BONUS FROM EMPLOYEE E2 WHERE E2.EMP_NAME = '유재식' ) WHERE ES.EMP_NAME = '방명수';
UPDATE - 다중열 서브 쿼리 이용
- 서브 쿼리를 이용해 한번에 여러 칼럼을 수정할 수 있다.
UPDATE EMP_SALARY ES SET (ES.SALARY, ES.BONUS) = (SELECT E1.SALARY, E1.BONUS FROM EMPLOYEE E1 WHERE E1.EMP_NAME = '유재식' ) WHERE ES.EMP_NAME = '방명수';
UPDATE - 다중행 서브 쿼리 이용
- WHERE 조건을 이용하여 서브 쿼리의 추출된 행들과 비교 연산을 통하여 값을 변경할 수 있다.
UPDATE EMP_SALARY ES SET ES.BONUS = 0.5 WHERE ES.EMP_ID IN (SELECT E1.EMP_ID FROM EMPLOYEE E1 JOIN DEPARTMENT D1 ON(E1.DEPT_CODE = D1.DEPT_ID) JOIN LOCATION L1 ON (D1.LOCATION_ID = L1.LOCAL_CODE) WHERE L1.LOCAL_NAME LIKE 'ASIA%' );
UPDATE 주의 사항
- 변경 값은 해당 칼럼에 대한 제약 조건에 위배되지 않아야 한다.
FOREIGN KEY 제약 조건 위배
- 부모 테이블의 기본키가 존재하지 않는 값으로 변경하는 경우
UPDATE EMPLOYEE E -- FOREIGN KEY 제약 조건 위배됨 (부모 키가 없습니다) SET E.DEPT_CODE = '65' WHERE E.DEPT_CODE = 'D6';
부모 테이블의 기본키 값이 '65'가 존재하지 않아 오류 발생
NOT NULL 제약 조건 위배
- NOT NULL 제약 조건을 갖고 있는 칼럼의 값을 NULL로 수정하는 경우
UPDATE EMPLOYEE E -- NOT NULL 제약 조건 위배됨 SET E.EMP_NAME = NULL WHERE E.EMP_ID = '200';
해당 칼럼의 제약 조건이 NOT NULL인데 NULL값으로 수정하려고 하여 오류 발생
UNIQUE 제약 조건 위배
- UNIQUE 제약 조건을 갖고 있는 칼럼에서 이미 존재하는 칼럼 값으로 수정하는 경우
UPDATE EMPLOYEE E -- UNIQUE 제약 조건 위배됨 SET E.EMP_NO = '800808-2123341' WHERE E.EMP_ID = '200';
해당 칼럼의 값들 중 이미 '800808-2123341'가 존재하여 오류 발생
728x90반응형'DataBase > Oracle' 카테고리의 다른 글
SQL - TCL (Transaction Control Language) (0) 2022.01.27 SQL - DML(Data Manupulation Language) DELETE, DDL(Data Definition Language) TRUNCATE (0) 2022.01.27 SQL - 테이블 생성(CREATE) 및 제약 조건(Constraint) (0) 2022.01.26 SQL - RANK, DENSE_RANK (0) 2022.01.22 SQL - SUBQUERY (0) 2022.01.21