version 1 -...

69
MySQL R 을이 1 Version 1.0 2 2009 5 18 1 2009 1 , 부분음을 니다. 자의 전제, 및배니다. 2 Assistant Professor, Department of Statistics and Information Science, Dongguk Univer- sity, Korea; E-mail: [email protected]

Upload: vohuong

Post on 06-Feb-2018

234 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

MySQL과 R을 이용한

데이터베이스입문 1

Version 1.0

김진석2

2009년 5월 18일

1본강의노트는 2009년 1학기동국대학교정보통계학과응용데이터베이스강의를위하여작성하였으며, 부분적으로 데이터베이스 관련 서적 및 자료를 인용하였음을 밝힘니다. 당분간 저자의 허락없이 본 강의노트의 무단전제, 사용 및 배포를 금합니다.

2Assistant Professor, Department of Statistics and Information Science, Dongguk Univer-sity, Korea; E-mail: [email protected]

Page 2: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

차례

제 1 장 데이터베이스 개요 4

제 1 절 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

제 2 절 데이터베이스 관리 시스템 . . . . . . . . . . . . . . . . . . . . . . . 4

제 3 절 관계형데이터 모델 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.1 관계형데이터모델에서 용어 . . . . . . . . . . . . . . . . . . . . . . 5

3.2 테이블 특성 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.3 키(key) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3.4 기본키와 널(NULL) . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.5 관계형데이터 베이스 . . . . . . . . . . . . . . . . . . . . . . . . . 7

제 4 절 SQL 개요 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

제 2 장 MySQL 9

제 1 절 MYSQL 윈도우즈 클라이언트 설치 . . . . . . . . . . . . . . . . . . 9

1.1 Windows Essentials (x86) 다운로드 . . . . . . . . . . . . . . . . . 9

1.2 Client 설치 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.3 서버세팅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.4 외부에서 접속시 ip주소 및 권한 추가 . . . . . . . . . . . . . . . 10

1.5 Client 윈도우 커맨드 창에서 접속 . . . . . . . . . . . . . . . . . . 11

제 2 절 MySQL 시작하기 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.1 password 변경 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2 주석문(comment) . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1

Page 3: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 3 장 SQL의 활용 14

제 1 절 DATABASE와 관련 명령들 . . . . . . . . . . . . . . . . . . . . . . 14

1.1 데이터베이스 리스트 출력 . . . . . . . . . . . . . . . . . . . . . . 14

1.2 데이터베이스 생성 및 삭제 . . . . . . . . . . . . . . . . . . . . . . 14

제 2 절 TABLE관 관련된 명령들 . . . . . . . . . . . . . . . . . . . . . . . 15

2.1 TABLE 리스트 출력 . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.2 TABLE내의 column 속성출력 . . . . . . . . . . . . . . . . . . . . 15

2.3 TABLE 생성 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.4 테이블의 삭제(delete/drop) . . . . . . . . . . . . . . . . . . . . . 18

2.5 테이블의 속성변경(alter) . . . . . . . . . . . . . . . . . . . . . . . 18

2.6 테이블에 자료입력 . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.7 오류 데이터의 수정 . . . . . . . . . . . . . . . . . . . . . . . . . . 21

제 3 절 테이블로부터의 검색 . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.1 모든 데이터 검색 . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.2 조건에 맞는 특정 행 검색(WHERE문 이용) . . . . . . . . . . . . 23

3.3 특정 열의 선택 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.4 특정 행과 열의 조합 . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.5 행 정열(ORDER BY) . . . . . . . . . . . . . . . . . . . . . . . . 27

제 4 절 패턴일치 기능(LIKE/REGEXP)을 이용한 검색 . . . . . . . . . . . 29

4.1 LIKE를 이용한 패턴 일치 검색 . . . . . . . . . . . . . . . . . . . 29

4.2 정규표현에 의한 패턴 일치(REGEXP) . . . . . . . . . . . . . . . 31

제 5 절 집단함수를 이용한 요약정보의 검색 . . . . . . . . . . . . . . . . . . 33

5.1 행수 세기 : COUNT . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.2 유용한 함수들 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

제 6 절 여러 개 테이블에서의 데이터 검색 . . . . . . . . . . . . . . . . . . 37

