< DML (Data Manipulation Language) >
- 데이터 조작어
- 테이블에 새로운 데이터를 삽입(INSERT)하거나, 기존의 데이터를 수정(UPDATE)하거나,
삭제(DELETE)하는 구문
< INSERT >
- 테이블에 행을 추가하는 구문
> 해당 테이블의 모든 컬럼에 값을 추가하고자 할 때
❗❗ 컬럼 순서대로 값을 입력해야 함!!
[ 표현법 ] INSERT INTO 테이블명 VALUES(값, 값, 값, ...);
> 해당 테이블 특정 컬럼만 선택해서 추가할 값만 제시하고자 할 때
- 선택하지 않은 컬럼은 NULL값이 기본으로 들어감
- 선택하지 않은 컬럼에 기본값(DEFAULT)이 지정되어 있으면 기본값이 들어감
❗❗ NOT NULL 제약조건이 걸려있는 컬럼은 반드시 값을 제시해야 함
[ 표현법 ] INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ...)
VALUES (값1, 값2, 값3, ...);
> 서브쿼리로 조회한 결과값을 추가하고자 할 때
[ 표현법 ] INSERT INTO 테이블명 (서브쿼리);
< INSERT ALL >
- 두 개 이상의 테이블에 동일한 서브쿼리를 이용하여 각각 값을 넣을 때 사용
[ 표현법 ]
INSERT ALL
INTO 테이블명1 VALUES(컬럼명, 컬럼명, 컬럼명, ...)
INTO 테이블명2 VALUES(컬럼명, 컬럼명, 컬럼명, ...)
서브쿼리;
-- 새로운 테이블을 먼저 만들기
-- 테이블1
CREATE TABLE EMP_JOB(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
JOB_NAME VARCHAR2(20)
);
-- 테이블2
CREATE TABLE EMP_DEPT(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
-- 서브쿼리
-- 급여가 300만원 이상인 사원들의 사번, 이름, 부서명, 직급명 조회
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE SALARY >= 3000000;
--> INSERT ALL
-- EMP_JOB테이블에는 급여가 300만원 이상인 사원들의 EMP_ID, EMP_NAME, JOB_NAME을 삽입
-- EMP_DEPT테이블에는 급여가 300만원 이상인 사원들의 EMP_ID, EMP_NAME, DEPT_TITLE을 삽입
INSERT ALL
INTO EMP_JOB VALUES(EMP_ID, EMP_NAME, JOB_NAME) -- 9개의 행을 추가
INTO EMP_DEPT VALUES(EMP_ID, EMP_NAME, DEPT_TITLE) -- 9개의 행을 추가
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE SALARY >= 3000000;
[ 표현법 ]
INSERT ALL
WHEN 조건1 THEN
INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
WHEN 조건2 THEN
INTO 테이블명2 VALUES(컬렴명, 컬럼명, ...)
서브쿼리;
-- 사번, 사원명, 입사일, 급여 // EMP_OLD, EMP_NEW
-- 테이블1
CREATE TABLE EMP_OLD
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0; -- EMPLOYEE테이블에서 구조만 복사
-- 테이블2
CREATE TABLE EMP_NEW
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0; -- EMPLOYEE테이블에서 구조만 복사
-- 서브쿼리
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
-- WHERE HIRE_DATE < '2010/01/01';
WHERE HIRE_DATE >= '2010/01/01';
-- 두 개의 조건을 만족하는 쿼리로 각각 나누려면?
INSERT ALL
WHEN HIRE_DATE < '2010/01/01' THEN -- 조건1
INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 테이블1
WHEN HIRE_DATE >= '2010/01/01' THEN -- 조건2
INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 테이블2
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY -- 서브쿼리
FROM EMPLOYEE; --25개의 행 추가
SELECT * FROM EMP_OLD; -- 9개의 행 추가
SELECT * FROM EMP_NEW; -- 16개의 행 추가
< UPDATE >
- 테이블에 기록된 데이터를 수정하는 구문
- WHERE 조건절 생략 가능. 생략 시 전체 모든 행의 데이터가 변경됨
❗❗ 값 수정 시에도 제약조건에 영향을 받음
[ 표현법 ]
UPDATE 테이블명
SET 컬럼명 = 바꿀값
, 컬럼명 = 바꿀값
, 컬럼명 = 바꿀값
, 컬럼명 = 바꿀값
WEHER 조건;
> 서브쿼리로 조회한 결과값으로 수정하고자 할 때
[ 표현법 ]
UPDATE 테이블명
SET 컬럼명 = (서브쿼리)
WHERE 조건;
< DELETE >
- 테이블에 기록된 데이터를 삭제하는 구문
- WHERE 조건절 생략 가능. 생략 시 전체 행이 삭제됨
[ 표현법 ]
DELETE FROM 테이블명
WHERE 조건;
< TRUNCATE >
- 테이블의 전체 행을 삭제할 때 사용하는 구문 (절삭)
- DELETE 보다 수행속도가 더 빠름
- 별도의 조건 제시 불가. ROLLBACK 불가능.
[ 표현법 ] TRUNCATE TABLE 테이블명;
TRUNCATE | DELETE |
별도의 조건 제시 불가 | 특정 조건 제시 가능 |
(DELETE 보다) 수행속도 빠름 | (TRUNCATE 보다) 수행속도 느림 |
ROLLBACK 불가 | ROLLBACK 가능 |
'개발 > SQL' 카테고리의 다른 글
[SQL] Oracle - (DCL) GRANT / REVOKE (0) | 2022.10.04 |
---|---|
[SQL] Oracle - (DDL) ALTER / DROP (0) | 2022.10.04 |
[SQL] Oracle - (DDL) CREATE / 제약조건(CONSTRAINTS) (0) | 2022.09.29 |
[SQL] Oracle - 서브쿼리(SUBQUERY) / 인라인 뷰(INLINE-VIEW) (0) | 2022.09.29 |
[SQL] Oracle - 집합연산자(Set Operator) (0) | 2022.09.28 |