티스토리 뷰

DB/MySQL

데이터 조작어 (DML)

태로미 2023. 3. 20. 14:47

 

목차

📍   데이터 조작어 (DML)

1.   Insert

2.   Update

3.   Delete



💡   트랜잭션 처리 모드 변경

 

 

 

 

 

 

 

 

 

 

📍   데이터 조작어 (DML)

–   Data Manipulation Language의 약자.

 

 

 

1.   INSERT     :      새로운 데이터를 입력
2.   UPDATE    :     기존 데이터를 갱신
3.   DELETE    :      기존 데이터를 삭제
4.   MERGE     :      기존 데이터를 합침

 

 

 

 

 

 

 

 

 

 

▸   INSERT

–   테이블에 새로운 데이터를 추가하는 문법.

 

 

 


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


•   insert into절

–   데이터를 입력할 테이블과 컬럼을 명시하는 절.

–   전체 컬럼을 순서대로 입력하는 경우라면 컬럼명 생략 가능.

 

•   values절

–   입력할 데이터값들을 명시하는 절.


EX1   )   기본
insert into departments (department_id, department_name, manager_id, location_id)
values (280, 'Home', 100, 1700);
-- 확인
select * from departments;

 

–    insert into절에 컬럼목록을 작성하면 해당 컬럼들에 대해서만 데이터를 입력하게 됨.
–    values절의 값은 값이 입력될 컬럼의 수와 데이터타입이 맞아야 함.

   실행 결과

 

 

 

EX2   )   NULL값 입력

 

•   null값이 입력되는 경우 1

insert into departments (department_id, department_name)
values (290, 'shopping');
-- 확인
select * from departments;

–    값을 입력받을 컬럼의 목록에서 누락된 컬럼들은 
      테이블에 별다른 설정이 없는 경우(default값이 없는 경우) 아래와 같이 null값이 입력되고,

      테이블에 default값이 설정되어 있다면,  null이 아닌 default값이 입력됨.

   실행 결과

 

 

•   null값이 입력되는 경우 2

insert into departments
values (300, 'Sleep', null, null);
-- 확인
select * from departments;

–   컬럼 목록을 생략하는 경우,  테이블의 모든 컬럼에 대해서 입력값을 작성해야 함.

     이 때,  컬럼에 입력할 값이 없을 경우 명시적으로 null값을 입력 할 수 있음.

–   테이블에 default값이 설정되어 있더라도 명시적으로 입력된 null이 우선하여 입력되므로 매우 안좋은 방법.

   실행 결과

 

 

 

EX3   )   SubQuery가 사용된 Insert 구문

 

•   sales_reps 테이블 새로 생성

create table sales_reps
as (select employee_id id, last_name name, salary, commission_pct
from employees
where 1 = 2);

–   ' where 1 = 2 '의 뜻은 항상 false 거짓인 조건절.  데이터 없이 구조만 복사하고 싶을 때 사용함.

 

 

•   subquery를 사용하여 데이터 입력

insert into sales_reps(id, name, salary, commission_pct)
select employee_id, last_name, salary, commission_pct
from employees
where job_id like '%REP%';
-- 확인
select * from sales_reps;

–   입력받을 테이블의 컬럼 순서에 맞춰 서브쿼리의 컬럼의 순서, 데이터타입, 컬럼 수를 작성함.
–   서브쿼리를 통해서 값을 입력하는 경우 한번에 여러 행의 값을 입력해줄 수 있음.

   실행 결과

 

 

 

EX4   )   테이블 데이터 전체 복사하기

 

•    employees 테이블과 동일한 구조의 copy_emp 테이블 생성

create table copy_emp
as select *
from employees
where 1 = 2;

–   where 1 = 2,  항상 거짓인 조건이 들어감.  데이터타입 없이 테이블 구조만 복사함.

   실행 결과

 

 

•    copy_emp 테이블에 employees 테이블에 있는 107명의 사원 정보 동일하게 삽입

insert into copy_emp
select *
from employees;
-- 확인
select * from copy_emp;

   실행 결과

 

 

 

 

 

 

 

 

 

 

▸   UPDATE

–    테이블의 기존 데이터를 수정할 때(갱신) 사용하는 구문.

 

 

 


UPDATE 테이블명 
SET 컬럼명 = 값
WHERE 조건;


•   Update 절

–   갱신할 데이터의 테이블을 명시.

 

•   Set 절

–   갱신할 작업을 작성하는 절. 이 때 '=' 기호는 할당의 의미로 사용.


•   Where 절

–   행에 대한 조건절로 사용. 조건을 만족하는 행들만 데이터가 갱신됨.  옵션절.


EX1   )
UPDATE employees
SET department_id = 50
WHERE employee_id = 113;

–   employee_id가 113인 사원의 department_id값을 50으로 수정함.

   실행 결과

 

 

 

 

 


💡   트랜잭션 처리 모드 변경하는 방법

더보기
Auto-Commit에서 Manual Commit으로 바꾸기

