본문 바로가기
수업(국비지원)/Oracle

[Oracle] SQL 명령어들 - DML (insert, update, delete)

by byeolsub 2023. 4. 14.

💡

- DML (Data Manipulation Language) : INSERT(입력) , UPDATE(변경) , DELETE(삭제) , MERGE(병합)

- DDL (Data Definition Language) : CREATE (생성) , ALTER (수정) , TRUNCATE (잘라내기) ,DROP (삭제)

- DCL (Data Control Language) : GRANT (권한 주기) , REVOKE (권한 뺏기)

- TCL (Transaction Control Language): COMMIT (확정) , ROLLBACK (취소)

- SELECT : 어떤 분류에서는 DQL (Data Query Language) 라고도 한다.


  • DML
      : Data Manipulation Language. 데이터 조작어.

DML 명령어

 1. insert : 테이블에 새로운 레코드 추가 시 사용되는 명령어. (C)reate
 2. update : 테이블에 기존 레코드 변경 시 사용되는 명령어    (U)pdate
 3. delete : 테이블에 기존 레코드 제거 시 사용되는 명령어    (D)elete
 4. merge : 두개의 테이블의 내용 병합 시 사용되는 명령어

1. insert

     : 데이터 입력 명령어

insert into 테이블명 [(컬럼명1, 컬럼명2,...)] values (값1,값2,....)
컬럼명 부분 생략 가능. => 모든 컬럼에 데이터를 추가하는 경우.
                         desc 테이블명에 조회된 컬럼(스키마)의 순서대로 값을 설정
                         => 권장하지 않음.
  컬럼명을 기술해야 하는 경우
   1. 모든 컬럼에 값을 설정하지 않는 경우
   2. 스키마 순서와 상관없이 순서를 개발자가 지정할때
   3. db구조가 자주 변경되는 경우 컬럼명을 기술하는 것이 안전함
예시 : dept2 테이블에 9000번 부서 추가하기
insert into dept2 (dcode,dname,pdept,area) 
values (9000,'특수판매팀',1000,'임시지역')

문제 : 
 1. dept2 테이블에 9001번 부서 추가하기 : 컬럼부분 생략
insert into dept2 values(9001,'특수판매1팀',9000,'임시지역')

문제 :
 2. dept2 테이블에 9002번 부서 추가하기
-- 코드:9002, 부서명:특수판매2팀
insert into dept2 (dcode,dname) values(9002,'특수판매2팀')

문제 : 
 3. dept2 테이블에 9003번 부서 추가하기
-- 코드:9003, 부서명:특수판매3팀
insert into dept2  values(9003,'특수판매3팀','','')
select * from dept2 where dcode >= 9000

문제 : 
 4. dept2 테이블에 9004번 부서 추가하기
-- 코드:9004, 부서명:특수판매4팀
insert into dept2  values(9004,'특수판매3팀',null,null)
select * from dept2 where dcode >= 9000
-- null 값 입력방법
-- 1. 컬럼을 기술하지 않기
-- 2. 빈문자열값을 설정
-- 3. null, NULL로 직접 입력하기
예시 : dept2 테이블에 9005번 부서 추가하기
-- 코드:9005, 부서명:특수판매5팀
insert into dept2  values(9005,'특수판매5팀',null,null)

문제 : 
 5. ddl_test 테이블에 데이터 추가하기
insert into ddl_test (no, name) values (1,'홍길동')

select * from ddl_test

insert into ddl_test (no, name) values (2,'남궁길동')

문제 : 
 6. ddl_test2 테이블에 no:2, name:김삿갓, birth:90-01-01 데이터 추가하기
insert into ddl_test2 values (2,'김삿갓','90-01-01')

2. update 

    : 기존의 레코드 컬럼의 값을 수정

update 테이블명 set 컬럼1=값1,컬럼2=값2....
 [where 조건문] => 변경되는 레코드를 선택 조건.
                  where 조건문이 구현되지 않으면 모든 레코드의 기술된 컬럼이 변경
예시 : 교수 테이블에서 직급이 조교수인 교수의 보너스를 99로 변경하기
select name,bonus from professor where position='조교수'

update professor set bonus=99  where position='조교수'

문제 : 
 1. 장혜진교수와 같은 직급의 교수 중 급여가 300 이하인 교수의 급여만 15% 인상하기
-- 수정전 조회
select name,pay,position from professor 
 where position = (select position from professor where name='장혜진')
  and pay <= 300

-- 수정  
update professor set pay = pay * 1.15
 where position = (select position from professor where name='장혜진')
  and pay <= 300

-- 수정후 조회
select name,pay,position from professor 
 where position = (select position from professor where name='장혜진')

문제 :
 2. 학생 테이블에서 지도교수가 없는 학생의 지도교수를 이서진학생의 지도교수로 변경하기
-- 수정전 조회 : 지도교수가 없는 학생 
select name,grade,profno from student where profno is null

-- 지도교수 수정
update student 
set profno = (select profno from student where name='이서진')
where profno is null

-- 수정후 조회 : 지도교수가 이서진학생과 같은 학생 
select name,grade,profno from student 
where profno = (select profno from student where name='이서진')

문제 : 
 3. 전임강사의 보너스를 조교수의 평균 보너스의 50%로 변경하기.
-- 조교수의 보너스가 없는 경우는 0으로 계산하기. 
-- 소숫점이하는 절삭한 보너스로 변경하기.

-- 수정전 조회 : 전임강사의 보너스 조회, 조교수의 평균 보너스 조회
select name,bonus from professor where position='전임강사'
select trunc(avg(nvl(bonus,0)) * 0.5) 
from professor where position='조교수'

-- 수정
update professor set bonus = (select trunc(avg(nvl(bonus,0)) * 0.5) 
from professor where position='조교수')
where position='전임강사'

-- 수정후 조회 : 전임강사의 보너스 조회
select name,bonus from professor where position='전임강사'

3. delete

     : 레코드 삭제 명령어

delete [from] 테이블명
  [where 조건문] => 삭제될 레코드 조건. 없는 경우는 모든 레코드 삭제. 주의필요
예시 : dept2 테이블의 dcode의 값이 9000번인 레코드 삭제하기
-- 삭제전 조회
select * from dept2 where dcode=9000

-- 삭제
delete from dept2 where dcode=9000

-- 삭제후 조회
select * from dept2 where dcode >=9000

문제 : 
 1. 교수테이블에서 심슨교수와 같은 부서의 교수를 퇴직시키기.
-- 삭제전 조회
select name,deptno from professor 
where deptno = (select deptno from professor where name='심슨')

-- 삭제
delete from professor 
where deptno = (select deptno from professor where name='심슨')

-- 삭제후 조회
select name,deptno from professor 
where deptno = 201