6.1 조인(JOIN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

6.2 풀조인(full join or cross join) . . . . . . . . . . . . . . . . . . . . 39

6.3 외부조인(full join) . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.4 서브 쿼리(sub query, sub select) . . . . . . . . . . . . . . . . . . 41

6.5 UNION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

2

Page 4: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 4 장 Database 설계 45

제 1 절 데이터베이스 설계시 고려해야 할 사항들 . . . . . . . . . . . . . . . 45

1.1 무결성 제약 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

제 2 절 Entity-Relationship (ER) 모델 . . . . . . . . . . . . . . . . . . . . 47

2.1 ER 모델의 Entity . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.2 ER 모델의 속성(Attribute Set) . . . . . . . . . . . . . . . . . . . 48

2.3 ER 모델의 관계 집합 (Relationship Set) . . . . . . . . . . . . . . 50

제 3 절 Entity-Relationship (ER) 모델에서 관계형 스키마로의 변환 . . . . 51

제 5 장 데이터베이스 설계 예제 54

제 1 절 대학교 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . . . . . 54

제 2 절 항공예약 관리 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . 54

제 3 절 비디오샵 관리 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . 55

제 4 절 도서관 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . . . . . 55

제 5 절 병원 데이터베이스 . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

제 6 장 릴레이션 정규화 57

제 1 절 제 1 정규형 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

제 2 절 제 2 정규형 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

제 3 절 제 3 정규형 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

제 7 장 R에서 MySQL을 접근 방법 61

제 1 절 RODBC의 이용 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

제 2 절 RMySQL의 이용 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

제 8 장 SAS에서 MySQL을 접근 방법 66

3

Page 5: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 1장

데이터베이스개요

제 1절 데이터베이스

데이터베이스는 특정 단체의 여러 응용 시스템들이 공유하여 이용할 수 있도록 통합하

여 저장한 운영 데이터들의 집합을 뜻한다. 따라서 데이터베이스는 다음과 같은 특징을

지니는 데이터의 집합이라고 생각할 수 있다.

• 최소한의 중복(minimal redundancy)만을 허용하는 통합 데이터(integrated data)

• 보조기억공간(디스크 등)에 저장하여, 필요 시에 검색하는 저장 데이터(stored data)

• 특정 단체의 작업 수행에 필요한 운영 데이터(operational data)

• 여러 사용자가 응용 프로그램, 응용 시스템을 통해 공동으로 사용하는 공용 데이터

(shared data)

제 2절 데이터베이스관리시스템

데이터베이스 시스템 또는 DBMS (Database Management System)는 특정 조직(또는

단체)에서 필요로 하는 자료들을 전산화된 레코드 형식으로 유지, 관리하여 주는 소프

트웨어 시스템을 일컫는다.

다음은 DBMS의 활용 예이다.

• 기업 : 제품 판매에 관한 데이터 유지

4

Page 6: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 학교 : 학생에 관련된 (성적, 증명, 수업료 등) 정보 관리나 도서관의 목록, 대출

관리

• 항공사 : 비행 정보, 예약 상황 관리 등

제 3절 관계형데이터모델

• Data model: 물리적 혹은 추상적으로 존재하는 현실세계를 단순하고 정형화된 형

태로 표현하는 방식 혹은 규범

• 관계형데이터 모델(relational data model): 테이블 형식을 이용하여 데이터를 정

의하고 설명하는 data model

3.1 관계형데이터모델에서 용어

그림 1.1: 관계형데이터모델에서의 용어

3.2 테이블 특성

• 튜플 유일성(Uniqueness) 규칙

5

Page 7: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 테이블 내에는 2개 이상의 동일 튜플이 존재할 수 없음

• 튜플들은 순서를 갖지 않음

• 튜플내의 속성들은 순서를 갖지 않음

• 속성은 반드시 원자값(atomic value)를 가져야 함

3.3 키(key)

데이터베이스에서 키(key)란 테이블에서 특정 튜플을 식별가능하게 하는 속성 혹은 속

성의 집합을 의미하며 다음과 같은 종류가 있다.

• 슈퍼키(super key): 아무런 제약없이 튜플을 구분할 수 있는 속성의 집합이다. 예

를 들면 주민등록번호, (학번, 주민등록번호)가 슈퍼키가 될 수 있다.

• 후보키(candidate key)는 키 중에서 최소한의 속성만으로 구성된 키로 주민등록

번호가 그 예이다.

• 관계형데이터 모델에서 여러개의 후보키중 하나만을 선택하여 식별자로 정의할 수

있다. 이를 기본키라고 한다.

• 외래키(foreign key)는 두 개 이상의 테이블에서 정의되며 아래의 그림을 참고하

라.

그림 1.2: 외래키

6

Page 8: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

3.4 기본키와 널(NULL)

널값(Null Value)은 아직 알려지지 않은 값(Unknown value)으로 아직 정의되지 않은

값(Undefined value)을 의미한다. 데이터베이스에서의 널값은 숫자 0이나 공백 또는 널

문자를 뜻하는 것은 아니며, 수치연산이나 검색연산등에 적용 받지 않는다. 데이터베이

스에서는 개체 무결성 규칙에 따라 테이블 T 에서 기본키에 속한 속성값은 T 내의 어떤

튜플에 대해서도 NULL값을 허용않는다.

3.5 관계형데이터 베이스

관계형데이터베이스는 관계형데이터 모델에 기반하여 하나 이상의 테이블을 구현한 데

이터베이스이다. 데이터베이스 스키마는 관계형데이터베이스에서 테이블스키마1의 집합

을 나타내며, 또한 데이터베이스 인스턴스(instance)는 관계형데이터베이스에서 테이블

인스턴스의 집합을 나타낸다.

제 4절 SQL개요

SQL(Structured Query Language) 이란 DBMS를 다루기 위한 표준언어로서 이용자(응

용 프로그램)와 DBMS 사이의 중간 다리 역할 담당한다. SQL을 이용하여 DBMS를 제

어하고, 입력할 데이터를 정의하거나, DBMS에 있는 데이터를 조작할 수 있다.

그림 1.3: SQL의 역할

1데이터베이스 관리 시스템에서 데이터 구조와 그 표현법의 기술을 수용한 파일. 데이터 정의 언어를 해석함으로써 시스템에서 만들어 낸다. 데이터 조작 언어로 나타내는 프로그램에는 데이터 구조의정의가 포함되어 있지 않으므로 데이터 조작 언어를 컴파일할 때나 실행할 때에 데이터베이스 스키마를

참조한다.

7

Page 9: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

SQL문장은 다음과 같이 그 기능에 따라 두가지(혹은 3가지)로 분류할 수 있다.

• 데이터 정의문 : 데이터베이스 객체 생성, 삭제, 갱신

- CREATE

- DROP

- ALTER

- CREATE DATABASE ‘데이터베이스_이름’

• 데이터 제어문 : 데이터베이스 객체 이용권한 부여

- GRANT

- DENY

- REVOKE

- GRANT CREATE TABLE TO ‘사용자 계정’

• 데이터 조작문 : 데이터 검색, 삽입, 갱신, 삭제

- SELECT

- INSERT

- UPDATE

- DELETE

- SELECT * FROM ‘테이블_이름’

8

Page 10: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 2장

MySQL

제 1절 MYSQL윈도우즈클라이언트설치

1.1 Windows Essentials (x86) 다운로드

http://dev.mysql.com/downloads/mysql/5.0.html#win32

1.2 Client 설치

1. custom설치 선택 (MySQL sever Instance Config 는 제외한다).

2. 폴더지정 (ex, c:

mysql)

1.3 서버세팅

> mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 18

Server version: 5.0.45-community MySQL Community Edition (GPL)

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.

9

Page 11: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

mysql> use mysql

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select user,host from user

-> ;

+------+-----------------------+

| user | host |

+------+-----------------------+

| root | 127.0.0.1 |

| root | 192.168.248.1 |

| root | 222.96.17.205 |

| root | localhost |

| root | localhost.localdomain |

+------+-----------------------+

5 rows in set (0.00 sec)

(해석)로컬호스트, 192.168.248.1, 222.96.17.205 에 대하여 root권한을 부여

1.4 외부에서 접속시 ip주소 및 권한 추가

사용자를 생성해 주는 sql 구문

grant [PRIVILIEGES] on [db_name].[table_name] to ’[USER_ID]’@’[HOST_NAME]’

IDENTIFIED BY ’[PASSWD]’;

[PRIVILIEGES]

ALL PRIVILIEGES==> 모든 권한

SELECT,INSERT,UPDATE,DELETE

10

Page 12: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

[db_name].[table_name]

*.* ==> 모든 데이터베이스와 모든 테이블에 접근가능

mysql.user ==> 만약,mysql DB의 user 테이블만 허락

mysql> grant all privileges on *.* to ’root’@ipaddres’ identified by ’비밀

번호’;

1.5 Client 윈도우 커맨드 창에서 접속

서버의 ip address:192.168.248.204인 경우 :

C:\mysql\bin>mysql -h 192.168.248.204 -u [USER_ID] -p ## -h 는 host를 의

미함

Enter password: ********

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 19

Server version: 5.0.45-community MySQL Community Edition (GPL)

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.

mysql>

제 2절 MySQL시작하기

명령프롬프트에서 MySQL을 시작하려면 다음을 이용한다. -u는 사용자의 계정을 의미

하고 db name은 사용하고자 하는 데이터베이스 이름이다.

C:\jskim>mysql -u "root" -p db_name

Enter password: *

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 7 to server version: 5.0.22-community-nt

11

Page 13: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 2.1: MySQL 초기화면

2.1 password 변경

유저가 자신의 password를 바꾸기를 원할 때가 있다. 유저에 대한 정보는 data\mysql

디렉토리에 데이터베이스의 형태로 보관되고 있기 때문에 PASSWORD()함수를 사용하

여 데이터베이스에 있는 정보를 변경하여야 한다.

mysql> use mysql;

Database changed

mysql> UPDATE user SET Password=PASSWORD(’1234’) where user=’root’;

Query OK, 1 row affected (0.08 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> FLUSH PRIVILEGES;

2.2 주석문(comment)

MySQL은 주로 아래와 같은 세 가지의 주석문형태를 제공한다. 하지만 두번째행의 –는

사용하지 않는 것이 좋다. 이는 음수의 뺄셈과 혼동되기 쉽기 때문이다. 예를 들어 1-(-

1))은 1–1로 표현할 수가 있어 혼란의 여지가 있다.

mysql> select 1+1; # This comment continues to the end of line

12

Page 14: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

mysql> select 1+1; -- This comment continues to the end of line

mysql> select 1 /* this is an in-line comment */ + 1;

mysql> select 1+

-> /* this is a

-> multiple-line comment */

-> 1;

13

Page 15: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 3장

SQL의활용

• 데이터정의 언어(Data definition Language: DDL)-데이터의 저장구조를 정의하는

언어로 스키마 정의 수정, 삭제하는 명령문과 인덱스의 생성 및 삭제

• 데이터조작 언어(Data Manipulation Language: DML)-데이터에 접근 및 조작하

는 언어로 튜플의 검색, 삽입, 삭제 수정과 같은 명령문

제 1절 DATABASE와관련명령들

1.1 데이터베이스 리스트 출력

SHOW DATABASES;

1.2 데이터베이스 생성 및 삭제

CREATE DATABASE [db_name];

이 문장을 실행하면 MySQL data 디렉토리에 db name이란 서브디렉토리가 생성된다.

만일 같은 이름의 data base디렉토리가 있으면 에러메시지를 내보낸다.

(예) 새로운 database world를 만들고, 이를 handling하기 위한 명령문은 다음과 같

다.

mysql> CREATE DATABASE world;

mysql> USE world;

14

Page 16: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

만일 database를 구축하기 위한 sql문이 다른 파일로 이미 만들어 진 경우 이를 수행하

기 위해서 다음과같은 source 명령을 이용한다.

mysql> SOURCE world.sql;

DROP DATABASE [IF EXISTS] db_name

DROP DATABASE는 데이터베이스와 함께 데이터베이스 안에 있는 모든 테이블을 삭

제하는 명령이다. 따라서 조심스럽게 사용해야 한다. 참고로 테이블과 관련된 파일은 3

가지 종류가 있는 데, 확장자가 ‘.ISD’, ‘.ISM’, 그리고 ‘.frm’이다.

MySQL은 IF EXISTS라는 키워드를 제공하는데 이는 삭제하려는 데이터베이스가

없는 경우에 에러메시지를 내보내는 것을 막아준다.

제 2절 TABLE관관련된명령들

2.1 TABLE 리스트 출력

DB안에 있는 table(or relation)들의 이름을 보기 위한 명령은 다음과 같다.

mysql> show tables;

2.2 TABLE내의 column 속성출력

또한 database안에 있는 특정 table이 어떤 column들로 구성되어 있는지를 확인하려면

다음의 명령 중 하나를 사용하면 된다.

mysql> show columns from album;

mysql> describe album;

mysql> desc album;

2.3 TABLE 생성

CREATE TABLE [IF NOT EXISTS] tbl_name

(create_definition,...);

15

Page 17: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

create_definition:

col_name type

[NOT NULL|NULL] [DEFAULT default_value]

[AUTO_INCREMENT] [PRIMARY KEY]

type:

INTEGER[(length)] [UNSIGNED] [ZEROFILL]

or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

or CHAR(length) [BINARY]

or VARCHAR(length) [BINARY]

or DATE

or TIME

or ENUM(value1,value2,value3,...)

2.3.1 column Options

• PRIMARY KEY : 기본키로 설정

• NOT NULL : 반드시 값을 가져야 함을 의미

• AUTO_INCREMENT : 레코드가 삽입될 때 마다 자동으로 값을 증가

2.3.2 컬럼(or Domain) Type

• char(n): Fixed length character string, with user-specified length n.

• varchar(n): Variable length character strings, with user-specified maximum length

n.

• int: Integer (a finite subset of the integers that is machine-dependent).

• smallint: Small integer (a machine-dependent subset of the integer domain type).

• numeric(p,d): Fixed point number, with user-specified precision of p digits, with

n digits to the right of decimal point.

16

Page 18: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• real, double precision: Floating point and double-precision floating point num-

bers, with machine-dependent precision.

• float(n): Floating point number, with user-specified precision of at least n digits.

참고 : Null values are allowed in all the domain types. Declaring an attribute to be

not null prohibits null values for that attribute.

2.3.3 테이블생성 예제

테이블을 만들기 전에 테이블에 포함할 컬럼의 속성을 정의해야 한다. 만일 A는 소매점

을 운영하는 사람이고, 고객관리를 위해서 고객정보를 포하하는 고객테이블을 생성하고

싶어한다고 하자. 따라서 고객테이블에는 고객의 정보인 이름과 나이, 전화번호, 이메일

그리고 자택주소가 포함되어 있어야 한다고 하자. 이 경우의 예에서 고객테이블의 명칭

을 customer라고 정한다면 아래와 같이 고객테이블을 생성할 수 있다.

테이블 명 : customer

컬럼 명 : no: 자동으로 부여되는 일련 번호

name: 이름

age: 나이

phone: 전화번호

email: 전자우편주소

address: 주소

테이블을 만들기 전에 아래와 같이 테이블명세서를 미리 만들어 두면 테이블생성시

의 오류를 피할 수 있다.

테이블명 컬럼명 데이터형식 NULL유무 기본키 외래키 FK테이블명 FK컬럼명

고객테이블 no INTEGER NOT NULL PK(customer) name CHAR(20) NOT NULL

age TINYINTphone VARCHAR(20)email VARCHAR(30) NOT NULL

address VARCHAR(50)

표 3.1: 테이블 명세서

17

Page 19: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

CREATE TABLE customer(

no INT PRIMARY KEY NOT NULL AUTO_INCREMENT,

name CHAR(20) NOT NULL,

age TINYINT,

phone VARCHAR(20),

email VARCHAR(30) NOT NULL,

address VARCHAR(50)

);

2.4 테이블의 삭제(delete/drop)

• delete all data from table

delete from [table_name];

delete from guest;

• deletes all information about the dropped relation from the database.

drop table table_name;

drop table guest;

2.5 테이블의 속성변경(alter)

테이블에 새로운 속성(attribute)추가, 제거 혹은 속성변경

• 컬럼추가

alter table [table_name] add [col_name] [column_type];

## student 테이블에 나이 컬럼을 추가하고 그 도메인을 int로 한다.

alter table student add age int;

결과적으로 나이컬럼에 해당되는 값들은 모두 null값을 가진다.

18

Page 20: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 컬럼 제거

alter table [table_name] drop [col_name];

// student 테이블에서 idnum(주민등록번호) 컬럼 제거

alter table student drop idnum;

(주의) 이 명령은 모든 데이터베이스에서 지원하지는 않는다.

• 칼럼명을 변경

alter table [table_name] change [old_name] [new_name] [column_type];

alter table address change name firstname varchar(15);

2.6 테이블에 자료입력

테이블을 만든 후에 테이블에 자료를 입력하기 위해서는 다음의 두가지 방법을 이용한다.

• LOAD DATA 구문의 이용

• INSERT 문 사용

2.6.1 LOAD DATA 구문의 이용

외부파일을 이용하여 테이블에 자료를 입력할 때의 사용형식은 다음과 같다.

LOAD DATA LOCAL INFILE "file_name" INTO TABLE tbl_name;

예를들어 애완 동물과 관련된 자료를 DB에 아래와 같이 입력하고 싶다고 하자.

name owner species sex birth death

--------------------------------------------------

Fluffy Harold cat f 1993-02-04

Claws Gwen cat m 1994-03-17

19

Page 21: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

Buffy Harold dog f 1989-05-13

Fang Benny dog m 1990-08-27

Bowser Dianne dog m 1998-08-31 1995-07-29

Chirpy Gwen bird f 1998-09-11

Whistler Gwen bird 1997-12-09

Slim Benny snake m 1996-04-29

• CREATE TABLE을 이용하여 table을 만든다.

create table pet(

name varchar (20) not null primary key,

owner varchar (20),

species varchar (20),

sex varchar (1),

birth date,

death date

};

• 먼저 입력할 내용을 아래와 같이 pet table의 컬럼순서에 따라 텍스트파일(여기

서는 pet.txt)로 만든다. 여기서 열의 값들은 탭(Tab)키 하나로 구분하며, 아직

정해지지 않은 값이 있는 경우(즉, NULL값이 있는 경우)에는 \N 로 입력한다.

Fluffy Harold cat f 1993-02-04 \N

Claws Gwen cat m 1994-03-17 \N

Buffy Harold dog f 1989-05-13 \N

Fang Benny dog m 1990-08-27 \N

Bowser Dianne dog m 1998-08-31 1995-07-29

Chirpy Gwen bird f 1998-09-11 \N

Whistler Gwen bird \N 1997-12-09 \N

Slim Benny snake m 1996-04-29 \N

• pet.txt 파일의 내용을 LOAD DATA 문을 이용하여 테이블 pet에 입력한다 :

LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

20

Page 22: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

2.6.2 INSERT 문 사용

한번에 한 개의 레코드를 추가하고자 할 때가 있을 것이다. CREATE TABLE 문에 정

의된 순서대로 각 열의 값을 적어 주면 된다.

insert into pet [column names..]

values(’Puffball’,’Diane’,’hamster’,’f’,’1999-03-30’,NULL);

• 문자열 및 날짜의 입력은 작은 따옴표(’)를 이용

• 위에서 언급한 NULL값은 NULL로 입력할 수 있다 (주의 : \N 이라고 적으면 안

됨)

2.7 오류 데이터의 수정

앞의 결과를 자세히 살펴보면 Bower의 출생일자가 사망일자보다 늦은 것을 확인할 수

있다. 즉, 죽은 뒤에 태어났다. 이러한 입력오류가 발생할 경우에 이를 수정하기 위한

두 가지 방법이 있다. 여기서 Bower의 출생일자가 실제로는 1989-08-31이라고 가정하

자.

• 원 파일 pet.txt를 편집하여 수정한다. 테이블을 delete한 후 pet.txt에서 다시 읽

어 들인다 :

mysql> DELETE FROM pet;

mysql> LOAD DATA LOCAL infile "pet.txt" into TABLE pet;

하지만 이렇게 하면 3.3절에서 개별적으로 insert문을 이용하여 입력한 Bowser에

대해서 다시 입력해야 한다.

• UPDATE 문을 사용하여 잘못된 곳만 수정한다.

mysql> UPDATE pet SET birth="1989-08-31" WHERE name="Bowser";

21

Page 23: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

위의 예처럼 테이블의 크기가 작은 경우에는 전체 테이블 내용을 눈으로 확인하여

오류를 검사할 수 있다. 하지만 테이블 크기가 커지면 이러한 작업은 불가능하다. 대신

특별한 조건을 만족하는 자료들만 뽑아서 보길 원할 것이다.

제 3절 테이블로부터의검색

테이블로부터 정보를 검색하기 위해서는 SELECT 문을 사용하면 된다. select문의 일반

형식은 다음과 같다 :

SELECT [target] FROM [tbl_name] WHERE [condition];

• 검색대상 (target)은 검색하려는 컬럼들을 쉼표를 이용하여 나열한다. 단 모든 열

을 검색하려고 할 때는 ’*’를 이용한다.

• WHERE: 생략가능, WHERE 문을 쓸 때는 검색조건 (condition)을 써 준다.

3.1 모든 데이터 검색

가장 간단한 SELECT 문의 형태로 다음 처럼 사용할 수 있다 :

mysql> SELECT * FROM pet;

+----------+--------+---------+------+------------+------------+

| name | owner |species | sex | birth | death |

+----------+--------+---------+------+------------+------------+

| Fluffy | Harold | cat | f | 1993-02-04 | NULL |

| Claws | Gwen | cat | m | 1994-03-17 | NULL |

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

| Fang | Benny | dog | m | 1990-08-27 | NULL |

| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |

| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

| Slim | Benny | snake | m | 1996-04-29 | NULL |

22

Page 24: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| Puffball | Diane | hamster | f | 1999-03-30 | NULL |

+----------+--------+---------+------+------------+------------+

이런 식으로 SELECT문을 사용하는 것은 테이블의 전체 정보를 보고자 할 때 유용

하다.

3.2 조건에 맞는 특정 행 검색(WHERE문 이용)

WHERE문을 이용하면 테이블에서 조건을 만족하는 행들만 뽑아낼 수 있다. 아래의 예

를 살펴보자.

• pet 테이블에서 name이 ’Bower’인 레코드만 검색

mysql> SELECT * FROM pet WHERE name = "Bower";

+--------+-------+---------+-----+------------+------------+

| name | owner | species | sex | birth | death |

+--------+-------+---------+-----+------------+------------+

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

+--------+-------+---------+-----+------------+------------+

• pet 테이블에서 1998년 이후에 태어난 동물을 검색하고 싶다면, birth 열을 대상

으로 검사하면 된다 :

mysql> SELECT * FROM pet WHERE birth >= "1998-1-1"

+----------+-------+---------+-----+------------+------+

| name | owner | species | sex | birth |death |

+----------+-------+---------+-----+------------+------+

| Chirp y | Gwen | bird | f | 1998-09-11 | NULL |

| Puffball | Diane | hamster | f | 1999-03-30 | NULL |

+----------+-------+---------+-----+------------+------+

• (조건의 AND 조합) 개(species=’dog’)이면서 암컷(sex=’f’)인 동물을 검색

23

Page 25: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";

+----------+--------+---------+-----+------------+-------+

| name | owner | species | sex | birth | death |

+----------+--------+---------+-----+------------+-------+

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

+----------+--------+---------+-----+------------+-------+

• (조건의 OR 조합) 뱀(species=’snake’)이거나 새(species=’bird’)인 동물을 검색

mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";

+----------+-------+---------+------+------------+-------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+-------+

| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

| Slim | Benny | snake | m | 1996-04-29 | NULL |

+----------+-------+---------+------+------------+-------+

• (조건의 AND/OR 조합) 이렇게 할 때는 그룹지어지는 조건들 을 괄호로 묶는 것

이 좋다

SELECT * FROM pet WHERE

(species = "cat" AND sex = "m") OR (species = "dog" AND sex = "f");

+-------+--------+--------+-----+------------+-------+

| name | owner |species | sex | birth | death |

+-------+--------+--------+-----+------------+-------+

| Claws | Gwen | cat | m | 1994-03-17 | NULL |

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

+-------+--------+--------+-----+------------+-------+

24

Page 26: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

3.3 특정 열의 선택

테이블에서 한 행 전체를 보기 보다는 관심있는 열(column)들만 보고 싶다면 보고자

하는 열이름을 쉼표로 구분하여 사용다.

• name, birth열을 검색

mysql> SELECT name, birth FROM pet;

+----------+------------+

| name | birth |

+----------+------------+

| Fluffy | 1993-02-04 |

| Claws | 1994-03-17 |

| Buffy | 1989-05-13 |

| Fang | 1990-08-27 |

| Bowser | 1989-08-31 |

| Chirpy | 1998-09-11 |

| Whistler | 1997-12-09 |

| Slim | 1996-04-29 |

| Puffball | 1999-03-30 |

+----------+------------+

• 소유주(owner)만 검색

mysql> SELECT owner FROM pet;

+--------+

| owner |

+--------+

| Harold |

| Gwen |

| Harold |

| Benny |

25

Page 27: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| Diane |

| Gwen |

| Gwen |

| Benny |

| Diane |

+--------+

• 중복된 행을 없애기 (distinct 이용)

mysql> SELECT distinct owner FROM pet;

+--------+

| owner |

+--------+

| Benny |

| Diane |

| Gwen |

| Harold |

+--------+

3.4 특정 행과 열의 조합

(WHERE 절을 이용한) 행의 선택과 (열이름을 지정한 검색으로) 열의 선택을 조합할

수 있다.

• 개(dog)와 고양이(cat)에 대해서만 이름(name), 종(species), 생일(birth)을 검색

mysql> SELECT name, species, birth FROM pet

-> WHERE species = "dog" OR species = "cat";

+--------+---------+------------+

| name | species | birth |

+--------+---------+------------+

26

Page 28: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| Fluffy | cat | 1993-02-04 |

| Claws | cat | 1994-03-17 |

| Buffy | dog | 1989-05-13 |

| Fang | dog | 1990-08-27 |

|Bowser | dog | 1989-08-31 |

+--------+---------+------------+

3.5 행 정열(ORDER BY)

지금까지의 예에서 결과가 전혀 정렬되어 있지 않았다. 결과가 정렬된다면 원하는 자

료를 훨씬 쉽게 알아 볼 수 있다. 결과를 원하는 column에 대하여 정렬하기 위해서는

ORDER BY 절을 사용하면 된다.

• 생일(birth)을 기준으로 정렬한 것이다.

mysql> SELECT name, birth FROM pet ORDER BY birth;

+----------+------------+

| name | birth |

+----------+------------+

| Buffy | 1989-05-13 |

| Bowser | 1989-08-31 |

| Fang | 1990-08-27 |

| Fluffy | 1993-02-04 |

| Claws | 1994-03-17 |

| Slim | 1996-04-29 |

| Whistler | 1997-12-09 |

| Chirpy | 1998-09-11 |

| Puffball | 1999-03-30 |

+----------+------------+

• 역순으로 정렬하려먼 desc 키워드를 열 이름 뒤에 적어준다

mysql> SELECT name, birth FROM pet ORDER BY birth desc;

27

Page 29: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

+----------+------------+

| name | birth |

+----------+------------+

| Puffball | 1999-03-30 |

| Chirpy | 1998-09-11 |

| Whistler | 1997-12-09 |

| Slim | 1996-04-29 |

| Claws | 1994-03-17 |

| Fluffy | 1993-02-04 |

| Fang | 1990-08-27 |

| Bowser | 1989-08-31 |

| Buffy | 1989-05-13 |

+----------+------------+

• (여러 열에 대해서도 정렬) 먼저 동물 이름(name)으로 정렬하고 각 동물에 대해

생일(birth)이 가장 늦은 순으로 역순 정렬

(주의) DESC 키워드는 바로 앞의 열에만 적용된다. 따라서 species에 대하여는

오름차순 정렬이 된다.

mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

+----------+---------+------------+

| name | species | birth |

+----------+---------+------------+

| Chirpy | bird | 1998-09-11 |

| Whistler | bird | 1997-12-09 |

| Claws | cat | 1994-03-17 |

| Fluffy | cat | 1993-02-04 |

| Fang | dog | 1990-08-27 |

| Bowser | dog | 1989-08-31 |

28

Page 30: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| Buffy | dog | 1989-05-13 |

| Puffball | hamster | 1999-03-30 |

| Slim | snake | 1996-04-29 |

+----------+---------+------------+

제 4절 패턴일치기능(LIKE/REGEXP)을이용한검색

위의 예에서 이름(name)이 ‘b’로 시작하는 행을 검색한다고 하자. SQL에서 이러한 것

을 지원하는 기능이 있는데 이를 패턴일치기능이라고 하며, 보다 빠르고 정교하게 원하

는 조건에 대한 검색을 해주기 때문에 매우 유용하다고 하겠다. MySQL의 패턴일치 기

능은 LIKE 혹은 REGEXP(정규 표현식)를 이용하여 검색할 수 있다.

4.1 LIKE를 이용한 패턴 일치 검색

SQL에서 패턴일치기능은 LIKE구문을 이용하고 패턴의 표현을 위해서 ‘ ’와 ‘%’ 기호를

사용한다.

• 여기서 ‘_’은 임의 한 문자를 의미하며,

• ‘%’는 임의의 수의 문자(0개의 문자를 포함)를 나타낸다. 따라서 ‘b’로 시작하는

패턴은 ”b%”로 표시한다.

• LIKE를 이용할 때는 패턴에서 대소문자는 비교하지 않는다.

아래는 LIKE를 이용한 패턴일치 검색의 사용예이다.

• 정확하게 5개의 글자로 이루어진 이름(name)에 대한 검색 : 밑줄(_) 5개를 사용

하여 검색조건을 나타낸다.

mysql> SELECT * FROM pet WHERE name LIKE "_____";

+-------+--------+---------+-----+------------+-------+

| name | owner | species | sex | birth | death |

+-------+--------+---------+-----+------------+-------+

| Claws | Gwen | cat | m | 1994-03-17 | NULL |

29

Page 31: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

+-------+--------+---------+-----+------------+-------+

• 이름(name)이 ‘b’로 시작하는 패턴 검색

mysql> SELECT * FROM pet WHERE name LIKE "b%";

+--------+--------+---------+-----+------------+-----------+

| name | owner | species | sex | birth | death |

+--------+--------+---------+-----+------------+-----------+

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

+--------+--------+---------+-----+------------+-----------+

• 이름(name)이 ‘fy’로 끝나는 패턴 검색

mysql> SELECT * FROM pet WHERE name LIKE "%fy";

+--------+--------+---------+-----+------------+-------+

| name | owner | species | sex | birth | death |

+--------+--------+---------+-----+------------+-------+

| Fluffy | Harold | cat | f | 1993-02-04 | NULL |

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

+--------+--------+---------+-----+------------+-------+

• 이름(name)에 ‘w’가 포함된 패턴에 대한 검색

mysql> SELECT * FROM pet WHERE name LIKE "%w%";

+----------+-------+---------+------+------------+------------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+------------+

| Claws | Gwen | cat | m | 1994-03-17 | NULL |

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

+----------+-------+---------+------+------------+------------+

30

Page 32: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

정규표현식에 사용되는 문자 설명

. 문자 하나

* 앞에 나온 문자의 0개 이상의 반복

^ 문자열 처음

$ 문자열 끝

[] 괄호안의 문자들 중 하나이상과 일치

{ } 반복연산자, 예를들어 n번 반복할 때

{n}으로 적는다.

표 3.2: 정규표현식에 사용되는 문자 및 용도

4.2 정규표현에 의한 패턴 일치(REGEXP)

정규표현(regular expression)에 기반한 패턴일치 검색은 LIKE대신 REGEXP을 사용

한다. 여기서 SQL 패턴은 전체 값과 일치해야 “일치한다”고 하지만 정규표현은 값의

어느 부분과 일치해도 “일치한다”고 한다는 것을 유의해야 한다.

SELECT * FROM pet WHERE name REGEXP ‘‘ffy"; //ffy가 포함된 것

SELECT * FROM pet WHERE name LIKE ‘‘ffy"; //반드시 ffy 인 것

• 문자 a나 b나 c중 하나를 가르키는 표현은 [abc]이다.

• 정규표현은 대소문자를 구별, 대문자던 소문자던 상관없이 알파벳 문자를 하나라

도 포함하는 표현은 [a-zA-Z]로 해야 한다.

• *는 0개 이상의 문자들을 의미하므로 만일 x*라는 표현은 x, xx, xxx ... 를 나타

낸다.

• [0-9]*는 7, 12, 345, 678등 임의의 길이를 갖는 수를 나타낸다.

• ^abc는 줄 처음에 abc로 시작하는 패턴을 abc$는 abc로 끝나는 문자열을 의미

한다.

• 이름(anme)이 소문자 b 혹은 대문자 B로 시작하는 조건검색

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

+--------+--------+---------+-----+------------+------------+

31

Page 33: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

집단함수 의미

COUNT 행의 개수

SUM NULL을 제외한 모든 행의 합계

AVG NULL을 제외한 모든 행의 평균값

MAX NULL을 제외한 모든 행의 최대값

MIN NULL을 제외한 모든 행의 최소값

| name | owner | species | sex | birth | death |

+--------+--------+---------+-----+------------+------------+

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |

+--------+--------+---------+-----+------------+------------+

• fy로 끝나는 이름검색 ($를 사용)

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

+--------+--------+---------+-----+------------+-------+

| name | owner | species | sex | birth | death |

+--------+--------+---------+-----+------------+-------+

| Fluffy | Harold | cat | f | 1993-02-04 | NULL |

| Buffy | Harold | dog | f | 1989-05-13 | NULL |

+--------+--------+---------+-----+------------+-------+

• 정확하게 5개의 문자로 이름어진 값 검색

SELECT * FROM pet WHERE name REGEXP "^.....$"; //정규 표현

SELECT * FROM pet WHERE name REGEXP "^.{5}$"; //정규표현(반복 연산자)

SELECT * FROM pet WHERE name LIKE "_____"; //LIKE 표현

32

Page 34: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 5절 집단함수를이용한요약정보의검색

5.1 행수 세기 : COUNT

“Gwan”이 bird를 몇마리 소유하고 있는지와 같이 특정조건에 해당되는 레코드의 수를

어떻게 알아낼 수 있을까 ? 이는 count()함수를 사용하면 되며 괄호안에 해당 조건을 부

여해 주면 된다.

mysql> SELECT COUNT(*) FROM pet;

+----------+

| COUNT(*) |

+----------+

| 9 |

+----------+

각 소유주가 소유한 애완동물의 수는 다음 처럼 하면 확인 할 수 있다.

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;

+--------+----------+

| owner | COUNT(*) |

+--------+----------+

| Benny | 2 |

| Diane | 2 |

| Gwen | 3 |

| Harold | 2 |

+--------+----------+

각 owner의 모든 레코드들을 한데 묶기 위해 GROUP BY 절을 사용한 것을 주목하라.

이렇게 하지 않으면 에러 메시지를 보게 될 것이다.

mysql> SELECT owner, COUNT(owner) FROM pet;

ERROR 1140 at line 1: Mixing of GROUP columns

(MIN(),MAX(),COUNT()...)

with no GROUP columns is illegal if there is no GROUP BY clause

33

Page 35: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

COUNT()와 GROUP BY는 데이터에 여러 특성을 파악하는데 대단히 유용하다. 다음

은 각 종에 해당하는 동물의 수를 헤아리는 명령이다.

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;

+---------+----------+

| species | COUNT(*) |

+---------+----------+

| bird | 2 |

| cat | 2 |

| dog | 3 |

| hamster | 1 |

| snake | 1 |

+---------+----------+

성에 따른 동물의 수는 다음의 SQL문으로 알아낼 수 있다.

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;

+------+----------+

| sex | COUNT(*) |

+------+----------+

| NULL | 1 |

| f | 4 |

| m | 4 |

+------+----------+

다음은 종과 성에 따른 동물의 수를 검색한 것이다.

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;

+---------+------+----------+

| species | sex |COUNT(*) |

+---------+------+----------+

| bird | NULL | 1 |

| bird | f | 1 |

34

Page 36: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| cat | f | 1 |

| cat | m | 1 |

| dog | f | 1 |

| dog | m | 2 |

| hamster | f | 1 |

| snake | m | 1 |

+---------+------+----------+

바로 위의 경우와는 달리, 특정한 동물에 대해서만 조사해 볼 수 도 있 다. 개와 고양

이의 경우에만 각 성에 대해 몇마리인지 조사해 보자.

mysql> SELECT species, sex, COUNT(*) FROM pet

-> WHERE species = "dog" OR species = "cat"

-> GROUP BY species, sex;

+---------+------+----------+

| species | sex | COUNT(*) |

+---------+------+----------+

| cat | f | 1 |

| cat | m | 1 |

| dog | f | 1 |

| dog | m | 2 |

+---------+------+----------+

mysql> SELECT COUNT(*) AS N_STUDENT FROM STUDENT;

mysql> SELECT ID_LEC COUNT(*) AS N_REG, AVG(FINAL) AS MEAN_FINAL

-> FROM LECTURES

-> GROUP BY ID_LEC

-> HAVING COUNT(*) >= 5;

여기서 HAVING 절은 GROUP BY절과 같이 사용되며, GROUP BY절에 명시된 열이

름에 대한 제약조건을 의미한다.

35

Page 37: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

5.2 유용한 함수들

• 난수발생 RAND()

mysql> SELECT id,name FROM STUDENT ORDER BY RAND() LIMIT 5;

+----+--------+

| id | name |

+----+--------+

| 3 | 이수만 |

| 2 | 임성훈 |

| 6 | 박수홍 |

| 12 | 정윤호 |

| 13 | 권보아 |

+----+--------+

• 문자열 결합 CONCAT()

mysql> SELECT id,CONCAT(name,"(",alias,")") AS "이름(별명)" FROM STUDENT;

+----+---------------------+

| id | 이름(별명) |

+----+---------------------+

| 1 | 조용필(작은거인) |

| 2 | 임성훈() |

| 3 | 이수만() |

| 4 | 임예진() |

| 5 | 원미경() |

| 6 | 박수홍(허우대) |

| 7 | 안칠현() |

| 8 | 김태희(헤드뱅잉) |

| 9 | 한채영(바비인형) |

| 10 | 박수애(리틀 정윤희) |

| 11 | 허영란(까치) |

36

Page 38: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| 12 | 정윤호(꼬비) |

| 13 | 권보아() |

| 14 | 문근영(국민 여동생) |

+----+---------------------+

제 6절 여러개테이블에서의데이터검색

6.1 조인(JOIN)

Join은 여러 테이블에 저장된 데이터를 하나의 SQL 문으로 한번에 검색할 수 있는 기

능이다. 이 조인기능은 현재 관계 DBMS를 사실상 표준으로 만드는데 결정적인 역할을

하였다. 조인문을 사용하기 위해서는 두 개 이상의 테이블을 연결하기 위한 공통의 값,

즉 왜래키(foreign key)가 적어도 하나 이상 있어야 한다.

조인문을 작성하는 순서

1. SELECT 절에서 검색하고 하는 열 이름들을 명시한다

2. FROM 절에서 SELECT 절에 지정된 열 이름들의 소속 테이블 이름을 명시한다

3. FROM 절에 지정된 테이블 이름이 두 개 이상이면, 조인을 위해서 WHERE 절에

조인 조건절을 명시해야 한다

조인에서 두 개 이상의 테이블에서 열 이름이 중복될 가능성이 있다. 이를 해결하기

위해서 열 이름 앞에 테이블 이름을 접두사로 사용한다.그리고 테이블 이름과 열 이름

은 반드시 점(.)으로 구분해야 한다. 예를 들면 professor와 student 테이블에 id라는

컬럼명을 동시에 사용한다고 하자. 이 경우 조인문에서는 professor.id와 student.id를

사용하므로써 서로를 구분한다.

조인에서 테이블 이름을 AS문을 이용하여 다른 이름으로 변경(별명)하여 사용할 수

있다. FROM 절에서 테이블 이름에 별명을 지정한 후, 조인 조건절(where)에서 지정된

별명을 사용하면 효율적이다.

교수의 번호, 이름, 학과 이름을 출력하라.

SELECT p.id as 교수번호, p.name as 교수이름, d.name as 학과명

37

Page 39: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

테이블명 컬럼명 데이터형식 NULL유무 기본키 외래키 FK-TABLE FK컬럼명

학과 번호 INTEGER NOT NULL 0(DEPART) 이름 VARCHAR(50)

교수 번호 INTEGER NOT NULL 0(PROFESSOR) 이름 VARCHAR(50)

학과번호 INTEGER NOT NULL 0 DEPART 번호

STUDENT 번호 INTEGER NOT NULL 0(학생) 이름 VARCHAR(30)

주소 VARCHAR(50)학년 INTEGER키 INTEGER몸무게 INTEGER별명 VARCHAR(20)별명이유 VAHRCHAR(50)학과번호 INTEGER NOT NULL 0 DEPART 번호

CURRICULUM 번호 INTEGER NOT NULL 0(과목) 이름 VARCHAR(30)

학점 INTEGER교수번호 INTEGER NOT NULL 0 PROF 번호

REGIST 번호 INTEGER NOT NULL 0(등록) 등록일 DATETIME

학생번호 INTEGER NOT NULL 0 STUDENT 번호

LECTURE 등록번호 INTEGER NOT NULL 0 0 REGIST 번호

(수강) 과목번호 INTEGER NOT NULL 0 LECTURE 번호

중간성적 DECIMAL(6,2)기말성적 DECIMAL(6,2)

표 3.3: 테이블 명세서

FROM professor as p, depart as d

where d.id = p.id;

+----------+----------+-------------+

| 교수번호 | 교수이름 | 학과명 |

+----------+----------+-------------+

| 1 | 김태길 | 국문과 |

| 2 | 김봉남 | 연극영화과 |

38

Page 40: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| 3 | 조정래 | 영문과 |

| 4 | 이문열 | 의류학과 |

| 5 | 안성기 | 전산학과 |

| 6 | 장미희 | 철학과 |

+----------+----------+-------------+

t1 t2

+-------+ +---------+

i1 c1 i2 c2

+-------+ +---------+

1 a 2 c

2 b 3 b

3 c 4 a

+-------+ +---------+

6.2 풀조인(full join or cross join)

SELECT t1.*, t2.* FROM t1,t2;

+------+------+------+------+

| i1 | c1 | i2 | c2 |

+------+------+------+------+

| 1 | a | 2 | c |

| 2 | b | 2 | c |

| 3 | c | 2 | c |

| 1 | a | 3 | b |

| 2 | b | 3 | b |

| 3 | c | 3 | b |

| 1 | a | 4 | a |

| 2 | b | 4 | a |

| 3 | c | 4 | a |

+------+------+------+------+

39

Page 41: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

SELECT t1.*, t2.* FROM t1,t2 WHERE t1.i1=t2.i2;

+------+------+------+------+

| i1 | c1 | i2 | c2 |

+------+------+------+------+

| 2 | b | 2 | c |

| 3 | c | 3 | b |

+------+------+------+------+

다음의 SQL문을 수행해 보고 위의 결과와 비교해 보시오.

SELECT t1.*, t2.* FROM t1 JOIN t2 WHERE t1.i1=t2.i2;

SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1=t2.i2;

SELECT t1.*, t2.* FROM t1 CROSS JOIN t2 WHERE t1.i1=t2.i2;

SELECT t1.*, t2.* FROM t1 CROSS JOIN t2 ON t1.i1=t2.i2;

6.3 외부조인(full join)

SELECT t1.*, t2.* FROM t1 LEFT JOIN t2 ON t1.i1=t2.i2;

+------+------+------+------+

| i1 | c1 | i2 | c2 |

+------+------+------+------+

| 1 | a | NULL | NULL |

| 2 | b | 2 | c |

| 3 | c | 3 | b |

+------+------+------+------+

SELECT t1.*, t2.* FROM t1 RIGHT JOIN t2 ON t1.i1=t2.i2;

+------+------+------+------+

| i1 | c1 | i2 | c2 |

+------+------+------+------+

| 2 | b | 2 | c |

40

Page 42: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| 3 | c | 3 | b |

| NULL | NULL | 4 | a |

+------+------+------+------+

SELECT * FROM (Artist INNER JOIN CD ON CD.ArtistID=Artist.ArtistID)

WHERE Artist.ArtistID=22;

SELECT * FROM Artists, CDs WHERE Artists.ArtistID *= CDs.ArtistID

SELECT * FROM CDs, Artists WHERE CDs.ArtistID =* Artists.ArtistID

SELECT * FROM Artists LEFT OUTER JOIN CDs ON Artists.ArtistID = CDs.ArtistID

SELECT * FROM CDs RIGHT OUTER JOIN Artists ON CDs.ArtistID = Artists.ArtistID

6.4 서브 쿼리(sub query, sub select)

하나의 SQL 문 처리 결과를 다른 SQL 문에 전달하여 새로운 결과를 검색하는 기능을

서브 쿼리 (Sub Query)라고 하며, 이 경우 ORDER BY 절은 사용이 불가하다. 다음의

예를 보자. 이 예는 학생 테이블에서 김태희 학생과 학년이 동일한 모든 학생의 이름,

키, 몸무게를 검색하라는 sql문장이다.

SELECT name AS 이름, weight AS 몸무게, height AS "키" ,grade AS "학년"

FROM student WHERE grade=(SELECT grade FROM student WHERE name="김태희");

“문자열 문과를 포함하는 학과 이름을 가진 학과에 소속된 모든 학생의 번호, 이름, 학

년, 학과번호를 검색하라.” 에 대한 예를 보자. 단, 서브쿼리의 검색결과가 하나 이상의

행이면, IN, EXISTS 등 다중 행 비교 연산자 중 하나를 사용해야 한다

SELECT id AS 학번, name as 이름, grade as 학년, did as 학과번호

FROM student

WHERE did IN

(SELECT id FROM depart WHERE name LIKE ’%문과%’);

6.5 UNION

SELECT i1 AS i FROM t1 UNION SELECT i2 AS i FROM t2;

41

Page 43: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

+------+

| i |

+------+

| 1 |

| 2 |

| 3 |

| 4 |

+------+

SELECT * FROM t1 UNION SELECT * FROM t2;

+------+------+

| i1 | c1 |

+------+------+

| 1 | a |

| 2 | b |

| 3 | c |

| 2 | c |

| 3 | b |

| 4 | a |

+------+------+

SELECT * FROM t3;

+------+------+

| i3 | c3 |

+------+------+

| 2 | e |

| 6 | a |

+------+------+

2 rows in set (0.00 sec)

SELECT * FROM t1 UNION SELECT * FROM t2 UNION SELECT * FROM t3;

42

Page 44: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

+------+------+

| i1 | c1 |

+------+------+

| 1 | a |

| 2 | b |

| 3 | c |

| 2 | c |

| 3 | b |

| 4 | a |

| 2 | e |

| 6 | a |

+------+------+

SELECT * FROM t1 LIMIT 1

UNION SELECT * FROM t2 LIMIT 1

UNION SELECT * FROM t3 LIMIT 1;

+------+------+

| i1 | c1 |

+------+------+

| 1 | a |

+------+------+

(SELECT * FROM t1 LIMIT 1)

UNION (SELECT * FROM t2 LIMIT 1)

UNION (SELECT * FROM t3 LIMIT 1);

+------+------+

| i1 | c1 |

+------+------+

| 1 | a |

| 2 | c |

43

Page 45: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

| 2 | e |

+------+------+

44

Page 46: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 4장

Database설계

데이터베이스 설계는 사용자의 요구조건이 주어진 경우 이를 바탕으로 데이터베이스의

구조를 이끄는 과정을 말한다. 따라서 사용자가 사용하기에 부족함이 없도록 데이터베이

스의 논리적 물리적 구조를 설계하여야 한다. 데이터베이스의 설계는 3단계로 구분되어

진행된다.

• 개념적 설계(conceptual design): 요구분석에서 나온 결과를 특정 DBMS에 독

립적이면서 추상화된 표현기법을 이용하여 기술하는 단계이다. 개체관계모델(ER

model)이 이러한 개념적 설계에 대표적으로 사용하는 기법이다.

• 논리적 설계(logical design): 개념적 설계를 바탕으로 관계형데이터모델이 논리적

데이터베이스 구조에 맞도록 스키마를 생성하는 단계이다. 개체관계스키마에서 관

계형 스키마로 변환하는 과정이다.

• 물리적 설계(physical design): 논리적 구조로 부터 효율적이고 구현 가능한 물리

적 데이터베이스 구조를 설계하는 단계이다. 물리적 설계 단계에서는 성능을 고려

한 인덱스의 사용, 각 속성의 데이터 타입 결정등과 같은 릴레이션의 저장구조를

고려한다.

제 1절 데이터베이스설계시고려해야할사항들

데이터베이스를 설계할 때 기본적으로 고려해야 할 사항으로는 다음과 같다.

45

Page 47: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 4.1: Database 설계의 순서

• 사용자와 응용프로그램이 필요로 하는 모든 정보를 표현 : 요구사항을 정확히 파악

하여 반드시 필요한 정보만을 표현하여야 한다.

• 단순하고 쉽게 이해할 수 있는 구조로 표현 :

• 데이터의 중복이 발생하지 않도록 설계 :

위에 나열한 기본적인 사항들을 고려하고 난 후 데이터베이스가 지녀야 할 제약조건들을

충족하고 있는 지를 검토하여야 한다.

1.1 무결성 제약

테이터베이스의 무결성(integrity)이란 데이터베이스에 저장된 테이터가 실제의 데이터

를 모순없이 잘 반영시키기 위해서 필요한 제약조건을 의미한다. 따라서 데이터베이스

를 설계할 때에는 무결성을 반드시 확인하는 절차가 수반되어야 한다. 무결성 제약에는

다음과 같은 것들이 있다.

• 개체무결성 제약 : 이는 테이블에 있는 개체들은 반드시 유일해야 한다는 조건이

다. 이는 기본키의 조건과 일치한다.

• 참조무결성 제약 : 한 테이블에서 다른 테이블을 참조할 때, 반드시 참조되는 개체

(튜플)가 존재해야 한다. 이는 외래키가 갖추어야 할 조건이다.

• 키 제약 : 이는 같은 키 값을 가진 두 개이상의 튜플이 있으면 안된다는 조건이다.

• 도메인 제약 : 각 속성은 정의된 도메인에 속한 값들만 갖는 다는 조건이다.

46

Page 48: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 함수적 종속(functional dependency): 논리적 설계에 중요함

위의 무결성제약들 중 개체무결성, 참조무결성 그리고 키 제약은 DBMS에 의해서 자

동적으로 검증이 된다. 하지만 도메인 제약의 일부는 DBMS가 검증할 수 없다. 이를

테면, 학생은 학기당 21학점을 초과하여 수강할 수 없다는 조건은 사용자가 지정하는

제약조건으로써 절대로 DBMS가 체크할 수 없는 제약조건이다.

이와 같은 제약조건에 대하여 데이터베이스의 무결성을 확보하기 위한 방법으로는

SQL문의 assertion이나 trigger 구문을 이용한다. 이 중 trigger는 표준 SQL에 정의되

지 않았으므로 assertion에 대하여만 살펴보자. assertion의 기본형식은 다음과 같다.

CREATE ASSERTION <name> CHECK <conditin>;

위의 에를 SQL문으로 바꾸어 보면 다음과 같다.

CREATE ASSERTION 수강규정1 CHECK

(NOT EXIST (SELECT COUNT(*) FROM 수강 GROUP BY 연도, 학기, 학번) > 21;

제 2절 Entity-Relationship (ER)모델

현실세계를 (1) 엔티티 집합, (2) 속성 집합, 그리고 엔티티 집합 간의 (3) 관계 집합을

이용해서 개념적으로 표현하는 데이터 모델로서 Peter Chen (1976)이 ER 모델을 직관

적으로 표현하는 표시 방법인 ERD (Entity-Relationship Diagram)를 제안하였다.

2.1 ER 모델의 Entity

• 엔티티 타입 (Entity Type) 또는 엔티티 집합 (Entity Set)은 현실세계에 존재하는

대상 또는 개념적으로 존재하는 대상 중에서 꼭 필요하고 유용한 정보이며 보통

실무에서는 엔티티(entity)라고 함

• 엔티티 인스턴스 (Entity Instance): 엔티티 타입이 실현된 형태이며, 예를들어 엔

티티(타입)를 교수와 학생이라고 하면 교수 엔티티의 인스턴스는 김주환, 조태경,

심규박, 김진석이되며, 학생엔티티의 인스턴스는 권재민, 박용민, 조승현 등을 말

한다.

• ERD에서 엔티티는 직사각형으로 표시한다.

47

Page 49: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 4.2: E-R 다이어그램

그림 4.3: ERD에서 엔티티 표시법

2.2 ER 모델의 속성(Attribute Set)

• 속성 집합(Attribute Set)은 엔티티의 속성이나 상태를 구체적으로 기술한 것으로

간단히 속성이라고 한다. 엔티티별로 여러개의 속성이 있을 수 있다.

예)학생엔티티의 속성으로는 학번, 이름, 학과, 학년등이 있을 수 있다.

• 속성값 (Attribute Value)은 엔티티의 특성이나 상태가 현실화된 값으로 엔티티

인스턴스별로 해당되는 속성값을 부여한다.

예) 학생 엔티티 인스턴스에 김태희가 있다면 김태희의 속성값 즉, 키=165cm, 학

