반응형

DML(Date Manipulation Language) 개념
| DML은 데이터 조작어로, 데이터베이스 내의 데이터를 조회, 삽입, 수정, 삭제하는 데 사용되는 명령어군 |
핵심 명령어 및 구문
| 명령어 | 기능 | 기본 구문 |
| INSERT | 새로운 데이터(Row) 삽입 | INSERT INTO 테이블 (컬럼1, 컬럼2) VALUES (값1, 값2); |
| UPDATE | 기존 데이터의 값 수정 | UPDATE 테이블 SET 컬럼 = 값 WHERE 조건; |
| DELETE | 기존 데이터 삭제 | DELETE FROM 테이블 WHERE 조건; |
| INSERT INTO <테이블> [(컬럼, 컬럼, ... )] VALUES (값, 값, ...); UPDATE 테이블 SET 컬럼 = 값, 컬럼 = 값, ... [WHERE 조건]; DELETE FROM 테이블 [WHERE 조건]; |
TCL 개념
| TCL은 트랜잭션 제어어로, DML에 의해 조작된 결과를 작업 단위(Transaction)별로 제어하는 명령어 |
DML 실제 예시
| 1. SQL> SELECT * FROM dept; ---> [조회] dept 테이블의 현재 모든 데이터를 확인 SQL> DELETE FROM dept; ---> [삭제] dept 테이블 내의 모든 행을 삭제 SQL> SELECT * FROM dept;---> [조회] 삭제 직후 상태를 확인 SQL> ROLLBACK; ---> [복구] 현재 트랙잭션에서 발생한 모든 변경 사항을 취소, 마지막 COMMIT 시점 이흐의 작업을 되돌려 데이터를 이전 상태로 복구함 SQL> SELECT * FROM dept; -->[조회] 최종 상태를 확인 2. SQL> DELETE FROM emp; ---> [삭제] emp(사원) 테이블의 모든 데이터를 삭제 SQL> DELETE FROM dept; ---> [삭제] dept(부서) 테이블의 모든 데이터를 삭제 SQL> COMMIT; --> [확정] 지금까지의 모든 변경 사항(emp,dept 삭제)을 디스크에 영구적으로 기록함 * 1번째 예시는 삭제 전 상태로 복구되고, 2번째 예시는 데이터가 영구 삭제된다는 차이점이 있다 |
| SQL> ALTER SESSION SET nls_date_format='YYYY/MM/DD'; SQL> DESC emp; SQL> INSERT INTO emp (eno, ename, sex, job, mgr, hdate, sal, comm, dno) 2 VALUES ('1001', '문시현', '남', '모델링', NULL, '1991/02/01', 4500, 520, '10'); SQL> INSERT INTO emp (eno, ename, sex, job, hdate, sal, comm, dno) ---> 아래 2번째에서 mgr 을 안 쓴 상태, 이렇게 쓰면 자동으로 NULL 로 되지만 이렇게 명령어 쓰면 안 된다 2 VALUES ('1002', '김주란', '여', '모델링', '1992/03/03', 4100, 330, '20'); SQL> INSERT INTO emp 2 VALUES ('1003', '양선호', '남', '모델링', NULL, '1995/02/21', 4300, NULL, '30'); SQL> SELECT * FROM emp; SQL> COMMIT; |
INSERT와 날짜 입력 문제
![]() ALTER SESSION SET nls_date_format='YYYY/MM/DD'; -- [순서1] 날짜 입력 시 '년/월/일' 형식을 인식 못 해 발생하는 오류를 막기 위해 세션 환경을 먼저 설정함. DESC emp; -- [순서2] 데이터를 넣기 전 테이블의 컬럼 순서, 데이터 타입(숫자/문자), 필수 입력 여부를 확인하여 '값의 배치'를 결정함. INSERT INTO emp (eno, ename, sex, job, mgr, hdate, sal, comm, dno) -- [순서3-1] 넣고자 하는 컬럼들을 직접 나열하여 데이터 입력 준비를 함. * 이렇게 명령어를 쓰면 안됨, 1:1 매칭 되게 해야 함 VALUES ('1001', '문시현', '남', '모델링', NULL, '1991/02/01', 4500, 520, '10'); -- [순서3-2] 위에서 나열한 컬럼 순서에 맞춰 실제 값을 매칭해 1번 행을 생성함. INSERT INTO emp (eno, ename, sex, job, hdate, sal, comm, dno) -- [순서4-1] 관리자(mgr) 정보가 없는 경우, 컬럼 목록에서 mgr을 빼고 입력을 시도함. VALUES ('1002', '김주란', '여', '모델링', '1992/03/03', 4100, 330, '20'); -- [순서4-2] mgr을 생략했으므로 해당 칸은 시스템이 자동으로 비워둠(NULL) INSERT INTO emp -- [순서5-1] 모든 컬럼에 값을 다 넣을 때는 컬럼명을 일일이 쓰지 않고 생략하여 쿼리를 간소화함. VALUES ('1003', '양선호', '남', '모델링', NULL, '1995/02/21', 4300, NULL, '30'); -- [순서5-2] 단, 이 방식은 DESC로 확인한 테이블 전체 구조와 '개수 및 순서'가 완벽히 일치해야 함. SELECT * FROM emp; -- [순서6] 지금까지 입력한 3개의 데이터가 테이블에 규격대로 잘 들어갔는지 화면에 출력해서 최종 검토함. COMMIT; -- [순서7] 검토가 끝난 '임시 저장' 데이터를 하드디스크에 영구적으로 기록하여 작업을 확정 지음. 2. (1)SQL> ALTER SESSION SET nls_date_format='YYYY/MM/DD:HH24:MI:SS'; SQL> INSERT INTO emp (eno, ename, hdate) 2. VALUES ('0001', '안영희', '2021/09/25:03:07:15'); (2) SQL> INSERT INTO emp (eno, ename, hdate) 2 VALUES ('0201', '안영숙', '2021/09/25:03:07:15'); (3)SQL> INSERT INTO emp (eno, ename, hdate) 2 VALUES ('0201', '안영숙', TO_DATE('2021/09/25:03:07:15', 'YYYY/MM/DD:HH24:MI:SS')); * (1), (2) 2개의 문장은 날짜 형식에 따라 입력을 한 상태이다. 날짜 형식 지정은 임시적인 설정이라 여러 환경에 따라 다를 수 있으므로 To_date 함수를 쓰면 DB 설정이 무엇이든 상관없이 함수 안에 적힌 형식대로 항상 완벽하게 실행된다. 그래서 반드시 To_date 함수를 써야 한다 참고사항 위에 테이블 짤릴 때 한눈에 보는 명령어 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ SET LINESIZE 200 SET PAGESIZE 100 COLUMN eno FORMAT A10 COLUMN ename FORMAT A12 COLUMN sex FORMAT A6 COLUMN job FORMAT A12 COLUMN mgr FORMAT A10 COLUMN hdate FORMAT A12 COLUMN sal FORMAT 999999 COLUMN comm FORMAT 999999 COLUMN dno FORMAT A6 SELECT * FROM emp; ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 3. ALTER SESSION SET nls_date_format='YYYY-MM-DD:HH24:MI:SS'; -- 날짜 출력 형식을 '년-월-일:시:분:초'로 변경 INSERT INTO emp (eno, hdate) -- emp 테이블의 사번(eno)과 입사일(hdate) 컬럼에 데이터 삽입 준비 VALUES ('01', TO_DATE('2000', 'YYYY')); -- 사번 '01'과 2000년(나머지 월, 일, 시간은 자동입력) 데이터를 실제 입력 COMMIT; -- 입력한 데이터를 데이터베이스에 최종 저장 SELECT * FROM emp WHERE eno = '01'; -- 사번이 '01'인 데이터를 조회하여 결과 확인 4. ![]() ALTER SESSION SET nls_date_format='YYYY-MM-DD:HH24:MI:SS'; -- 1. 출력 형식을 [년-월-일:시:분:초]로 고정함 INSERT INTO emp (eno, hdate) -- 2. emp 테이블의 사번(eno)과 날짜(hdate) 칸만 쓰겠다고 지정함 VALUES ('01', TO_DATE('2000', 'YYYY')); -- 3. 사번 '01'을 넣고, '2000'이란 숫자만 날짜 데이터로 변환해서 넣음 5. ALTER SESSION SET nls_date_format='YYYY-MM-DD:HH24:MI:SS'; -- 1. 날짜 형식을 시/분/초까지 보이게 설정 INSERT INTO emp (eno, hdate) VALUES ('04', sysdate); -- 2. 사번 '04'에 현재 실시간 날짜와 시간을 입력 COMMIT; -- 3. 입력한 데이터를 데이터베이스에 저장 SELECT eno, hdate FROM emp WHERE eno = '04'; -- 4. 입력된 '04'번 데이터 확인 |
참고사항
| 예시) DELETE FROM emp WHERE eno = '01'; -- 지우고 (임시 보관) ROLLBACK; -- 다시 살리기 (Undo 활용) COMMIT; -- 영구 삭제 (저장) 1. DELETE와 복구 원리 DELETE 후: 데이터는 바로 사라지지 않고 **Undo Segment(임시 저장소)**에 보관됨 COMMIT 전: 이 임시 저장소 덕분에 ROLLBACK으로 데이터를 다시 살릴 수 있다 COMMIT 후: 임시 저장소가 비워지며 데이터가 영구적으로 지워진다 2. Segment(세그먼트)란? 실제 공간: 테이블처럼 데이터베이스에서 물리적인 저장 공간을 차지하는 진짜 물건(Object)을 말한다 결론: "테이블도 하드디스크에 자리를 잡고 있는 세그먼트 중 하나다"라고 이해하면 됨 |
'Infra & Security Eng > Database Engineering' 카테고리의 다른 글
| 제약조건 특징, 종류, 검색, PK와 FK의 특징, 무결성 통제, 명령어 개념까지 (0) | 2026.02.09 |
|---|---|
| DDL 개념과 종류, 테이블 생성, 생성규칙, 명령어, 삭제, 복구, 컬럼의 데이터 타입 (0) | 2026.02.09 |
| 그룹 함수와 GROUP BY 개념, 사용하는 이유, 종류, 문제 (0) | 2026.02.05 |
| 단일 행 함수 변환 함수 실습 (0) | 2026.02.04 |
| 단일 행 함수 - 변환 함수 개념, 특징, 예제 (0) | 2026.02.04 |


