home
자바
home

07. INSERT, UPDATE, DELETE (DML)

DATA MANIPULATION LANGUAGE (DML) 데이터 조작 언어

테이블에 값을 삽입(INSERT)하거나, 수정(UPDATE)하거나, 삭제(DELETE)하는 구문

INSERT

테이블에 새로운 데이터를 행 단위로 추가하는 구문
테이블에 모든 컬럼에 대한 값을 제시해서 한 행 INSERT하고자 할 때 INSERT INTO 테이블명 VALUES(값, 값, 값, 값, ....);
주의할점 : 테이블에 존재하는 모든 컬럼 수 만큼 값 제시 / 컬럼 순번 지켜서 값 나열
INSERT INTO EMPLOYEE VALUES(900, '장채현', '980914-2112456', 'jang_ch@naver.com', null, 'D1', 'J7', 2000000, null, 200, sysdate, null, default); SELECT * FROM EMPLOYEE WHERE EMP_ID = 900;
SQL
복사
테이블에 특정 컬럼만 선택해서 그 컬럼에 대한 값만 제시해서 INSERT하고자 할 때 사용
INSERT INTO 테이블명(컬럼명, 컬럼명, 컬럼명) VALUES(값, 값, 값);
그래도 한 행단위로 추가되기 때문에 지정안한 컬럼은 기본적으로 NULL이 들어감 → 주의할점 : NOT NULL 제약조건이 걸려있는 컬럼은 반드시 지정해서 직접 값 제시해야됨!!
단, 기본값(DEFAULT)이 지정되어있는 컬럼일 경우 NULL이 아닌 DEFAULT값이 담김
INSERT INTO EMPLOYEE ( EMP_ID , EMP_NAME , EMP_NO , DEPT_CODE , JOB_CODE , HIRE_DATE ) VALUES( 901 , '강람보' , '800918-2456785' , 'D2' , 'J7' , SYSDATE );
SQL
복사
서브쿼리로 조회한 결과값을 통째로 INSERT하는 방법
INSERT INTO 테이블명 (서브쿼리);
--새로운 테이블 세팅 CREATE TABLE EMP_01( EMP_ID NUMBER, EMP_NAME VARCHAR2(20), DEPT_TITLE VARCHAR2(20) ); INSERT INTO EMP_01 (SELECT EMP_ID, EMP_NAME, DEPT_TITLE FROM EMPLOYEE LEFT JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID);
SQL
복사

INSERT ALL

두 개 이상의 테이블에 각각 INSERT할 경우 단, 그 때 사용되는 서브쿼리가 동일할 경우에만 해당
-- 테이블 세팅 CREATE TABLE EMP_DEPT AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE FROM EMPLOYEE WHERE 1=0; CREATE TABLE EMP_MANAGER AS SELECT EMP_ID, EMP_NAME, MANAGER_ID FROM EMPLOYEE WHERE 1=0; SELECT * FROM EMP_DEPT; -- EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE SELECT * FROM EMP_MANAGER; -- EMP_ID, EMP_NAME, MANAGER_ID -- 부서코드가 D1인 사원들의 사번, 사원명, 부서코드, 입사일, 사수사번 SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D1';
SQL
복사

1)

INSERT ALL INTO 테이블명1 VALUES(컬럼명, 컬럼명, 컬럼명, ..) INTO 테이블명2 VALUES(컬럼명, 컬럼명, ..) 서브쿼리;
INSERT ALL INTO EMP_DEPT VALUES(EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE) INTO EMP_MANAGER VALUES(EMP_ID, EMP_NAME, MANAGER_ID) SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D1'; SELECT * FROM EMP_DEPT; SELECT * FROM EMP_MANAGER;
SQL
복사
조건을 사용해서 각 테이블 INSERT
2000년도 이전 입사한 입사자들을 보관할 테이블
CREATE TABLE EMP_OLD AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE WHERE 1=0;
SQL
복사
2000년도 이후 입사한 입사자들을 보관할 테이블
CREATE TABLE EMP_NEW AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE WHERE 1=0;
SQL
복사

2)

INSERT ALL WHEN 조건1 THEN INTO 테이블명1 VALUES(컬럼명, 컬럼명, 컬럼명) WHEN 조건2 THEN INTO 테이블명2 VALUES(컬럼명, 컬럼명, 컬럼명) 서브쿼리;
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 EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE;
SQL
복사

UPDATE