과 = 의류학과등이 속성값이다.

• ERD에서는 속성을 타원으로 표시한다.

• 엔티티 속성(집합)은 식별자(Identifier)와 설명자(Descriptor)로 아래와 같이 구

분된다.

48

Page 50: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 4.4: ERD에서 속성 집합(Attribute Set) 표시법

– 식별자 (Identifier): 엔티티 인스턴스를 다른 인스턴스와 구별할 수 있게 하는

하나 또는 그 이상의 엔티티 속성을 말하며, 관계형데이터베이스의 super key

역할을 하는 속성이다. 이를테면 학번이나 주민번호가 이에 속한다. ERD에

서 식별자인 속성은 밑줄로 표시한다.

그림 4.5: ERD에서 identifier(식별자) 속성의 표시법

– 설명자 (Descriptor): 식별자 이외에 엔티티를 설명하기 위한 속성이다.

• 속성중 연락처가 둘 이상이라든지, 취미가 여러개인 경우와 같이 속성들은 여러개

의 속성값들을 가질 수 있다. 이러한 속성을 다중값 속성 (Multivalued Attribute)

이라고 한다.

그림 4.6: ERD에서 다중값 속성의 표시법

• 또한 성명은 성과 이름으로 구분할 수 있고, 생년월일은 생년+월+일로 구분될

