1. 테이블에 새로운 행을 추가하는 INSERT


특정한 컬럼에만 DATA를 입력하는 경우
모든 컬럼에 DATA를 입력하는 경우
INSERT INTO table_name (column_name, …)
VALUES(column_value, …)
INSERT INTO table_name
VALUES(column_value, …)

새로운 행을 추가하기 위해 INSERT문을 사용하면 한 번에 하나의 행만 삽입된다. 기술한 칼럼 목록 순서대로 VALUES에 지정된 값이 삽입된다. 만약 칼럼 목록을 기술하지 않으면 테이블에 있는 칼럼의 디폴트 순서대로 VALUES이하의 값이 삽입되며 문자와 날짜 값은 단일 따옴표(‘ ‘)을 사용해야 한다.

 

부서 테이블 DEPT을 생성한다.

CREATE TABLE DEPT( 
   DEPTNO NUMBER(2),	--부서번호
   DNAME VARCHAR2(14),	--부서명
   LOC VARCHAR2(13)	--지역명
);

칼럼 DEPTNO에 10번 부서, DNAME에는 ‘ACCOUNTING’을, LOC에는 ‘NEW YORK’을 추가하자

INSERT INTO DEPT
VALUES(10, 'ACCOUNTING', 'NEW YORK');

 

 

1-1. INSERT 구문에서 오류 발생의 예

1) 칼럼명에 기술된 목록의 수보다 VALUES 다음에 나오는 괄호 안에 기술한 값의 개수가 적으면 에러가 발생한다.

INSERT INTO DEPT(DEPTNO, DNAME, LOC) 
VALUES (10, 'ACCOUNTING');

2) 칼럼명에 기술된 목록의 수보다 VALUES 다음에 나오는 괄호에 기술한 값의 개수가 많으면 에러가 발생한다.

INSERT INTO DEPT(DEPTNO, DNAME) 
VALUES(10, 'ACCOUNTING', 'NEW YORK', 20);

3) 칼럼과 입력할 값의 데이터 타입이 서로 맞지 않을 경우에도 에러가 발생한다. 

INSERT INTO DEPT(DEPTNO, DNAME, LOC) 
VALUES(10, ACCOUNTING, 'NEW YORK');

 

 

1-2. NULL 값 삽입

데이터를 입력하는 시점에서 해당 칼럼 값을 모르거나 확정되지 않았을 경우에는 NULL값을 입력해야 한다.

NULL 값 삽입에는 암시적인 방법과 명시적인 방법이 있다.

DEPTNO NUMBER(2) NOT NULL, -- NULL값 금지
DNAME VARCHAR2(14), -- NULL값 허용

1) 암시적으로 NULL 값 삽입

암시적인 방법은 INSERT 리스트에 칼럼명을 생략하는 것이다. 즉, 다른 칼럼은 값을 입력하지만 이렇게

생략한 칼럼에는 암시적으로 NULL값이 할당된다.

 

> 지역명이 결정되지 않아 부서번호와 부서명만 입력했다

INSERT INTO DEPT(DEPTNO, DNAME) 
VALUES (30, 'SALES');

 

2) 명시적으로 NULL 값의 삽입

명시적 방법은 VALUES에 NULL이라고 직접 기술하여 입력하는 방법이다.

--(X)지역명이 결정되지 않아서 다음과 같이 2개의 칼럼만 입력하면 오류가 발생한다.
INSERT INTO DEPT 
VALUES (40, 'OPERATIONS');

--(O)VALUES에 NULL이라고 직접 기술
INSERT INTO DEPT 
VALUES (40, 'OPERATIONS', NULL);

--NULL 값을 갖는 칼럼을 추가하기 위해서 NULL 대신 ‘ ‘ 를 사용할 수 있다.
INSERT INTO DEPT
VALUES (50, '', 'CHICAGO');

 

 

1-3. 기존 테이블에 존재하는 데이터를 다른 테이블에 넣을 때 

INSERT INTO table_name(column1, column2,…) 
SELECT column1, column2,… 
FROM table_name 
WHERE 조건;

 

> DEPT 테이블 생성시 컬럼들의 자릿수와 DEPARTMENTS 테이블의 컬럼의 자릿수를 일치하도록 테이블을 수정하자

