오늘은 SQL의 DML(Data Manipulation Language)중 INSERT 문을 사용할 것이다.
DML은 데이터 조작어를 의미하며 테이블 내의 데이터를 추가, 변경, 삭제 해주는 언어이다.
그중에서도 INSERT문은 테이블에 자료가 없을 때 테이블에 데이터를 저장해주는 명령어이다.
사용형식은 아래와 같다.
INSERT INTO 테이블명(컬럼명1, 컬럼명2 ....)
VALUES(값1,값2.....)
주의해야할 점은 컬럼명은 생략이 가능하고, 생략하면 테이블 생성시 기술한 순서대로 모든값을 VALUES절에 기술하면 된다.
컬럼명을 기술하는 경우 필요한 자료만 입력이 가능해진다. 단, NOT NULL은 생략불가능여서 NN으로 지정된 컬럼에는 반드시 데이터를 삽입해주어야 한다.
https://show5116.tistory.com/5
2장에서 만들었던 테이블들에 데이터를 삽입해보겠다.
-- DEPT 테이블 명
--------------------------
-- 부서번호 부서명
--------------------------
-- 10 총무부
-- 20 회계부
-- 30 영업부
-- 40 배송부
-- 50 자재부
--------------------------
INSERT INTO DEPT
VALUES(10,'총무부');
INSERT INTO DEPT
VALUES(20,'회계부');
INSERT INTO DEPT
VALUES(30,'영업부');
INSERT INTO DEPT
VALUES(40,'배송부');
INSERT INTO DEPT
VALUES(50,'자재부');
이렇게 테이블에 데이터를 삽입했다면 한번 확인해보자.
SELECT * -- * ALL을 의미 모든 데이터를
FROM DEPT; -- DEPT 테이블에서 가져오겠다.
위의 명령어대로 실행한다면 테이블 값이 터미널에 보여질 것이다.
-- EMP
---------------------------------------------
-- 사원번호 사원명 직무명 부서코드
---------------------------------------------
-- E001 홍길동 40
-- E002 강감찬 구매 10
-- E003 이성계 인사 70
---------------------------------------------
INSERT INTO EMP(EMP_ID,EMP_NAME,DEPT_ID)
VALUES('E001','홍길동',40);
INSERT INTO EMP
VALUES('E002','강감찬','구매',10);
INSERT INTO EMP
VALUES('E003','이성계','인사',70);
한가지 예시를 더 진행해보았다.
EMP 테이블에서 부서코드는 FK(외래키)로 설정하였었다. 즉 위의 DEPT 테이블의 PK에서 값을 가져오는 것이다.
우선 이렇게 코드를 실행한다면 'E003'에서 에러가 발생할 것이다. 그 이유는 방금 전에 DEPT 테이블에서 부서코드
70을 생성하지 않았기 때문이다. 즉 외래키가 부모키로 부터 참조해와야 하는데, 70이란 값을 불러들이지 못하여서
에러가 발생한 것이다.
위의 예시에서 한가지 더 볼것이 있다. 사원번호 E001의 경우에는 직무명이 존재하지 않는다.
즉 직무명에 NULL 값을 주어야한다. 이렇게 할 수 있는 방법은 3가지 방법이 있다.
첫번째로는 위의 코드처럼 INSERT INTO EMP(칼럼명1,칼럼명2,칼럼명4) 이런식으로 칼럼명3을 부르지 않아서
값을 주지 않는 방법이다.
INSERT INTO EMP
VALUES('E001','홍길동',NULL,40);
두번째로는 직접 3번째 칼럼에 NULL값을 주는 것이다.
INSERT INTO EMP
VALUES('E001','홍길동','',40);
세번째로는 ''로 값을 주는것인데 이것은 white space로 즉 널과 같은 의미를 가져서 같은 결과를 가지게 된다.
-- SITE
-----------------------------------------------------------------------
-- 사업장번호 이름 주소 전화번호 비고
-----------------------------------------------------------------------
-- A020201201 나라초등학교 신축 대전시 중구 대흥동
-- C120210607 S-CITY 신축 대전시 달성구 042-999-0001
-----------------------------------------------------------------------
INSERT INTO SITE
VALUES('A020201201','나라초등학교 신축','대전시 중구 대흥동','',NULL);
INSERT INTO SITE(SITE_ID,SITE_NAME,SITE_ADDR,SITE_TEL)
VALUES('C120210607','S-CITY 신축','대전시 달성구','042-999-0001');
SELECT *
FROM SITE;
위의 널값을 주는 방법을 토대로 한가지 예시를 더 진행해보았다.
-- WORK
---------------------------------------
-- 사업장번호 사원번호 투입일
---------------------------------------
-- C120210607 E002 2020-12-20
-- C120210607 E001 오늘
-- A020201201 E003 2001-02-29
---------------------------------------
INSERT INTO WORK
VALUES('A020201201','E002','20201210');
INSERT INTO WORK
VALUES('A020201201','E001',SYSDATE);
INSERT INTO WORK
VALUES('A020201201','E003','20010229');
SELECT *
FROM WORK;
마지막 예시이다. 이번엔 날짜 (DATE) 값을 저장해주었다.
날짜 DATE같은경우에는 숫자만 입력해주어도 알아서 날짜로 변경하여 해석해준다.
위와 같이 실행하게 되면 우선 3번째 INSERT에서 에러가 날 것이다.
그 이유가 무엇이냐?? 실제로 2001년을 확인하면 2월은 28일까지만 존재한다.
즉 컴퓨터가 스스로 캘린더를 확인하여서 날짜 범위 밖에 존재하는 2001 02 29일의 값을 저장하지 못한다는 것이다.
그래서 29를 28로 고쳐주면 에러가 사라지는 것을 확인 할 수 있다.
그리고 2번째 INSERT를 보면 SYSDATE라고 표현하였다. 이것은 현재 system에서의 날짜값을 지정해주겠다는 것이다.
실제로 그 결과값을 보면 오늘 날짜로 저장된것을 확인할 수 있다.
'DataBase > Oracle' 카테고리의 다른 글
7.[Oracle] 서브쿼리 (0) | 2021.07.01 |
---|---|
6. [Oracle] 테이블 조인 (0) | 2021.06.25 |
5. [Oracle] 함수(function) (0) | 2021.06.16 |
2. [Oracle] 변수타입, DDL_CREATE 구문 사용하기 (0) | 2021.06.08 |
1. [Oracle] 설치 및 사용자 생성 (0) | 2021.06.07 |