코딩하는 문과생
[SQL] 13. DML 본문
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;
# 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 |