SQL 8-2. 널 값 삽입 방법
관련링크
본문
암시적(Implicit) 열 목록에서 열을 생략합니다.
명시적(Explicit)
VALUES목록에서 NULL키워드를 지정합니다.
문자열 및 날짜에 대해 VALUES목록에서 공백 문자열( ‘ ’ )을 지정합니다.
오라클에서 DESCRIBE명령을, MSSQL에서 sp_columns 명령을 통해 Null상태를 확인하여 대상 열에서 널 값을 사용할 수
있는지 확인한다.
SQL Server는 자동으로 모든 데이터 유형, 데이터 범위를 사용하며 데이터 무결성 제약 조건을 보존한다.
목록에 없는 열은 명시적(explicit)으로 새 행에 널 값을 갖게 된다.
다음은 사용자 입력 중에 발생할 수 있는 일반적인 오류다.
․ NOT NULL열에 필수 값 누락
․ 중복 값으로 고유성 제약 조건 위반
․ 외래 키 제약 조건 위반
․ CHECK 제약 조건 위반
․ 데이터 유형 불일치
․ 값의 폭(width)이 너무 넓어 열에 맞지 않음
예제) 특정 값 삽입
SYSDATE 함수는 현재 날짜 및 시간을 기록한다.
오라클 디비 예제 : INSERT INTO employees (employee_id,
first_name, last_name, email, phone_number, hire_date, job_id, salary,commission_pct, manager_id, department_id)
VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
참고] Oracle에서 스크립트파일 작성 : 데이터 조작 스크립트 작성 ․ SQL문에 & 치환을 사용하여 사용자에게 값을 요구합니다. ․ &는 변수 값에 대한 위치 표시자입니다.
☞설명) SQL함수를 사용하여 특정 값 삽입
함수를 사용하여 테이블에 특정 값을 입력할 수 있다.
예제는 EMPLOYEES테이블에 사원LPOPP에 대한 정보를 기록한다.
이 때 HIRE_DATE열에 현재 날짜 및 시간을 제공하기 위해 SYSDATE함수를 사용한다.
테이블에 행을 삽입할 때 USER함수를 사용하여 현재 사용자 이름을 기록할 수도 있다.
테이블에 추가한 항목 확인
오라클 디비 예제 :
SELECT employee_id, last_name, job_id, hire_date, commission_pct
FROM employees
WHERE employee_id = 113;
MSSQL 디비 예제 :
INSERT INTO employee (emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date)
VALUES (113, 'Louis', 'M', 'LPOPP',15, 100, '0877', GETDATE());
테이블에 추가한 항목 확인
SELECT emp_id, lname, job_id, hire_date, minit
FROM employee
WHERE emp_id = 113;
USER_NAME 함수를 사용하여 현재 사용자 이름을 기록할 수 있다.
SELECT USER_NAME();
예제) 특정 날짜 값 삽입
오라클 디비 예제 : INSERT INTO employees
VALUES ( 114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561',
TO_DATE('FEB 3, 1999','MON DD, YYYY'), 'AC_ACCOUNT', 11000, NULL, 100, 30);
날짜 값을 삽입할 때 주로 사용하는 DD-MON-YY형식에서는 세기 기본값으로 현재 세기를 사용한다는 점을 기억해 두어야 한다.
날짜에도 시간 정보기 포함되므로 기본 시간은 자정(00:00:00)이다.
날짜를 기본형식이 아닌 다른형식(예:다른세기 또는 특정시간)으로 입력하려면 TO_DATE함수를 사용해야 한다.
예제는 사원 Raphealy의 정보를 EMPLOYEES테이블에 기록하며 HIRE_DATE열을 1999년 2월 f3일로 설정한다.
예제) 명령문을 사용할 경우 hire_date의 연도는 2099로 해석된다.
오라클 디비 예제 : INSERT INTO employees
VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561',
'03-FEB-99', 'AC_ACCOUNT', 1100, NULL, 100, 30);
RR형식을 사용할 경우에는 현제 세기가 아닌 경우에도 자동으로 정확한 세기 정보를 제공한다.
MSSQL 디비 예제 :
INSERT INTO employee (emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date)
VALUES (114, 'Louis', 'M', 'LPOPP', 15, 100, '0877', ‘2009-08-08’);
INSERT INTO employee (emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date)
VALUES (114, 'Louis', 'M', 'LPOPP', 15, 100, '0877', ‘99-08-08’);
'99-08-08'로 입력하게 되면 1999년으로 입력하게 된다.
INSERT INTO departments (department_id, department_name, location_id);
VALUES (&department_id, '&department name, &location);
치환 변수가 포함된 명령을 파일에 저장한 후 이 파일에 있는 명령을 실행할 수 있다.
예제는 부서 정보를 DEPARTMENTS테이블에 기록한다.
스크립트 파일을 실행하면 & 치환 변수의 값을 입력하라는 프롬프트가 나타난다.
사용자가 입력한 값은 명령문으로 치환된다.
이런 방식으로 매번 실행할 때마다 다른 값을 제공하면서 동일한 스크립트 파일을 반복해서 실행할 수 있다.
MSSQL 디비 예제 :
INSERT INTO insert_test(emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date)
SELECT emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date
FROM employee
where pub_id='0877'
SELECT * FROM employee WHERE pub_id='0877'
MSSQL에서는 4-part : 서버명.DB명.소유자명.OBJECT명
1. 가장 간단한 경우 : object_name만 기술한다.
- 원하는 SQL server에 연결되어 있고 원하는 DB에 연결이 되어 있고, object의 owner가 dbo인 경우
select * from employee
2. owner.object_name :
- 액세스하기를 원하는 Object가 존재하는 SQL 서버에 연결되어 있고, Object가 존재하는 DB에 연결되어 있는 경우
- Owner가 dbo이거나 현재 login한 사용자가 Owner인 object의 경우에는 Owner를 생략해도 된다.
- Owner가 dbo가 아니고, 현재 login한 사용자가 만든 object도 아닌 경우에는 Owner를 기술해 줘야한다.
select * from dbo.employee
3. dbname.owner.object_name
- 액세스하고자 하는 object가 존재하는 SQL 서버에 연결되어 있고, 액세스하고자 하는 DB가 아닌 다른 DB에 연결
형식
INSERT INTO table [ column (, column) ] subquery;
구문 설명 :
table 테이블 이름입니다.
column 데이터를 삽입할 테이블의 열 이름이다.
subquery 테이블에 삽입할 행을 반환하는 서브 쿼리다.
INSERT절의 열 목록에서 열 수 및 데이터 유형은 서브 쿼리의 열 수 및 데이터 유형과 일치해야 한다.
테이블의 행에 대해 복사본을 생성하려면 서브 쿼리에서 SELECT * 를 사용한다.
INSERT INTO copy_emp
SELECT *
FROM employees;