티스토리 뷰
목차
📍 데이터 조작어 (DML)
📍 데이터 조작어 (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으로 수정함.
✓ 실행 결과
💡 트랜잭션 처리 모드 변경하는 방법

– 실제로 데이터를 수정해야하므로 모드를 안전하게 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
- 제어문
- 주석문
- gitbash
- JSTL
- 데이터타입
- 단일행함수
- 숫자형
- 인자
- 매개변수
- 문자형
- model2
- 내장객체
- 오버라이딩
- Method
- 로컬저장소
- 원격저장소
- mysql
- javascript
- 다형성
- Java
- jsp
- Dao
- 출력문
- github
- null
- 업캐스팅
- Git
- DB
- Object
- 논리형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |