안녕하세요.
여니입니다 :)
* DML (DATA MANIPULATION LANGUAGE)
데이터 조작 언어
테이블에 새로운 데이터를 삽입(INSERT)하거나
기존의 데이터를 수정(UPDATE)하거나
삭제(DELETE)하는 구문
1. INSERT : 테이블에 새로운 "행"을 추가하는 구문
[표현법]
* INSERT INTO 계열
1) INSERT INTO 테이블명 VALUES(값1,값2,값3,...);
-> 해당 테이블에 존재하는 "모든" 컬럼에 대해 추가하고자하는 값을 내가 직접
제시해서 "한 행"을 INSERT하고자할때 쓰는 표현법
** 주의사항 **
1) 칼럼의 순서, 2)자료형, 3)갯수를 맞춰서 VALUES괄호 안에 값을 나열해야함
- 부족하게 제시하면 : NOT ENOUGH VALUE 오류
- 더 많이 제시하면 : TOO MANY VALUE 오류가 발생한다.
ex)
INSERT INTO EMPLOYEE
VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 0101234567888, 'D1', 'J7', 'S6', 1800000,
0.9, 200, SYSDATE,NULL,DEFAUL);
- 괄호 안에 값이 하나라도 비면 "not enough values" 오류뜸
- 괄호 안에 값이 하나라도 많으면 "too many values" 오류뜸
2) INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ....)
VALUES(값1,값2,값3,...)
=> 해당 테이블에 "특정" 컬럼만 선택해서 그 컬럼에 추가할 값만 제시하고자 할 때 사용
- 그래도 한 행단위로 추가되기 때문에 선택 안된 칼럼은 NULL값이 들어감(단, DEFAULT설정이 되어있을 경우 그 값이 들어감)
주의사항 : NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 제시해야한다.
단, DEFAULT설정이 되어 있다면 선택 안해도 된다.
ex)
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, DEPT_CODE, JOB_CODE, SAL_LEVEL)
VALUES (901,'김소연2','123456-1234567','D1','J6','S5'); -- 한 칼럼값만 추가하여 줌
<조회가능>
SELECT * FROM EMPLOYEE WHERE EMP_ID = 901;
3) INSERT INTO 테이블명 (서브쿼리);
=> VALUES()로 값을 직접 기입하는 것이 아니라
서브쿼리로 조회한 결과값을 통째로 INSERT 하는 구문
즉, 여러행을 한번에 INSERT 할수있다. ★의외로 많이사용됨
ex)
-- 새로운 테이블 생성
CREATE TABLE EMP_01(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
-- 전체 사원들의 사번, 이름, 부서명을 조회한 결과를 EMP_01 테이블에 통째로 추가
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;
-- 2) INSERT
INSERT INTO EMP_01(SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID);
<조회가능>
SELECT * FROM EMP_01;
* INSERT ALL 계열
두 개 이상의 테이블에 각각 INSERT 할 때 사용
조건 : 그 때 사용되는 서브쿼리가 동일해야한다.
1) INSERT ALL
INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
서브쿼리;
ex)
-- 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_IN,EMP_NAME,JOB_NAME)
INTO EMP_DEPT VALUES(EMP_ID,EMP_NAME,DEPT_TITLE)
SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
WHERE SALARY >= 3000000;
<조회가능>
SELECT * FROM EMP_JOB;
SELECT * FROM EMP_DEPT;
2) INSERT ALL
WHEN 조건1 THEN
INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
WHEN 조건2 THEN
INTO 테이블명2 VALUES(칼럼명, 칼럼명, ....)
서브쿼리;
-조건에 맞는 값들만 넣겠다.
ex)
-- 조건을 사용해서 각 테이블에 값 INSERT
-- 새로운 테스트용 테이블 생성
-- 2010년도 기준으로 이전에 입사한 사원들의 사번, 사원명, 입사일, 급여를 담는 테이블 (EMP_OLD)
CREATE TABLE EMP_OLD
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0; -- 테스트용(껍데기생성)
-- 2010년도 기준으로 이후에(2010년 포함) 입사한 사원들의 사번, 사원명, 입사일, 급여를 담는 테이블 (EMP_NEW)
CREATE TABLE EMP_NEW
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE 1 = 0; -- 테스트용(껍데기생성)
-- 1) 서브쿼리 부분
-- 2010년 이전, 이후
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE HIRE_DATE < '2010/01/01'; -- 15
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE HIRE_DATE >= '2010/01/01'; -- 9
INSERT ALL
WHEN HIRE_DATE < '2010/01/01' THEN
INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 15행
WHEN HIRE_DATE >= '2010/01/01' THEN
INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY) -- 9행
SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY FROM EMPLOYEE;
<조회가능>
SELECT * FROM EMP_OLD;
SELECT * FROM EMP_NEW;