본문 바로가기
Java . Spring . Web . SQL

SQL : DML (Data Manipulation Language) : 데이터 조작 언어

by heidish 2020. 9. 13.
반응형

DML  (Data Manipulation Language)

= 데이터 조작 언어

 

사용자가 데이터를 접근하고 조작할 수 있게 하는 언어.

레코드의 검색(search), 삽입(insert), 삭제(delete), 수정(update)

 

 

 

 

데이터 정의 언어의 종류

 

데이터 삽입  :  insert

데이터 조회  :  select

데이터 삭제  :  delete

데이터 수정  :  update

 

 


 

이 포스트에서 사용하는 테이블은 모두 "DDL" 포스트에서 생성했던 테이블임!

heidish.tistory.com/42

 

SQL : DDL (Data Definition Language) : 데이터 정의 언어

DDL  (Data Definition Language) = 데이터 정의 언어 데이터 저장 구조를 명시하는 언어이다. 테이블 스키마의 정의, 수정, 삭제... 데이터 정의 언어의 종류 테이블 생성 : create table 테이블 삭제 : drop t..

heidish.tistory.com

DDL 관련 내용과, 해당 테이블들은 위의 포스트를 참고하기 바란다.

 


 

 

레코드 삽입

 

insert into 테이블명 (필드리스트) values (값리스트);

 

필드리스트 => 삽입에 사용될 테이블의 필드들

값 리스트 => (필드리스트) 순서에 맞게 삽입될 값들

 

insert 할 때 (필드리스트) 에 나열되지 않은 필드에 대해서는 null 값이 입력된다.

(필드리스트) 를 생략할 경우, (값리스트)에는 테이블을 처음 생성할 때 나열한 필드의 순서에 맞게 값을 나열해주자.

 


 

department 테이블에 값을 입력 해 보자.

insert into department (dept_id, dept_name) values ('920', '컴퓨터공학과');

이렇게 값을 입력하게 되면 오라클 cmd 창에 아래와 같은 오류가 뜰 것이다.

ORA-12899: value too large for column "HEIDIDB"."DEPARTMENT"."DEPT_NAME" (actual: 18, maximum: 14)

이 오류는 해당 컬럼에 들어가는 값의 크기가 설정해놓은 크기보다 커서 발생하는 오류인데,

오류 문구의 큰따옴표에 들어가는것들은 순서대로 "현재user명"."insert하려는테이블명"."오류가발생한컬럼명" 이다.

 

 

해당 오류를 해결하기 위해서 테이블의 dept_name 컬럼의 크기를 아래와 같이 변경해주자.

alter table department modify dept_name varchar2(20);

DDL 포스트에서 배웠던거니까 기억 안나면 DDL 포스트 참고하기,,

 

 

그리고 다시 insert를 해주면 값이 잘 들어가는걸 확인할 수 있다.

insert into department (dept_id, dept_name) values ('920', '컴퓨터공학과');

 

 

이제 department 테이블에 들어갈 나머지 데이터도 insert를 해보자.

이번엔 (필드리스트)를 사용하지 않고 데이터를 삽입하자.

insert into department values('923', '산업공학과', '207호');
insert into department values('925', '전자공학과', '308호');

위와 같이 삽입이 가능하다.

 

 


 

레코드 수정

update 테이블명 set 수정할내용 where 조건;

 

수정할내용은 " ,(쉼표) "를 이용해서 여러 필드에 대한 수정 내용을 지정할 수 있다.

또한 대상 테이블에서 필드에 들어가는 값을 수정하기 위한 산술식도 들어갈 수 있다.

 

조건에는 대상이 되는 레코드에 대한 조건을 적어준다.

관계대수에서 선택연산의 조건식과 같은 의미라고 보면 된다.

테이블의 모든 레코드에 대해서 수정할때는 where 조건절을 생략하고 update set 해주면 된다.

 

 


 

1.  student 테이블 내의 값 수정

 

 

레코드 수정 전에, 데이터가 있어야 수정이 가능하므로 우선 값을 insert 해주자.

insert into student values('1292001', '900424-1825409', '김광식', 3, '서울', '920');
insert into student values('1292002', '900305-1730021', '김정현', 3, '서울', '920');
insert into student values('1292003', '891021-2308302', '김현정', 4, '대전', '920');
insert into student values('1292301', '890902-2704012', '김현정', 2, '대구', '923');
insert into student values('1292303', '910715-1524390', '박광수', 3, '광주', '923');
insert into student values('1292305', '921011-1809003', '김우주', 4, '부산', '923');
insert into student values('1292501', '900825-1506390', '박철수', 3, '대전', '925');
insert into student values('1292502', '911011-1809003', '백태성', 3, '서울', '925');