ALTER TABLE DEPT MODIFY(DEPTNO NUMBER(4), DNAME VARCHAR2(30));

INSERT INTO DEPT
SELECT DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID 
FROM DEPARTMENTS;

 

 

 

2. 테이블의 내용을 수정하기 위한 UPDATE


UPDATE table_name
SET column_name1 = value1, column_name2 = value2, …
WHERE conditions;
  1. UPDATE문은 기존의 행을 수정하는 것이다.
  2. 어떤 행의 데이터를 수정하는지 WHERE절을 이용하여 조건을 지정해야 한다.
  3. WHERE절을 사용하지 않을 경우에는 테이블에 있는 모든 행이 수정된다.
  4. 테이블의 전체 행을 수정하려고 했던 것이 아니라면 큰 문제가 발생하므로 WHERE절의 사용 유무를 신중하게 판단해야 한다.

 

2-1. 테이블의 모든 행 변경 

: WHERE절을 추가하지 않으면 테이블의 모든 행이 변경된다.

 

> 모든 사원의 부서번호를 30번으로 수정하자. 

UPDATE EMPLOYEES
SET DEPARTMENT_ID = 30;

> 모든 사원의 급여를 10% 인상한다.

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1;

> 입사일을 오늘로 수정한다.

UPDATE EMP
SET HIRE_DATE = SYSDATE;

 

2-2. 테이블의 특정 행만 변경

UPDATE문에 WHERE절을 추가하면 조건을 만족하는 테이블의 특정 행만 변경할 수 있다.

 

> 부서번호가 10번인 사원의 부서번호를 30번으로 수정

UPDATE EMPLOYEES
SET DEPARTMENT_ID =30
WHERE DEPARTMENT_ID =10;

 

> 급여가 3000 이상인 사원만 급여를 10% 인상

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1 
WHERE SALARY >= 3000;

> 2007년에 입사한 사원의 입사일이 오늘로 수정한다

UPDATE EMPLOYEES
SET HIRE_DATE = SYSDATE
WHERE SUBSTR(HIRE_DATE, 1, 2)='07';

 

2-3. 테이블에서 2개 이상의 칼럼 값 변경

테이블에서 복수 개의 칼럼 값을 변경하려면 기존 SET절에 콤마를 추가하고 칼럼=값을 추가 기술하면 된다.

 

> Susan의 부서번호는 20번으로, 직급은 FI_MGR

UPDATE EMPLOYEES
SET DEPARTMENT_ID = 20, JOB_ID = 'FI_MGR'
WHERE FIRST_NAME = 'Susan';

 

> LAST_NAME이 Russell인 사원의 급여를 17000로, 커미션 비율이 0.45로 인상된다.

UPDATE EMPLOYEES
SET SALARY = 17000, COMMISSION_PCT = 0.45
WHERE LAST_NAME = 'Russell';

 

 

3. 테이블에 불필요한 행(레코드)을 삭제하기 위한 DELETE

: 테이블에 특정 로우(행)의 데이터를 삭제한다.

DELETE FROM table_name 
WHERE conditions;

 

> 30번 부서를 삭제

DELETE FROM DEPT 
WHERE DEPTNO=30;

 

※ DELETE와 TRUNCATE의 차이점

- DELETE 명령어

DELETE 명령어를 사용하여 TABLE의 행을 삭제할 경우에 행이 많으면 행이 삭제될 때마다 많은 자원이 소모된다.

왜냐하면 DELETE 명령어는 삭제 이전 상태로 원상 복귀할 경우를 생각해서 ROLLBACK 정보를 저장하고 있어야 하기 때문이다.

 

- TRUNCATE 명령어

TRUNCATE 명령어를 사용하여 TABLE의 모든 행을 삭제할 경우 TRUNCATE 명령어는 DDL 명령문으로 ROLLBACK 될 수 없다. 어떤 ROLLBACK 정보도 만들지 않고 즉시 COMMIT 하기에 빠르고 효율적인 방법이다.

'DB > SQL' 카테고리의 다른 글

JOIN  (0) 2022.04.03
무결성 제약 조건 *  (0) 2022.04.03
DDL (테이블의 구조를 변경)  (0) 2022.04.03
SQL (Structured Query Language)  (0) 2022.04.03
DB (Data Base)  (0) 2022.03.24