수 있다. 이렇듯 속성이 여러개의 세부 속성으로 구분되는 경우 (혹은 포함하는

경우) 이를 복합 속성 (Composite Attribute)이라고 한다.

49

Page 51: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 4.7: ERD에서 복합 속성의 표시법

2.3 ER 모델의 관계 집합 (Relationship Set)

• 엔티티와 엔티티 사이의 의미 있는 연관관계를 말하며, 간단히 관계(Relationship)

라고 한다. 엔티티간의 관계가 실현된 형태를 관계 인스턴스 (Relationship In-

stance)라고 한다.

• ERD에서는 entity간의 관계를 다이아몬드로 표시한다.

그림 4.8: ERD에서 entity간의 Relationship의 표시법

• 여러 엔티티간에 특정한 관계에 의하여 연결된 엔티티의 수를 관계의 차수 (De-

gree)라고 하며, 연결된 엔티티의 수에 따라 1차, 2차, 3차...등으로 표현하며 ERD

에서는 아래와 같이 표시한다.

그림 4.9: ERD에서 entity간의 Degree의 표시법

50

Page 52: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 하나의 관계에 실제로 참여할 수 있는 인스턴스 수를 관계의 카디낼리티 (Cardi-

nality)라고 한다. 일반적으로 카디낼리티는 일 대 일 (1 : 1), 일 대 다 (1 : M),

