개발자 끄적끄적
SQL의 구성(DDL, DML) 본문
<질의어와 SQL>
- SQL은 자연어와 유사하고 '비절차적 언어'이므로 사용하기 용이하다
비절차적 언어 : what to do
- 표현력이 떨어진다
절차적 언어 : how to do
<SQL의 구성 : DDL & DML>
- SQL은 크게 DDL과 DML로 구성된다
- 데이터 정의 언어(DDL : Data Definition Language)
- 데이터 저장 구조를 명시하는 언어
- '테이블 스키마(table schema)'의 정의, 수정, 삭제
- 자동 commit 즉, rollback 불가 -> drop table
- 데이터 조작 언어(DML : Data Manipulation Language)
- 사용자가 데이터를 접근하고 조작할 수 있게 하는 언어
- '레코드(인스턴스)'의 검색(research), 삽입(insert), 삭제(delete), 수정(update)
- commit, rollback 가능
<데이터 정의 언어>
- 테이블 생성(create table)
- 기본키, 외래키 설정
- 테이블 삭제(drop table)
- 테이블 수정(alter table)
- 종류
- 테이블 생성
- 테이블 삭제
- 테이블 수정
- 필드의 Data type 종류(표준 SQL | 오라클)
1. 문자
1) char(n) | char(n) : 길이가 n byte인 고정길이 문자열, 오라클의 경우 최대 2000byte까지 지정 가능 -> 주로 모든 레코드의 값이 공통적으로 길이가 같을 때(ex. 학번, 전화번호, 주민번호, 교과목코드)
2) varchar(n) | varchar2(n) : 최대 길이가 n byte인 가변길이 문자열, 오라클의 경우 최대 4000byte까지 지정 가능 -> ex. 주소
2. 숫자
1) int | int : 정수형
2) float | float : 부동 소수
3) (오라클-정수형, 실수형)number(n) : n(10진수 n자리)
ex) number(6, 2) : 최대 999.99까지
*number형은 정수형과 실수형 모두 사용 가능
3. 날짜, 시간
1) date | date : 년, 월, 일을 갖는 날짜형, 오라클의 경우 날짜의 기본 형식은 'yy/mm/dd'이다
2) time, timestamp | timestamp : 년, 월, 일, 시, 분 초를 갖는 날짜 시간형
<테이블 생성>
- 형식 : create table<테이블이름>(<필드리스트>)
- <필드리스트>는 '필드명 데이터타입'
<기본키, 외래키 설정>
- 테이블을 생설할 기본키 역할을 하는 필드를 지정
ex)
create table department
(
dept id varchar2(10),
dept name varchar2(20) not null,
office varchar2(20),
constraint pk_departmnet primary key(dept_id)
)
- pk_department : 제약식의 이름
- primary key는 굳이 not null을 안써도 된다
<외래키까지 포함된 student 테이블 생성 예>
create table student
(
stu_id varchar2(10),
resident_id varchar2(14) not null,
name varchar2(10) not null,
year int,
address varchaar2(10),
dept_id varchar2(10),
constraint pk_student primary key(stu_id),
constraint fk_student foreign keya(dept_id) references
department(dept_id)
- 참조되는 fk키 dept_id는 student 테이블의 primary key이어야 한다
- fk인 dept_id와 pk의 dept_id의 이름은 꼭 같을 필요는 없다
<테이블 삭제>
- 형식 : drop table<테이블이름>
- 주의
- 다른 테이블에서 외래키로 참조되는 경우에는 삭제할 수 없다
<테이블 수정>
- 기존 테이블에 새로운 필드를 추가하거나 기존 필드를 삭제
- 필드 추가 형식 : alter table<테이블이름>add<추가할 필드>
- ex) student 테이블에 age 필드를 추가
alter table student add age int
- 필드 삭제 형식 : alter table<테이블이름>drop column<삭제할 필드>
- ex) alter table student drop column age
<기본키, 외래키 관련 주의사항>
- 외래키를 필드로 갖는 테이블을 생성할 때
- 외래키가 참조하는 테이블을 먼저 생성
- ex) 만일 department 테이블이 존재하지 않는 상태에서 student 테이블을 먼저 생성한다면 오류 발생
- 테이블을 삭제할 때도 같은 문제가 발생한다
- member 테이블이 있는 한 drop을 할 수 없다
- dept 테이블을 삭제하려면 member테이블을 먼저 삭제하던지, 외래키를 해제해야한다
<데이터 조작 언어>
- 레코드 삽입
- 레코드 수정
- 레코드 삭제
- 레코드 검색
<레코드 삽입>
- 형식 : insert into<테이블이름>(<필드리스트>)values(<값리스트>)
- <필드리스트>
- 삽입에 사용될 테이블의 필드들
- <값리스트>
- <필드리스트>의 순서에 맞춰 삽입될 값
- <필드리스트>에 나열되지 않은 필드에 대해서는 NULL값이 입력된다
- <필드리스트>를 생략할 경우 <값리스트>에는 테이블을 생성할 때 나열한 필드의 순서에 맞춰서 값을 나열
<레코드 삽입>
- 삽입 명령문에 필드 이름을 나열할 경우 그 순서는 테이블을 생성할 때 지정한 순서와 반드시 일치할 필요는 없다
- ex) insert into department (dept_id, dept_name, office)
values ('920', '컴퓨터공학과', '201호') - 1
insert into department (office, dept_id, dept_name)
values ('201호', '920', '컴퓨터공학과') -2
//1, 2번은 동일
- department 테이블의 필드들 중에서 office 필드를 생략하는 경우
- 생략된 필드에는 NULL이 입력
insert into department (dept_id, dept_name)
values ('920', '컴퓨터공학과')
- 단, not null로 설정된 필드는 NULL값이 들어갈 수 없는 필드이기 떄문에 insert문의 <필드리스트>에서 생략할 수 없다
- <필드리스트>를 사용하지 않고 데이터를 삽입하는 예
insert into department
values ('923', '산업공학과', '207호')
<레코드 수정>
- 형식 : update<테이블이름> set<수정내역> where<조건>
- <수정내역>
- 대상 테이블의 필드에 들어가는 값을 수정하기 위한 산술식
- ';'를 이용하여 여러 필드에 대한 수정 내역을 지정
- <조건>
- 대상이 되는 레코드에 대한 조건을 기술
- 관계대수에서 선택 연산의 조건식과 같은 의미
- 테이블의 모든 레코드에 대해 수정을 적용하려면 where절을 생략
- ex) student 테이블에서 모든 학생들의 학년을 하나씩 증가
update student
set year = year + 1
- ex) professor 테이블에서 '고희석' 교수의 직위를 '교수'로 수정하고 학과번호를 '923'으로 수정
update professor
set position='교수‘, dept_id='923'
where name='고희석‘
<레코드 삭제>
- 형식 : delete from<테이블이름>where<조건>
- where절에 지정된 조건을 만족하는 레코드를 삭제
- where절이 생략되면 테이블에서 모든 레코드를 삭제
- ex) professor 테이블에서 이름이 '김태석'인 교수를 삭제
delete from professor
where name='김태석'
- delete문을 이용하여 테이블의 모든 레코드를 삭제하더라도 테이블은 삭제되지 않는다
<레코드 삽입 시 주의사항>
- 외래키로 사용되는 필드에 대해 데이터를 삽입할 때
- 참조하는 테이블의 해당 필드에 그 값을 먼저 삽입해야 한다
- 외래키로 참조되는 필드를 가지고 있는 테이블에서 레코드를 삭제할 경우에도 오류가 발생할 수 있다
'데이터 베이스' 카테고리의 다른 글
SQL문법 (0) | 2023.03.28 |
---|---|
오라클 소개 (0) | 2023.03.17 |
관계형 데이터베이스 (0) | 2023.03.10 |