슬라이드 1

Download Report

Transcript 슬라이드 1

The Korean Statistical Society
SQL 실습
안 정 용
전북대학교 수학∙통계정보과학부
SQL Workshop
1/30
SQL 개요
The Korean Statistical Society
• SQL(Structured Query Language) 이란?
•
DBMS 표준 언어
•
•
이용자(응용 프로그램)와 DBMS 사이의 중간 다리 역할 담당
데이터 정의, 제어, 조작 등의 기능 포함
SQL
SQL Workshop
Database
Management
System
•
고객정보 테이블에서 직업이 ‘학생’인 고객 검색
•
Select * from Customer_Info
where job=‘학생’
2/30
The Korean Statistical Society
• SQL 문장
· 데이터 정의문
- CREATE
- DROP
- ALTER
· 데이터 제어문
- GRANT
- DENY
- REVOKE
· 데이터 조작문
-
SQL Workshop
SELECT
INSERT
UPDATE
DELETE
· 데이터베이스 객체 생성, 삭제, 갱신
- CREATE DATABASE ‘데이터베이스_이름’
· 데이터베이스 객체 이용권한 부여
- GRANT CREATE TABLE
TO ‘사용자 계정’
· 데이터 검색, 삽입, 갱신, 삭제
- SELECT *
FROM ‘테이블_이름’
3/30
데이터 정의문
The Korean Statistical Society
• 데이터베이스 생성 및 삭제
· 데이터베이스 생성
예 : CREATE DATABASE TestDB
- TestDB 이름을 가진 데이터베이스 생성
- 데이터베이스의 크기, 저장될 파일 이름, 파일의 증가 단위 등을 지정할 수 있음
- 시스템에서 기본적으로 제공하는 것을 사용
· 데이터베이스 삭제
예 : DROP DATABASE TestDB
- TestDB 이름을 가진 데이터베이스 삭제
SQL Workshop
4/30
The Korean Statistical Society
• 테이블 생성 및 삭제
· 테이블 생성
CREATE TABLE
(
필드_이름
필드_이름
…
필드_이름
)
테이블_이름
데이터_타입
데이터_타입
[제약조건] ,
[제약조건] ,
데이터_타입
[제약조건]
- 데이터_타입
SQL Workshop
구분
데이터 타입
크기(byte)
구분
데이터 타입
크기(byte)
4
2
1
1
날짜
datetime
smalldatetime
정수
int
smallint
tinyint
bit
문자
char, varchar
nchar, nvarchar
text
0~8000
0~4000
0~2GB
고정소수
numeric
decimal
2~17
이진
binary
image
0~8000
0~2GB
부동소수
float
real
8
4
화폐
money
smallmoney
8
4
8
4
5/30
The Korean Statistical Society
- 제약조건
구분
제약조건
기본 키 설정
primary key
외래 키 설정
foreign key references 참조_테이블_이름(참조_필드)
널 값 허용하지 않을 때
not null
동일한 데이터 입력 방지
unique
기본 값 설정
default ‘기본_값’
- 예 : 고객테이블
SQL Workshop
속성
속성명
데이터 타입
길이
제약사항
고객번호
CID
char
6
PK
고객이름
Name
char
10
not null
주소
Address
char
20
전화번호
Tel
char
15
생년월일
Bday
datetime
주민등록번호
SID
char
14
직업
Job
char
10
성별
Sex
char
1
결혼여부
Married
bit
not null
not null
not null
6/30
The Korean Statistical Society
- 예 : 고객테이블 생성
CREATE TABLE Customer_Info
(
CID
char(6)
PRIMARY
KEY,
Name
char(10)
not null,
Address char(20)
,
Tel
char(15)
,
Bday
datetime
not null,
SID
char(14)
not null,
Job
char(10)
,
Sex
char(1)
not null,
Married
bit
)
SQL Workshop
CREATE TABLE Customer_Info
(
CID
char(6)
not null,
Name
char(10)
not null,
Address char(20)
,
Tel
char(15)
,
Bday
datetime
not null,
SID
char(14)
not null,
Job
char(10)
,
Sex
char(1)
not null,
Married
bit,
PRIMARY KEY (CID)
)
7/30
The Korean Statistical Society
· 테이블 변경 : 필드 추가/제거, 데이터 타입 또는 크기 변경
예 : ALTER TABLE Customer_Info
ALTER COLUMN NAME char(20)
- Customer_Info 테이블의 Name 필드의 크기를 20으로 변경
· 테이블 제거
예 : DROP TABLE Customer_Info
- Customer_Info 테이블 제거
※ 기본 키나 외래 키가 포함되면 삭제 순서를 고려
- Customer_OnlineInfo, Customer_Info에서 삭제 순서는?
DROP TABLE Customer_OnlineInfo
DROP TABLE Customer_Info
SQL Workshop
8/30
실습 환경
The Korean Statistical Society
• 실습 환경
•
•
Server Computer, DBMS : COMPSTAT 서버 이용(전북대학교)
Client 환경 : Web browser 이용
• 테이블 구성
SQL Workshop
9/30
The Korean Statistical Society
• 예제 데이터
- Table : Sales
- Table : Customer_Info
CID
Name
Address
100001
100002
100003
100004
100005
100006
:
김민주
정영미
최소영
박진재
이순석
박진희
:
서울시..
경기도..
제주도..
강원도..
충남..
서울시..
:
Tel
Bday
423-8627 75-7-1
321-4568 77-2-1
624-2172 80-1-25
543-9467 60-5-2
254-9124 82-6-1
459-2187 75-4-5
:
:
SID
Job
Sex
Married
75..
77..
80..
60..
82..
75..
:
공무원
회사원
학생
공무원
회사원
회사원
:
1
1
1
0
0
1
:
0
1
0
1
0
0
:
- Table : Customer_OnlineInfo
CID
LID
LPW
EMail
Jday
100001
100002
100003
100005
100006
100008
:
champ
gimme
mac001
black
soyoung
jini
:
cham999
sweet
pluto
white007
soso
movie
:
[email protected]
[email protected]
[email protected]
[email protected]
2000/2/1
2000/3/4
2000/4/1
2000/1/10
2000/2/2
2000/7/2
:
[email protected]
:
SaleID PID
1
2
3
4
5
6
7
8
9
:
1240
1220
1230
1240
1250
3010
1210
1240
1230
:
SID
CID
SDay
Amount
211
211
211
211
211
211
211
211
211
:
100001
100001
100006
100002
100006
100011
100010
100002
100010
:
2000/3/3
2000/4/1
2000/4/4
2000/4/5
2000/4/6
2000/4/9
2000/4/11
2000/4/11
2000/4/12
:
18000
13000
5000
18000
10000
30000
21000
18000
5000
:
• 실습 사이트
•
SQL Workshop
compstat.chonbuk.ac.kr/dbbook
10/30
데이터 조작문
The Korean Statistical Society
• 데이터 검색 : SELECT 문
· 여러 테이블을 조합해서 사용자가 원하는 필드와 레코드를 추출
· 일반적인 형식
SELECT [DISTINCT] 필드_리스트
FROM 테이블_이름
[WHERE 조건]
[GROUP BY 필드_리스트]
[HAVING 조건]
[ORDER BY 필드_리스트 [ASC|DESC] ]
- SELECT
: 검색하고자 하는 필드 이름 명시
- FROM
: 검색 테이블 이름 명시
- WHERE
: 검색할 데이터의 검색 조건 지정
- GROUP BY : 그룹화(분할) 하고자 하는 필드 이름 명시
- HAVING
: GROUP BY에서 명세된 그룹에 대한 검색 조건 명시
- ORDER BY : 정렬하고자 하는 기준 필드 이름 명시
SQL Workshop
11/30
The Korean Statistical Society
(1) 테이블의 일부 또는 전체 필드 검색
- 예 : 테이블 Customer_Info 에서 고객번호, 이름, 직업 필드의 데이터 검색
SELECT CID, Name, Job
FROM Customer_Info
- 예 : 테이블 Customer_OnlineInfo 에서 전체 필드의 데이터 검색
SELECT ( all ) *
FROM Customer_OnlineInfo
또는
SELECT CID, LID, LPW, Email, Jday
FROM Customer_OnlineInfo
SQL Workshop
12/30
The Korean Statistical Society
(2) 레코드의 중복 제거 : DISTINCT
- 예 : 제품 구입을 한 고객 모두 검색
Sales 테이블의 고객번호들을 중복 없이 검색
SELECT DISTINCT CID
FROM Sales
(3) 레코드의 조건 검색 : WHERE
- 예1 : Customer_Info 테이블에서 직업이 ‘회사원’인 고객의 고객번호(CID), 이름(Name),
직업(job), 결혼여부(married) 검색
SELECT CID, Name, Job, Married
FROM Customer_Info
WHERE Job = '회사원'
SQL Workshop
13/30
The Korean Statistical Society
- 예2 : Customer_OnlineInfo 테이블에서 전자우편주소(Email)가 널 값이 아닌 레코드 검색
SELECT *
FROM Customer_OnlineInfo
WHERE Email is not NULL
- 예3 : Customer_Score 테이블에서 Score가 100 이상이고 200 이하인 레코드 검색
SELECT *
FROM Customer_Score
WHERE Score>=100 and Score<=200
※ 비교, 논리 연산자
SQL Workshop
비교연산자
의미
논리연산자
의미
=
같다
AND
논리곱
>
크다
OR
논리합
<
작다
NOT
부정
>=
크거나 같다
<=
작거나 같다
<>
같지 않다
14/30
The Korean Statistical Society
- 예4 : LIKE 연산자 이용
· 특정 패턴의 문자열 검색
SELECT *
FROM Customer_Info
WHERE Name LIKE '김%'
SELECT *
FROM Customer_OnlineInfo
WHERE Email LIKE '%hotmail%'
- 예5 : IN 연산자 이용
· 검색하고자 하는 값의 집합 이용
SELECT CID, Name, Job
FROM Customer_Info
WHERE Job IN ('회사원', '공무원', '학생')
SQL Workshop
15/30
The Korean Statistical Society
(4) 데이터의 그룹화 : GROUP BY
- 특정 필드의 값에 따라 데이터 그룹화, 일반적으로 SQL 함수와 같이 사용
- 예 : Customer_Info 테이블에서 직업별 고객 빈도수 검색
SELECT
Job, count(*) as freq
FROM
Customer_Info
GROUP BY Job
(5) 데이터 그룹화의 조건검색 : HAVING
- 각 그룹에 대한 조건 검색
- HAVING 절 다음에는 SELECT 다음에 명시된 필드(또는 함수)에 대해서만 조건을 줄 수
있음
- 예 : Sales 테이블에서 2001년 4월의 고객별 구매회수가 20회 이상인 고객들만 검색
SELECT
CID, count(*) as freq
FROM
Sales
WHERE
year(SDay)=2001 and month(SDay)=4
GROUP BY CID
HAVING count(*) >= 20
SQL Workshop
16/30
The Korean Statistical Society
(6) 출력 순서 명시 : ORDER BY
- 질의 결과의 레코드 정렬
- 예 : Customer_Info 테이블에서 고객들을 생년월일 순으로 검색
SELECT
CID, Name, Bday
FROM
Customer_Info
ORDER BY Bday ( ASC )
(7) 상위 레코드 선택 : SELECT TOP
- 예 : Customer_OnlineInfo 테이블에서 2000년 이후 가입한 고객 중 먼저 가입한 5명 검색
SELECT TOP 5 *
FROM
Customer_OnlineInfo
WHERE
year(Jday) >= 2000
ORDER BY Jday
SQL Workshop
17/30
The Korean Statistical Society
(8) 여러 테이블에서 데이터 검색 : JOIN
- 관계형 데이터베이스 설계 시에 데이터의 중복을 피하고 데이터의 정확성을 높이기 위해
개체와 관계를 여러 테이블로 나누어 설계
- 따라서 여러 테이블을 조합해야 원하는 데이터 검색할 수 있음
- INNER JOIN
- OUTER JOIN
- CROSS JOIN
SQL Workshop
18/30
The Korean Statistical Society
① INNER JOIN
- 기본적인 조인형태, 조인하고자 하는 테이블을 연결하는 필드의 값이 같은 레코드 선택
- 예 : 테이블 Customer_Info, Customer_OnlineInfo 에서 고객번호, 이름, Login ID,
전자우편주소를 고객번호 순으로 검색
SELECT
FROM
INNER JOIN
ON
ORDER BY
또는
SELECT
FROM
WHERE
ORDER BY
또는
SELECT
FROM
WHERE
ORDER BY
SQL Workshop
Customer_Info.CID, Name, LID, EMail
Customer_Info
Customer_OnlineInfo
Customer_Info.CID= Customer_OnlineInfo.CID
Customer_Info.CID
Customer_Info.CID, Name, LID, EMail
Customer_Info, Customer_OnlineInfo
Customer_Info.CID= Customer_OnlineInfo.CID
Customer_Info.CID
C.CID, Name, LID, EMail
Customer_Info AS C, Customer_OnlineInfo AS CO
C.CID= CO.CID
C.CID
19/30
The Korean Statistical Society
② OUTER JOIN
- 조인할 때 기준테이블을 설정하고, 기준테이블의 모든 레코드와 다른 테이블에서
조인 조건을 만족하는 레코드 선택
- 기준테이블의 위치에 따라 LEFT OUTER JOIN, RIGHT OUTER JOIN 등이 있음
- 예 : 고객 정보에 온라인 정보를 추가해서 검색하고자 할 때 ( LEFT JOIN )
SELECT
FROM
LEFT JOIN
ON
또는
SELECT
FROM
WHERE
C.CID, Name, LID, EMail
Customer_Info AS C
Customer_OnlineInfo AS CO
C.CID= CO.CID
C.CID, Name, LID, EMail
Customer_Info AS C, Customer_OnlineInfo AS CO
C.CID *= CO.CID
- 예 : 고객 정보에 온라인 정보를 추가해서 검색하고자 할 때 ( RIGHT JOIN )
SELECT
FROM
WHERE
SQL Workshop
C.CID, Name, LID, EMail
Customer_OnlineInfo AS CO, Customer_Info AS C
CO.CID =* C.CID
20/30
The Korean Statistical Society
(9) 중첩 질의
- WHERE 절에 완전한 하나의 SELECT 질의문이 포함되어 있는 형태
- 어떤 테이블내에 존재하는 레코드를 검색한 다음 이를 비교 조건에서 사용
- 예 : Customer_Info 테이블에도 존재하고, Customer_Score 테이블에도 존재하는
고객(온라인 고객이면서 구매 실적이 있는 고객)의 명단 검색
SELECT CID, Name
FROM Customer_Info as C
WHERE EXISTS ( SELECT *
FROM Customer_OnlineInfo as CO
WHERE C.CID = CO.CID )
AND EXISTS ( SELECT *
FROM Customer_Score as SC
WHERE C.CID = SC.CID )
SQL Workshop
21/30
The Korean Statistical Society
• 데이터 삽입 : INSERT 문
· 테이블에 새로운 레코드 삽입
· 일반적인 형식
INSERT (INTO) [ ( 필드_이름 [ , … n ] ) ]
VALUES ( 데이터 [ , … n ] )
- 예1 : Customer_Info 테이블에 고객 번호, 고객 이름, 생년월일, 주민등록번호, 성별이
(100005, '김철수', '82-6-1', '820601-1450512', 1) 인 레코드 삽입
INSERT INTO Customer_Info (CID, Name, Bday, SID, Sex)
VALUES ('100005', '김철수', 82-6-1, '820601-1450512', 1)
- 예2 : Customer_Info 테이블에서 남자 고객만 Customer_Male 테이블로 복사
INSERT INTO Customer_Male
( SELECT CID, Name, Address, Tel, Sex
FROM Customer_Info
WHERE Sex=0 )
SQL Workshop
22/30
The Korean Statistical Society
• 데이터 갱신 및 삭제 : UPDATE 문, DELETE 문
- 예1 : Customer_Info 테이블에서 고객번호가 100005인 고객의 전화번호를 '254-4567',
직업을 '회사원'으로 수정
UPDATE Customer_Info
SET
Tel='254-4567', Job='회사원'
WHERE CID='100005'
- 예2 : Customer_Info 테이블에서 고객번호가 100005인 레코드를 삭제
DELETE Customer_Info
WHERE CID='100005'
SQL Workshop
23/30
SQL 함수
The Korean Statistical Society
• 스칼라(Scalar) 함수
(1) 수학 함수
함 수
의 미
ABS(numeric_expr)
절대값
ACOS,ASIN,ATAN,ATN2,COS,
COT,SIN,TAN(float_expr)
삼각함수 관련 값
CEILING, FLOOR(numeric_expr)
ROUND(numeric_expr, length)
올림, 내림
반올림
EXP(float_expr)
LOG, LOG10(float_expr)
지수
자연로그, 로그 값
RAND([seed])
0에서 1사이의 난수
POWER(numeric_expr, length)
SQRT(float_expr)
승
자연로그 값
- 예 : 0과 1사이의 난수 생성
SELECT RAND() as RN
SQL Workshop
24/30
The Korean Statistical Society
(2) 문자열 함수
함
수
의
미
LEN(string_expr)
문자열의 길이(즉 문자의 개수)
LOWER, UPPER(char_expr)
소문자, 대문자로 변환
LTRIM, RTRIM(char_expr)
문자열 좌측, 우측 공백 제거
REPLACE(expr1,expr2, expr3)
expr1에서 expr2 문자열을 찾아 expr3 문자열로 바꿔준다
LEFT,RIGHT(str_expr, int_expr)
문자열의 왼쪽, 오른쪽에서부터 정해진 자리수 만큼의 부분
STR(float_expr[,length[,decimal]])
숫자 값을 문자열로 변환
- 예 : Customer_OnlineInfo 테이블에서 LPW 필드의 길이 검색
SELECT CID, LEN(LPW) as LengthofPassword
FROM Customer_OnlineInfo
SQL Workshop
25/30
The Korean Statistical Society
(3) 날짜 함수
함
수
의
미
DATEADD(datepart, number, date)
datapart 자리에 숫자를 더한다
DATEDIFF(datepart, date1, date2)
두 날짜간의 차이를 나타낸다
GETDATE()
시스템의 날짜와 시각을 반환한다
YEAR, MONTH, DAY(date)
날짜에서 년, 월, 일을 반환한다
- 예 : Customer_Info 테이블에서 고객들의 나이를 내림차순으로 검색
SELECT
CID, Name, year(GETDATE())-year(Bday) as Age
FROM
Customer_Info
ORDER BY Age DESC
SQL Workshop
26/30
The Korean Statistical Society
• 통계 관련 함수
(1) 집계 함수
함
수
의
미
AVG
SUM
평균값
합계
COUNT
COUNT(*)
전체 레코드 수
NULL 값을 포함한 전체 레코드 수
MIN
MAX
최소값
최대값
STDEV
STDEVP
표본 표준편차
모집단 표준편차
VAR
VARP
분산
모집단 분산
- 예 : Customer_Info 테이블의 전체 레코드 수, 고객 나이의 표준편차를 계산
SELECT
COUNT(*) as countAll,
STDEV( year(GETDATE())-year(Bday)) as sampleSTDEV
STDEVP( year(GETDATE())-year(Bday)) as popSTDEV
FROM Customer_Info
SQL Workshop
27/30
The Korean Statistical Society
(2) 다차원 분석 연산자 : ROLLUP, CUBE, COMPUTE
- GROUP BY 와 함께 데이터에 대한 2차적 요약
- 예 : Customer_Info 테이블과 Sales 테이블을 JOIN 하여 고객별, 제품별 평균 구매액 산출
SELECT
FROM
INNER JOIN
ON
GROUP BY
ORDER BY
SQL Workshop
Name, PID, AVG(Amount) as averAmount
Customer_Info as C
Sales as S
C.CID=S.CID
Name, PID WITH CUBE
Name
28/30
SQL 활용 예
The Korean Statistical Society
• ASP : 고객정보 입력
<html>
<%
userId
Password
userName
:
email
= Trim(Request("userid"))
= Trim(Request("password"))
= Trim(Request("username"))
:
= Trim(Request("email"))
사용자 입력 데이터
sql= " Insert into db_Users Values ( '"&userId&"' ,'"&Password&"', '"&userName&"', … ,
'"&email&"' )"
Set DBConn = Server.CreateObject("ADODB.CONNECTION")
DBConn.Open Session("Dsn")
DB 연결
SQL 문장
DBConn.Execute sql
Dbconn.Close
Set Dbconn=Nothing
SQL 문 실행
%>
</html>
SQL Workshop
29/30
The Korean Statistical Society
• ASP : 로그인
<html>
<%
사용자 입력 데이터
userID = Trim(Request.Form("UserID"))
userPW = Trim(Request.Form("Password"))
sql = "Select * FROM db_Users "
sql = sql & " WHERE LID = '"&userID&"' and LPW='"&userPW&"' "
set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, Session("Dsn")
if not rs.EOF then
Response.Redirect "../start.asp"
else
Response.redirect "error.asp"
end if
SQL 문장
DB 연결 및 SQL 문 실행
‘사용자가 존재하면
‘사용자가 존재하지 않으면
' 사용자가 존재하지 않으면
%>
</html>
SQL Workshop
30/30