–   실제로 데이터를 수정해야하므로 모드를 안전하게 Manual로 변경함.
      →   데이터가 삭제 되어도 'ROLLBACK' 으로 복원 가능.
–    Auto는 실시간으로 데이터를 반영함.


 

 

 

 

 

EX2   )   Where절 없는 Update 구문 실행
UPDATE copy_emp
SET department_id = 110;

 

–   데이터가 이상해질 수도 있는데,  정말 where절 없이 데이터를 수정하겠냐고 경고창이 뜸.

–   데이터를 수정하고 삭제할 때는 항상 where절을 추가하는 습관 들이기.

   실행 결과

 

 

 

EX3   )   SubQuery가 사용된 Update 구문

 

•   113 번 사원의 job_id, salary 값을 205번 사원의 정보로 갱신

UPDATE copy_emp
SET job_id = (SELECT job_id
FROM employees
WHERE employee_id = 205),
salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 113;

–   사번이 113번인 직원의 job_id와 salary를 사번이 205번인 직원의 job_id와 salary값과 동일하게 수정함.

SELECT employee_id, job_id, salary
FROM copy_emp
WHERE employee_id IN (113, 205);

–   위의 쿼리를 통해 값이 잘 바뀌었는지 확인해봄.

   실행 결과

 

 

 

EX3–1   )   SubQuery가 사용된 Update 구문 2

 

•  위치 코드 1800에 위치한 부서에 근무하는 사원의 급여를 10% 인상

 

1.   위치 코드 1800에 위치한 부서

SELECT department_id
FROM departments
WHERE location_id = 1800;

–   결과로 나오는 부서가 메인쿼리 where절의 조건 대상이 됨.

   실행 결과

ROLLBACK;

 

–    데이터를 이전 상태로 되돌림.

 

 

2.   급여 인상 전

SELECT department_id, salary
FROM copy_emp
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–    서브쿼리에 해당하는 부서의 부서번호와 '현재 급여'를 출력함.

   실행 결과

 

 

3.   급여 인상

UPDATE copy_emp
SET salary = salary * 1.1
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–   location_id가 1800인 부서에 속하는 직원들의 급여를 1.1배 올림.

 

 

 

4.   급여 인상 후

SELECT department_id, salary
FROM copy_emp
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–   급여 올리기 전의 데이터와 비교해보면 1.1배 올라간걸 확인할 수 있음.

   실행 결과

 

 

 

 

 

 

 

 

 

 

▸   DELETE

–    기존 테이블의 데이터 (행)를 삭제하는 문법.

 

 

 


DELETE FROM 테이블명
WHERE 조건;

•   Delete 절

–   삭제 될 데이터의 테이블을 명시하는 절.

 

•   Where 절

–   삭제 할 행을 선택하는 조건절.  옵션으로 생략가능하지만 사실상 필수.


EX1   )
DELETE FROM departments
WHERE department_name = 'Finance';

–   해당 부서를 지워버리면 현재 이 부서에 근무하는 사원은 ...?!  DB입장에서 말이 안되므로 에러 발생함.

DELETE FROM departments
WHERE department_name = 'Sleep';

–   앞서 임의로 만든, 근무하는 사원이 없는 Sleep부서를 삭제함.

SELECT * FROM departments;

–   Sleep부서가 삭제된 걸 확인할 수 있음.

   실행 결과

 

 

 

EX2   )   Where절 없이 Delete 구문 실행
SELECT count(*) FROM copy_emp;

–   결과로 테이블의 행이 107행인걸 확인할 수 있음.

   실행 결과

 

DELETE FROM copy_emp;
-- 확인
SELECT count(*) FROM copy_emp;

–   where절 없이 실행했으므로 경고창이 뜸. 강행함.

–   테이블의 데이터가 모두 삭제되어 행의 개수가 0으로 출력됨.

   실행 결과

ROLLBACK;

 

–   이전의 데이터를 다시 살림.  방금 삭제한 테이블의 107행의 데이터를 복원함.

 

 

 

EX3   )   SubQuery가 사용된 Delete 구문

 

•   위치 코드가 1800인 부서와 같은 부서에서 근무하는 직원들 삭제하기

SELECT employee_id, last_name, department_id
FROM copy_emp
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–   서브쿼리에 해당하는 직원들을 출력해봄. (삭제 대상 직원들)

   실행 결과

 

DELETE FROM copy_emp
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–   위에서 출력된 직원2명 삭제함.

SELECT employee_id, last_name, department_id
FROM copy_emp
WHERE department_id = (SELECT department_id
FROM departments
WHERE location_id = 1800);

–   데이터가 삭제되었는지 다시 확인.

   실행 결과

 

 

 

 

 

 

 

 

 

 

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

데이터정의어 (DDL) — Table  (0) 2023.03.21
트랜잭션제어어 (TCL)  (0) 2023.03.21
서브쿼리 (SubQuery)  (0) 2023.03.14
그룹 함수 — 그룹화 (GROUP BY 절 / HAVING 절)  (0) 2023.03.14
단일 행 함수 — 숫자  (0) 2023.02.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함