insert 후, select * from student; 를 통해 값을 확인해보자.

총 8개의 레코드를 삽입된걸 확인할 수 있다.

 

 

 

이제 테이블에 입력된 데이터의 값을 수정해보자.

 

student 테이블에서 모든 학생들의 학년을 하나씩 증가시켜보자.

(테이블 생성시 학년은 year 이라는 필드명으로 지정해줬었다.)

update student set year = year + 1;

위에서 수정할 내용에는 산술식도 적을 수 있다 고 했다.

 

이렇게 update를 한 뒤에, 다시 select를 통해 전체 값을 확인해보자.

year 컬럼의 값들을 보면 처음 insert 했을때보다 +1씩 값이 커진걸 확인할 수 있다.

 

 


 

2.  professor 테이블 내의 값 수정

 

professor 테이블 또한 insert로 값을 넣어준 뒤, 수정을 해보자.

insert into professor values('92001', '590327-1839240', '이태규', '920', '교수', 1997);
insert into professor values('92002', '690702-1350026', '고희석', '920', '부교수', 2003);
insert into professor values('92301', '741011-2765501', '최성희', '923', '부교수', 2005);
insert into professor values('92302', '750728-1102458', '김태석', '923', '교수', 1999);
insert into professor values('92501', '620505-1200546', '박철재', '925', '조교수', 2007);
insert into professor values('92502', '740101-1830264', '장민석', '925', '부교수', 2005);

select문을 통해 값이 잘 들어갔나 확인해보자.

 

 

이제 값을 수정해보자.

professor 테이블에서 '고희석' 이라는 이름의 교수의 직위를 '부교수'=>'교수' 로 수정하고,

학과 번호는 '920'=>'923' 으로 수정해보자.

update professor set position='교수', dept_id='923' where name='고희석';

 

수정이 완료되었다고 뜨면, select문에 조건을 넣어서 '고희석' 교수의 레코드만 확인해보자.

 

dept_id, position이 바뀐걸 확인할 수 있다.

 

 

 


 

레코드 삭제

delete from 테이블명 where 조건;

 

where 절에 지정된 조건을 만족하는 레코드를 삭제하게 된다.

만약 where절이 생략되면, 테이블에서 모든 레코드를 삭제하게 된다.

 


professor 테이블에서 이름이 '김태석'인 교수를 삭제해보자.

(이름은 name 이라는 필드명으로 설정해줬었다.)

 

delete from professor where name='김태석';

 

삭제가 완료되면 select문으로 확인해보자.

 

 

김태석이라는 교수가 사라진걸 볼 수 있다.

 

(delete문에 조건절을 달아주지 않아서 해당 테이블 내의 모든 데이터가 삭제되더라도 해당 테이블은 삭제되지 않는 것 주의하기)

 

 


레코드 삭제시 주의사항 !

 

외래키로 참조되는 필드를 가지고 있는 테이블에서 레코드를 삭제할때 주의하자!

 

만약 student 테이블에서 외래키로 참조하는 테이블인 department 테이블의 어떠한 레코드를 삭제하려고 하면 어떤 오류가 발생하는지 보자.

 

delete from department where dept_id='920';

 

위와 같이 department 라는 테이블에서, dept_id='920' 이라는 조건을 포함하는 레코드를 삭제하려고 할 때

delete문을 저렇게 입력하고 엔터를 누르면 아래와 같은 오류 메시지가 뜬다.

 

ORA-02449: unique/primary keys in table referenced by foreign keys

 

삭제하려는 레코드의 어떤 값이 unique/primary key이며 다른 테이블에서 외래키(foreign key)로 참조되고 있기 때문에, 이런 오류가 뜬다.

 

 

따라서 department 테이블에서 delete 하기 전에, 해당 테이블의 값을 외래키로 참조하고있는 테이블인 student 테이블을 먼저 delete 해줘야한다.

 

 

 


 

레코드 검색

SQL에서 가장 많이 사용하고, 중요하고, 복잡하다.

 

검색 레코드의 종류는 아래와 같다.

-  기본 구조

-  재명명 연산

-  LIKE 연산자

-  집합 연산

-  외부조인

-  집계함수

-  널의 처리

-  중첩 질의

 

 

 

레코드 검색에 관한 내용은 다른 포스트에 적어놨다.

글이 너무 길어져서,,,,,

 

링크는 아래에!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글