SQL_DML(데이터 조작어)_INSERT(입력)

김하은·2023년 3월 27일
0

SQL

목록 보기
10/12
post-thumbnail

📖 데이터 조작어

1. DML(Data Manipulation Language)

테이블에 새로운 데이터를 입력하거나 기존 데이터를 수정 또는 삭제하기 위한 명령어

2. 종류

1) insert : 새로운 데이터 입력 명령어
2) update : 기존 데이터 수정 명령어
3) delete : 기존 데이터 삭제 명령어
4) merge : 두 개의 테이블을 하나의 테이블로 병합하는 명령어

3. 트랜잭션

여러 개의 명령문을 하나의 논리적인 작업단위로 처리하는 기능

  • commit : 트랜잭션의 정상적인 종료를 위한 명령어
  • rollback : 트랜잭션의 비정상적인 중단을 위한 명령어
    DB 서버
    클라이언트1 클라이언트2 클라이언트3
    클라이언트1이 데이터를 변경해서 commit 하기 전까지는 클라이언트1 화면에서만 변경된 데이터를 보인다. commit 하기 전에 rollback을 하면 클라이언트1에게 이전 변경 전 데이터로 변경된다. 다시 변경 후, commit 하는 순간, 클라이언트2, 클라이언트3에게 데이터를 확인했을 때, 변경된 데이터를 볼 수 있다.

✍ 데이터 입력 (INSERT)

1. 테이블에 데이터를 입력하기 위한 명령어 insert명령문 사용

2. 데이터 입력 방법

1) 단일 행 입력 : 한번에 하나의 행을 테이블에 입력하는 방법
2) 다중 행 입력 : 서브쿼리를 이용하여 한 번에 여러 행을 동시에 입력하는 방법

📌 단일 행 입력

단일 행 입력 방법

1) 기본 명령문

  • 컬럼명 명시 없이 : 전체 테이블에 데이터 입력
    insert into 테이블명 values(데이터1, ... 데이터n)
  • 테이블에서 선언된 순서와 타입대로 데이터를 나열하여야 한다.
  • 컬럼명 명시 하여 : 해당 컬럼에만 데이터 입력
    insert into 테이블명(컬럼명1, 컬럼명2) values(데이터1, 데이터2);

2) 사용 방법

--ex) 컬럼명 지정하지 않고 전체데이터 입력
INSERT INTO emp_cp100 VALUES(9999,'신길동','사원',7878,sysdate, 3000, 100, 10);
-- 초기에 테이블이 만들어진 순서와 데이터유형대로 데이터를 입력처리한다. 
-- 입력시 에러 check
-- 1. 전체 컬럼의 데이터를 입력 : 추후에 입력할 내용이면 null 
-- 2. 순서와 type이 맞는지?
-- 3. 데이터 크기가 맞는지?

--ex) 컬럼명 지정하여 해당 컬럼에 데이터 입력
INSERT INTO emp_cp100(empno, ename, sal) VALUES(9998, '오길동', 3500);
-- 입력시 에러 check
-- 1. 명시된 컬럼명 순서와 type, 크기에 맞게 values값을 할당하여야 한다. 

--테이블 복사하여 생성
CREATE TABLE emp_cp102
AS SELECT empno, ename, sal
FROM emp
WHERE 1=0; -- 테이블의 구조만 복사하여 테이블이 만들어진다. 

-- ex1) 전체 컬럼을 한꺼번에 입력처리
INSERT INTO emp_cp102 values(9999,'신짱구',5000);

-- ex2) empno와 sal만 입력처리하기
INSERT INTO EMP_CP102(empno, sal) values(7000, 3000);

📌 null 데이터 입력

1. 명시적으로 null 데이터 입력

지정한 또는 전체 테이블을 입력할 때, null로 명시적으로 데이터를 입력처리.

INSERT INTO emp_cp100 VALUES(7781, '오길동', NULL, NULL, NULL, 3000, NULL, NULL);

2. 묵시적으로 null 데이터 입력

지정한 컬럼만 데이터 입력하는 경우, 그 외에 컬럼은 null로 입력이 된다.

INSERT INTO EMP_CP100(empno, ename) VALUES(9997, '하길동');

📌 날짜 데이터 입력 방법

  1. 날짜는 고유의 날짜 타입이 있기에 이를 기본적으로 문자나 숫자로 바로 입력을 할 수 없다.
    to_char(날짜형, '보고자하는형식') : 보고자하는 문자열 형식을 지정하여 확인할 수 있다.

  2. to_date() 함수를 이용해서 지정한 형식으로 문자열을 통해 입력이 가능하다.

  3. 기본 형식 : to_date('문자열데이터', '지정한형식')

  4. 현재 날짜/시간을 입력할 때는 sysdate를 활용한다.

