개발자 끄적끄적

SQL의 구성(DDL, DML) 본문

데이터 베이스

SQL의 구성(DDL, DML)

햏치 2023. 3. 25. 14:21

<질의어와 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