코딩하는 문과생

[SQL] 13. DML 본문

프로그래밍/SQL

[SQL] 13. DML

코딩하는 문과생 2020. 1. 29. 09:10

DML: Data Manipulation Language(데이터 조작어)

필요에 따라 COMMIT과 ROLLBACK이 가능(TCL이라 일컫는다.)

 

[UPDATE]

- 조건에 따른 행을 수정한다.

UPDATE table_name
SET column_name = value [ ,column = value... ]
WHERE [ condition ];

- value 대신 서브쿼리 가능

 

# EX1

UPDATE 	DEPARTMENT
SET		DEPT_NAME = '전략기획팀'
WHERE	DEPT_ID	= '90';

SELECT * FROM DEPARTMENT;


# EX2

UPDATE	EMPLOYEE
SET		(JOB_ID, SALARY) = (SELECT JOB_ID, SALARY
							FROM	EMPLOYEE
							WHERE	EMP_NAME = '성해교')
WHERE	EMP_NAME = '심하균';

SELECT * FROM EMPLOYEE;


# EX3

// DEFAULT값
UPDATE	EMPLOYEE
SET		MARRIAGE = DEFAULT
WHERE	EMP_ID = '210';

SELECT * FROM EMPLOYEE;

 

MARRIAGE가 N


# EX4

//WHERE절에 서브쿼리
UPDATE	EMPLOYEE
SET	BONUS_PCT = 0.3
WHERE	DEPT_ID = (	SELECT DEPT_ID
					FROM	DEPARTMENT
					WHERE	DEPT_NAME = '해외영업2팀');
					
SELECT * FROM EMPLOYEE;


# EX5

UPDATE	EMPLOYEE
SET		DEPT_ID = '65'
WHERE	DEPT_ID IS NULL;
//EMPLOYEE테이블이 DEPARTMENT 테이블의 DEPT_ID를 참조하기 때문에, DEPT_ID에는 65가 없다. 

 

[INSERT]

INSERT INTO table_name  column_name, column_name ...
VALUES value1, value2 ... ;

INSERT INTO table_name  column_name, column_name ...
Subquery ;
//Subquery앞에 AS를 쓰지 않는다.

데이터 타입, 순서, 개수가 일치해야 한다.

 

- INSERT에서 Null입력

  • 암시적 방법: INSERT INTO 절에서 해당 컬럼 이름 생략
  • 명시적 방법: VALUES절에서 Null키워드나 ''사용

# EX1

INSERT INTO EMPLOYEE (EMP_ID, EMP_NO, EMP_NAME, PHONE, HIRE_DATE, JOB_ID, SALARY, BONUS_PCT, MARRIAGE)
VALUES		('880', '860412-2123142', '한채연', '0103231311', '06/01/01', 'J7', 3000000, 0, 'N')

SELECT * FROM EMPLOYEE;


# EX2

INSERT INTO EMPLOYEE (EMP_ID, EMP_NO, EMP_NAME, SALARY, MARRIAGE)
VALUES				('860', '812939-2312121', '선예진', DEFAULT, DEFAULT);

SELECT * FROM EMPLOYEE;


# EX3

CREATE TABLE EMP
(EMP_ID 	CHAR(3),
 EMP_NAME	VARCHAR(20),
 DEPT_NAME	VARCHAR(20));
 
INSERT INTO	EMP
(SELECT EMP_ID, EMP_NAME, DEPT_NAME
 FROM	EMPLOYEE
 LEFT OUTER JOIN DEPARTMENT USING(DEPT_ID));
 //AS를 쓰지 않는다.

SELECT * FROM EMP;

 

[DELETE]

  • drop은 테이블의 스키마를 없애는 것
  • delete는 행을 삭제하는 것
DELETE [FROM] table_name
[WHERE	condition] ;
  • 부모테이블 : 입력 신경x, 수정과 삭제는 신경써야한다.
  • 자식테이블 : 입력과 수정은 신경써야한다. 삭제 신경x

- ON DELETE 구문

  • RESTRICTED(기본) - 대상 데이터를 마음대로 삭제 불가
  • SET NULL - 대상 데이터를 삭제하고, 해당 데이터를 참조하는 데이터를 NULL로 채운다.
  • CASCADE - 대상 데이터를 삭제한다.
ALTER TABLE EMPLOYEE DROP CONSTRAINTS FK_MGRID;

ALTER TABLE EMPLOYEE ADD CONSTRAINTS FK_MGRID FOREIGN KEY (MGR_ID)
REFERENCES EMPLOYEE ON DELETE SET NULL;

DELETE FROM EMPLOYEE WHERE EMP_ID = '141';

SELECT * FROM EMPLOYEE;

 

TRUNCATE (delete와 비교)

TRUNCATE TABLE table_name ;
  • DELETE보다 수행속도가 빠름
  • 테이블 전체 데이터를 삭제하는 경우에만 사용 가능
  • 롤백 불가능, 제약조건이 있는 경우는 사용불가

[TRANSACTION]

현업에서는 트랜잭션을 제어할 일이 많이 없다.

  • DML은 기본적으로 ROLLBACK(복원)과 COMMIT(반영)기반

  • 즉, ALL OR NOTHING의 개념

  • 하나라도 잘못되면 ROLLBACK을 해야하는 상황이 발생

  • 따라서 INPUT으로 들어오는 데이터의 유효성을 잘 체크해야 한다.

ALTER TABLE EMPLOYEE
DISABLE CONSTRAINTS PK_MGRID;

SAVEPOINT S0;

INSERT INTO DEPARTMENT
VALUES ('40', '기획전략팀', 'A1');

SAVEPOINT S1;

UPDATE 	EMPLOYEE
SET		DEPT_ID = '40'
WHERE	DEPT_ID IS NULL;

SAVEPOINT S2;

DELETE FROM EMPLOYEE;

//*****************************************

ROLLBACK TO S2;
SELECT COUNT(*) FROM EMPLOYEE;

ROLLBACK TO S1;
SELECT COUNT(*) FROM DEPARTMENT WHERE DEPT_ID = '40';

ROLLBACK TO S0;
SELECT COUNT(*) FROM DEPARTMENT WHERE DEPT_ID = '40';

 

[LOCK]

- 2개의 세션을 열어 놓는 경우

EX. 이클립스를 이용해 DB에 접근, CMD를 이용해 접근

- DML을 이용해 INSERT를 하면 DB에 반영되는 게 아니라 메모리 상에서만 수정이 발생

'프로그래밍 > SQL' 카테고리의 다른 글

[SQL] Oracle, 데이터 베이스  (0) 2020.03.27
[SQL] MySQL에서 사용자 추가 및 권한 부여  (0) 2020.03.10
[SQL] 12. SEQUENCE, INDEX  (0) 2020.01.23
[SQL] 11. DDL(3)  (0) 2020.01.23
[SQL] 10. DDL(2)  (0) 2020.01.23