DML(DATA MANIPULATION LANGUAGE): 데이터 조작 언어
테이블에 새로운 데이터를 삽입, 수정, 삭제하는 구문 (DELETE, UPDATE, DELETE)
1.INSERT
테이블에 행을 추가하는 구문
1) 테이블의 모든 컬럼에 값 추가시
INSERT INTO 테이블명 VALUES (값1, 값2, 값3....)
=> 해당 테이블의 모든 컬럼에 값 추가시 사용
**유의할 점: 컬럼 순번을 지켜야함
SELECT * FROM EMPLOYEE;
INSERT INTO EMPLOYEE
VALUES (10, '샐러리맨', , 'moneyisall@gg.or.kr', '0101263158', 'D1', 'J1', 'S4', 80000000, 0.1, NULL, SYSDATE, NULL, DEFAULT);
2) 테이블에 특정 컬럼만 선택하여 값 추가시
INSERT INTO 테이블명 (컬럼명1, 컬럼명2, 컬럼명3) VALUES (값1, 값2, 값3)
== > 해당 테이블에 특정 컬럼만 선택하여 추가할 때
==> INSERT는 행 단위로 추가가 되므로 선택이 되지 않은 컬럼은 NULL값이 들어감
(DEFAULT가 지정되어 있을 경우 DEFAULT값이 들어감)
주의사항: NOT NULL 제약조건이 걸린 컬럼은 반드시 값을 제시하여야 함
INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, DEPT_CODE, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES ( 107, '자바전문가', '153244-5446789', 'D2','J2', 'S3', SYSDATE);
3) INSERT INTO 테이블명(서브쿼리)
VALUES 내부 값을 기입하는 대신,
서브쿼리 조회 결과값을 INSERT하는 구문
INSERT INTO 테이블명
서브쿼리;
CREATE TABLE EMP_01 (
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
SELECT * FROM EMP_01;
INSERT INTO EMP_01
(SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE =DEPT_ID(+)
) ;
4) INSERT ALL
동일한 하나의 SUBQUERY의 결과값을
두 개 이상의 테이블에 각각 INSERT할 때 사용
INSERT ALL
INTO 테이블명1 VALUES (컬럼명, 컬럼명 ,컬럼명)
INTO 테이블명2 VALUES (컬럼명, 컬럼명 ,컬럼명)
서브쿼리;
--- EMP_JOB 테이블에는 급여가 300만원 이상인 사원들의 정보 삽입
--- EMP_DEPT테이블에는 급여가 300만원 이상인 사원들의 정보 삽입
INSERT ALL
INTO EMP_JOB
VALUES (EMP_ID, EMP_NAME, JOB_NAME)
INTO EMP_DEPT
VALUES (EMP_ID, EMP_NAME, JOB_NAME)
SELECT EMP_ID, EMP_NAME, JOB_NAME
FROM EMPLOYEE
LEFT JOIN JOB
USING (JOB_CODE)
LEFT JOIN DEPARTMENT
ON DEPT_CODE = DEPT_ID
WHERE SALARY >= 3000000;
CREATE TABLE EMP_OLD
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0 ;
CREATE TABLE EMP_NEW
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0 ;
SELECT * FROM EMP_OLD;
SELECT * FROM EMP_NEW;
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE HIRE_DATE >= '2010/01/01';
5) INSERT ALL - WHEN THEN
INSERT ALL
WHEN 조건1 THEN
INTO 테이블명1 VALUES( 컬럼명1, 컬럼명,,,,)
WHEN 조건2 THEN
INTO 테이블명2 VALUES (컬럼명..)
서브쿼리;
INSERT ALL
WHEN HIRE_DATE < '2010/01/01' THEN
INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
WHEN HIRE_DATE >= '2010/01/01' THEN
INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE;
2. UPDATE
테이블에 기록된 데이터를 수정하는 구문
UPDATE 테이블명
SET 컬럼명 = 바꿀값
, 컬럼명 = 바꿀값
....
==> 여러개 컬럼 동시변경 가능
WHERE 조건절 ; => 생략이 가능하나, 생략시 전체 모든 행 데이터가 변경됨
--테이블복사
CREATE TABLE DEPT_COPY
AS SELECT * FROM DEPARTMENT;
SELECT * FROM DEPT_COPY;
---D9부서명을 을 전략기획부로 수정
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획부';
ROLLBACK;
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획부'
WHERE DEPT_TITLE = '총무부';
-- 테이블 복사2
CREATE TABLE EMP_SALARY
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS
FROM EMPLOYEE;
DROP TABLE EMP_SALARY;
ROLLBACK;
UPDATE시 서브쿼리 활용
서브쿼리 수행 결과값으로 UPDATE
UPDATE 테이블명
SET 컬럼명 = (서브쿼리)
WHERE 조건 ; (생략가능)
SELECT * FROM EMP_SALARY;
--- EMP_SALARY테이블에서 자바전문가 사원의 부서코드를 샐러리맨 사원의 부서코드로 변경해보자
UPDATE EMP_SALARY
SET DEPT_CODE = (
SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '샐러리맨')
WHERE EMP_NAME = '자바전문가' ;
--방명수 사원의 급여와 보너스를 유재식사원의 급여와 보너스값으로 변경
UPDATE EMP_SALARY
SET (SALARY, BONUS) = ( SELECT SALARY, BONUS
FROM EMPLOYEE
WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';
SELECT * FROM EMP_SALARY;
UPDATE EMPLOYEE
SET EMP_ID = 200
WHERE EMP_NAME = '송종기'; ---ORA-00001: unique constraint (KH.EMPLOYEE_PK) violated --PRIMARY KEY제약조건 위배 (중복)
UPDATE EMPLOYEE
SET EMP_NAME = NULL
WHERE EMP_NAME = '송종기'; --ORA-01407: cannot update ("KH"."EMPLOYEE"."EMP_NAME") to NULL , NOT NULL 제약조건 위배
COMMIT;
3. DELETE
테이블에 기록된 데이터를 삭제하는 구문
DELETE FROM 테이블명
WHERE 조건; (WHERE 절은 생략가능, 생략시 해당 테이블 전체행삭제)
DELETE FROM EMPLOYEE;
SELECT * FROM EMPLOYEE;
ROLLBACK;--- 롤백시 마지막 커밋시점으로 돌아감
---샐러리맨, 자바전문가 데이터 지우기
DELETE FROM EMPLOYEE
WHERE EMP_NAME IN ( '샐러리맨', '자바전문가');
COMMIT; ---모든 변경사항을 확정하겠다
-------DEPARTMENT테이블로부터 DEPT_ID가 D1인 부서 삭제
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1'; ---ORA-02292: integrity constraint (KH.SYS_C007166) violated - child record found
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D3';
ROLLBACK;
* TRUNCATE
- 테이블 전체 행을 삭제할 때 사용(절삭)
- DELETE보다 실행속도가 빠름
- 별도 조건 부여 불가
- ROLLBACK불가
TRUNCATE TABLE 테이블명; | DELETE FROM 테이블명 |
별도 조건제시 불가 | 특정 조건제시 가능 |
수행속도 빠름 | 수행속도 느림 |
ROLLBACK불가 | ROLLBACK 가능 |
SELECT * FROM EMP_SALARY;
DELETE FROM EMP_SALARY; -- 0.03초
ROLLBACK;
TRUNCATE TABLE EMP_SALARY; --0.15초 --- 테이블 데이터가 많아야 의미있음,,,
--TABLE EMP_SALARY 가 잘렸습니다 --ROLLBACK 불가!
'Database' 카테고리의 다른 글
[SQL] DCL - GRANT, REVOKE (1) | 2022.10.05 |
---|---|
[SQL] DDL - CREATE/ ALTER/ DROP (0) | 2022.10.05 |
[SQL] 제약조건 (CONSTRAINTS) (0) | 2022.10.04 |
[SQL] 서브쿼리 (SUBQUERY) (0) | 2022.10.04 |
[SQL] 집합연산자 (SET OPERATOR) (0) | 2022.10.04 |