혹은 다 대 다 (M : N)로 표현될 수 있고, ERD에서는 아래와 같이 표시한다.

그림 4.10: ERD에서 entity간의 관계 차수 표시법

제 3절 Entity-Relationship (ER)모델에서관계형스키

마로의변환

• 개체집합의 변환 : 엔티티와 단순 속성 변환 규칙

– ERD에서 하나의 엔티티는 하나의 테이블로 변환

– 그 엔티티에 소속된 단순속성은 그 테이블에 소속된 열로 변환

– 식별자 속성은 기본키로 변환

• 복합속성(composite attribute) 변환 : 복합속성을 구성하는 단순속성들을 해당 테

이블의 열로 변환

그림 4.11: 복합속성(composite attribute) 변환

51

Page 53: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

• 다중값(multi-valued) 속성의 변환 :

– 다중값 속성은 신규 테이블을 생성함

– 신규 테이블에 다중값 속성에 포함되는 단순속성을 열로 표시함

– 다중값 속성을 포함하는 엔티티의 식별자를 신규 테이블에 포함 시키고, 외래

키로 지정

– 신규 테이블의 기본 키는 외래키와 다중값 속성의 조합이 된다.

그림 4.12: 다중값(multi-valued) 속성의 변환

• 관계 변환 규칙 : ERD에서 관계는 테이블 구조에서 외래 키로 변환

