Oracle DBA/SQL

078 데이터 입력하기(INSERT)

Nuez 2023. 7. 6. 11:59
반응형

* SQL의 종류? 

종류 명령어
Query SELECT문의 6가지 절
DML (Data Manipulation Language) INSERT, UPDATE, DELETE, MERGE, SELECT
DDL (Data Definition Language) CREATE, ALTER, DROP, TRUNCATE, RENAME
DCL (Data Control Language)  GRANT, REVOKE
TCL (Transaction Control Language)  COMMIT, ROLLACK, SAVEPOINT

DBA영역 : DDL, DCL


구조 : 

1) 일부 컬럼 값만 쓸 경우

 

INSERT INTO 테이블명(컬럼명1, 컬럼명2, 컬럼명3, 컬럼명4, ...)
VALUES (컬럼1의 값, 컬럼2의 값, 컬럼3의 값, 컬럼4의 값, ... );

 

 


2) 모든 컬럼에 대한 값을 쓸 경우

 

INSERT INTO 테이블명  

VALUES (테이블 내 컬럼 순서대로 값 하나씩 나열);

 

(하지만 가독성을 위해서 보통은 모든 데이터를 넣더라도 컬럼명을 1번처럼 나열해줌)

 

참고 사항: 

나열되지 않은 컬럼의 값은 자동으로 null 값이 들어감. 

숫자를 입력할 떄는 양쪽에 ' ' 안둘러줘도 되는데 문자와 날짜를 입력할 때는 해줘야 함.


ORACLE


예제. 사원 테이블에 아래의 데이터를 입력하시오.

사원번호 9321
사원이름 JANE
월급  4000
입사일 오늘날짜
INSERT INTO emp(empno, ename, sal, hiredate)
VALUES (9321, 'JANE', 4000, TO_DATE('2023/07/06','RRRR/MM/DD'));

입력한 컬럼들 외에는 null값이 들어가있는 것 확인 가능


문제 432. 부서 테이블에 아래의 데이터를 입력하시오.

부서번호 50
부서명 DATA TEAM
부서위치 SEOUL
INSERT INTO dept(deptno, dname, loc)
VALUES(50, 'DATA TEAM', 'SEOUL');


* 추가 : ROLLBACK

ROLLBACK;

COMMIT하지 않은 상태에서 ROLLBACK하면 그동안 작업했던 데이터 입력, 수정, 삭제 작업을 취소함.

 

SELECT * FROM dept;

새로운 데이터를 넣기 전 상태로 돌아온 것을 확인할 수 있음.


* 추가 : NULL값을 입력하는 방법 2가지

 

1. 명시적 입력 

1) NULL입력

INSERT INTO emp(empno, ename, sal)
	VALUES (7234, NULL, 4000);

 

주의: 'NULL'이라고 작은따옴표로 둘러서 기입하면, 말그대로 NULL이라는 문자가 ename에 들어가게됨. 

 

2) 작은따옴표('')

INSERT INTO emp(empno, ename, sal)
	VALUES (7456, '', 5000);

결과 : 

ename 컬럼의 값 둘 다 null로 들어간 것 확인 가능 

 

2. 암시적 입력

INSERT INTO emp(empno, ename, sal)
	VALUES (3933, 'AAA', 5000);

나열하지 않은 컬럼들의 값은 암시적으로 NULL로 처리

 


문제 434. 이름이 NULL인 사원들의 이름과 월급을 출력하시오.

SELECT ename, sal
FROM emp
WHERE ename IS NULL;


문제 435. 아래와 같이 이름에 공백을 입력하시오.

사원번호 4956
사원명 공백(NULL X)
월급 6000
INSERT INTO emp(empno, ename, sal)
VALUES (4956, '   ', 6000);

문제 436. 이름이 NULL이 아닌 사원들의 이름과 월급을 출력하시오.

SELECT ename,sal
FROM emp
WHERE ename IS NOT NULL;