테이블에 기록되어있는 데이터를 수정하는 구문
[표현법] UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값, ... [WHERE 조건식]; --> 생략하면 전체 모든 행의 데이터가 변경됨!!
-- 복사본 테이블 만든 후 CREATE TABLE DEPT_COPY AS SELECT * FROM DEPARTMENT; -- DEPT_ID가 D9인 부서명이 '전략기획팀'으로 수정 UPDATE DEPT_COPY SET DEPT_TITLE = '전략기획팀' WHERE DEPT_ID = 'D9'; ROLLBACK; UPDATE DEPT_COPY SET DEPT_TITLE = '전략기획팀' WHERE DEPT_ID = 'D0'; -- 복사본 테이블 작업 후 진행 CREATE TABLE EMP_SALARY AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS FROM EMPLOYEE; -- 노옹철 사원의 급여를 100만원으로 변경 UPDATE EMP_SALARY SET SALARY = 1000000 WHERE EMP_NAME = '노옹철'; -- 선동일 사원의 급여를 700만원으로, 보너스를 0.2로 변경 UPDATE EMP_SALARY SET SALARY = 7000000 , BONUS = 0.2 WHERE EMP_NAME = '선동일'; -- 전체 사원의 급여를 기존의 급여에 10프로 인상한 금액(기존급여*1.1)으로 변경 UPDATE EMP_SALARY SET SALARY = SALARY * 1.1;
SQL
복사
UPDATE시에 서브쿼리 사용 가능
UPDATE 테이블명 SET 컬럼명 = (서브쿼리) WHERE 조건식;
-- 방명수 사원의 급여와 보너스값을 유재식 사원의 급여와 보너스값으로 변경 --> 단일행서브쿼리 UPDATE EMP_SALARY SET SALARY = ( SELECT SALARY FROM EMP_SALARY WHERE EMP_NAME = '유재식' ), BONUS = ( SELECT BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식' ) WHERE EMP_NAME = '방명수'; --> 다중열 서브쿼리로도 가능 UPDATE EMP_SALARY SET (SALARY, BONUS) = ( SELECT SALARY, BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식' ) WHERE EMP_NAME = '방명수'; -- ASIA 지역에서 근무하는 사원들의 보너스를 0.3으로 변경 -- 먼저 (서브쿼리 자리에 넣을)ASIA 지역에 근무하는 사원들의 사번 조회 SELECT EMP_ID FROM EMP_SALARY JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE) WHERE LOCAL_NAME LIKE 'ASIA%'; UPDATE EMP_SALARY SET BONUS = 0.3 WHERE EMP_ID IN (SELECT EMP_ID FROM EMP_SALARY JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE) WHERE LOCAL_NAME LIKE 'ASIA%'); -- 다중행서브쿼리(IN, ANY, ALL 사용 !!)
SQL
복사
UPDATE시 변경할 값은 해당 컬럼에 대한 제약조건에 위배되면 안됨!! 뿐만 아니라 DATA TYPE도 신경써서 변경해야됨!!
-- 선동일 사원의 주민번호값을 NULL로 변경 UPDATE EMPLOYEE SET EMP_NO = NULL WHERE EMP_NAME = '선동일'; -- 오류발생 --cannot update ("KH"."EMPLOYEE"."EMP_NO") to NULL -- 노옹철 사원의 부서코드를 D0으로 변경 UPDATE EMPLOYEE SET DEPT_CODE = 'D0' WHERE EMP_NAME = '노옹철'; --integrity constraint (KH.SYS_C007177) violated - parent key not found -- 심봉선 사원의 전화번호를 '010-1111-2222'로 변경 UPDATE EMPLOYEE SET PHONE = '010-1111-2222' WHERE EMP_NAME = '심봉선'; --value too large for column "KH"."EMPLOYEE"."PHONE" (actual: 13, maximum: 12) COMMIT;
SQL
복사

DELETE

테이블에 기록되어있는 데이터를 삭제하는 구문 (행 자체가 삭제됨)
[표현법] DELETE FROM 테이블명 [WHERE 조건식]; --> 생략시 전체 행 데이터 다 삭제됨!
-- 장채현 사원의 데이터 지우기 DELETE FROM EMPLOYEE WHERE EMP_NAME = '장채현'; ROLLBACK; --> 마지막 커밋시점으로 원복 DELETE FROM EMPLOYEE WHERE EMP_NAME = '강람보'; -- DELETE FROM EMPLOYEE -- WHERE EMP_NAME IN ('장채현', '강람보'); COMMIT; -- DEPARTMENT 로부터 D9부서 삭제 DELETE FROM DEPARTMENT WHERE DEPT_ID = 'D9'; --> D9의 값을 가져다 쓰고 있는 자식데이터가 있기 때문에 삭제 안됨 (삭제제한옵션) -- D3인 부서 삭제 DELETE FROM DEPARTMENT WHERE DEPT_ID = 'D3'; ROLLBACK;
SQL
복사
DELETE FROM 테이블명; → 테이블의 전체 행을 삭제할 때 사용되는 구문
[참고]
TRUNCATE(DDL) : 테이블의 전체 행을 삭제할 때 사용되는 구문 (DELETE보다 수행속도가 빠름)
TRUNCATE TABLE 테이블명; -- WHERE절 없음!! 별도의 조건 제시 불가
주의할점 : DELETE는 ROLLBACK이 가능하지만 TRUNCATE는 ROLLBACK이 불가!!
DELETE FROM EMP_SALARY; ROLLBACK; TRUNCATE TABLE EMP_SALARY; ROLLBACK; CREATE TABLE DEPT_COPY2 AS SELECT * FROM DEPARTMENT; ALTER TABLE DEPT_COPY2 ADD PRIMARY KEY(DEPT_ID); -- EMPLOYEE_COPY에 DEPT_CODE 컬럼에 외래키제약조건 추가 (DEPT_COPY2테이블참조) ALTER TABLE EMPLOYEE_COPY ADD FOREIGN KEY(DEPT_CODE) REFERENCES DEPT_COPY2(DEPT_ID); TRUNCATE TABLE DEPT_COPY2;
SQL
복사