– 일대다 : ERD에서 일측 엔티티 관련 테이블의 기본키를 다측 엔티티 관련

테이블의 속성(열)으로 추가 ⇒ 복사한 속성을 외래키로 지정

그림 4.13: 일대다 관계의 변환

– 일대일 : 두 엔티티 중에서 부모 역할을 하는 한 엔티티를 선택하여 기본키를

다른 테이블에 추가

52

Page 54: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 4.14: 일대일 관계의 변환

그림 4.15: 다대다 관계의 변환

– 다대다 : 다대다 관계는 교차 엔티티로 간주 ⇒ 교차 엔티티를 테이블로 변환

• 릴레이션의 중복과 결합 :

53

Page 55: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 5장

데이터베이스설계예제

제 1절 대학교데이터베이스

• 대학 데이터베이스는 학생과 교수에 관한 데이터를 나타낸다.

• 학생에 관한 정보로는 이름, 나이, 성, 도시, 출생지(도시), 가족들의 거주지, 전에

살았던 장소와 기간, 이수한 과목(과목명, 코드, 교수, 학점, 날짜) 등이 있다. 그

리고 지금 이수하고 있는 과목과 매일매일 강의하는 장소와 시간도 포함한다.

• 대학원생에 관한 정보로는 교수 이름과 지난 해 총이수 학점 등이 있다.