문제 437. 위의 결과를 다시 출력하는데 이름이 공백인 사원도 제외하고 출력하시오.

 

실수로 공백을 넣는 경우도 있는데, 공백의 갯수가 몇개인지 모를 때 사용할 수 있는 방법

SELECT ename,sal
FROM emp
WHERE TRIM(ename) IS NOT NULL; -- RTRIM으로도 많이 씀

공백을 제거하는 TRIM, LTRIM, RTRIM

 

다만 좌변의 컬럼을 가공하게 되면(함수 등으로 두르면) SQL검색 성능이 느려짐. 

 

튜닝이 필요함 (인덱스 이용)


정리

1. INSERT하고 나서 COMMIT을 안했으면 바로 ROLLBACK이 가능. 

2. INSERT할 때 양쪽에 공백이 포함되지 않게 주의해야 함.


My SQL


문제 438. (MySQL) Mysql의 emp 테이블에 아래의 데이터를 입력하시오.

사원번호 5969
사원이름 JACK
월급  3000
부서번호 20

 

INSERT INTO emp(empno, ename, sal, deptno)
VALUES (5969, 'JACK', 3000, 20);

일부 캡쳐, 맨 마지막에 입력된 것 확인 가능

 

ROLLBACK을 하고 다시 한 번 emp테이블을 확인해보시오. 

롤백이 되지 않고 그대로 남아있는 것을 확인 할 수 있음 

∵ MySQL은 자동 커밋기능이 기본값으로 활성화되어있음.


 

자동 커밋 기능이 켜져있는지 확인하는 방법

SELECT @@AUTOCOMMIT;

1이라고 뜨면 활성화되어 있는 것.

 

= > MySQL을 사용하기 전에는 반드시 자동 커밋기능이 활성화되어있는지 확인해야 함. 

 

실수로 데이터를 지웠는데 백업이 없으면 복구할 수 없음.

바로 커밋이 되어버리기 때문. 주의!!!!!!


 

자동 커밋 기능 끄는 방법

SET @@AUTOCOMMIT = FALSE;

다시 조회해보면 0으로 바뀌어, 자동커밋 기능이 꺼진 것을 확인 할 수 있다. 

이 이후에 INSERT한 데이터는 ROLLBACK하면 사라짐.

 

주의사항!!! Default값이 1이라서 다시 껐다 키면 1로 돌아감. (지금 접속한 session에서만 유효)

매번 반복하기 싫다면 다른 방법으로 설정해줘야 함.


session이아니라 database level로 설정하면, 자동 커밋 기능을 아예 끌 수 있음. (DBA 업무)


문제 439. 아래의 데이터를 emp 테이블에 입력하시오. 

사원번호 5543
사원이름 JONE
월급  3999
입사일 오늘날짜
INSERT INTO emp(empno, ename, sal, hiredate) 
VALUES (5543, 'JONE', 3999, date_format('2023-07-06','%Y/%m/%d'));

위와 같이 날짜를 입력해야 db의 날짜 형식에 상관없이 날짜를 기입할 수 있음. 


문제 440. 아래의 데이터를 emp 테이블에 입력하시오. 

사원번호 3945, 3946
사원명 NULL
월급 3000

 

ORACLE에서 통하던 방법 2가지 수행 

 

1) NULL

INSERT INTO emp(empno, ename, sal)
VALUES (3945, NULL, 3000);

2) 작은따옴표 '' 

INSERT INTO emp(empno, ename, sal)
VALUES (3946, '', 3000);

 

맨 밑의 두 행을 통해 입력이 잘 된 것을 확인할 수 있음.

다만, null을 작은따옴표로 입력한 행의 경우 ename 컬럼에 null이라고 뜨지 않음 (= null로 인식하지 않음)

SELECT *
FROM emp
WHERE ename IS NOT NULL;

다음과 같은 방식으로 이름이 null이 아닌 사원들을 출력하라고 했을 때, 사원번호 3946은 출력됨. (= null로 인식하지 않음)