안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)
/*
* 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 오류가 발생한다.
*/
INSERT INTO EMPLOYEE
VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 0101234567888, 'D1', 'J7', 'S6', 1800000,
0.9, 200, SYSDATE,NULL,DEFAUL);
--VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 01012345678, 'D1', 'J7', 'S6', 1800000,
--0.9, 200, SYSDATE,NULL);
--"not enough values"
--VALUES(900, '김소연', '880218-1234567', 'THDUS@NAVER.COM', 01012345678, 'D1', 'J7', 'S6', 1800000,
--0.9, 200, SYSDATE,NULL,DEFAULT,DEFAULT);
--"too many values"
SELECT * FROM EMPLOYEE;
----------------------------------------------------------------------------------------
/*
2) INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, ....)
VALUES(값1,값2,값3,...)
=> 해당 테이블에 "특정" 컬럼만 선택해서 그 컬럼에 추가할 값만 제시하고자 할 때 사용
- 그래도 한행단위로 추가되기 때문에 선택 안된칼럼은 NULL값이 들어감(단, DEFAULT설정이 되어있을 경우 그 값이 들어감)
주의사항 : NOT NULL 제약조건이 걸려있는 컬럼은 반드시 선택해서 직접 값을 제시해야한다.
단, DEFAULT설정이 되어 있다면 선택 안해도 된다.
*/
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 할수있다. ★의외로 많이사용됨
*/
-- 새로운 테이블 생성
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);
/*
* INSERT ALL 계열
두 개 이상의 테이블에 각각 INSERT 할 때 사용
조건 : 그 때 사용되는 서브쿼리가 동일해야한다.
1) INSERT ALL
INTO 테이블명1 VALUES(컬럼명, 컬럼명, ...)
INTO 테이블명2 VALUES(컬럼명, 컬럼명, ...)
서브쿼리;
*/
-- 새로운 테이블을 먼저 만들기
-- 첫번째 테이블 : 급여가 300만원 이상인 사원들의 사번, 사원명, 직급명을 보관할 테이블
-- 테이블명 : EMP_JOB / EMP_ID(NUMBER), EMP_NAME(VARCHAR2(30), JOB_NAME(VARCHAR(20))
CREATE TABLE EMP_JOB(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
JOB_NAME VARCHAR2(20)
);
-- 첫번째 테이블 : 급여가 300만원 이상인 사원들의 사버느 사원명, 부서명을 보관할 테이블
-- 테이블명 : EMP_DEPT / EMP_ID(NUMBER), EMP_NAME(VARCHAR2(30), DEPT_TITLE(VARCHAR2(20))
CREATE TABLE EMP_DEPT(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30),
DEPT_TITLE VARCHAR2(20)
);
-- 급여가 300만원 이상인 사원들의 사번, 이름, 직급명, 부서명 조회
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;
-- 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(칼럼명, 칼럼명, ....)
서브쿼리
-조건에 맞는 값들만 넣겠다.
*/
-- 조건을 사용해서 각 테이블에 값 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;