INSERT INTO EMP_CP100(empno, hiredate) VALUES(1002, to_date('2022-05-25', 'YYYY-MM-DD'));

INSERT INTO emp_cp100(empno, hiredate) VALUES(1003, sysdate);

-- ex1) 오늘 입사한 사원 정보를 전체 입력처리하세요. 
--방법1)
INSERT INTO emp_cp100 values(1004, '마길동', '사원', 7839, sysdate, 3000, 100, 10); 

--방법2) 현재의 년도와 월을 SYSDATE통해서 가져오고 날짜는 지정된 날짜로 처리할 때 아래 형식을 활용한다. 
-- 일단 기본 입력하는 형식의 날짜를 문자열로 만들고, 
-- 실제로 입력되어야 할 데이터는 날짜형이기에 날짜형으로 만들어서 입력 처리
INSERT INTO emp_cp100 VALUES(1005, '오길동', '사원', 7839,
 to_date(to_char(sysdate, 'YYYY/MM') || '/10', 'YYYY/MM/DD'),3000,100,10
);

-- ex2) 사원번호, 사원명, 입사일, 급여를 8000, '김철수', 2022-01-01, 3500으로 처리하여 입력하세요.
INSERT INTO EMP_CP100(empno, ename, hiredate, sal) VALUES(8000, '김철수', to_date('2022-01-01','YYYY-MM-DD'), 3500); 

📌 다중 행 입력

1. 기본 형식

insert 명령문에서 서버쿼리 절을 이용
insert 명령문에 의해 한번에 여러 행을 동시에 입력
9i버전 이후
insert all
first insert

2. 단일 테이블에 다중 행 입력 방법

1) insert 명령문에서 서브쿼리 절을 이용하여 자신이나 다른 테이블에 데이터를 복사하여
여러행을 동시에 입력
2) insert 명령문의 values절 대신 서브쿼리에서 검색된 결과 집합을 한꺼번에 입력
3) 서버쿼리 결과 집합은 insert명령문에 지정된 컬럼 갯수와 데이터 타입이 일치해야 함.
4) 서버쿼리를 이용한 다중 행 입력 시 테이블에 기본키, 고유키, 제약 조건이 중복되지 않도록
주의
5) 제약 조건을 위반할 경우 입력되지 않고 오류 발생

3. 활용 방법

INSERT INTO 테이블 (컬럼1, 컬럼2..)
Subquery

--테이블 복사해서 생성
CREATE TABLE EMP2_CP103
AS SELECT * FROM emp WHERE 1=0;
--복사,생성한 테이블 확인
SELECT * FROM EMP_CP103;
--입력
INSERT INTO EMP2_CP103 (empno, ename)
SELECT empno, ename FROM emp WHERE deptno = 10;

-- ex) EMP_CP104로 데이터가 없는 복사테이블을 만들고, 
-- 사원 정보 중에 연봉에 1000~3000 사이의 데이터를 전체데이터 입력
-- 사원 정보 중에 직책이 SALESMAN인 데이터를 사원번호, 사원명, 직책, 급여만 입력 
처리하세요. 

CREATE TABLE EMP_CP104
AS SELECT * 
FROM emp 
WHERE 1=0;

SELECT * FROM EMP_CP104; 

-- 1)
INSERT INTO EMP_CP104 
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 3000;
--SELECT * FROM emp WHERE sal >=1000 AND sal <=3000;

-- 2)
INSERT INTO EMP_CP104 (empno, ename, job, sal)
SELECT empno, ename, job, sal FROM emp WHERE job='SALESMAN';

📌 다중행 입력 insert all

1. 조회된 내용을 한번에 여러 테이블에 입력 처리

2. 내용

서브 쿼리의 결과 집합을 조건 없이 여러 테이블에 동시에 입력
서브 쿼리의 컬럼 이름과 데이터가 입력되는 테이블의 컬럼이 반드시 동일하여야 함
갯수, 유형과 크기가 입력 가능하여야 함

3. 기본 형식

insert all || first
into 테이블1 values(컬럼1, 컬럼2...)
into 테이블2 values(컬럼1, 컬럼2...)
into 테이블3 values(컬럼1, 컬럼2...)
into 테이블4 values(컬럼1, 컬럼2...)
... subquery

1) all : 서브 쿼리의 결과 집합을 해당하는 insert절에 모두 입력
2) first : 서브 쿼리의 결과 집합을 해당하는 첫번째 insert절에 입력
3) subquery : 입력 데이터 집합을 정의하기 위한 서브쿼리