• 박사과정 학생에 관한 정보로는 논문제목과 연구 분야 등이 있다.

• 교수에 관한 정보로는 이름, 나이, 출생한 장소, 소속학과, 전화번호, 직위, 상태,

그리고 주제등이 있다.

제 2절 항공예약관리데이터베이스

항공사의 예약 데이터베이스는 비행기와 승객 예약에 대한 데이터를 저장한다. 우선 보

유하고 있는 비행기에 대한 기종, 엔진 종류, 생산 연도, 좌석 수에 대한 정보가 있다.

또한 스케줄이 잡힌 각 비행기에 대해, 출발지와 도착지 및 일시를 알 수 있다. 각 비행

기에 대해서는 중간 기착지 없이 하나의 출발지와 도착지에 연결되는 것으로 가정한다.

54

Page 56: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

출발지와 도착지는 공항 이름, 국가, 도시이름, 인구에 대한 정보가 있다. 각 승객은 이

름, 성별, 전화번호 및 좌석, 흡연 여부, 마일리지를 알 수 있고 각 승객은 복수 예약이

가능하다.

제 3절 비디오샵관리데이터베이스

서울 동양 비디오(SDV)사는 대여 및 판매도매상이다. 대여는 개인 고객들에게, 판매는

소규모 비디오점을 운영하는 소매점 고객들에게 이루어지고 있다. SDV사는 보다 철저

한 고객만족을 위해 새로운 정보시스템을 구축하기로 결정했다.

각 고객은 고객id로 식별되며 이름, 전화번호 및 주소를 가진다. 개인고객의 경우는

신용카드번호가 필요하며, 소매고객의 경우는 사업자등록번호와 FAX번호가 요구된다.

SDV사의 고객이 되기 위해서는 적어도 한번은 SDV사로부터 비디오 테이프를 대여했

거나 구입했어야 한다.

고객은 한번에 여러 개의 테이프를 대여할 수 있으나 대여일로부터 3일 이내에 반

납하지 않으면 한 개당 일일 1,000원의 벌금을 지불해야 한다. 반납만기일까지 빌린 테

이프를 다 보지 못한 경우, 어떤 고객은 무더기 벌금을 피하기 위해 다 본 테이프들은

반납하고 나머지만 하루, 이틀 더 본 뒤 벌금과 함께 반납하기도 한다.

SDV사는 현재 테이프가 들어와 있거나 곧 들어올 모든 영화에 대해 제목, 감독, 판

매가격, 대여료 등의 정보를 유지한다. 한 영화에 대해 대여용 테이프가 여러 개인 경

우는 테이프마다 일련번호를 붙여서 관리하며, 각 테이프마다 테이프 형식을 기록한다.

소매점 고객이 테이프를 구매할 때는 구매일, 지불양식, 또 각 영화 당 구매수량 등이

기록된다.

SDV사는 최근 고객들이 영화를 고를 때 특정 영화배우가 출연했거나 대종상에 출

연배우가 후보로 지명된 영화들을 선호하는 현상을 보고, 고객서비스 차원에서 대종상

연기부문 정보(연두, 부문, 상금, 후보영화, 후보배우 등)와 영화배우 정보(이름, 주소,

출연영화 등)를 갖춰 고객의 영화선정을 도울 계획이다.

제 4절 도서관데이터베이스

대학의 도서관에서는 도서관 전산화를 위한 데이터베이스 구축을 위해 업무를 분석하고

55

Page 57: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

있다. 도서관에 있는 책들은 단행본과 연속간행물로 구분되는데, 모든 책들은 분류번호,

서명, 출판사, 구입일 등의 정보를 갖고 있다. 여기에 부가하여 단행본의 경우에는 저

자의 이름에 대한 정보가 있으며, 연속간행물의 경우에는 몇 권 몇 호인지에 대한 권과

호에 대한 정보가 있다. 도서관에는 직원들이 있는데, 각각 사원번호, 성명, 직급, 급여

등에 대한 정보를 갖고 있으며, 부양가족의 인원수에 따라서 가족수당을 받고, 가족의

생일에는 꽃 배달 서비스를 제공한다. 또한, 직원들 중에서 몇 사람의 책임자를 선임하

여 다른 직원을 관리한다. 학생들은 최대 5권까지 대출할 수 있으며, 대출장부에는 대출