CREATE TABLE emp_cpy201
AS SELECT * FROM emp WHERE 1=0;

CREATE TABLE emp_cpy202
AS SELECT * FROM emp WHERE 1=0;

CREATE TABLE emp_cpy203
AS SELECT * FROM emp WHERE 1=0;

--------------------------
INSERT ALL
INTO emp_cpy201(empno, ename, job) values(empno, ename, job)
INTO emp_cpy202(empno, ename, job) values(empno, ename, job)
INTO emp_cpy203(empno, ename, job) values(empno, ename, job)
SELECT empno, ename, job
FROM EMP 
WHERE deptno = 10; 

--------------------------
INSERT FIRST
INTO emp_cpy201(empno, ename, job) values(empno, ename, job)
INTO emp_cpy202(empno, ename, job) values(empno, ename, job)
INTO emp_cpy203(empno, ename, job) values(empno, ename, job)
SELECT empno, ename, job
FROM EMP e 
WHERE deptno = 20;

/*
ex) EMP_CPY301, EMP_CPY302, EMP_CPY303 데이터가 없는 복사테이블을 만들고, 해당 
테이블에 부서번호가 20인 사원 정보 전체 컬럼을 입력 처리하세요. */
CREATE TABLE EMP_CPY301
AS SELECT * FROM emp WHERE 1=0;

CREATE TABLE EMP_CPY302
AS SELECT * FROM emp WHERE 1=0;

CREATE TABLE EMP_CPY303
AS SELECT * FROM emp WHERE 1=0;

INSERT ALL
INTO EMP_CPY301 values(empno, ename, job, mgr, hiredate, sal, comm, deptno)
INTO EMP_CPY302 values(empno, ename, job, mgr, hiredate, sal, comm, deptno)
INTO EMP_CPY303 values(empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT *
FROM EMP 
WHERE deptno = 20; 

--------------------------------
INSERT FIRST
조건절1
INTO 테이블 values(데이터...)
조건절2
INTO 테이블 values(데이터...)
조건절3
INTO 테이블 values(데이터...)
subquery 처리
--------------------------------

--ex) 사원 정보 중에 급여가 4000 이상인 데이터는 테이블 1에 입력, 
-- 급여가 2000~4000 미만인 데이터는 테이블 2에 입력
-- 그외는 테이블 3에 입력 
CREATE TABLE EMP_CPY401 AS SELECT * FROM emp WHERE 1=0;
CREATE TABLE EMP_CPY402 AS SELECT * FROM emp WHERE 1=0;
CREATE TABLE EMP_CPY403 AS SELECT * FROM emp WHERE 1=0;

INSERT FIRST 
 WHEN sal>=4000 THEN INTO EMP_CPY401(empno, ename, sal) VALUES(empno, ename, sal)
 WHEN sal>=2000 THEN INTO EMP_CPY402(empno, ename, sal) VALUES(empno, ename, sal)
 ELSE INTO EMP_CPY403(empno, ename, sal) VALUES(empno, ename, sal)
SELECT empno, ename, SAL 
FROM emp;
 
-- ex) EMP_CPY501, EMP_CPY502, EMP_CPY503, EMP_CPY504 만들기
-- 사원 입사분기별로 사원데이터를 각각 입력하세요. 
-- (TRUNCATE TABLE EMP_CPY501 : 데이터 잘못 들어갔을때 데이터 삭제)

CREATE TABLE EMP_CPY501 AS SELECT * FROM emp WHERE 1=0; 
CREATE TABLE EMP_CPY502 AS SELECT * FROM emp WHERE 1=0; 
CREATE TABLE EMP_CPY503 AS SELECT * FROM emp WHERE 1=0; 
CREATE TABLE EMP_CPY504 AS SELECT * FROM emp WHERE 1=0; 

INSERT FIRST
 WHEN to_char(hiredate, 'Q') = '1' THEN INTO EMP_CPY501(empno, ename, hiredate, sal) VALUES(empno, ename, hiredate, 
sal)
 WHEN to_char(hiredate, 'Q') = '2' THEN INTO EMP_CPY502(empno, ename, hiredate, sal) VALUES(empno, ename, hiredate, 
sal)
 WHEN to_char(hiredate, 'Q') = '3' THEN INTO EMP_CPY503(empno, ename, hiredate, sal) VALUES(empno, ename, hiredate, 
sal)
 WHEN to_char(hiredate, 'Q') = '4' THEN INTO EMP_CPY504(empno, ename, hiredate, sal) VALUES(empno, ename, hiredate, 
sal)
SELECT empno, ename, hiredate, sal 
FROM emp;
profile
개발자국

0개의 댓글