한 학생의 학번, 책의 분류번호, 대출일, 그리고 반납예정일을 기록해 둔다. 대출기간은

일주일이며, 연체할 경우 연체료를 부과한다. 또한, 연속간행물의 경우에는 장기 대출을

할 수 있는데, 이 때에는 별도의 장기대출장부에 대출한 학생의 이름, 대출해준 직원의

이름, 책의 분류번호, 대출일, 반납예정일 등을 기록해 두며, 1개월 단위로 1000원씩의

대여료를 부과한다. 대학 도서관에서는 책을 출판한 출판사에 대한 정보를 갖고 있는데,

여기에는 출판사 이름, 창립연도, 전화번호, 주소 등이 포함된다.

제 5절 병원데이터베이스

병원 데이터베이스는 환자와 병원 각 부서로부터의 입원 및 퇴원, 치료에 대한 데이터를

저장한다. 각 환자에 대해서는 이름, 주소, 성별, 주민등록번호, 보험코드 등을 알 수 있

어야 하고 각 부서에 대해서는 부서명, 위치, 책임자, 병상의 수, 사용중인 병상의 수를

저장한다. 각 부서에는 여러 명의 의사들과 간호사가 있으며 의사 중 한 명이 책임자가

된다. 각 입원 환자에는 담당 의사와 간호사가 있으며 각 의사는 여러 명의 입원 환자

를 담당한다. 반면에 간호사는 여러 명의 환자를 담당하고 각 환자는 한 명의 의사와

여러 명의 간호사로부터 관리를 받는다. 각 의사와 간호사에 대해서는 사원번호, 이름,

주민등록번호, 재직년수 등의 정보가 있다. 각 환자들은 지정된 날짜에 입, 퇴원하며 입

원기간 동안 여러 번의 치료를 받는다. 치료에 대해서는 치료명, 기간, 환자가 보일 수

있는 반응 등을 저장한다.

56

Page 58: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 6장

릴레이션정규화

정규화(Normalization)의 기본 원칙은 데이터베이스에 저장되는 데이터의 중복을 최소

화하기 위하여 서로 독립적인 관계는 별개의 테이블로 표현한다는 것이다.

그림 6.1: 정규화 과정과 정규화 간의 관계(1)

57

Page 59: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 1절 제 1정규형

제 1 정규형이 되기 위해서는 한 셀에 하나의 데이터만 나타나야 한다.

그림 6.2: 정규화 되지 않은 테이블

그림 6.3: 1차 정규화가 끝난 테이블

제 2절 제 2정규형

제 1 정규형 에서 기본 키 열과 기본 키가 아닌 열 간의 종속 관계가 있는 경우, 이를

별도의 테이블로 분리하면 제 2 정규형이 된다. 함수 종속성(Functional Dependen-

cies:FD): 속성 A의 모든 원소들이 속성 B의 유일한 원소와 대응될 때

그림 6.4: 제 1 정규형 테이블

제 3절 제 3정규형

제 2 정규형 에서 기본 키가 아닌 열끼리 종속관계가 있는 경우, 이를 별도의 테이블로

58

Page 60: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 6.5: 2차 정규화가 끝난 테이블

분리하면 제 3 정규형이 된다

59

Page 61: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

그림 6.6: 제 2 정규형 테이블

그림 6.7: 3차 정규화가 끝난 테이블

60

Page 62: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 7장

R에서MySQL을접근방법

그림 7.1: R program 초기화면

제 1절 RODBC의이용

엑셀 파일이나 Access 파일을 ODBC와 연결하여 R에서 가져오기

1. RODBC 패키지 설치 : 패키지 ⇒ package 인스톨⇒ CRAN mirror 사이트⇒

61

Page 63: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

패키지 리스트 ⇒ RODBC를 선택

또는

> install.packages("RODBC")

2. DB 연결하기 : odbcConnect 이용

#ODBC에 scoremdb 라는 DSN 이름으로 등록되어 있는 경우,

> install.packages("RODBC")

> library(RODBC)

> channel <- odbcConnect("scoremdb")

3. 데이터베이스의 테이블이름 가져오기 : sqlTables 함수 이용

> sqlTables(channel)

4. 테이블 자료 가져오기 : sqlFetch 이용 테이블을 data frame으로 가져오는 기능

을 수행.

sqlFetch(channel, "midterm")

sqlFetch(channel, "endterm")

5. sql문의 수행 : sqlQuery 이용 데이터베이스에 SQL 문을 수행해서 자료를 가져

오는 기능을 수행.

> sqlQuery(channel, "select * from endterm")

> sqlQuery(channel, "select * from endterm where id > 10")

> sqlQuery(channel, "select * from endterm where math > 70 ")

(예)두 테이블을 합친 뒤, 평균이나 표준편차를 구하는 예.

> midterm <- sqlQuery(channel, "select * from midterm")

> endterm <- sqlQuery(channel, "select * from endterm")

> score <- cbind(midterm, endterm[,c(3:5)])

> mean(score["korean"])

> sd(score[3])

62

Page 64: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

6. Excel 파일 불러오기 : scorexls 라는 DSN이름으로 ODBC에 등록되어 있는

경우

> library(RODBC)

> channel2 <- odbcConnect("scorexls")

> sqlTables(channel2)

> sqlQuery(channel2, "select * from [sheet1$]")

제 2절 RMySQL의이용

1. MySQL DB 연결 : dbConnect()

con<-dbConnect(MySQL(),group = "lasers")

con<-dbConnect(MySQL(),

user="opto",password="pure-light",dbname="lasers",host="merced")

con<-dbConnect(MySQL(), username="root", password="1234", dbmane="htest2")

2. 테이블리스트 보기 : dbListTables(con)

> dbListTables(con)

[1] "depart" "depart2"

3. 테이블의 컬럼 보기 : dbListFields(con, ”table name”)

> dbListFields(con, "depart2")

[1] "id" "name"

4. 테이블데이터를 data.frame으로 가져오기

> dbReadTable(con, "depart2")

id name

1 1 aaa

2 2 stats

63

Page 65: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

5. data.frame를 DB테이블로 내보내기 : dbWriteTable(con, ”DBtable”, ”Rdataframe”)

> a<-data.frame(x=rnorm(10))

> a

x

1 0.3421252

2 0.3129875

3 1.6688226

4 -0.3774251

5 1.6476455

6 -1.2227376

7 -1.3733826

8 0.2277806

9 -2.0370210

10 -0.8352766

> dbWriteTable(con, "aa", a)

[1] TRUE

> dbListTables(con)

[1] "aa" "depart" "depart2"

6. file을 DB테이블로 내보내기 : dbWriteTable(con, ”DBtable”, ”파일”)

>dbWriteTable(con, "test2", "~/data/test2.csv")

7. SQL문의 수행 : dbGetQuery(), dbSendQuery()이용

>dbGetQuery(con, "select count(*) from a_table")

>dbGetQuery(con, "select * from a_table")

Run an SQL statement and extract its output in pieces (returns a result set):

rs <- dbSendQuery(con, "select * from WL where width\_nm between 0.5 and 1")

d1 <- fetch(rs, n = 10000)

d2 <- fetch(rs, n = -1) #n is maximum number of records. Use n=-1 for all records.

64

Page 66: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

8. DB 연결종료 :

dbDisconnect(con)

65

Page 67: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

제 8장

SAS에서MySQL을접근방법

LIBNAME을 이용한 접근

LIBNAME libref mysql <connection-options><LIBNAME-options>;

Arguments

• libref: 데이터베이스와의 연결하여 사용하려고 하는 SAS 이름

• mysql: MySQL과 접속하기 위한 SAS/ACCESS engine 이름

• connection-options: DBMS와 연결하기 위한 여러가지 옵션들, 아래는MySQL

접속시의 옵션들

– USER= user login ID

– PASSWORD=MySQL password

– DATABASE=MySQL database 이름

– SERVER=server name or IP address of the MySQL server

– PORT=MySQL server에 연결하는 TCP/IP 통신 port 숫자

• LIBNAME-options SAS에서 DBMS 객체를 처리하는 어떻게 처리하는 가에

대한 옵션 정의

66

Page 68: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

libname mysqllib mysql user=testuser password=testpass database=mysqldb

server=mysqlserv port=9876;

proc print data=mysqllib.employees;

where dept=’CSR010’;

run;

proc sql을 이용한 접근법 :

proc sql;

connect to mysql (user=testuser password=testpass server=mysqlserv

database=mysqldb port=9876);

select * from connection to mysql

(select * from customers

where customer like ’1%’);

disconnect from mysql;

quit;

67

Page 69: Version 1 - datamining.dongguk.ac.krdatamining.dongguk.ac.kr/lectures/2009-1/db/notes/db_note_v1.0.pdf · 데이터베이스입문 1 ... 1본강의노트는2009년1학기동국대학교정보통계학과응용

참고문헌

[1] 장재영 이상구. 데이터베이스시스템. 영지문화사, 2001.

[2] 이종만. 사례로 배우는 데이터베이스 설계와 구축. 이한출판사, 2006.

[3] Y. Choi. MySQL Reference Manual(in Korean). Software Engineering,

1999.

[4] Jeremy Cole David Axmark, MichaelWidenius and Paul DuBois.

MySQL Reference Manual, 2001.

[5] B. D. Ripley and R. M. Ripley. Applications of r clients and servers. In

In Proceedings of the Distributed Statistical Computing 2001 Workshop.

Vienna University of Technology, 2001.

[6] Brian D. Ripley. Using databases with r. R News, 1(1):18–21, January

2001.

[7] R Development Core Team. R data import/export, 2001.

[8] Brian D. Ripley Torsten Hothorn, David A. James. R/s interfaces to

databases. In Proceedings of the 2nd International Workshop on Dis-

tributed Statistical Computing, pages 15–17. Vienna, Austria, 2001.

68