You are on page 1of 146

TRNG I HC KHOA HC HU

KHOA CNG NGH THNG TIN








G
G
I
I

O
O
T
T
R
R

N
N
H
H
S
S
Q
Q
L
L

(Lu hnh ni b)


Bin son: Trn Nguyn Phong





Hu, 2004
Khoa CNTT - Trng HKH Hu Gio trnh SQL

M M C C L L C C

MC LC........................................................................................................................2
LI NI U.................................................................................................................5
CHNG 1: .............................................................................7 TNG QUAN V SQL
1.1 SQL l ngn ng c s d liu quan h ........................................................................... 7
1.2 Vai tr ca SQL................................................................................................................ 8
1.3 Tng quan v c s d liu quan h ................................................................................. 9
1.3.1 M hnh d liu quan h............................................................................................ 9
1.3.2 Bng (Table) .............................................................................................................. 9
1.3.3 Kho ca bng ......................................................................................................... 10
1.3.4 Mi quan h v kho ngoi...................................................................................... 11
1.4 S lc v SQL............................................................................................................... 12
1.4.1 Cu lnh SQL........................................................................................................... 12
1.4.2 Qui tc s dng tn trong SQL............................................................................... 14
1.4.3 Kiu d liu ............................................................................................................. 14
1.4.4 Gi tr NULL ........................................................................................................... 16
1.5 Kt chng...................................................................................................................... 16
CHNG 2: ......................................................18 NGN NG THAO TC D LIU
2.1 Truy xut d liu vi cu lnh SELECT........................................................................ 18
2.1.1 Mnh FROM....................................................................................................... 19
2.1.2 Danh sch chn trong cu lnh SELECT ................................................................ 20
2.1.3 Ch nh iu kin truy vn d liu ......................................................................... 25
2.1.4 To mi bng d liu t kt qu ca cu lnh SELECT ......................................... 29
2.1.5 Sp xp kt qu truy vn.......................................................................................... 29
2.1.6 Php hp .................................................................................................................. 31
2.1.7 Php ni ................................................................................................................... 33
2.1.7.1 S dng php ni .............................................................................................. 34
2.1.7.2 Cc loi php ni .............................................................................................. 36
2.1.7.4 S dng php ni trong SQL2.......................................................................... 40
2.1.8 Thng k d liu vi GROUP BY........................................................................... 43
2.1.9 Thng k d liu vi COMPUTE............................................................................ 46
2.1.10 Truy vn con (Subquery) ....................................................................................... 49
2.2 B sung, cp nht v xo d liu.................................................................................... 53
2.2.1 B sung d liu........................................................................................................ 53
2.2.2 Cp nht d liu....................................................................................................... 54
2.2.3 Xo d liu............................................................................................................... 56
Bi tp chng 2............................................................................................................. 58
CHNG 3: ..................................................69 NGN NG NH NGHA D LIU
2
Khoa CNTT - Trng HKH Hu Gio trnh SQL
3.1 To bng d liu ............................................................................................................. 69
3.1.1 Rng buc CHECK.................................................................................................. 72
3.1.2 Rng buc PRIMARY KEY.................................................................................... 74
3.1.3 Rng buc UNIQUE................................................................................................ 76
3.1.4 Rng buc FOREIGN KEY..................................................................................... 76
3.2 Sa i nh ngha bng ................................................................................................. 79
3.3 Xo bng......................................................................................................................... 81
3.4 Khung nhn ..................................................................................................................... 82
3.4.1 To khung nhn........................................................................................................ 84
3.4.2 Cp nht, b sung v xo d liu thng qua khung nhn......................................... 86
3.4.3 Sa i khung nhn.................................................................................................. 89
3.4.4 Xo khung nhn........................................................................................................ 90
Bi tp chng 3............................................................................................................. 90
CHNG 4: ........................................................................96 BO MT TRONG SQL
4.1 Cc khi nim................................................................................................................. 96
4.2 Cp pht quyn ............................................................................................................... 97
4.2.1 Cp pht quyn cho ngi dng trn cc i tng c s d liu .......................... 97
4.2.2 Cp pht quyn thc thi cc cu lnh ...................................................................... 99
4.3 Thu hi quyn............................................................................................................... 100
4.3.1 Thu hi quyn trn i tng c s d liu:.......................................................... 100
4.3.2 Thu hi quyn thc thi cc cu lnh: ..................................................................... 103
CHNG 5: .......................................104 TH TC LU TR, HM V TRIGGER
5.1 Th tc lu tr (stored procedure)................................................................................ 104
5.1.1 Cc khi nim........................................................................................................ 104
5.1.2 To th tc lu tr ................................................................................................. 105
5.1.3 Li gi th tc lu tr............................................................................................ 107
5.1.4 S dng bin trong th tc..................................................................................... 107
5.1.5 Gi tr tr v ca tham s trong th tc lu tr...................................................... 108
5.1.6 Tham s vi gi tr mc nh................................................................................. 109
5.1.7 Sa i th tc ....................................................................................................... 110
5.2 Hm do ngi dng nh ngha .................................................................................... 111
5.2.1 nh ngha v s dng hm................................................................................... 111
5.2.2 Hm vi gi tr tr v l d liu kiu bng......................................................... 112
5.3 Trigger .......................................................................................................................... 116
5.3.1 nh ngha trigger.................................................................................................. 117
5.3.2 S dng mnh IF UPDATE trong trigger......................................................... 119
5.3.3 ROLLBACK TRANSACTION v trigger ............................................................ 121
5.3.4 S dng trigger trong trng hp cu lnh INSERT, UPDATE v DELETE c tc
ng n nhiu dng d liu........................................................................................... 122
5.3.4.1 S dng truy vn con..................................................................................... 122
5.3.4.2 S dng bin con tr....................................................................................... 125
Bi tp chng 5........................................................................................................... 127
CHNG 6: ....................................................................................132 GIAO TC SQL
6.1 Giao tc v cc tnh cht ca giao tc........................................................................... 132
6.2 M hnh giao tc trong SQL........................................................................................ 133
3
Khoa CNTT - Trng HKH Hu Gio trnh SQL
6.3 Giao tc lng nhau........................................................................................................ 136
PH LC.....................................................................................................................138
A. C s d liu mu s dng trong gio trnh .................................................................. 138
B. Mt s hm thng s dng .......................................................................................... 141
B.1 Cc hm trn d liu kiu chui .............................................................................. 141
B.2 Cc hm trn d liu kiu ngy gi ......................................................................... 143
B.3 Hm chuyn i kiu ............................................................................................... 144
TI LIU THAM KHO............................................................................................146





4
Khoa CNTT - Trng HKH Hu Gio trnh SQL

L L I I N N I I U U

Ngn ng hi c cu trc (SQL), c tin thn l SEQUEL, l mt ngn ng
c IBM pht trin v s dng trong h c s d liu th nghim c tn l System/R
vo nm 1974, chnh thc c ANSI/ISO cng nhn l mt chun ngn ng s dng
trong c s d liu quan h vo nm 1986. Cho n hin nay, SQL c s dng
ph bin trong cc h qun tr c s d liu thng mi v c vai tr quan trng trong
nhng h thng ny.
c s ng vin ca cc ng nghip trong Khoa Cng ngh Thng tin
(Trng i hc Khoa hc - i hc Hu), chng ti mnh dn vit v gii thiu Gio
trnh SQL n bn c. Trong gio trnh ny, chng ti khng c tham vng cp n
mi kha cnh ca SQL m ch mong mun rng y s l ti liu tham kho tng i
y v cc cu lnh thng c s dng trong SQL. Gio trnh c chia thnh
su chng vi ni dung nh sau:
Chng 1 gii thiu tng quan v SQL v mt s khi c bn lin quan n c s
d liu quan h.
Chng 2 c dnh bn lun n cc cu lnh thao tc d liu bao gm
SELECT, INSERT, UPDATE v DELETE, trong tp trung nhiu vo cu lnh
SELECT.
Chng 3 trnh by mt s cu lnh c bn c s dng trong nh ngha cc i
tng c s d liu.
Mt s vn lin quan n bo mt d liu trong SQL c cp n trong
chng 4.
Ni dung ca chng 5 lin quan n vic s dng th tc lu tr, hm v trigger
trong c s d liu.
Trong chng cui cng, chng 6, chng ti gii thiu n bn c mt s vn
lin quan n x l giao tc trong SQL
Ngoi su chng trn, phn ph lc cui gio trnh cp n c s d liu
mu c s dng trong hu ht cc v d v mt s hm thng c s dng trong
h qun tr SQL Server 2000 bn c tin trong vic tra cu.
So vi chun SQL do ANSI/ISO xut, bn thn cc h qun tr c s d liu
quan h thng mi li c th c mt s thay i no ; iu ny i khi dn n s
khc bit, mc d khng ng k, gia SQL chun v SQL c s dng trong cc h
qun tr c s d liu c th. Trong gio trnh ny, chng ti chn h qun tr c s d
5
Khoa CNTT - Trng HKH Hu Gio trnh SQL
liu SQL Server 2000 ca hng Microsoft s dng cho cc v d minh ho cng nh
li gii ca cc bi tp.
Chng ti hi vng rng gio trnh ny s thc s c ch i vi bn c. Chng
ti rt mong nhn c s c v v nhng kin ng gp thng thn ca cc bn.
Cui cng, xin gi li cm n n cc thy c, ng nghip v cc bn sinh vin
ng vin v gip chng ti hon thnh gio trnh ny.

Hu, 2003

Trn Nguyn Phong



6
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 1 1: :
T T N NG G Q QU UA AN N V V S SQ QL L

Ngn ng hi c cu trc (SQL) v cc h qun tr c s d liu quan h l mt
trong nhng nn tng k thut quan trng trong cng nghip my tnh. Cho n nay, c
th ni rng SQL c xem l ngn ng chun trong c s d liu. Cc h qun tr
c s d liu quan h thng mi hin c nh Oracle, SQL Server, Informix, DB2,...
u chn SQL lm ngn ng cho sn phm ca mnh
Vy thc s SQL l g? Ti sao n li quan trng trong cc h qun tr c s d
liu? SQL c th lm c nhng g v nh th no? N c s dng ra sao trong cc
h qun tr c s d liu quan h? Ni dung ca chng ny s cung cp cho chng ta
ci nhn tng quan v SQL v mt s vn lin quan.
1.1 SQL l ngn ng c s d liu quan h
SQL, vit tt ca Structured Query Language (ngn ng hi c cu trc), l
cng c s dng t chc, qun l v truy xut d liu uc lu tr trong cc c s
d liu. SQL l mt h thng ngn ng bao gm tp cc cu lnh s dng tng tc
vi c s d liu quan h.
Tn gi ngn ng hi c cu trc phn no lm chng ta lin tng n mt
cng c (ngn ng) dng truy xut d liu trong cc c s d liu. Thc s m ni,
kh nng ca SQL vt xa so vi mt cng c truy xut d liu, mc d y l mc
ch ban u khi SQL c xy dng nn v truy xut d liu vn cn l mt trong
nhng chc nng quan trng ca n. SQL c s dng iu khin tt c cc chc
nng m mt h qun tr c s d liu cung cp cho ngi dng bao gm:
nh ngha d liu: SQL cung cp kh nng nh ngha cc c s d liu,
cc cu trc lu tr v t chc d liu cng nh mi quan h gia cc thnh
phn d liu.
Truy xut v thao tc d liu: Vi SQL, ngi dng c th d dng thc
hin cc thao tc truy xut, b sung, cp nht v loi b d liu trong cc c
s d liu.
iu khin truy cp: SQL c th c s dng cp pht v kim sot cc
thao tc ca ngi s dng trn d liu, m bo s an ton cho c s d liu
7
Khoa CNTT - Trng HKH Hu Gio trnh SQL
m bo ton vn d liu: SQL nh ngha cc rng buc ton vn trong
c s d liu nh m bo tnh hp l v chnh xc ca d liu trc cc
thao tc cp nht cng nh cc li ca h thng.
Nh vy, c th ni rng SQL l mt ngn ng hon thin c s dng trong
cc h thng c s d liu v l mt thnh phn khng th thiu trong cc h qun tr
c s d liu. Mc d SQL khng phi l mt ngn ng lp trnh nh C, C++, Java,...
song cc cu lnh m SQL cung cp c th c nhng vo trong cc ngn ng lp
trnh nhm xy dng cc ng dng tng tc vi c s d liu.
Khc vi cc ngn ng lp trnh quen thuc nh C, C++, Java,... SQL l ngn
ng c tnh khai bo. Vi SQL, ngi dng ch cn m t cc yu cu cn phi thc
hin trn c s d liu m khng cn phi ch ra cch thc thc hin cc yu cu nh
th no. Chnh v vy, SQL l ngn ng d tip cn v d s dng.
1.2 Vai tr ca SQL
Bn thn SQL khng phi l mt h qun tr c s d liu, n khng th tn ti
c lp. SQL thc s l mt phn ca h qun tr c s d liu, n xut hin trong cc
h qun tr c s d liu vi vai tr ngn ng v l cng c giao tip gia ngi s
dng v h qun tr c s d liu.
Trong hu ht cc h qun tr c s d liu quan h, SQL c nhng vai tr nh
sau:
SQL l ngn ng hi c tnh tng tc: Ngi s dng c th d dng
thng qua cc trnh tin ch gi cc yu cu di dng cc cu lnh SQL
n c s d liu v nhn kt qu tr v t c s d liu
SQL l ngn ng lp trnh c s d liu: Cc lp trnh vin c th nhng
cc cu lnh SQL vo trong cc ngn ng lp trnh xy dng nn cc
chng trnh ng dng giao tip vi c s d liu
SQL l ngn ng qun tr c s d liu: Thng qua SQL, ngi qun tr
c s d liu c th qun l c c s d liu, nh ngha cc cu trc lu
tr d liu, iu khin truy cp c s d liu,...
SQL l ngn ng cho cc h thng khch/ch (client/server): Trong cc
h thng c s d liu khch/ch, SQL c s dng nh l cng c giao
tip gia cc trnh ng dng pha my khch vi my ch c s d liu.
SQL l ngn ng truy cp d liu trn Internet: Cho n nay, hu ht cc
my ch Web cng nh cc my ch trn Internet s dng SQL vi vai tr l
ngn ng tng tc vi d liu trong cc c s d liu.
SQL l ngn ng c s d liu phn tn: i vi cc h qun tr c s d
liu phn tn, mi mt h thng s dng SQL giao tip vi cc h thng
khc trn mng, gi v nhn cc yu cu truy xut d liu vi nhau.
8
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SQL l ngn ng s dng cho cc cng giao tip c s d liu: Trong
mt h thng mng my tnh vi nhiu h qun tr c s d liu khc nhau,
SQL thng c s dng nh l mt chun ngn ng giao tip gia cc
h qun tr c s d liu.
1.3 Tng quan v c s d liu quan h
1.3.1 M hnh d liu quan h
M hnh d liu quan h c Codd xut nm 1970 v n nay tr thnh m
hnh c s dng ph bin trong cc h qun tr c s d liu thng mi. Ni mt
cch n gin, mt c s d liu quan h l mt c s d liu trong tt c d liu
c t chc trong cc bng c mi quan h vi nhau. Mi mt bng bao gm cc
dng v cc ct: mi mt dng c gi l mt bn ghi (b) v mi mt ct l mt
trng (thuc tnh).
Hnh 1.1 minh ho cho ta thy c 3 bng trong mt c s d liu
n, trong c s d liu quan h, bng l i tng c s dng
Hnh 1.1: Cc bng trong mt c s d liu
1.3.2 Bng (Table)
Nh ni tr
t chc v lu tr d liu. Mt c s d liu bao gm nhiu bng v mi bng c
xc nh duy nht bi tn bng. Mt bng bao gm mt tp cc dng v cc ct: mi
9
Khoa CNTT - Trng HKH Hu Gio trnh SQL
mt dng trong bng biu din cho mt thc th (trong hnh 1.1, mi mt dng trong
bng SINHVIEN tng ng vi mt sinh vin); v mi mt ct biu din cho mt tnh
cht ca thc th (chng hn ct NGAYSINH trong bng SINHVIEN biu din cho
ngy sinh ca cc sinh vin c lu tr trong bng).
Nh vy, lin quan n mi mt bng bao gm cc yu t sau:
g trong c s d
rc ca bng: Tp cc ct trong bng. Mi mt ct trong bng c
ca bng: Tp cc dng (bn ghi) hin c trong bng.
1.3.3 K o
liu c thit k tt, mi mt bng phi c mt hoc mt
c
c nhiu tp cc ct khc nhau c tnh cht ca kho (tc l gi
ca
gi l kho ph hay l kho d tuyn (candidate key/unique key).
Tn ca bng: c s dng xc nh duy nht mi bn
liu.
Cu t
xc nh bi mt tn ct v phi c mt kiu d liu no (chng hn ct
NGAYSINH trong bng SINHVIEN hnh 1.1 c kiu l DATETIME).
Kiu d liu ca mi ct qui nh gi tr d liu c th c chp nhn trn
ct .
D liu
h ca bng
Trong mt c s d
tp cc ct m gi tr d liu ca n xc nh duy nht mt dng trong mt tp cc
dng ca bng. Tp mt hoc nhiu ct c tnh cht ny c gi l kho ca bng.
Vic chn kho ca bng c vai tr quan trng trong vic thit k v ci t c
c s d liu quan h. Cc dng d liu trong mt bng phi c gi tr khc nhau trn
kho. Bng MONHOC trong hnh di y c kho l ct MAMONHOC
Hnh 1.2: Bng MONHOC vi kho chnh l MAMONHOC

Mt bng c th
tr n xc nh duy nht mt dng d liu trong bng). Trong trng hp ny, kho
c chn cho bng c gi l kho chnh (primary key) v nhng kho cn li c
10
Khoa CNTT - Trng HKH Hu Gio trnh SQL
1.3.4 Mi quan h v kho ngoi
Cc bng trong mt c s d liu khng tn ti c lp m c mi quan h mt
n h ny c th hin thng qua rng buc gi
A ca mt dng (tc l mt lp) trong bng LOP phi
c x

gi ng LOP
v KH
u din mi quan h gia cc bng d liu. Mt hay mt tp cc ct trong mt
thit vi nhau v mt d liu. Mi qua
tr d liu xut hin bng ny phi c xut hin trc trong mt bng khc. Mi
quan h gia cc bng trong c s d liu nhm m bo c tnh ng n v hp l
ca d liu trong c s d liu.
Trong hnh 1.3, hai bng LOP v KHOA c mi quan h vi nhau. Mi quan h
ny i hi gi tr ct MAKHO
c nh t ct MAKHOA ca bng KHOA.

Bng LOP
Hnh 1.3: Mi quan h gia hai bng LOP v KHOA trong c s d liu
Mi quan h gia cc bng trong mt c s d liu th hin ng mi quan h
a cc thc th trong th gii thc. Trong hnh 1.3, mi quan h gia hai b
OA khng cho php mt lp no tn ti m li thuc vo mt khoa khng c
tht.
Khi nim kho ngoi (Foreign Key) trong c s d liu quan h c s dng
bi
bng m gi tr ca n c xc nh t kha chnh ca mt bng khc c gi l
kho ngoi. Trong hnh 1.3, ct MAKHOA ca bng LOP c gi l kho ngoi ca
bng ny, kho ngoi ny tham chiu n kho chnh ca bng KHOA l ct
MAKHOA.


11
Khoa CNTT - Trng HKH Hu Gio trnh SQL
1.4 S lc v SQL
m khong 40 cu lnh. Bng 1.1 lit k danh sch cc cu
ng nht trong s cc cu lnh ca SQL. Trong cc h qun tr
liu
Truy xut d liu

E liu trong bng
nh ngh u
To bng
ng
n
n
EX
MA s d liu
URE

1.4.1 Cu lnh SQL
SQL chun bao g
lnh thng c s d
c s d liu khc nhau, mc d cc cu lnh u c cng dng v cng mc ch s
dng song mi mt h qun tr c s d liu c th c mt s thay i no . iu
ny i khi dn n c php chi tit ca cc cu lnh c th s khc nhau trong cc h
qun tr c c s d liu khc nhau.
Cu lnh Chc nng
Thao tc d
SELECT
INSERT B sung d liu
UPDATE Cp nht d liu
DELETE Xo d liu
TRUNCAT Xo ton b d
a d li
CREATE TABLE
DROP TABLE Xoa bng
ALTER TABLE Sa i b
CREATE VIEW To khung nh
ALTER VIEW Sa i khung nh
DROP VIEW Xo khung nhn
CREATE IND To ch mc
DROP INDEX Xo ch mc
CREATE SCHE To lc c
DROP SCHEMA Xo lc c s d liu
CREATE PROCED To th tc lu tr
ALTER PROCEDURE Sa i th tc l tr
DROP PROCEDURE Xo th tc lu tr
12
Khoa CNTT - Trng HKH Hu Gio trnh SQL
CREATE FUNCTION To hm (do ngi s dng nh ngha)
r
er
i
Cp pht quyn cho ngi s dng

Qu c
U thc (kt thc thnh cng) giao tc
K
ACTION trong giao tc
Lp
RE Khai bo bin hoc nh ngha con tr
y vn
con tr)
E nh SQL
Bng 1.1: M ng SQL
Cc cu ln t t kho cho bit
hc n
,hodem,ten
ALTER FUNCTION Sa i hm
DROP FUNCTION Xo hm
CREATE TRIGGER To trigge
ALTER TRIGGER Sa i trigg
DROP TRIGGER Xo trigger
u khin truy cp
GRANT
REVOKE Thu hi quyn t ngi s dng
n l giao t
COMMIT
ROLLBAC Quay lui giao tc
SAVE TRANS nh du mt im
trnh
DECLA
OPEN M mt con tr truy xut kt qu tru
FETCH c mt dng trong kt qu truy vn (s dng
CLOSE ng mt con tr
EXECUT Thc thi mt cu l
t s cu lnh thng dng tro
h ca SQL u c bt u bi cc t lnh, l m
c ng ca cu lnh (chng hn SELECT, DELETE, COMMIT). Sau t lnh l cc
mnh ca cu lnh. Mi mt mnh trong cu lnh cng c bt u bi mt t
kho (chng hn FROM, WHERE,...).
V d 1.1: Cu lnh:
SELECT masv
FROM sinhvien
24102 WHERE malop=C
13
Khoa CNTT - Trng HKH Hu Gio trnh SQL
dng truy xut d liu trong bng SINHVIEN c bt u bi t lnh SELECT,
trong cu lnh bao gm hai mnh : mnh FROM ch nh tn ca bng cn truy
xut d liu v mnh WHERE ch nh iu kin truy vn d liu.
1.4.2 Qui tc s dng tn trong SQL
Cc i tng trong c s d liu da trn SQL c xc nh thng qua tn
ca i tng. Tn ca cc i tng l duy nht trong mi c s d liu. Tn c s
dng nhiu nht trong cc truy vn SQL v c xem l nn tng trong c s d liu
quan h l tn bng v tn ct.
Trong cc c s d liu ln vi nhiu ngi s dng, khi ta ch nh tn ca mt
bng no trong cu lnh SQL, h qun tr c s d liu hiu l tn ca bng do ta
s hu (tc l bng do ta to ra). Thng thng, trong cc h qun tr c s d liu ny
cho php nhng ngi dng khc nhau to ra nhng bng trng tn vi nhau m khng
gy ra xung t v tn. Nu trong mt cu lnh SQL ta cn ch n mt bng do mt
ngi dng khc s hu (hin nhin l phi c php) th tn ca bng phi c vit
sau tn ca ngi s hu v phn cch vi tn ngi s hu bi du chm:
tn_ngi_s_hu.tn_bng
Mt s i tng c s d liu khc (nh khung nhn, th tc, hm), vic s dng tn
cng tng t nh i vi bng.
Ta c th s dng tn ct mt cch bnh thng trong cc cu lnh SQL bng
cch ch cn ch nh tn ca ct trong bng. Tuy nhin, nu trong cu lnh c lin
quan n hai ct tr ln c cng tn trong cc bng khc nhau th bt buc phi ch
nh thm tn bng trc tn ct; tn bng v tn ct c phn cch nhau bi du
chm.
V d: V d di y minh ho cho ta thy vic s dng tn bng v tn ct trong cu
lnh SQL
SELECT masv,hodem,ten,sinhvien.malop,tenlop
FROM dbo.sinhvien,dbo.lop
WHERE sinhvien.malop = lop.malop
1.4.3 Kiu d liu
Chun ANSI/ISO SQL cung cp cc kiu d liu khc nhau s dng trong
cc c s d liu da trn SQL v trong ngn ng SQL. Da trn c s cc kiu d
liu do chun ANSI/ISO SQL cung cp, cc h qun tr c s d liu thng mi hin
nay c th s dng cc dng d liu khc nhau trong sn phm ca mnh. Bng 1.2
di y lit k mt s kiu d liu thng dng c s dng trong SQL.
Tn kiu M t
CHAR (n) Kiu chui vi di c nh
14
Khoa CNTT - Trng HKH Hu Gio trnh SQL
NCHAR (n) Kiu chui vi di c nh h tr UNICODE
VARCHAR (n) Kiu chui vi di chnh xc
NVARCHAR (n) Kiu chui vi di chnh xc h tr UNICODE
INTEGER S nguyn c gi tr t -2
31
n 2
31
- 1
INT Nh kiu Integer
TINYTINT S nguyn c gi tr t 0 n 255.
SMALLINT S nguyn c gi tr t -2
15
n 2
15
1
BIGINT S nguyn c gi tr t -2
63
n 2
63
-1
NUMERIC (p,s) Kiu s vi chnh xc c nh.
DECIMAL (p,s) Tng t kiu Numeric
FLOAT S thc c gi tr t -1.79E+308 n 1.79E+308
REAL S thc c gi tr t -3.40E + 38 n 3.40E + 38
MONEY Kiu tin t
BIT Kiu bit (c gi tr 0 hoc 1)
DATETIME Kiu ngy gi (chnh xc n phn trm ca giy)
SMALLDATETIME Kiu ngy gi (chnh xc n pht)
TIMESTAMP
BINARY D liu nh phn vi di c nh (ti a 8000 bytes)
VARBINARY D liu nh phn vi di chnh xc (ti a 8000 bytes)
IMAGE D liu nh phn vi di chnh xc (ti a 2,147,483,647
bytes)
TEXT D liu kiu chui vi di ln (ti a 2,147,483,647 k
t)
NTEXT D liu kiu chui vi di ln v h tr UNICODE (ti
a 1,073,741,823 k t)
Bng 1.2: Mt s kiu d liu thng dng trong SQL
V d 1.2: Cu lnh di y nh ngha bng vi kiu d liu c qui nh cho cc
ct trong bng
CREATE TABLE NHANVIEN
15
Khoa CNTT - Trng HKH Hu Gio trnh SQL
(
MANV NVARCHAR(10) NOT NULL,
HOTEN NVARCHAR(30) NOT NULL,
GIOITINH BIT,
NGAYSINH SMALLDATETIME,
NOISINH NCHAR(50),
HSLUONG DECIMAL(4,2),
MADV INT
)

1.4.4 Gi tr NULL
Mt c s d liu l s phn nh ca mt h thng trong th gii thc, do
cc gi tr d liu tn ti trong c s d liu c th khng xc nh c. Mt gi tr
khng xc nh c xut hin trong c s d liu c th do mt s nguyn nhn sau:
Gi tr c tn ti nhng khng bit.
Khng xc nh c gi tr c tn ti hay khng.
Ti mt thi im no gi tr cha c nhng ri c th s c.
Gi tr b li do tnh ton (trn s, chia cho khng,...)
Nhng gi tr khng xc nh c biu din trong c s d liu quan h bi
cc gi tr NULL. y l gi tr c bit v khng nn nhm ln vi chui rng (i
vi d liu kiu chui) hay gi tr khng (i vi gi tr kiu s). Gi tr NULL ng
mt vai tr quan trng trong cc c s d liu v hu ht cc h qun tr c s d liu
quan h hin nay u h tr vic s dng gi tr ny.
1.5 Kt chng
Nh vy, SQL (vit tt ca Structured Query Language) l h thng ngn ng
c s dng cho cc h qun tr c s d liu quan h. Thng qua SQL c th thc
hin c cc thao tc trn c s d liu nh nh ngha d liu, thao tc d liu, iu
khin truy cp, qun l ton vn d liu... SQL l mt thnh phn quan trng v khng
th thiu trong h qun tr c s d liu quan h.
SQL ra i nhm s dng cho cc c s d liu theo m hnh quan h. Trong
mt c s d liu quan h, d liu c t chc v lu tr trong cc bng. Mi mt
bng l mt tp hp bao gm cc dng v cc ct; mi mt dng l mt bn ghi v
mi mt ct tng ng vi mt trng, tp cc tn ct cng vi kiu d liu v cc
tnh cht khc to nn cu trc ca bng, tp cc dng trong bng chnh l d liu ca
bng.
16
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Cc bng trong mt c s d liu c mi quan h vi nhau. Cc mi quan h
c biu din thng qua kho chnh v kho ngoi ca cc bng. Kho chnh ca
bng l tp mt hoc nhiu ct c gi tr duy nht trong bng v do gi tr ca n
xc nh duy nht mt dng d liu trong bng. Mt kho ngoi l mt tp mt hoc
nhiu ct c gi tr c xc nh t kho chnh ca cc bng khc.

_______________________________________



17
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 2 2
N NG G N N N NG G T TH HA AO O T T C C D D L LI I U U

i vi a s ngi s dng, SQL c xem nh l cng c hu hiu thc
hin cc yu cu truy vn v thao tc trn d liu. Trong chng ny, ta s bn lun
n nhm cc cu lnh trong SQL c s dng cho mc ch ny. Nhm cc cu lnh
ny c gi chung l ngn ng thao tc d liu (DML: Data Manipulation Language)
bao gm cc cu lnh sau:
SELECT: S dng truy xut d liu t mt hoc nhiu bng.
INSERT: B sung d liu.
UPDATE: Cp nht d liu
DELETE: Xo d liu
Trong s cc cu lnh ny, c th ni SELECT l cu lnh tng i phc tp
v c s dng nhiu trong c s d liu. Vi cu lnh ny, ta khng ch thc hin
cc yu cu truy xut d liu n thun m cn c th thc hin c cc yu cu
thng k d liu phc tp. Cng chnh v vy, phn u ca chng ny s tp trung
tng i nhiu n cu lnh SELECT. Cc cu lnh INSERT, UPDATE v DELETE
c bn lun n cui chng
2.1 Truy xut d liu vi cu lnh SELECT
Cu lnh SELECT c s dng truy xut d liu t cc dng v cc ct ca
mt hay nhiu bng, khung nhn. Cu lnh ny c th dng thc hin php chn (tc
l truy xut mt tp con cc dng trong mt hay nhiu bng), php chiu (tc l truy
xut mt tp con cc ct trong mt hay nhiu bng) v php ni (tc l lin kt cc
dng trong hai hay nhiu bng truy xut d liu). Ngoi ra, cu lnh ny cn cung
cp kh nng thc hin cc thao tc truy vn v thng k d liu phc tp khc.
C php chung ca cu lnh SELECT c dng:

SELECT [ALL | DISTINCT][TOP n] danh_sch_chn
[INTO tn_bng_mi]
FROM danh_sch_bng/khung_nhn
[WHERE iu_kin]
[GROUP BY danh_sch_ct]
[HAVING iu_kin]
18
Khoa CNTT - Trng HKH Hu Gio trnh SQL
[ORDER BY ct_sp_xp]
[COMPUTE danh_sch_hm_gp [BY danh_sch_ct]]

iu cn lu u tin i vi cu lnh ny l cc thnh phn trong cu lnh
SELECT nu c s dng phi tun theo ng th t nh trong c php. Nu khng,
cu lnh s c xem l khng hp l.
Cu lnh SELECT c s dng tc ng ln cc bng d liu v kt qu
ca cu lnh cng c hin th di dng bng, tc l mt tp hp cc dng v cc
ct (ngoi tr trng hp s dng cu lnh SELECT vi mnh COMPUTE).
V d 2.1: Kt qu ca cu lnh sau y cho bit m lp, tn lp v h o to ca cc
lp hin c
SELECT malop,tenlop,hedaotao
FROM lop



2.1.1 Mnh FROM
Mnh FROM trong cu lnh SELECT c s dung nhm ch nh cc bng
v khung nhn cn truy xut d liu. Sau FROM l danh sch tn ca cc bng v
khung nhn tham gia vo truy vn, tn ca cc bng v khung nhn c phn cch
nhau bi du phy.
V d 2.2: Cu lnh di y hin th danh sch cc khoa trong trng
SELECT * FROM khoa
kt qu cu lnh nh sau:
19
Khoa CNTT - Trng HKH Hu Gio trnh SQL


Ta c th s dng cc b danh cho cc bng hay khung nhn trong cu lnh
SELECT. B danh c gn trong mnh FROM bng cch ch nh b danh ngay
sau tn bng.
V d 2.3: cu lnh sau gn b danh l a cho bng khoa
SELECT * FROM khoa a
2.1.2 Danh sch chn trong cu lnh SELECT
Danh sch chn trong cu lnh SELECT c s dng ch nh cc trng,
cc biu thc cn hin th trong cc ct ca kt qu truy vn. Cc trng, cc biu thc
c ch nh ngay sau t kho SELECT v phn cch nhau bi du phy. S dng
danh sch chn trong cu lnh SELECT bao gm cc trng hp sau:
a. Chn tt c cc ct trong bng
Khi cn hin th tt c cc trng trong cc bng, s dng k t * trong danh
sch chn thay v phi lit k danh sch tt c cc ct. Trong trng hp ny, cc ct
c hin th trong kt qu truy vn s tun theo th t m chng c to ra khi
bng c nh ngha.
V d 2.4: Cu lnh
SELECT * FROM lop
cho kt qu bao nh sau:
20
Khoa CNTT - Trng HKH Hu Gio trnh SQL


b. Tn ct trong danh sch chn
Trong trng hp cn ch nh c th cc ct cn hin th trong kt qu truy vn,
ta ch nh danh sch cc tn ct trong danh sch chn. Th t ca cc ct trong kt
qu truy vn tun theo th t ca cc trng trong danh sch chn.
V d 2.5: Cu lnh
SELECT malop,tenlop,namnhaphoc,khoa
FROM lop
cho bit m lp, tn lp, nm nhp hc v kho ca cc lp v c kt qu nh sau:

Lu : Nu truy vn c thc hin trn nhiu bng/khung nhn v trong cc
bng/khung nhn c cc trng trng tn th tn ca nhng trng ny nu xut hin
trong danh sch chn phi c vit di dng:
tn_bng.tn_trng
V d 2.6:
SELECT malop, tenlop, lop.makhoa, tenkhoa
FROM lop, khoa
WHERE lop.malop = khoa.makhoa

21
Khoa CNTT - Trng HKH Hu Gio trnh SQL
c. Thay i tiu cc ct
Trong kt qu truy vn, tiu ca cc ct mc nh s l tn ca cc trng
tng ng trong bng. Tuy nhin, cc tiu tr nn thn thin hn, ta c th i
tn cc tiu ca cc ct. t tiu cho mt ct no , ta s dng cch vit:
tiu__ct = tn_trng
hoc tn_trng AS tiu__ct
hoc tn_trng tiu__ct
V d 2.7: Cu lnh di y:
SELECT 'M lp'= malop,tenlop 'Tn lp',khoa AS 'Kho'
FROM lop
cho bit m lp, tn lp v kho hc ca cc lp trong trng. Kt qu ca cu lnh
nh sau:


d. S dng cu trc CASE trong danh sch chn
Cu trc CASE c s dng trong danh sch chn nhm thay i kt qu ca
truy vn tu thuc vo cc trng hp khc nhau. Cu trc ny c c php nh sau:
CASE biu_thc
WHEN biu_thc_kim_tra THEN kt_qu
[ ... ]
[ELSE kt_qu_ca_else]
END
hoc:
CASE
WHEN iu_kin THEN kt_qu
[ ... ]
[ELSE kt_qu_ca_else]
END
22
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 2.8: hin th m, h tn v gii tnh (nam hoc n) ca cc sinh vin, ta s
dng cu lnh
SELECT masv,hodem,ten,
CASE gioitinh
WHEN 1 THEN 'Nam'
ELSE 'N'
END AS gioitinh
FROM sinhvien
hoc:
SELECT masv,hodem,ten,
CASE
WHEN gioitinh=1 THEN 'Nam'
ELSE 'N'
END AS gioitinh
FROM sinhvien
Kt qu ca hai cu lnh trn u c dng nh sau


e. Hng v biu thc trong danh sch chn
Ngoi danh sch trng, trong danh sch chn ca cu lnh SELECT cn c th
s dng cc biu thc. Mi mt biu thc trong danh sch chn tr thnh mt ct trong
kt qu truy vn.
V d 2.9: cu lnh di y cho bit tn v s tit ca cc mn hc
SELECT tenmonhoc,sodvht*15 AS sotiet
FROM monhoc
23
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Nu trong danh sch chn c s xut hin ca gi tr hng th gi tr ny s xut
hin trong mt ct ca kt qu truy vn tt c cc dng
V d 2.10: Cu lnh
SELECT tenmonhoc,'S tit: ',sodvht*15 AS sotiet
FROM monhoc
cho kt qu nh sau:


f. Loi b cc dng d liu trng nhau trong kt qu truy vn
Trong kt qu ca truy vn c th xut hin cc dng d liu trng nhau. loi
b bt cc dng ny, ta ch nh thm t kha DISTINCT ngay sau t kho SELECT.
V d 2.11: Hai cu lnh di y
SELECT khoa FROM lop
v:
SELECT DISTINCT khoa FROM lop
c kt qu ln lt nh sau:
24
Khoa CNTT - Trng HKH Hu Gio trnh SQL


g. Gii hn s lng dng trong kt qu truy vn
Kt qu ca truy vn c hin th thng s l tt c cc dng d liu truy vn
c. Trong trng hp cn hn ch s lng cc dng xut hin trong kt qu truy
vn, ta ch nh thm mnh TOP ngay trc danh sch chn ca cu lnh SELECT.
V d 2.12: Cu lnh di y hin th h tn v ngy sinh ca 5 sinh vin u tin
trong danh sch
SELECT TOP 5 hodem,ten,ngaysinh
FROM sinhvien

Ngoi cch ch nh c s lng dng cn hin th trong kt qu truy vn, ta c
th ch nh s lng cc dng cn hin th theo t l phn trm bng cch s dng
thm t kho PERCENT nh v d di y.
V d 2.13: Cu lnh di y hin th h tn v ngy sinh ca 10% s lng sinh vin
hin c trong bng SINHVIEN
SELECT TOP 10 PERCENT hodem,ten,ngaysinh
FROM sinhvien

2.1.3 Ch nh iu kin truy vn d liu
Mnh WHERE trong cu lnh SELECT c s dng nhm xc nh cc
iu kin i vi vic truy xut d liu. Sau mnh WHERE l mt biu thc logic
v ch nhng dng d liu no tho mn iu kin c ch nh mi c hin th
trong kt qu truy vn.
V d 2.14: Cu lnh di y hin th danh sch cc mn hc c s n v hc trnh
ln hn 3
SELECT * FROM monhoc
WHERE sodvht>3
25
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Kt qu ca cu lnh ny nh sau:


Trong mnh WHERE thng s dng:
Cc ton t kt hp iu kin (AND, OR)
Cc ton t so snh
Kim tra gii hn ca d liu (BETWEEN/ NOT BETWEEN)
Danh sch
Kim tra khun dng d liu.
Cc gi tr NULL

a. Cc ton t so snh
Ton t ngha
=
Bng
>
Ln hn
<
Nh hn
>=
Ln hn hoc bng
<=
Nh hn hoc bng
<>
Khc
!>
Khng ln hn
!<
Khng nh hn
V d 2.15: Cu lnh:
SELECT masv,hodem,ten,ngaysinh
FROM sinhvien
WHERE (ten='Anh')
AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)
cho bit m, h tn v ngy sinh ca cc sinh vin c tn l Anh v c tui nh hn
hoc bng 20.
26
Khoa CNTT - Trng HKH Hu Gio trnh SQL


b. Kim tra gii hn ca d liu
kim tra xem gi tr d liu nm trong (ngoi) mt khong no , ta s
dng ton t BETWEEN (NOT BETWEEN) nh sau:
Cch s dng ngha
gi_tr BETWEEN a AND b a gi_tr b
gi_tr NOT BETWEEN a AND b (gi_tr < a) AND (gi_tr>b)

V d 2.16: Cu lnh di y cho bit h tn v tui ca cc sinh vin c tn l Bnh
v c tui nm trong khong t 20 n 22
SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bnh' AND
YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22

c. Danh sch (IN v NOT IN)
T kho IN c s dng khi ta cn ch nh iu kin tm kim d liu cho cu
lnh SELECT l mt danh sch cc gi tr. Sau IN (hoc NOT IN) c th l mt danh
sch cc gi tr hoc l mt cu lnh SELECT khc.
V d 2.17: bit danh sch cc mn hc c s n v hc trnh l 2, 4 hoc 5, thay
v s dng cu lnh
SELECT * FROM monhoc
WHERE sodvht=2 OR sodvht=4 OR sodvht=5
ta c th s dng cu lnh
SELECT * FROM monhoc
WHERE sodvht IN (2,4,5)

d. Ton t LIKE v cc k t i din
T kho LIKE (NOT LIKE) s dng trong cu lnh SELECT nhm m t
khun dng ca d liu cn tm kim. Chng thng c kt hp vi cc k t i
din sau y:
27
Khoa CNTT - Trng HKH Hu Gio trnh SQL
K t i din ngha
% Chui k t bt k gm khng hoc nhiu k t
_ K t n bt k
[] K t n bt k trong gii hn c ch nh (v d
[a-f]) hay mt tp (v d [abcdef])
[^] K t n bt k khng nm trong gii hn c ch
nh ( v d [^a-f] hay mt tp (v d [^abcdef]).

V d 2.18: Cu lnh di y
SELECT hodem,ten FROM sinhvien
WHERE hodem LIKE 'L%'
cho bit h tn ca cc sinh vin c h l L v c kt qu nh sau

Cu lnh:
SELECT hodem,ten FROM sinhvien
WHERE hodem LIKE 'L%' AND ten LIKE '[AB]%'
C kt qu l:


e. Gi tr NULL
D liu trong mt ct cho php NULL s nhn gi tr NULL trong cc trng hp
sau:
28
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Nu khng c d liu c nhp cho ct v khng c mc nh cho ct hay
kiu d liu trn ct .
Ngi s dng trc tip a gi tr NULL vo cho ct .
Mt ct c kiu d liu l kiu s s cha gi tr NULL nu gi tr c ch
nh gy trn s.
Trong mnh WHERE, kim tra gi tr ca mt ct c gi tr NULL hay khng, ta
s dng cch vit:
WHERE tn_ct IS NULL
hoc:
WHERE tn_ct IS NOT NULL

2.1.4 To mi bng d liu t kt qu ca cu lnh SELECT
Cu lnh SELECT ... INTO c tc dng to mt bng mi c cu trc v d liu
c xc nh t kt qu ca truy vn. Bng mi c to ra s c s ct bng s ct
c ch nh trong danh sch chn v s dng s l s dng kt qu ca truy vn
V d 2.19: Cu lnh di y truy vn d liu t bng SINHVIEN v to mt bng
TUOISV bao gm cc trng HODEM, TEN v TUOI
SELECT hodem,ten,YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi
INTO tuoisv
FROM sinhvien
Lu : Nu trong danh sch chn c cc biu thc th nhng biu thc ny phi c
t tiu .

2.1.5 Sp xp kt qu truy vn
Mc nh, cc dng d liu trong kt qu ca cu truy vn tun theo th t ca
chng trong bng d liu hoc c sp xp theo ch mc (nu trn bng c ch mc).
Trong trng hp mun d liu c sp xp theo chiu tng hoc gim ca gi tr ca
mt hoc nhiu trng, ta s dng thm mnh ORDER BY trong cu lnh
SELECT; Sau ORDER BY l danh sch cc ct cn sp xp (ti a l 16 ct). D liu
c sp xp c th theo chiu tng (ASC) hoc gim (DESC), mc nh l sp xp
theo chiu tng.
V d 2.20: Cu lnh di y hin th danh sch cc mn hc v sp xp theo chiu
gim dn ca s n v hc trnh
SELECT * FROM monhoc
ORDER BY sodvht DESC
29
Khoa CNTT - Trng HKH Hu Gio trnh SQL


Nu sau ORDER BY c nhiu ct th vic sp xp d liu s c u tin theo th t
t tri qua phi.
V d 2.21: Cu lnh
SELECT hodem,ten,gioitinh,
YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bnh'
ORDER BY gioitinh,tuoi
c kt qu l:


Thay v ch nh tn ct sau ORDER BY, ta c th ch nh s th t ca ct
cn c sp xp. Cu lnh v d trn c th c vit li nh sau:
SELECT hodem,ten,gioitinh,
YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bnh'
ORDER BY 3, 4



30
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2.1.6 Php hp
Php hp c s dng trong trng hp ta cn gp kt qu ca hai hay nhiu
truy vn thnh mt tp kt qu duy nht. SQL cung cp ton t UNION thc hin
php hp. C php nh sau
Cu_lnh_1
UNION [ALL] Cu_lnh_2
[UNION [ALL] Cu_lnh_3]
...
[UNION [ALL] Cu_lnh_n]
[ORDER BY ct_sp_xp]
[COMPUTE danh_sch_hm_gp [BY danh_sch_ct]]
Trong
Cu_lnh_1 c dng
SELECT danh_sch_ct
[INTO tn_bng_mi]
[FROM danh_sch_bng|khung_nhn]
[WHERE iu_kin]
[GROUP BY danh_sch_ct]
[HAVING iu_kin]
v Cu_lnh_i (i = 2,..,n) c dng
SELECT danh_sch_ct
[FROM danh_sch_bng|khung_nhn]
[WHERE iu_kin]
[GROUP BY danh_sch_ct]
[HAVING iu_kin]
V d 2.22: Gi s ta c hai bng Table1 v Table2 ln lt nh sau:

cu lnh
SELECT A,B FROM Table1
UNION
SELECT D,E FROM table2
Cho kt qu nh sau:
31
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Mc nh, nu trong cc truy vn thnh phn ca php hp xut hin nhng
dng d liu ging nhau th trong kt qu truy vn ch gi li mt dng. Nu mun gi
li cc dng ny, ta phi s dng thm t kho ALL trong truy vn thnh phn.
V d 2.23: Cu lnh
SELECT A,B FROM Table1
UNION ALL
SELECT D,E FROM table2
Cho kt qu nh sau

Khi s dng ton t UNION thc hin php hp, ta cn ch cc nguyn tc sau:
Danh sch ct trong cc truy vn thnh phn phi c cng s lng.
Cc ct tng ng trong tt c cc bng, hoc tp con bt k cc ct c s
dng trong bn thn mi truy vn thnh phn phi cng kiu d liu.
Cc ct tng ng trong bn thn tng truy vn thnh phn ca mt cu lnh
UNION phi xut hin theo th t nh nhau. Nguyn nhn l do php hp so
snh cc ct tng ct mt theo th t c cho trong mi truy vn.
Khi cc kiu d liu khc nhau c kt hp vi nhau trong cu lnh
UNION, chng s c chuyn sang kiu d liu cao hn (nu c th c).
Tiu ct trong kt qu ca php hp s l tiu ct c ch nh trong
truy vn u tin.
32
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Truy vn thnh phn u tin c th c INTO to mi mt bng t kt
qu ca chnh php hp.
Mnh ORDER BY v COMPUTE dng sp xp kt qu truy vn hoc
tnh ton cc gi tr thng k ch c s dng cui cu lnh UNION.
Chng khng c s dng trong bt k truy vn thnh phn no.
Mnh GROUP BY v HAVING ch c th c s dng trong bn thn
tng truy vn thnh phn. Chng khng c php s dng tc ng ln
kt qu chung ca php hp.
Php ton UNION c th c s dng bn trong cu lnh INSERT.
Php ton UNION khng c s dng trong cu lnh CREATE VIEW.

2.1.7 Php ni
Khi cn thc hin mt yu cu truy vn d liu t hai hay nhiu bng, ta phi s
dng n php ni. Mt cu lnh ni kt hp cc dng d liu trong cc bng khc
nhau li theo mt hoc nhiu iu kin no v hin th chng trong kt qu truy vn.
Xt hai bng sau y:
Bng KHOA

Bng LOP

Gi s ta cn bit m lp v tn lp ca cc lp thuc Khoa Cng ngh Thng tin, ta
phi lm nh sau:
33
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Chn ra dng trong bng KHOA c tn khoa l Khoa Cng ngh Thng tin,
t xc nh c m khoa (MAKHOA) l DHT02.
Tm kim trong bng LOP nhng dng c gi tr trng MAKHOA l
DHT02 (tc l bng MAKHOA tng ng trong bng KHOA) v a nhng
dng ny vo kt qu truy vn



Nh vy, thc hin c yu cu truy vn d liu trn, ta phi thc hin php ni
gia hai bng KHOA v LOP vi iu kin ni l MAKHOA ca KHOA bng vi
MAKHOA ca LOP. Cu lnh s c vit nh sau:
SELECT malop,tenlop
FROM khoa,lop
WHERE khoa.makhoa = lop.makhoa AND
tenkhoa='Khoa Cng ngh Thng tin'

2.1.7.1 S dng php ni
Php ni l c s thc hin cc yu cu truy vn d liu lin quan n nhiu
bng. Mt cu lnh ni thc hin ly cc dng d liu trong cc bng tham gia truy
vn, so snh gi tr ca cc dng ny trn mt hoc nhiu ct c ch nh trong iu
kin ni v kt hp cc dng tho mn iu kin thnh nhng dng trong kt qu truy
vn.
thc hin c mt php ni, cn phi xc nh c nhng yu t sau:
Nhng ct no cn hin th trong kt qu truy vn
Nhng bng no c tham gia vo truy vn.
iu kin thc hin php ni gia cc bng d liu l g
34
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Trong cc yu t k trn, vic xc nh chnh xc iu kin thc hin php
ni gia cc bng ng vai tr quan trng nht. Trong a s cc trng hp, iu kin
ca php ni c xc nh nh vo mi quan h gia cc bng cn phi truy xut d
liu. Thng thng, l iu kin bng nhau gia kho chnh v kho ngoi ca hai
bng c mi quan h vi nhau. Nh vy, c th a ra mt cu lnh ni thc hin
chnh xc yu cu truy vn d liu i hi phi hiu c mi quan h cng nh
ngha ca chng gia cc bng d liu.
Danh sch chn trong php ni
Mt cu lnh ni cng c bt u vi t kha SELECT. Cc ct c ch
nh tn sau t kho SELECT l cc ct c hin th trong kt qu truy vn. Vic s
dng tn cc ct trong danh sch chn c th l:
Tn ca mt s ct no trong cc bng c tham gia vo truy vn. Nu tn
ct trong cc bng trng tn nhau th tn ct phi c vit di dng
tn_bng.tn_ct
Du sao (*) c s dng trong danh sch chn khi cn hin th tt c cc
ct ca cc bng tham gia truy vn.
Trong trng hp cn hin th tt c cc ct ca mt bng no , ta s dng
cch vit:
tn_bng.*

Mnh FROM trong php ni
Sau mnh FROM ca cu lnh ni l danh sch tn cc bng (hay khung
nhn) tham gia vo truy vn. Nu ta s dng du * trong danh sch chn th th t ca
cc bng lit k sau FROM s nh hng n th t cc ct c hin th trong kt qu
truy vn.

Mnh WHERE trong php ni
Khi hai hay nhiu bng c ni vi nhau, ta phi ch nh iu kin thc
hin php ni ngay sau mnh WHERE. iu kin ni c biu din di dng
biu thc logic so snh gi tr d liu gia cc ct ca cc bng tham gia truy vn.
Cc ton t so snh di y c s dng xc nh iu kin ni
Php ton ngha
= Bng
> Ln hn
>= Ln hn hoc bng
< Nh hn
35
Khoa CNTT - Trng HKH Hu Gio trnh SQL
<= Nh hn hoc bng
<> Khc
!> Khng ln hn
!< Khng nh hn

V d 2.24: Cu lnh di y hin th danh sch cc sinh vin vi cc thng tin: m
sinh vin, h v tn, m lp, tn lp v tn khoa
SELECT masv,hodem,ten,sinhvien.malop,tenlop,tenkhoa
FROM sinhvien,lop,khoa
WHERE sinhvien.malop = lop.malop AND
lop.makhoa=khoa.makhoa
Trong cu lnh trn, cc bng tham gia vo truy vn bao gm SINHVIEN, LOP v
KHOA. iu kin thc hin php ni gia cc bng bao gm hai iu kin:
sinhvien.malop = lop.malop
v lop.malop = khoa.malop
iu kin ni gia cc bng trong cu lnh trn l iu kin bng gia kho ngoi v
kho chnh ca cc bng c mi quan h vi nhau. Hay ni cch khc, iu kin ca
php ni c xc nh da vo mi quan h gia cc bng trong c s d liu.

2.1.7.2 Cc loi php ni
Php ni bng v php ni t nhin
Mt php ni bng (equi-join) l mt php ni trong gi tr ca cc ct c
s dng ni c so snh vi nhau da trn tiu chun bng v tt c cc ct trong
cc bng tham gia ni u c a ra trong kt qu.
V d 2.25: Cu lnh di y thc hin php ni bng gia hai bng LOP v KHOA
SELECT *
FROM lop,khoa
WHERE lop.makhoa=khoa.makhoa
Trong kt qu ca cu lnh trn, ct makhoa (m khoa) xut hin hai ln trong kt qu
php ni (ct makhoa ca bng khoa v ct makhoa ca bng lop) v nh vy l khng
cn thit. Ta c th loi b bt i nhng ct trng tn trong kt qu truy vn bng cch
ch nh danh sch ct cn c hin th trong danh sch chn ca cu lnh.
Mt dng c bit ca php ni bng c s dng nhiu l php ni t nhin
(natural-join). Trong php ni t nhin, iu kin ni gia hai bng chnh l iu kin
bng gia kho ngoi v kho chnh ca hai bng; V trong danh sch chn ca cu
lnh ch gi li mt ct trong hai ct tham gia vo iu kin ca php ni
36
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 2.26: thc hin php ni t nhin, cu lnh trong v d 2.25 c vit li nh
sau
SELECT malop,tenlop,khoa,hedaotao,namnhaphoc,
siso,lop.makhoa,tenkhoa,dienthoai
FROM lop,khoa
WHERE lop.makhoa=khoa.makhoa
hoc vit di dng ngn gn hn:
SELECT lop.*,tenkhoa,dienthoai
FROM lop,khoa
WHERE lop.makhoa=khoa.makhoa

Php ni vi cc iu kin b sung
Trong cc cu lnh ni, ngoi iu kin ca php ni c ch nh trong mnh
WHERE cn c th ch nh cc iu kin tm kim d liu khc (iu kin chn).
Thng thng, cc iu kin ny c kt hp vi iu kin ni thng qua ton t
AND.
V d 2.27: Cu lnh di y hin th h tn v ngy sinh ca cc sinh vin Khoa
Cng ngh Thng tin
SELECT hodem,ten,ngaysinh
FROM sinhvien,lop,khoa
WHERE tenkhoa='Khoa Cng ngh Thng tin' AND
sinhvien.malop = lop.malop AND
lop.makhoa = khoa.makhoa

Php t ni v cc b danh
Php t ni l php ni m trong iu kin ni c ch nh lin quan n
cc ct ca cng mt bng. Trong trng hp ny, s c s xut hin tn ca cng mt
bng nhiu ln trong mnh FROM v do cc bng cn phi c t b danh.
V d 2.28: bit c h tn v ngy sinh ca cc sinh vin c cng ngy sinh vi
sinh vin Trn Th Kim Anh, ta phi thc hin php t ni ngay trn chnh bng
sinhvien. Trong cu lnh ni, bng sinhvien xut hin trong mnh FROM vi b
danh l a v b. Bng sinhvien vi b danh l a s dng chn ra sinh vin c h tn l
Trn Th Kim Anh v bng sinhvien vi b danh l b s dng xc nh cc sinh vin
trng ngy sinh vi sinh vin Trn Th Kim Anh. Cu lnh c vit nh sau:
SELECT b.hodem,b.ten,b.ngaysinh
FROM sinhvien a, sinhvien b
WHERE a.hodem='Trn Th Kim' AND a.ten='Anh' AND
a.ngaysinh=b.ngaysinh AND a.masv<>b.masv
37
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Php ni khng da trn tiu chun bng
Trong php ni ny, iu kin thc hin php ni gia cc bng d liu
khng phi l iu kin so snh bng gia cc ct. Loi php ni ny trong thc t
thng t c s dng.

Php ni ngoi (outer-join)
Trong cc php ni cp trn, ch nhng dng c gi tr trong cc ct
c ch nh tho mn iu kin kt ni mi c hin th trong kt qu truy vn, v
c gi l php ni trong (inner join) Theo mt ngha no , nhng php ni ny
loi b thng tin cha trong nhng dng khng tho mn iu kin ni. Tuy nhin, i
khi ta cng cn gi li nhng thng tin ny bng cch cho php nhng dng khng
tho mn iu kin ni c mt trong kt qu ca php ni. lm iu ny, ta c th
s dng php ni ngoi.
SQL cung cp cc loi php ni ngoi sau y:
Php ni ngoi tri (k hiu: *=): Php ni ny hin th trong kt qu truy
vn tt c cc dng d liu ca bng nm bn tri trong iu kin ni cho d
nhng dng ny khng tho mn iu kin ca php ni
Php ni ngoi phi (k hiu: =*): Php ni ny hin th trong kt qu truy
vn tt c cc dng d liu ca bng nm bn phi trong iu kin ni cho
d nhng dng ny khng tho iu kin ca php ni.
V d 2.29: Gi s ta c hai bng DONVI v NHANVIEN nh sau:
Bng DONVI Bng NHANVIEN


Cu lnh:
SELECT *
FROM nhanvien,donvi
WHERE nhanvien.madv=donvi.madv
c kt qu l:
38
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Nu thc hin php ni ngoi tri gia bng NHANVIEN v bng DONVI:
SELECT *
FROM nhanvien,donvi
WHERE nhanvien.madv*=donvi.madv
kt qu ca cu lnh s l:

V kt qu ca php ni ngoi phi:
select *
from nhanvien,donvi
where nhanvien.madv=*donvi.madv
nh sau:


Php ni v cc gi tr NULL
Nu trong cc ct ca cc bng tham gia vo iu kin ca php ni c cc gi
tr NULL th cc gi tr NULL c xem nh l khng bng nhau.
V d 2.30: Gi s ta c hai bng TABLE1 v TABLE2 nh sau:
TABLE1 TABLE2
A
B C D
1
b1 NULL d1
NULL
b2 4 d2
4
b3
39
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Cu lnh:
SELECT *
FROM table1, table2
WHERE A *= C
C kt qu l:
A B C D
1 b1 NULL NULL
NULL b2 NULL NULL
4 b3 4 d2

2.1.7.4 S dng php ni trong SQL2
phn trc cp n phng php s dng php ni trong v php ni
ngoi trong truy vn SQL. Nh trnh by, iu kin ca php ni trong cu lnh
c ch nh trong mnh WHERE thng qua cc biu thc so snh gia cc bng
tham gia truy vn.
Chun SQL2 (SQL-92) a ra mt cch khc biu din cho php ni, trong
cch biu din ny, iu kin ca php ni khng c ch nh trong mnh
WHERE m c ch nh ngay trong mnh FROM ca cu lnh. Cch s dng
php ni ny cho php ta biu din php ni cng nh iu kin ni c r rng, c
bit l trong trng hp php ni c thc hin trn ba bng tr ln.

Php ni trong
iu kin thc hin php ni trong c ch nh trong mnh FROM theo
c php nh sau:
tn_bng_1 [INNER] JOIN tn_bng_2 ON iu_kin_ni

V d 2.31: hin th h tn v ngy sinh ca cc sinh vin lp Tin K24, thay v s
dng cu lnh:
SELECT hodem,ten,ngaysinh
FROM sinhvien,lop
WHERE tenlop='Tin K24' AND
sinhvien.malop=lop.malop
ta c th s dng cu lnh nh sau:
SELECT hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE tenlop='Tin K24'
40
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Php ni ngoi
SQL2 cung cp cc php ni ngoi sau y:
Php ni ngoi tri (LEFT OUTER JOIN)
Php ni ngoi phi (RIGHT OUTER JOIN)
Php ni ngoi y (FULL OUTER JOIN)
Cng tng t nh php ni trong, iu kin ca php ni ngoi cng c ch nh
ngay trong mnh FROM theo c php:
tn_bng_1 LEFT|RIGHT|FULL [OUTER] JOIN tn_bng_2
ON iu_kin_ni

V d 2.32: Gi s ta c hai bng d liu nh sau:
Bng DONVI Bng NHANVIEN


Php ni ngoi tri gia hai bng NHANVIEN v DONVI c biu din bi cu
lnh:
SELECT *
FROM nhanvien LEFT OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
c kt qu l:

Cu lnh:
SELECT *
FROM nhanvien RIGHT OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
41
Khoa CNTT - Trng HKH Hu Gio trnh SQL
thc hin php ni ngoi phi gia hai bng NHANVIEN v DONVI, v c kt qu l:

Nu php ni ngoi tri (tng ng phi) hin th trong kt qu truy vn c nhng dng
d liu khng tho iu kin ni ca bng bn tri (tng ng phi) trong php ni th
php ni ngoi y hin th trong kt qu truy vn c nhng dng d liu khng
tho iu kin ni ca c hai bng tham gia vo php ni.
V d 2.33: Vi hai bng NHANVIEN v DONVI nh trn, cu lnh
SELECT *
FROM nhanvien FULL OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
cho kt qu l:


Thc hin php ni trn nhiu bng
Mt c im ni bt ca SQL2 l cho php biu din php ni trn nhiu
bng d liu mt cch r rng. Th t thc hin php ni gia cc bng c xc nh
theo ngha kt qu ca php ni ny c s dng trong mt php ni khc.
V d 2.34: Cu lnh di y hin th h tn v ngy sinh ca cc sinh vin thuc
Khoa Cng ngh Thng tin
SELECT hodem,ten,ngaysinh
FROM (sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop)
INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa=N'Khoa cng ngh thng tin'
42
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Trong cu lnh trn, th t thc hin php ni gia cc bng c ch nh r rng:
php ni gia hai bng sinhvien v lop c thc hin trc v kt qu ca php ni
ny li tip tc c ni vi bng khoa.

2.1.8 Thng k d liu vi GROUP BY
Ngoi kh nng thc hin cc yu cu truy vn d liu thng thng (chiu,
chn, ni,) nh cp nh cc phn trc, cu lnh SELECT cn cho php
thc hin cc thao tc truy vn v tnh ton thng k trn d liu nh: cho bit tng s
tit dy ca mi gio vin, im trung bnh cc mn hc ca mi sinh vin,
Mnh GROUP BY s dng trong cu lnh SELECT nhm phn hoch cc
dng d liu trong bng thnh cc nhm d liu, v trn mi nhm d liu thc hin
tnh ton cc gi tr thng k nh tnh tng, tnh gi tr trung bnh,...
Cc hm gp c s dng tnh gi tr thng k cho ton bng hoc trn mi
nhm d liu. Chng c th c s dng nh l cc ct trong danh sch chn ca cu
lnh SELECT hoc xut hin trong mnh HAVING, nhng khng c php xut
hin trong mnh WHERE
SQL cung cp cc hm gp di y:
Hm gp Chc nng
SUM([ALL | DISTINCT] biu_thc) Tnh tng cc gi tr.
AVG([ALL | DISTINCT] biu_thc) Tnh trung bnh ca cc gi tr
COUNT([ALL | DISTINCT] biu_thc) m s cc gi tr trong biu thc.
COUNT(*) m s cc dng c chn.
MAX(biu_thc) Tnh gi tr ln nht
MIN(biu_thc) Tnh gi tr nh nht
Trong :
Hm SUM v AVG ch lm vic vi cc biu thc s.
Hm SUM, AVG, COUNT, MIN v MAX b qua cc gi tr NULL khi tnh
ton.
Hm COUNT(*) khng b qua cc gi tr NULL.
Mc nh, cc hm gp thc hin tnh ton thng k trn ton b d liu. Trong
trng hp cn loi b bt cc gi tr trng nhau (ch gi li mt gi tr), ta ch nh
thm t kho DISTINCT trc biu thc l i s ca hm.


43
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Thng k trn ton b d liu
Khi cn tnh ton gi tr thng k trn ton b d liu, ta s dng cc hm gp
trong danh sch chn ca cu lnh SELECT. Trong trng hp ny, trong danh sch
chn khng c s dng bt k mt tn ct hay biu thc no ngoi cc hm gp.
V d 2.35: thng k trung bnh im ln 1 ca tt c cc mn hc, ta s dng cu
lnh nh sau:
SELECT AVG(diemlan1)
FROM diemthi
cn cu lnh di y cho bit tui ln nht, tui nh nht v tui trung bnh ca tt
c cc sinh vin sinh ti Hu:
SELECT MAX(YEAR(GETDATE())-YEAR(ngaysinh)),
MIN(YEAR(GETDATE())-YEAR(ngaysinh)),
AVG(YEAR(GETDATE())-YEAR(ngaysinh))
FROM sinhvien
WHERE noisinh=Hu

Thng k d liu trn cc nhm
Trong trng hp cn thc hin tnh ton cc gi tr thng k trn cc nhm d
liu, ta s dng mnh GROUP BY phn hoch d liu vo trong cc nhm. Cc
hm gp c s dng s thc hin thao tc tnh ton trn mi nhm v cho bit gi tr
thng k theo cc nhm d liu.
V d 2.36: Cu lnh di y cho bit s s (s lng sinh vin) ca mi lp
SELECT lop.malop,tenlop,COUNT(masv) AS siso
FROM lop,sinhvien
WHERE lop.malop=sinhvien.malop
GROUP BY lop.malop,tenlop
v c kt qu l

cn cu lnh:
44
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SELECT sinhvien.masv,hodem,ten,
sum(diemlan1*sodvht)/sum(sodvht)
FROM sinhvien,diemthi,monhoc
WHERE sinhvien.masv=diemthi.masv AND
diemthi.mamonhoc=monhoc.mamonhoc
GROUP BY sinhvien.masv,hodem,ten
cho bit trung bnh im thi ln 1 cc mn hc ca cc sinh vin

Lu : Trong trng hp danh sch chn ca cu lnh SELECT c c cc hm gp v
nhng biu thc khng phi l hm gp th nhng biu thc ny phi c mt y
trong mnh GROUP BY, nu khng cu lnh s khng hp l.
V d 2.37: Di y l mt cu lnh sai
SELECT lop.malop,tenlop,COUNT(masv)
FROM lop,sinhvien
WHERE lop.malop=sinhvien.malop
GROUP BY lop.malop
do thiu trng TENLOP sau mnh GROUP BY.

Ch nh iu kin i vi hm gp
Mnh HAVING c s dng nhm ch nh iu kin i vi cc gi tr
thng k c sn sinh t cc hm gp tng t nh cch thc mnh WHERE thit
lp cc iu kin cho cu lnh SELECT. Mnh HAVING thng khng thc s c
ngha nu nh khng s dng kt hp vi mnh GROUP BY. Mt im khc bit
gia HAVING v WHERE l trong iu kin ca WHERE khng c c cc hm
gp trong khi HAVING li cho php s dng cc hm gp trong iu kin ca mnh.
V d 2.38: bit trung bnh im thi ln 1 ca cc sinh vin c im trung bnh ln
hn hoc bng 5, ta s dng cu lnh nh sau:
SELECT sinhvien.masv,hodem,ten,
SUM(diemlan1*sodvht)/sum(sodvht)
FROM sinhvien,diemthi,monhoc
WHERE sinhvien.masv=diemthi.masv AND
diemthi.mamonhoc=monhoc.mamonhoc
GROUP BY sinhvien.masv,hodem,ten
HAVING sum(diemlan1*sodvht)/sum(sodvht)>=5



45
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2.1.9 Thng k d liu vi COMPUTE
Khi thc hin thao tc thng k vi GROUP BY, kt qu thng k (c sn
sinh bi hm gp) xut hin di mt ct trong kt qu truy vn. Thng qua dng truy
vn ny, ta bit c gi tr thng k trn mi nhm d liu nhng khng bit c chi
tit d liu trn mi nhm
V d 2.39: Cu lnh:
SELECT khoa.makhoa,tenkhoa,COUNT(malop) AS solop
FROM khoa,lop
WHERE khoa.makhoa=lop.makhoa
GROUP BY khoa.makhoa,tenkhoa
cho ta bit c s lng lp ca mi khoa vi kt qu nh sau:

nhng c th mi khoa bao gm nhng lp no th chng ta khng th bit c trong
kt qu truy vn trn.

Mnh COMPUTE s dng kt hp vi cc hm gp (dng) v ORDER BY
trong cu lnh SELECT cng cho chng ta cc kt qu thng k (ca hm gp) trn
cc nhm d liu. im khc bit gia COMPUTE v GROUP BY l kt qu thng k
xut hin di dng mt dng trong kt qu truy vn v cn cho chng ta c chi tit v
d liu trong mi nhm. Nh vy, cu lnh SELECT vi COMPUTE cho chng ta c
chi tit d liu v gi tr thng k trn mi nhm.
Mnh COMPUTE BY c c php nh sau:
COMPUTE hm_gp(tn_ct) [,, hm_gp (tn_ct)]
BY danh_sch_ct
Trong :
Cc hm gp c th s dng bao gm SUM, AVG, MIN, MAX v COUNT.
danh_sch_ct: l danh sch ct s dng phn nhm d liu

V d 2.40: Cu lnh di y cho bit danh sch cc lp ca mi khoa v tng s
cc lp ca mi khoa:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop
WHERE khoa.makhoa=lop.makhoa
ORDER BY khoa.makhoa
COMPUTE COUNT(malop) BY khoa.makhoa
46
Khoa CNTT - Trng HKH Hu Gio trnh SQL
kt qu ca cu lnh nh sau:
MAKHOA TENKHOA MALOP TENLOP
DHT01 Khoa Ton c - Tin hc C24101 Ton K24
DHT01 Khoa Ton c - Tin hc C25101 Ton K25
DHT01 Khoa Ton c - Tin hc C26101 Ton K26
CNT
3
MAKHOA TENKHOA MALOP TENLOP
DHT02 Khoa Cng ngh thng tin C26102 Tin K26
DHT02 Khoa Cng ngh thng tin C25102 Tin K25
DHT02 Khoa Cng ngh thng tin C24102 Tin K24
CNT
3
MAKHOA TENKHOA MALOP TENLOP
DHT03 Khoa Vt l C24103 L K24
DHT03 Khoa Vt l C25103 L K25
CNT
2
MAKHOA TENKHOA MALOP TENLOP
DHT05 Khoa Sinh hc C25301 Sinh K25
DHT05 Khoa Sinh hc C24301 Sinh K24
CNT
2

Khi s dng mnh COMPUTE ... BY cn tun theo cc qui tc di y:
T kha DISTINCT khng cho php s dng vi cc hm gp dng
Hm COUNT(*) khng c s dng trong COMPUTE.
Sau COMPUTE c th s dng nhiu hm gp, khi cc hm phi phn
cch nhau bi du phy.
Cc ct s dng trong cc hm gp xut hin trong mnh COMPUTE
phi c mt trong danh sch chn.
Khng s dng SELECT INTO trong mt cu lnh SELECT c s dng
COMPUTE.
Nu s dng mnh COMPUTE ... BY th cng phi s dng mnh
ORDER BY. Cc ct lit k trong COMPUTE BY phi ging ht hay l
mt tp con ca nhng g c lit k sau ORDER BY. Chng phi c
cng th t t tri qua phi, bt u vi cng mt biu thc v khng b
qua bt k mt biu thc no.
47
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Chng hn nu mnh ORDER BY c dng:
ORDER BY a, b, c
Th mnh COMPUTE BY vi hm gp F trn ct X theo mt trong cc
cch di y l hp l:
COMPUTE F(X) BY a, b, c
COMPUTE F(X) BY a, b
COMPUTE F(X) BY a
V cc cch s dng di y l sai:
COMPUTE F(X) BY b, c
COMPUTE F(X) BY a, c
COMPUTE F(X) BY c
Phi s dng mt tn ct hoc mt biu thc trong mnh ORDER BY, vic
sp xp khng c thc hin da trn tiu ct.

Trong trng hp s dng COMPUTE m khng c BY th c th khng cn s
dng ORDER BY, khi phm vi tnh ton ca hm gp l trn ton b d liu.
V d 2.41: Cu lnh di y hin th danh sch cc lp v tng s lp hin c:
SELECT malop,tenlop,hedaotao
FROM lop
ORDER BY makhoa
COMPUTE COUNT(malop)
kt qu ca cu lnh nh sau:
MALOP TENLOP HEDAOTAO
C24101 Ton K24 Chnh quy
C25101 Ton K25 Chnh quy
C26101 Ton K26 Chnh quy
C26102 Tin K26 Chnh quy
C25102 Tin K25 Chnh quy
C24102 Tin K24 Chnh quy
C24103 L K24 Chnh quy
C25103 L K25 Chnh quy
C25301 Sinh K25 Chnh quy
C24301 Sinh K24 Chnh quy
CNT
10

C th thc hin vic tnh ton hm gp dng trn cc nhm lng nhau bng
cch s dng nhiu mnh COMPUTE BY trong cng mt cu lnh SELECT
48
Khoa CNTT - Trng HKH Hu Gio trnh SQL

V d 2.42: Cu lnh:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop
WHERE khoa.makhoa=lop.makhoa
ORDER BY khoa.makhoa
COMPUTE COUNT(malop) BY khoa.makhoa
COMPUTE COUNT(malop)
Cho bit danh sch cc lp ca mi khoa, tng s lp theo mi khoa v tng s lp
hin c vi kt qu nh sau:
MAKHOA TENKHOA MALOP TENLOP
DHT01 Khoa Ton c - Tin hc C24101 Ton K24
DHT01 Khoa Ton c - Tin hc C25101 Ton K25
DHT01 Khoa Ton c - Tin hc C26101 Ton K26
CNT
3
MAKHOA TENKHOA MALOP TENLOP
DHT02 Khoa Cng ngh thng tin C26102 Tin K26
DHT02 Khoa Cng ngh thng tin C25102 Tin K25
DHT02 Khoa Cng ngh thng tin C24102 Tin K24
CNT
3
MAKHOA TENKHOA MALOP TENLOP
DHT03 Khoa Vt l C24103 L K24
DHT03 Khoa Vt l C25103 L K25
CNT
2
MAKHOA TENKHOA MALOP TENLOP
DHT05 Khoa Sinh hc C25301 Sinh K25
DHT05 Khoa Sinh hc C24301 Sinh K24
CNT
2
CNT
10

2.1.10 Truy vn con (Subquery)
Truy vn con l mt cu lnh SELECT c lng vo bn trong mt cu lnh
SELECT, INSERT, UPDATE, DELETE hoc bn trong mt truy vn con khc. Loi
49
Khoa CNTT - Trng HKH Hu Gio trnh SQL
truy vn ny c s dng biu din cho nhng truy vn trong iu kin truy vn
d liu cn phi s dng n kt qu ca mt truy vn khc.
C php ca truy vn con nh sau:
(SELECT [ALL | DISTINCT] danh_sch_chn
FROM danh_sch_bng
[WHERE iu_kin]
[GROUP BY danh_sch_ct]
[HAVING iu_kin])

Khi s dng truy vn con cn lu mt s quy tc sau:
Mt truy vn con phi c vit trong cp du ngoc. Trong hu ht cc
trng hp, mt truy vn con thng phi c kt qu l mt ct (tc l ch
c duy nht mt ct trong danh sch chn).
Mnh COMPUTE v ORDER BY khng c php s dng trong truy
vn con.
Cc tn ct xut hin trong truy vn con c th l cc ct ca cc bng trong
truy vn ngoi.
Mt truy vn con thng c s dng lm iu kin trong mnh
WHERE hoc HAVING ca mt truy vn khc.
Nu truy vn con tr v ng mt gi tr, n c th s dng nh l mt thnh
phn bn trong mt biu thc (chng hn xut hin trong mt php so snh
bng)

Php so snh i vi vi kt qu truy vn con
Kt qu ca truy vn con c th c s dng thc hin php so snh s hc
vi mt biu thc ca truy vn cha. Trong trng hp ny, truy vn con c s dng
di dng:
WHERE biu_thc php_ton_s_hc [ANY|ALL]
(truy_vn_con)
Trong php ton s hc c th s dng bao gm: =, <>, >, <, >=, <=; V truy vn
con phi c kt qu bao gm ng mt ct.
V d 2.43: Cu lnh di y cho bit danh sch cc mn hc c s n v hc trnh
ln hn hoc bng s n v hc trnh ca mn hc c m l TI-001
SELECT *
FROM monhoc
WHERE sodvht>=(SELECT sodvht
FROM monhoc
50
Khoa CNTT - Trng HKH Hu Gio trnh SQL
WHERE mamonhoc='TI-001')

Nu truy vn con tr v nhiu hn mt gi tr, vic s dng php so snh nh
trn s khng hp l. Trong trng hp ny, sau php ton so snh phi s dng thm
lng t ALL hoc ANY. Lng t ALL c s dng khi cn so snh gi tr ca biu
thc vi tt c cc gi tr tr v trong kt qu ca truy vn con; ngc lai, php so snh
vi lng t ANY c kt qu ng khi ch cn mt gi tr bt k no trong kt qu
ca truy vn con tho mn iu kin.

V d 2.44: Cu lnh di y cho bit h tn ca nhng sinh vin lp Tin K25 sinh
trc tt c cc sinh vin ca lp Ton K25
SELECT hodem,ten
FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop
WHERE tenlop='Tin K25' AND
ngaysinh<ALL(SELECT ngaysinh
FROM sinhvien JOIN lop
ON sinhvien.malop=lop.malop
WHERE lop.tenlop='Ton K25')
v cu lnh:
SELECT hodem,ten
FROM sinhvien JOIN lop on sinhvien.malop=lop.malop
WHERE tenlop='Tin K25' AND
year(ngaysinh)= ANY(SELECT year(ngaysinh)
FROM sinhvien JOIN lop
ON sinhvien.malop=lop.malop
WHERE lop.tenlop='Ton K25')
cho bit h tn ca nhng sinh vin lp Tin K25 c nm sinh trng vi nm sinh ca
bt k mt sinh vin no ca lp Ton K25.

S dng truy vn con vi ton t IN
Khi cn thc hin php kim tra gi tr ca mt biu thc c xut hin (khng
xut hin) trong tp cc gi tr ca truy vn con hay khng, ta c th s dng ton t IN
(NOT IN) nh sau:
WHERE biu_thc [NOT] IN (truy_vn_con)
V d 2.45: hin th h tn ca nhng sinh vin lp Tin K25 c nm sinh bng vi
nm sinh ca mt sinh vin no ca lp Ton K25, thay v s dng cu lnh nh
v d trn, ta c th s dng cu lnh nh sau:
SELECT hodem,ten
51
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FROM sinhvien JOIN lop on sinhvien.malop=lop.malop
WHERE tenlop='Tin K25' AND
year(ngaysinh)IN(SELECT year(ngaysinh)
FROM sinhvien JOIN lop
ON sinhvien.malop=lop.malop
WHERE lop.tenlop='Ton K25')

S dng lng t EXISTS vi truy vn con
Lng t EXISTS c s dng kt hp vi truy vn con di dng:
WHERE [NOT] EXISTS (truy_vn_con)
kim tra xem mt truy vn con c tr v dng kt qu no hay khng. Lng t
EXISTS (tng ng NOT EXISTS) tr v gi tr True (tng ng False) nu kt qu
ca truy vn con c t nht mt dng (tng ng khng c dng no). iu khc bit
ca vic s dng EXISTS vi hai cch nu trn l trong danh sch chn ca truy
vn con c th c nhiu hn hai ct.
V d 2.46: Cu lnh di y cho bit h tn ca nhng sinh vin hin cha c im
thi ca bt k mt mn hc no
SELECT hodem,ten
FROM sinhvien
WHERE NOT EXISTS(SELECT masv FROM diemthi
WHERE diemthi.masv=sinhvien.masv)

S dng truy vn con vi mnh HAVING
Mt truy vn con c th c s dng trong mnh HAVING ca mt truy
vn khc. Trong trng hp ny, kt qu ca truy vn con c s dng to nn
iu kin i vi cc hm gp.
V d 2.47: Cu lnh di y cho bit m, tn v trung bnh im ln 1 ca cc mn
hc c trung bnh ln hn trung bnh im ln 1 ca tt c cc mn hc
SELECT diemthi.mamonhoc,tenmonhoc,AVG(diemlan1)
FROM diemthi,monhoc
WHERE diemthi.mamonhoc=monhoc.mamonhoc
GROUP BY diemthi.mamonhoc,tenmonhoc
HAVING AVG(diemlan1)>
(SELECT AVG(diemlan1) FROM diemthi)


52
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2.2 B sung, cp nht v xo d liu
Cc cu lnh thao tc d liu trong SQL khng nhng ch s dng truy vn
d liu m cn thay i v cp nht d liu trong c s d liu. So vi cu lnh
SELECT, vic s dng cc cu lnh b sung, cp nht hay xo d liu n gin hn
nhiu. Trong phn cn li ca chng ny s cp n 3 cu lnh:
Lnh INSERT
Lnh UPDATE
Lnh DELETE

2.2.1 B sung d liu
D liu trong cc bng c th hin di dng cc dng (bn ghi). b sung
thm cc dng d liu vo mt bng, ta s dng cu lnh INSERT. Hu ht cc h
qun tr CSDL da trn SQL cung cp cc cch di y thc hin thao tc b
sung d liu cho bng:
B sung tng dng d liu vi mi cu lnh INSERT. y l cc s dng
thng gp nht trong giao tc SQL.
B sung nhiu dng d liu bng cch truy xut d liu t cc bng d liu
khc.

B sung tng dng d liu vi lnh INSERT
b sung mt dng d liu mi vo bng, ta s dng cu lnh INSERT vi c
php nh sau:
INSERT INTO tn_bng[(danh_sch_ct)]
VALUES(danh_sch_tr)
Trong cu lnh INSERT, danh sch ct ngay sau tn bng khng cn thit phi ch
nh nu gi tr cc trng ca bn ghi mi c ch nh y trong danh sch tr.
Trong trng hp ny, th t cc gi tr trong danh sch tr phi bng vi s lng cc
trng ca bng cn b sung d liu cng nh phi tun theo ng th t ca cc
trng nh khi bng c nh ngha.
V d 2.48: Cu lnh di y b sung thm mt dng d liu vo bng KHOA
INSERT INTO khoa
VALUES(DHT10,Khoa Lut,054821135)

Trong trng hp ch nhp gi tr cho mt s ct trong bng, ta phi ch nh
danh sch cc ct cn nhp d liu ngay sau tn bng. Khi , cc ct khng c
nhp d liu s nhn gi tr mc nh (nu c) hoc nhn gi tr NULL (nu ct cho
53
Khoa CNTT - Trng HKH Hu Gio trnh SQL
php chp nhn gi tr NULL). Nu mt ct khng c gi tr mc nh v khng chp
nhn gi tr NULL m khng uc nhp d liu, cu lnh s b li.
V d 2.49: Cu lnh di y b sung mt bn ghi mi cho bng SINHVIEN
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop)
VALUES(0241020008,Nguyn Cng,Chnh,1,C24102)
cu lnh trn cn c th c vit nh sau:
INSERT INTO sinhvien
VALUES(0241020008,Nguyn Cng,Chnh,
NULL,1,NULL,C24102)

B sung nhiu dng d liu t bng khc
Mt cch s dng khc ca cu lnh INSERT c s dng b sung nhiu
dng d liu vo mt bng, cc dng d liu ny c ly t mt bng khc thng qua
cu lnh SELECT. cch ny, cc gi tr d liu c b sung vo bng khng c
ch nh tng minh m thay vo l mt cu lnh SELECT truy vn d liu t bng
khc.
C php cu lnh INSERT c dng nh sau:
INSERT INTO tn_bng[(danh_sch_ct)] cu_lnh_SELECT

V d 2.50: Gi s ta c bng LUUSINHVIEN bao gm cc trng HODEM, TEN,
NGAYSINH. Cu lnh di y b sung vo bng LUUSINHVIEN cc dng d liu
c c t cu truy vn SELECT:
INSERT INTO luusinhvien
SELECT hodem,ten,ngaysinh
FROM sinhvien
WHERE noisinh like %Hu%

Khi b sung d liu theo cch ny cn lu mt s im sau:
Kt qu ca cu lnh SELECT phi c s ct bng vi s ct c ch nh
trong bng ch v phi tng thch v kiu d liu.
Trong cu lnh SELECT c s dng mnh COMPUTE ... BY

2.2.2 Cp nht d liu
Cu lnh UPDATE trong SQL c s dng cp nht d liu trong cc bng.
Cu lnh ny c c php nh sau:
UPDATE tn_bng
54
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SET tn_ct = biu_thc
[, ..., tn_ct_k = biu_thc_k]
[FROM danh_sch_bng]
[WHERE iu_kin]
Sau UPDATE l tn ca bng cn cp nht d liu. Mt cu lnh UPDATE c th cp
nht d liu cho nhiu ct bng cch ch nh cc danh sch tn ct v biu thc tng
ng sau t kho SET. Mnh WHERE trong cu lnh UPDATE thng c s
dng ch nh cc dng d liu chu tc ng ca cu lnh (nu khng ch nh,
phm vi tc ng ca cu lnh c hiu l ton b cc dng trong bng)

V d 2.51: Cu lnh di y cp nht li s n v hc trnh ca cc mn hc c s
n v hc trnh nh hn 2
UPDATE monhoc
SET sodvht = 3
WHERE sodvht = 2

S dng cu trc CASE trong cu lnh UPDATE
Cu trc CASE c th c s dng trong biu thc khi cn phi a ra cc
quyt nh khc nhau v gi tr ca biu thc
V d 2.52: Gi s ta c bng NHATKYPHONG sau y

Sau khi thc hin cu lnh:
UPDATE nhatkyphong
SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100
WHEN loaiphong='B' THEN 70
ELSE 50
END
D liu trong bng s l:
55
Khoa CNTT - Trng HKH Hu Gio trnh SQL

iu kin cp nht d liu lin quan n nhiu bng
Mnh FROM trong cu lnh UPDATE c s dng khi cn ch nh cc
iu kin lin quan n cc bng khc vi bng cn cp nht d liu. Trong trung hp
ny, trong mnh WHERE thng c iu kin ni gia cc bng.

V d 2.53: Gi s ta c hai bng MATHANG v NHATKYBANHANG nh sau:

Cu lnh di y s cp nht gi tr trng THANHTIEN ca bng
NHATKYBANHANG theo cng thc THANHTIEN = SOLUONG GIA
UPDATE nhatkybanhang
SET thanhtien = soluong*gia
FROM mathang
WHERE nhatkybanhang.mahang = mathang.mahang

Cu lnh UPDATE vi truy vn con
Tng t nh trong cu lnh SELECT, truy vn con c th c s dng trong
mnh WHERE ca cu lnh UPDATE nhm ch nh iu kin i vi cc dng d
liu cn cp nht d liu.
V d 2.54: Cu lnh trn c th c vit nh sau:
UPDATE nhatkybanhang
SET thanhtien = soluong*gia
FROM mathang
WHERE mathang.mahang =(SELECT mathang.mahang
FROM mathang
WHERE mathang.mahang=nhatkybanhang.mahang)
2.2.3 Xo d liu
xo d liu trong mt bng, ta s dng cu lnh DELETE. C php ca cu
lnh ny nh sau:
DELETE FROM tn_bng
[FROM danh_sch_bng]
[WHERE iu_kin]
56
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Trong cu lnh ny, tn ca bng cn xo d liu c ch nh sau DELETE FROM.
Mnh WHERE trong cu lnh c s dng ch nh iu kin i vi cc dng
d liu cn xo. Nu cu lnh DELETE khng c mnh WHERE th ton b cc
dng d liu trong bng u b xo.
V d 2.55: Cu lnh di y xo khi bng SINHVIEN nhng sinh vin sinh ti Hu
DELETE FROM sinhvien
WHERE noisinh LIKE %Hu%

Xo d liu khi iu kin lin quan n nhiu bng
Nu iu kin trong cu lnh DELETE lin quan n cc bng khng phi l
bng cn xa d liu, ta phi s dng thm mnh FROM v sau l danh sch tn
cc bng . Trong trng hp ny, trong mnh WHERE ta ch nh thm iu kin
ni gia cc bng
V d 2.56: Cu lnh di y xo ra khi bng SINHVIEN nhng sinh vin lp Tin
K24
DELETE FROM sinhvien
FROM lop
WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24'

S dng truy vn con trong cu lnh DELETE
Mt cu lnh SELECT c th c lng vo trong mnh WHERE trong cu
lnh DELETE lm iu kin cho cu lnh tng t nh cu lnh UPDATE.
V d 2.57: Cu lnh di y xo khi bng LOP nhng lp khng c sinh vin no
hc
DELETE FROM lop
WHERE malop NOT IN (SELECT DISTINCT malop
FROM sinhvien)
Xo ton b d liu trong bng
Cu lnh DELETE khng ch nh iu kin i vi cc dng d liu cn xo
trong mnh WHERE s xo ton b d liu trong bng. Thay v s dng cu lnh
DELETE trong trng hp ny, ta c th s dng cu lnh TRUNCATE c c php
nh sau:
TRUNCATE TABLE tn_bng
V d 2.58: Cu lnh sau xo ton b d liu trong bng diemthi:
DELETE FROM diemthi
c tc dng tng t vi cu lnh
TRUNCATE TABLE diemthi
57
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Bi tp chng 2
C s d liu di y c s dng qun l cng tc giao hng trong mt
cng ty kinh doanh. Cc bng trong c s d liu ny c biu din trong s di
y:

rong :
ng NHACUNGCAP lu tr d liu v cc i tc cung cp hng cho
THANG lu tr d liu v cc mt hng hin c trong cng ty.
hn vin lm vic trong
ACHHANG c s dng lu gi thng tin v cc khch hng
ca cng ty.

T
B
cng ty.
Bng MA
Bng LOAIHANG phn loi cc mt hng hin c.
Bng NHANVIEN c d liu l thng tin v cc n
cng ty.
Bng KH
58
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Khch hng t hng cho cng ty thng qua cc n t hng. Thng tin
chung v cc n t hng c lu tr trong bng DONDATHANG (Mi

ITIETDATHANG. Bng ny c quan h

S dng c liu sau y:
. 1 Cho bit danh sch cc i tc cung cp hng cho cng ty.
g ty.
trong cng ty.
?
n c
2. 7 t Tin cung cp nhng mt hng no?
v a ch ca cc cng ty

u?
c bn + ph cp).
iu (s tin phi tr c tnh theo cng thc
2. 13
2. 15 hng ngay ti cng ty t hng v nhng
ng ty.
2. 17 Nhng mt hng no cha tng c khch hng t mua?
mt n t hng phi do mt nhn vin ca cng ty lp v do bng ny
c quan h vi bng NHANVIEN)
Thng tin chi tit ca cc n t hng (t mua mt hng g, s lng, gi
c,...) c lu tr trong bng CH
vi hai bng DONDATHANG v MATHANG.
u lnh SELECT vit cc yu cu truy vn d
2
2. 2 M hng, tn hng v s lng ca cc mt hng hin c trong cn
2. 3 H tn v a ch v nm bt u lm vic ca cc nhn vin
2. 4 a ch v in thoi ca nh cung cp c tn giao dch VINAMILK l g
2. 5 Cho bit m v tn ca cc mt hng c gi ln hn 100000 v s lng hi
t hn 50.
2. 6 Cho bit mi mt hng trong cng ty do ai cung cp.
Cng ty Vi
2. 8 Loi hng thc phm do nhng cng ty no cung cp
l g?
2. 9 Nhng khch hng no (tn giao dch) t mua mt hng Sa hp XYZ ca
cng ty?
2. 10 n t hng s 1 do ai t v do nhn vin no lp, thi gian v a im giao
hng l
2. 11 Hy cho bit s tin lng m cng ty phi tr cho mi nhn vin l bao nhiu
(lng = lng
2. 12 Trong n t hng s 3 t mua nhng mt hng no v s tin m khch hng
phi tr cho mi mt hng l bao nh
SOLUONGGIABAN SOLUONGGIABANMUCGIAMGIA/100)
Hy cho bit c nhng khch hng no li chnh l i tc cung cp hng ca
cng ty (tc l c cng tn giao dch).
2. 14 Trong cng ty c nhng nhn vin no c cng ngy sinh?
Nhng n t hng no yu cu giao
n l ca cng ty no?
2. 16 Cho bit tn cng ty, tn giao dch, a ch v in thoi ca cc khch hng v
cc nh cung cp hng cho c
59
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2. 18 Nhng nhn vin no ca cng ty cha tng lp bt k mt ho n t hng
no?
2. 19 Nhng nhn vin no ca cng ty c lng c bn cao nht?
2. 21 nm 2003, nhng mt hng no ch c t mua ng mt ln.
n t mua hng
hn vin
2. 24 s tin hng m ca hng thu c trong mi thng ca nm 2003
2. 25 c t mi mt hng trong nm
2. 26 i mt hng m cng ty c (tng s
2. 27 in no ca cng ty bn c s lng hng nhiu nht v s lng hng
2. 28 ng c t mua t nht?
tin m mi n
2. 31 loi hng bao gm nhng mt hng no, tng s lng
qu c hin th di dng bng, hai ct ct u l m hng v
ng hng bn c mi thng v trong

S dn
2. 33 g NGAYCHUYENHANG ca nhng bn ghi c
NGAYCHUYENHANG cha xc nh (NULL) trong bng DONDATHANG
2. 20 Tng s tin m khch hng phi tr cho mi n t hng l bao nhiu?
Trong
2. 22 Hy cho bit mi mt khch hng phi b ra bao nhiu ti
ca cng ty?
2. 23 Mi mt nhn vin ca cng ty lp bao nhiu n t hng (nu n
cha h lp mt ho n no th cho kt qu l 0)
Cho bit tng
(thi c gian tnh theo ngy t hng).
Hy cho bit tng s tin li m cng ty thu
2003.
Hy cho bit tng s lng hng ca m
lng hng hin c v bn).
Nhn v
bn c ca nhng nhn vin ny l bao nhiu?
n t hng no c s lng h
2. 29 S tin nhiu nht m mi khch hng tng b ra t hng trong cc n
t hng l bao nhiu?
2. 30 Mi mt n t hng t mua nhng mt hng no v tng s
t hng phi tr l bao nhiu?
Hy cho bit mi mt
hng ca mi loi v tng s lng ca tt c cc mt hng hin c trong cng ty
l bao nhiu?
2. 32 Thng k xem trong nm 2003, mi mt mt hng trong mi thng v trong c
nm bn c vi s lng bao nhiu
Yu cu: Kt
tn hng, cc ct cn li tng ng vi cc thng t 1 n 12 v c nm. Nh
vy mi dng trong kt qu cho bit s l
c nm ca mi mt hng.
g cu lnh UPDATE thc hin cc yu cu sau:
Cp nht li gi tr trn
bng vi gi tr ca trng NGAYDATHANG.
60
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2. 34 Tng s lng hng ca nhng mt hng do cng ty VINAMILK cung cp ln
gp i.
Cp nht gi tr ca trng NOIGIAOHANG tro 2. 35 ng bng DONDATHANG bng
tr trng NOIGIAOHANG bng NULL).
hi ging nhau.
2. 38 ng nhiu
2. 39 ng nhn vin trong nm 2003 khng lp c bt k
2. 40 trong bng DONDATHANG c thm trng SOTIEN cho bit s tin

2. 41
nm.
s d liu.
2. 44 hi bng KHACHHANG nhng khch hng hin khng c bt k n t
ng c

ruy vn di y s dng c php ca
QL2.
macongty,tencongty,tengiaodich

LECT mahang,tenhang,soluong
r(ngaylamviec) AS namlamviec
a ch ca khch hng i vi nhng n t hng cha xc nh c ni giao
hng (gi
2. 36 Cp nht li d liu trong bng KHACHHANG sao cho nu tn cng ty v tn
giao dch ca khch hng trng vi tn cng ty v tn giao dch ca mt nh
cung cp no th a ch, in thoi, fax v e-mail p
2. 37 Tng lng ln gp ri cho nhng nhn vin bn c s lng hng nhiu
hn 100 trong nm 2003.
Tng ph cp ln bng 50% lng cho nhng nhn vin bn c h
nht.
Gim 25% lng ca nh
n t hng no.
Gi s
m khch hng phi tr trong mi n t hng. Hy tnh gi tr cho trng ny.
Thc hin cc yu cu di y bng cu lnh DELETE.
Xo khi bng NHANVIEN nhng nhn vin lm vic trong cng ty qu 40
2. 42 Xo nhng n t hng trc nm 2000 ra khi c
2. 43 Xo khi bng LOAIHANG nhng loi hng hin khng c mt hng.
Xo k
hng no cho cng ty.
2. 45 Xo khi bng MATHANG nhng mt hng c s lng bng 0 v kh
t mua trong bt k n t hng no.
Li gii:
Cc php ni c s dng trong cc t
S
2.1 SELECT
FROM nhacungcap
2.2 SE
FROM mathang
2.3 SELECT ho,ten,yea
FROM nhanvien
61
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2.4 SELECT diachi,dienthoai
ch='VINAMILK'
ng<50
cap.macongty,tencongty,tengiaodich
y=nhacungcap.macongty

in'
encongty,diachi
athang.maloaihang)
macongty
9
athang.mahang)
sohoadon)

g=khachhang.makhachhang
10 C ,ho,ten,
dondathang
g.manhanvien
1
N phucap IS NULL THEN 0

luong
OM anv n
FROM nhacungcap
WHERE tengiaodi
2.5 SELECT mahang,tenhang
FROM mathang
WHERE giahang>100000 AND soluo
2.6 SELECT mahang,tenhang,
nhacung
FROM mathang INNER JOIN nhacungcap
ON mathang.macongt
2.7 SELECT mahang,tenhang
FROM mathang INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.macongty
WHERE tencongty='Vit T
2.8 SELECT DISTINCT nhacungcap.macongty,t
FROM (loaihang INNER JOIN mathang
ON loaihang.maloaihang=m
INNER JOIN nhacungcap
ON mathang.macongty=nhacungcap.
WHERE tenloaihang='Thc phm'
2. SELECT DISTINCT tengiaodich
FROM ((mathang INNER JOIN chitietdathang
ON mathang.mahang=chitietd
INNER JOIN dondathang
ON chitietdathang.sohoadon=dondathang.
INNER JOIN khachhang
ON dondathang.makhachhan
WHERE tenhang='Sa hp'
2. SELE T dondathang.manhanvien
ngaygiaohang,noigiaohang
FROM nhanvien INNER JOIN
ON nhanvien.manhanvien=dondathan
WHERE sohoadon=1
2.1 SELECT manhanvien,ho,ten,
luongcoban + CASE
WHE
ELSE phucap
END AS
FR nh ie
2.12 SELECT a.mahang,tenhang,
62
Khoa CNTT - Trng HKH Hu Gio trnh SQL
oluong*giaban*(1- a.s mucgiamgia/100) AS sotien
hang AS a INNER JOIN mathang AS b

3
hacungcap
.tengiaodich
4 LEC .ngaysinh
5
OM
g.diachi
6 LEC chi,dienthoai
7 ng,tenhang
(SELECT mahang FROM chitietdathang
mahang=mathang.mahang)
8 en,ho,ten
ERE OT IST ang
nhanvien=nhanvien.manhanvien)
9 en,ho,ten,luongcoban
.makhachhang,
y,tengiaodich,
ondathang.makhachhang)

ng.sohoadon
thang.sohoadon
FROM chitietdat
ON a.mahang=b.mahang
2.1 SELECT makhachhang,khachhang.tencongty,
khachhang.tengiaodich
FROM khachhang INNER JOIN n
ON khachhang.tengiaodich=nhacungcap
2.1 SE T a.ho,a.ten,b.ho,b.ten,b
FROM nhanvien a INNER JOIN nhanvien b
ON a.ngaysinh=b.ngaysinh AND
a.manhanvien<>b.manhanvien
2.1 SELECT sohoadon,tencongty,tengiaodich,
ngaydathang,noigiaohang
FR dondathang INNER JOIN khachhang
ON dondathang.noigiaohang=khachhan
2.1 SE T tencongty,tengiaodich,dia
FROM khachhang
UNION ALL
SELECT tencongty,tengiaodich,diachi,dienthoai
FROM nhacungcap
2.1 SELECT maha
FROM mathang
WHERE NOT EXISTS
WHERE
2.1 SELECT manhanvi
FROM nhanvien
WH N EX S (SELECT manhanvien FROM dondath
WHERE ma
2.1 SELECT manhanvi
FROM nhanvien
WHERE luongcoban=(SELECT MAX(luongcoban) FROM nhanvien)
2.20 SELECT dondathang.sohoadon,dondathang
tencongt
SUM(soluong*giaban-soluong*giaban*mucgiamgia/100)
FROM (khachhang INNER JOIN dondathang
ON khachhang.makhachhang=d
INNER JOIN chitietdathang
ON dondathang.sohoadon=chitietdatha
GROUP BY dondathang.makhachhang,tencongty,
tengiaodich,donda
63
Khoa CNTT - Trng HKH Hu Gio trnh SQL
2. SELECT mathang.mahang,tenhang 21
g.sohoadon
UP g
2 encongty,tengiaodich,
giaban*mucgiamgia/100)
ang)
ang.sohoadon
3 LEC ,COUNT(sohoadon)
4
)
hang
athang.sohoadon
25
ng*giaban*mucgiamgia/100)-
ER JOIN chitietdathang AS b
c
26 C ng,
ng.soluong) IS NULL THEN 0
athang.soluong)
tongsoluong
FROM (mathang INNER JOIN chitietdathang
ON mathang.mahang=chitietdathang.mahang)
iNNER JOIN dondathang
ON chitietdathang.sohoadon=dondathan
WHERE YEAR(ngaydathang)=2003
GRO BY mathang.mahang,tenhan
HAVING COUNT(chitietdathang.mahang)=1
2.2 SELECT khachhang.makhachhang,t
SUM(soluong*giaban-soluong*
FROM (khachhang INNER JOIN dondathang
ON khachhang.makhachhang = dondathang.makhachh
INNER JOIN chitietdathang
ON dondathang.sohoadon=chitietdath
GROUP BY khachhang.makhachhang,tencongty,tengiaodich
2.2 SE T nhanvien.manhanvien,ho,ten
FROM nhanvien LEFT OUTER JOIN dondathang
ON nhanvien.manhanvien=dondathang.manhanvien
GROUP BY nhanvien.manhanvien,ho,ten
2.2 SELECT MONTH(ngaydathang) AS thang,
SUM(soluong*giaban-soluong*giaban*mucgiamgia/100
FROM dondathang INNER JOIN chitietdat
ON dondathang.sohoadon=chitietd
WHERE year(ngaydathang)=2003
GROUP BY month(ngaydathang)
2. SELECT c.mahang,tenhang,
SUM(b.soluong*giaban-b.soluo
SUM(b.soluong*giahang)
FROM (dondathang AS a INN
ON a.sohoadon=b.sohoadon)
INNER JOIN mathang AS
ON b.mahang=c.mahang
WHERE YEAR(ngaydathang)=2003
GROUP BY c.mahang,tenhang
2. SELE T mathang.mahang,tenha
mathang.soluong +
CASE
WHEN SUM(chitietdatha
ELSE SUM(chitietd
END AS
64
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FROM mathang LEFT OUTER JOIN chitietdathang
ON mathang.mahang=chitietdathang.mahang
GR BY mathang.mahang,tenhan OUP g,mathang.soluong
7 )
n)
hang.sohoadon
N m(soluong)
dathang.manhanvien)
.sohoadon
28
ohoadon

on=chitietdathang.sohoadon
9
OM thang
hang.sohoadon=chitietdathang.sohoadon
0

AS a INNER JOIN chitietdathang AS b
n
1 ihang,tenloaihang,
aihang
2.2 SELECT nhanvien.manhanvien,ho,ten,sum(soluong
FROM (nhanvien INNER JOIN dondathang
ON nhanvien.manhanvien=dondathang.manhanvie
INNER JOIN chitietdathang
ON dondathang.sohoadon=chitietdat
GROUP BY nhanvien.manhanvien,ho,ten
HAVI G sum(soluong)>=ALL(SELECT su
FROM (nhanvien INNER JOIN dondathang
ON nhanvien.manhanvien=don
INNER JOIN chitietdathang ON
dondathang.sohoadon=chitietdathang
GROUP BY nhanvien.manhanvien,ho,ten)
2. SELECT dondathang.sohoadon,SUM(soluong)
FROM dondathang INNER JOIN chitietdathang
ON dondathang.sohoadon=chitietdathang.s
GROUP BY dondathang.sohoadon
HAVING sum(soluong)<=ALL(SELECT sum(soluong)
FROM dondathang INNER JOIN chitietdathang
ON dondathang.sohoad
GROUP BY dondathang.sohoadon)
2.2 SELECT TOP 1
SUM(soluong*giaban-soluong*giaban*mucgiamgia/100)
FR dondathang INNER JOIN chitietda
ON dondat
ORDER BY 1 DESC
2.3 SELECT a.sohoadon,b.mahang,tenhang,
b.soluong*giaban-b.soluong*giaban*mucgiamgia/100
FROM (dondathang
ON a.sohoadon = b.sohoadon)
INNER JOIN mathang AS c ON b.mahang = c.mahang
ORDER BY a.sohoadon
COMPUTE SUM(b.soluong*giaban-
b.soluong*giaban*mucgiamgia/100) BY a.sohoado
2.3 SELECT loaihang.maloa
mahang,tenhang,soluong
FROM loaihang INNER JOIN mathang
ON loaihang.maloaihang=mathang.malo
65
Khoa CNTT - Trng HKH Hu Gio trnh SQL
ORDER BY loaihang.maloaihang
COMPUTE SUM(soluong) BY loaihang.maloaihang
2
b.soluong
AS Thang1,
dathang) WHEN 2 THEN b.soluong

UM( WHEN 3 THEN b.soluong

UM( WHEN 4 THEN b.soluong

UM( WHEN 5 THEN b.soluong

UM( WHEN 6 THEN b.soluong

UM( WHEN 7 THEN b.soluong

UM( WHEN 8 THEN b.soluong

UM( WHEN 9 THEN b.soluong

UM( WHEN 10 THEN b.soluong

UM( WHEN 11 THEN b.soluong

UM( HEN 12 THEN b.soluong

N b.mahang=c.mahang
3
thang
WHERE ngaychuyenhang IS NULL
COMPUTE SUM(soluong)
2.3 SELECT b.mahang,tenhang,
SUM(CASE MONTH(ngaydathang) WHEN 1 THEN
ELSE 0 END)
SUM(CASE MONTH(ngay
ELSE 0 END) AS Thang2,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang3,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang4,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang5,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang6,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang7,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang8,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang9,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang10,
S CASE MONTH(ngaydathang)
ELSE 0 END) AS Thang11,
S CASE MONTH(ngaydathang) W
ELSE 0 END) AS Thang12,
SUM(b.soluong) AS CaNam
FROM (dondathang AS a INNER JOIN chitietdathang AS b
ON a.sohoadon=b.sohoadon)
INNER JOIN mathang AS c O
WHERE YEAR(ngaydathang)=1996
GROUP BY b.mahang,tenhang

2.3 UPDATE dondathang
SET ngaychuyenhang = ngayda

2.34 UPDATE mathang
SET soluong=soluong*2
66
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FROM nhacungcap
WHERE nhacungcap.macongty=mathang.macongty AND
LK'
5
akhachhang=khachhang.makhachang AND
L
6
nhacungcap.dienthoai,
x = nhacungcap.fax,
RE .tencongty AND
tengiaodich
7
hanvien
chitietdathang
ohoadon=chitietdathang.sohoadon
vien.manhanvien
hanvien
R JOIN chitietdathang
oadon=chitietdathang.sohoadon
R JOIN chitietdathang
itietdathang.sohoadon
39
tencongty='VINAMI
2.3 UPDATE dondathang
SET noigiaohang=diachi
FROM khachhang
WHERE dondathang.m
noigiaohang IS NUL
2.3 UPDATE khachhang
SET khachhang.diachi = nhacungcap.diachi,
khachhang.dienthoai =
khachhang.fa
khachhang.email = nhacungcap.email
FROM nhacungcap
WHE khachhang.tencongty = nhacungcap
khachhang.tengiaodich = nhacungcap.
2.3 UPDATE nhanvien
SET luongcoban=luongcoban*1.5
WHERE manhanvien =
(SELECT man
FROM dondathang INNER JOIN
ON dondathang.s
WHERE manhanvien=nhan
GROUP BY manhanvien
HAVING SUM(soluong)>100)
2.38 UPDATE nhanvien
SET phucap=luongcoban/2
WHERE manhanvien IN
(SELECT man
FROM dondathang INNE
ON dondathang.soh
GROUP BY manhanvien
HAVING SUM(soluong)>=ALL
(SELECT SUM(soluong)
FROM dondathang INNE
ON dondathang.sohoadon=ch
GROUP BY manhanvien))
2. UPDATE nhanvien
SET luongcoban=luongcoban*0.85
WHERE NOT EXISTS (SELECT manhanvien
67
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FROM dondathang
en=nhanvien.manhanvien)
0
T s ien
hang
on=dondathang.sohoadon

1
amviec,GETDATE())>40
42 DELETE FROM dondathang
1/2000'
3
T mahang

RE maloaihang=loaihang.maloaihang)
4
ERE OT IST FROM dondathang
)
hang
ang.mahang)
__________________
WHERE manhanvi
2.4 UPDATE dondathang
SE ot =
(SELECT SUM(soluong*giaban+soluong*giaban*mucgiamgia)
FROM chitietdat
WHERE sohoad
GROUP BY sohoadon)

2.4 DELETE FROM nhanvien
WHERE DATEDIFF(YY,ngayl
2.
WHERE ngaydathang<'1/
2.4 DELETE FROM loaihang
WHERE NOT EXISTS (SELEC
FROM mathang
WHE
2.4 DELETE FROM khachhang
WH N EX S (SELECT sohoadon
WHERE makhachhang=khachhang.makhachhang
2.45 DELETE FROM mathang
WHERE soluong=0 AND
NOT EXISTS (SELECT sohoadon
FROM chitietdat
WHERE mahang=math

_____________________
68
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 3 3
N NG G N N N NG G N NH H N NG GH H A A D D L LI I U U

Cc cu lnh SQL cp n trong chng 3 c s dng nhm thc hin
cc thao tc b sung, cp nht, loi b v xem d liu. Nhm cc cu lnh ny c
gi l ngn ng thao tc d liu (DML). Trong chung ny, chng ta s tm hiu nhm
cc cu lnh c s dng nh ngha v qun l cc i tng CSDL nh bng,
khung nhn, ch mc,... v c gi l ngn ng nh ngha d liu (DLL).
V c bn, ngn ng nh ngha d liu bao gm cc lnh:
CREATE: nh ngha v to mi i tng CSDL.
ALTER: thay i nh ngha ca i tng CSDL.
DROP: Xo i tng CSDL c.

3.1 To bng d liu
Nh ni n chng 1, bng d liu l cu trc c vai tr quan trng nht
trong c s d liu quan h. Ton b d liu ca c s d liu c t chc trong cc
bng, nhng bng ny c th l nhng bng h thng c to ra khi to lp c s d
liu, v cng c th l nhng bng do ngi s dng nh ngha.
Hnh 3.1 Bng trong c s d liu quan h

Trong cc bng, d liu c t chc di dng cc dng v ct. Mi mt dng
l mt bn ghi duy nht trong bng v mi mt ct l mt trng. Cc bng trong c s
69
Khoa CNTT - Trng HKH Hu Gio trnh SQL
d liu c s dng biu din thng tin, lu gi d liu v cc i tng trong th
gii thc v/hoc mi quan h gia cc i tng. Bng trong hnh 3.1 bao gm 10 bn
ghi v 4 trng l MAKHOA, TENKHOA, DIENTHOAI v TRUONGKHOA.
Cu lnh CREATE TABLE c s dng nh ngha mt bng d liu mi
trong c s d liu. Khi nh ngha mt bng d liu mi, ta cn phi xc nh c
cc yu cu sau y:
Bng mi c to ra s dng vi mc ch g v c vai tr nh th no
trong c s d liu.
Cu trc ca bng bao gm nhng trng (ct) no, mi mt trng c
ngha nh th no trong vic biu din d liu, kiu d liu ca mi trng l
g v trng c cho php nhn gi tr NULL hay khng.
Nhng trng no s tham gia vo kha chnh ca bng. Bng c quan h
vi nhng bng khc hay khng v nu c th quan h nh th no.
Trn cc trng ca bng c tn ti nhng rng buc v khun dng, iu
kin hp l ca d liu hay khng; nu c th s dng u v nh th no.
Cu lnh CREATE TABLE c c php nh sau
CREATE TABLE tn_bng
(
tn_ct thuc_tnh_ct cc_rng_buc
[,...
,tn_ct_n thuc_tnh_ct_n cc_rng_buc_ct_n]
[,cc_rng_buc_trn_bng]
)
Trong :
tn_bng
Tn ca bng cn to. Tn phi tun theo qui tc nh danh v
khng c vt qu 128 k t.
tn_ct
L tn ca ct (trng) cn nh ngha, tn ct phi tun theo
qui tc nh danh v khng c trng nhau trong mi mt
bng. Mi mt bng phi c t nht mt ct. Nu bng c nhiu
ct th nh ngha ca cc ct (tn ct, thuc tnh v cc rng
buc) phi phn cch nhau bi du phy.
thuc_tnh_ct
Mi mt ct trong mt bng ngoi tn ct cn c cc thuc tnh
bao gm:
Kiu d liu ca ct. y l thuc tnh bt buc phi
c i vi mi ct.
Gi tr mc nh ca ct: l gi tr c t ng gn
cho ct nu nh ngi s dng khng nhp d liu
70
Khoa CNTT - Trng HKH Hu Gio trnh SQL
cho ct mt cch tng minh. Mi mt ct ch c th
c nhiu nht mt gi tr mc nh.
Ct c tnh cht IDENTITY hay khng? tc l gi tr
ca ct c c t ng tng mi khi c bn ghi mi
c b sung hay khng. Tnh cht ny ch c th s
dng i vi cc trng kiu s.
Ct c chp nhn gi tr NULL hay khng
V d 3.1: Khai bo di y nh ngha ct STT c kiu d
liu l int v ct c tnh cht IDENTITY:
stt INT IDENTITY
hay nh ngha ct NGAY c kiu datetime v khng cho php
chp nhn gi tr NULL:
ngay DATETIME NOT NULL
v nh ngha ct SOLUONG kiu int v c gi tr mc nh l
0:
soluong INT DEFAULT (0)
cc_rng_buc
Cc rng buc c s dng trn mi ct hoc trn bng nhm
cc mc ch sau:
Quy nh khun dng hay gi tr d liu c cho
php trn ct (chng hn qui nh tui ca mt hc
sinh phi ln hn 6 v nh hn 20, s in thoi phi
l mt chui bao gm 6 ch s,...). Nhng rng buc
kiu ny c gi l rng buc CHECK
m bo tnh ton vn d liu trong mt bng v ton
vn tham chiu gia cc bng trong c s d liu.
Nhng loi rng buc ny nhm m bo tnh ng
ca d liu nh: s chng minh nhn dn ca mi mt
ngi phi duy nht, nu sinh vin hc mt lp no
th lp phi tn ti,... Lin quan n nhng loi
rng buc ny bao gm cc rng buc PRIMARY
KEY (kho chnh), UNIQUE (kha d tuyn) v
FOREIGN KEY (kho ngoi)
Cc loi rng buc ny s c trnh by chi tit hn phn
sau.

71
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 3.2: Cu lnh di y nh ngha bng NHANVIEN vi cc trng MANV
(m nhn vin), HOTEN (h v tn), NGAYSINH (ngy sinh ca nhn vin),
DIENTHOAI (in thoi) v HSLUONG (h s lng)
CREATE TABLE nhanvien
(
manv NVARCHAR(10) NOT NULL,
hoten NVARCHAR(50) NOT NULL,
ngaysinh DATETIME NULL,
dienthoai NVARCHAR(10) NULL,
hsluong DECIMAL(3,2) DEFAULT (1.92)
)
Trong cu lnh trn, trng MANV v HOTEN ca bng NHANVIEN khng
c NULL (tc l bt buc phi c d liu), trng NGAYSINH v DIENTHOAI s
nhn gi tr NULL nu ta khng nhp d liu cho chng cn trng HSLUONG s
nhn gi tr mc nh l 1.92 nu khng c nhp d liu.
Nu ta thc hin cc cu lnh di y sau khi thc hin cu lnh trn b
sung d liu cho bng NHANVIEN
INSERT INTO nhanvien
VALUES('NV01','Le Van A','2/4/75','886963',2.14)
INSERT INTO nhanvien(manv,hoten)
VALUES('NV02','Mai Thi B')
INSERT INTO nhanvien(manv,hoten,dienthoai)
VALUES('NV03','Tran Thi C','849290')
Ta s c c d liu trong bng NHANVIEN nh sau:

3.1.1 Rng buc CHECK
Rng buc CHECK c s dng nhm ch nh iu kin hp l i vi d
liu. Mi khi c s thay i d liu trn bng (INSERT, UPDATE), nhng rng buc
ny s c s dng nhm kim tra xem d liu mi c hp l hay khng.
Rng buc CHECK c khai bo theo c php nh sau:
[CONSTRAINT tn_rng_buc]
CHECK (iu_kin)
72
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Trong , iu_kin l mt biu thc logic tc ng ln ct nhm qui nh gi tr hoc
khun dng d liu c cho php. Trn mi mt bng cng nh trn mi mt ct c
th c nhiu rng buc CHECK.
V d 3.3: Cu lnh di y to bng DIEMTOTNGHIEP trong qui nh gi tr
ca ct DIEMVAN v DIEMTOAN phi ln hn hoc bng 0 v nh hn hoc bng
10.
CREATE TABLE diemtotnghiep
(
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME,
diemvan DECIMAL(4,2)
CONSTRAINT chk_diemvan
CHECK(diemvan>=0 AND diemvan<=10),
diemtoan DECIMAL(4,2)
CONSTRAINT chk_diemtoan
CHECK(diemtoan>=0 AND diemtoan<=10),
)
Nh vy, vi nh ngha nh trn ca bng DIEMTOTNGHIEP, cc cu lnh di y
l hp l:
INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan)
VALUES('Le Thanh Hoang',9.5,2.5)
INSERT INTO diemtotnghiep(hoten,diemvan)
VALUES('Hoang Thi Mai',2.5)
cn cu lnh di y l khng hp l:
INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan)
VALUES('Tran Van Hanh',6,10.5)
do ct DIEMTOAN nhn gi tr 10.5 khng tho mn iu kin ca rng buc

Trong v d trn, cc rng buc c ch nh phn khai bo ca mi ct.
Thay v ch nh rng buc trn mi ct, ta c th ch nh cc rng buc mc bng
bng cch khai bo cc rng buc sau khi khai bo xong cc ct trong bng.
V d 3.4: Cu lnh
CREATE TABLE lop
(
malop NVARCHAR(10) NOT NULL ,
tenlop NVARCHAR(30) NOT NULL ,
khoa SMALLINT NULL ,
hedaotao NVARCHAR(25) NULL
73
Khoa CNTT - Trng HKH Hu Gio trnh SQL
CONSTRAINT chk_lop_hedaotao
CHECK (hedaotao IN ('chnh quy','ti chc')),
namnhaphoc INT NULL
CONSTRAINT chk_lop_namnhaphoc
CHECK (namnhaphoc<=YEAR(GETDATE())),
makhoa NVARCHAR(5)
)
c th c vit li nh sau:
CREATE TABLE lop
(
malop NVARCHAR(10) NOT NULL ,
tenlop NVARCHAR(30) NOT NULL ,
khoa SMALLINT NULL ,
hedaotao NVARCHAR(25) NULL,
namnhaphoc INT NULL ,
makhoa NVARCHAR(5),
CONSTRAINT chk_lop
CHECK (namnhaphoc<=YEAR(GETDATE()) AND
hedaotao IN ('chnh quy','ti chc'))
)

3.1.2 Rng buc PRIMARY KEY
Rng buc PRIMARY KEY c s dng nh ngha kho chnh ca bng.
Kho chnh ca mt bng l mt hoc mt tp nhiu ct m gi tr ca chng l duy
nht trong bng. Hay ni cch khc, gi tr ca kho chnh s gip cho ta xc nh
c duy nht mt dng (bn ghi) trong bng d liu. Mi mt bng ch c th c duy
nht mt kho chnh v bn thn kho chnh khng chp nhn gi tr NULL. Rng
buc PRIMARY KEY l c s cho vic m bo tnh ton vn thc th cng nh ton
vn tham chiu.
khai bo mt rng buc PRIMARY KEY, ta s dng c php nh sau:
[CONSTRAINT tn_rng_buc]
PRIMARY KEY [(danh_sch_ct)]
Nu kho chnh ca bng ch bao gm ng mt ct v rng buc PRIMARY KEY
c ch nh mc ct, ta khng cn thit phi ch nh danh sch ct sau t kho
PRIMARY KEY. Tuy nhin, nu vic khai bo kho chnh c tin hnh mc bng
(s dng khi s lng cc ct tham gia vo kho l t hai tr ln) th bt buc phi ch
nh danh sch ct ngay sau t kha PRIMARY KEY v tn cc ct c phn cch
nhau bi du phy.
74
Khoa CNTT - Trng HKH Hu Gio trnh SQL

V d 3.5: Cu lnh di y nh ngha bng SINHVIEN vi kho chnh l MASV
CREATE TABLE sinhvien
(
masv NVARCHAR(10)
CONSTRAINT pk_sinhvien_masv PRIMARY KEY,
hodem NVARCHAR(25) NOT NULL ,
ten NVARCHAR(10) NOT NULL ,
ngaysinh DATETIME,
gioitinh BIT,
noisinh NVARCHAR(255),
malop NVARCHAR(10)
)
Vi bng va c to bi cu lnh trn, nu ta thc hin cu lnh:
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop)
VALUES('0261010001','L Hong Phng','Anh',0,'C26101')
mt bn ghi mi s c b sung vo bng ny. Nhng nu ta thc hin tip cu lnh:
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop)
VALUES('0261010001','L Huy','an',1,'C26101')
th cu lnh ny s b li do trng gi tr kho vi bn ghi c.

V d 3.6: Cu lnh di y to bng DIEMTHI vi kho chnh l tp bao gm hai
ct MAMONHOC v MASV
CREATE TABLE diemthi
(
mamonhoc NVARCHAR(10) NOT NULL ,
masv NVARCHAR(10) NOT NULL ,
diemlan1 NUMERIC(4, 2),
diemlan2 NUMERIC(4, 2),
CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv)
)

Lu :
Mi mt bng ch c th c nhiu nht mt rng buc PRIMARY KEY.
Mt kho chnh c th bao gm nhiu ct nhng khng vt qu 16 ct.

75
Khoa CNTT - Trng HKH Hu Gio trnh SQL
3.1.3 Rng buc UNIQUE
Trn mt bng ch c th c nhiu nht mt kha chnh nhng c th c nhiu
ct hoc tp cc ct c tnh cht nh kho chnh, tc l gi tr ca chng l duy nht
trong bng. Tp mt hoc nhiu ct c gi tr duy nht v khng c chn lm kho
chnh c gi l kho ph (kho d tuyn) ca bng. Nh vy, mt bng ch c nhiu
nht mt kho chnh nhng c th c nhiu kho ph.
Rng buc UNIQUE c s dng trong cu lnh CREATE TABLE nh
ngha kho ph cho bng v c khai bo theo c php sau y:
[CONSTRAINT tn_rng_buc]
UNIQUE [(danh_sch_ct)]

V d 3.7: Gi s ta cn nh ngha bng LOP vi kho chnh l ct MALOP nhng
ng thi li khng cho php cc lp khc nhau c trng tn lp vi nhau, ta s
dng cu lnh nh sau:
CREATE TABLE lop
(
malop NVARCHAR(10) NOT NULL,
tenlop NVARCHAR(30) NOT NULL,
khoa SMALLINT NULL,
hedaotao NVARCHAR(25) NULL,
namnhaphoc INT NULL,
makhoa NVARCHAR(5),
CONSTRAINT pk_lop PRIMARY KEY (malop),
CONSTRAINT unique_lop_tenlop UNIQUE(tenlop)
)

3.1.4 Rng buc FOREIGN KEY
Cc bng trong mt c s d liu c mi quan h vi nhau. Nhng mi quan h
ny biu din cho s quan h gia cc i tng trong th gii thc. V mt d liu,
nhng mi quan h c m bo thng qua vic i hi s c mt ca mt gi tr d
liu trong bng ny phi ph thuc vo s tn ti ca gi tr d liu trong mt
bng khc.
Rng buc FOREIGN KEY c s dng trong nh ngha bng d liu nhm
to nn mi quan h gia cc bng trong mt c s d liu. Mt hay mt tp cc ct
trong mt bng c gi l kho ngoi, tc l c rng buc FOREIGN KEY, nu gi
tr ca n c xc nh t kho chnh (PRIMARY KEY) hoc kho ph (UNIQUE)
ca mt bng d liu khc.
76
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Hnh di y cho ta thy c mi quan h gia 3 bng DIEMTHI,
SINHVIEN v MONHOC. Trong bng DIEMTHI, MASV l kho ngoi tham chiu
n ct MASV ca bng SINHVIEN v MAMONHOC l kho ngoi tham chiu n
ct MAMONHOC ca bng MONHOC.
Hnh 3.2 Mi quan h gia cc bng

Vi mi quan h c to ra nh hnh trn, h qun tr c s d liu s kim tra tnh
hp l ca mi bn ghi trong bng DIEMTHI mi khi c b sung hay cp nht. Mt
bn ghi bt k trong bng DIEMTHI ch hp l (m bo rng buc FOREIGN KEY)
nu gi tr ca ct MASV phi tn ti trong mt bn ghi no ca bng SINHVIEN
v gi tr ca ct MAMONHOC phi tn ti trong mt bn ghi no ca bng
MONHOC.
Rng buc FOREIGN KEY c nh ngha theo c php di y:
[CONSTRAINT tn_rng_buc]
FOREIGN KEY [(danh_sch_ct)]
REFERENCES tn_bng_tham_chiu(danh_sch_ct_tham_chiu)
[ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT]
[ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT]
Vic nh ngha mt rng buc FOREIGN KEY bao gm cc yu t sau:
77
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Tn ct hoc danh sch ct ca bng c nh ngha tham gia vo kho
ngoi.
Tn ca bng c tham chiu bi kho ngoi v danh sch cc ct c
tham chiu n trong bng tham chiu.
Cch thc x l i vi cc bn ghi trong bng c nh ngha trong trng
hp cc bn ghi c tham chiu trong bng tham chiu b xo (ON
DELETE) hay cp nht (ON UPDATE). SQL chun a ra 4 cch x l:
CASCADE: T ng xo (cp nht) nu bn ghi c tham chiu
b xo (cp nht).
NO ACTION: (Mc nh) Nu bn ghi trong bng tham chiu
ang c tham chiu bi mt bn ghi bt k trong bng c
nh ngha th bn ghi khng c php xo hoc cp nht (i
vi ct c tham chiu).
SET NULL: Cp nht li kho ngoi ca bn ghi thnh gi tr
NULL (nu ct cho php nhn gi tr NULL).
SET DEFAULT: Cp nht li kho ngoi ca bn ghi nhn gi tr
mc nh (nu ct c qui nh gi tr mc nh).

V d 3.8: Cu lnh di y nh ngha bng DIEMTHI vi hai kho ngoi trn ct
MASV v ct MAMONHOC (gi s hai bng SINHVIEN v MONHOC c nh
ngha)
CREATE TABLE diemthi
(
mamonhoc NVARCHAR(10) NOT NULL ,
masv NVARCHAR(10) NOT NULL ,
diemlan1 NUMERIC(4, 2),
diemlan2 NUMERIC(4, 2),
CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv),
CONSTRAINT fk_diemthi_mamonhoc
FOREIGN KEY(mamonhoc)
REFERENCES monhoc(mamonhoc)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_diemthi_masv
FOREIGN KEY(masv)
REFERENCES sinhvien(masv)
ON DELETE CASCADE
ON UPDATE CASCADE
78
Khoa CNTT - Trng HKH Hu Gio trnh SQL
)

Lu :
Ct c tham chiu trong bng tham chiu phi l kho chnh (hoc l kho
ph).
Ct c tham chiu phi c cng kiu d liu v di vi ct tng ng
trong kha ngoi.
Bng tham chiu phi c nh ngha trc. Do , nu cc bng c mi
quan h vng, ta c th khng th nh ngha rng buc FOREIGN KEY
ngay trong cu lnh CREATE TABLE m phi nh ngha thng qua lnh
ALTER TABLE.
3.2 Sa i nh ngha bng
Mt bng sau khi c nh ngha bng cu lnh CREATE TABLE c th
c sa i thng qua cu lnh ALTER TABLE. Cu lnh ny cho php chng ta
thc hin c cc thao tc sau:
B sung mt ct vo bng.
Xo mt ct khi bng.
Thay i nh ngha ca mt ct trong bng.
Xo b hoc b sung cc rng buc cho bng

C php ca cu lnh ALTER TABLE nh sau:
ALTER TABLE tn_bng
ADD nh_ngha_ct |
ALTER COLUMN tn_ct kiu_d_liu [NULL | NOT NULL] |
DROP COLUMN tn_ct |
ADD CONSTRAINT tn_rng_buc nh_ngha_rng_buc |
DROP CONSTRAINT tn_rng_buc

V d 3.9: Cc v d di y minh ho cho ta cch s dng cu lnh ALTER TABLE
trong cc trng hp.
Gi s ta c hai bng DONVI v NHANVIEN vi nh ngha nh sau:
CREATE TABLE donvi
(
madv INT NOT NULL PRIMARY KEY,
tendv NVARCHAR(30) NOT NULL
79
Khoa CNTT - Trng HKH Hu Gio trnh SQL
)

CREATE TABLE nhanvien
(
manv NVARCHAR(10) NOT NULL,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME,
diachi CHAR(30) NOT NULL
)
B sung vo bng NHANVIEN ct DIENTHOAI vi rng buc CHECK nhm qui
nh in thoi ca nhn vin l mt chui 6 ch s:
ALTER TABLE nhanvien
ADD
dienthoai NVARCHAR(6)
CONSTRAINT chk_nhanvien_dienthoai
CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]')
B sung thm ct MADV vo bng NHANVIEN:
ALTER TABLE nhanvien
ADD
madv INT NULL
nh ngha li kiu d liu ca ct DIACHI trong bng NHANVIEN v cho php ct
ny chp nhn gi tr NULL:
ALTER TABLE nhanvien
ALTER COLUMN diachi NVARCHAR(100) NULL
Xo ct ngy sinh khi bng NHANVIEN:
ALTER TABLE nhanvien
DROP COLUMN ngaysinh
nh ngha kho chnh (rng buc PRIMARY KEY) cho bng NHANVIEN l ct
MANV:
ALTER TABLE nhanvien
ADD
CONSTRAINT pk_nhanvien PRIMARY KEY(manv)
nh ngha kho ngoi cho bng NHANVIEN trn ct MADV tham chiu n ct
MADV ca bng DONVI:
ALTER TABLE nhanvien
ADD
CONSTRAINT fk_nhanvien_madv
FOREIGN KEY(madv) REFERENCES donvi(madv)
80
Khoa CNTT - Trng HKH Hu Gio trnh SQL
ON DELETE CASCADE
ON UPDATE CASCADE
Xo b rng buc kim tra s in thoi ca nhn vin
ALTER TABLE nhanvien
DROP CONSTRAINT CHK_NHANVIEN_DIENTHOAI

Lu :
Nu b sung thm mt ct vo bng v trong bng c t nht mt bn ghi
th ct mi cn b sung phi cho php chp nhn gi tr NULL hoc phi c
gi tr mc nh.
Mun xo mt ct ang c rng buc bi mt rng buc hoc ang c
tham chiu bi mt kho ngoi, ta phi xo rng buc hoc kho ngoi trc
sao cho trn ct khng cn bt k mt rng buc v khng cn c tham
chiu bi bt k kho ngoi no.
Nu b sung thm rng buc cho mt bng c d liu v rng buc cn
b sung khng c tho mn bi cc bn ghi c trong bng th cu lnh
ALTER TABLE khng thc hin c.

3.3 Xo bng
Khi mt bng khng cn cn thit , ta c th xo n ra khi c s d liu bng
cu lnh DROP TABLE. Cu lnh ny cng ng thi xo tt c nhng rng buc, ch
mc, trigger lin quan n bng .
Cu lnh c c php nh sau:
DROP TABLE tn_bng
Trong cc h qun tr c s d liu, khi xo mt bng bng lnh DROP
TABLE, ta khng th khi phc li bng cng nh d liu ca n. Do , cn phi cn
thn khi s dng cu lnh ny.
Cu lnh DROP TABLE khng th thc hin c nu bng cn xo ang c
tham chiu bi mt rng buc FOREIGN KEY. Trong trng hp ny, rng buc
FOREIGN KEY ang tham chiu hoc bng ang tham chiu n bng cn xo phi
c xo trc.
Khi mt bng b xo, tt c cc rng buc, ch mc v trigger lin quan n
bng cng ng thi b xa theo. Do , nu ta to li bng th cng phi to li cc i
tng ny.
81
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 3.10: Gi s ct MADV trong bng DONVI ang c tham chiu bi kho
ngoi fk_nhanvien_madv trong bng NHANVIEN. xo bng DONVI ra khi c s
d liu, ta thc hin hai cu lnh sau:
Xo b rng buc fk_nhanvien_madv khi bng NHANVIEN:
ALTER TABLE nhanvien
DROP CONSTRAINT fk_nhanvien_madv
Xo bng DONVI:
DROP TABLE donvi
3.4 Khung nhn
Cc bng trong c s d liu ng vai tr l cc i tng t chc v lu tr d
liu. Nh vy, ta c th quan st c d liu trong c s d liu bng cch thc hin
cc truy vn trn bng d liu. Ngoi ra, SQL cn cho php chng ta quan st c d
liu thng qua vic nh ngha cc khung nhn.
Mt khung nhn (view) c th c xem nh l mt bng o trong c s d
liu c ni dung c nh ngha thng qua mt truy vn (cu lnh SELECT). Nh
vy, mt khung nhn trng ging nh mt bng vi mt tn khung nhn v l mt tp
bao gm cc dng v cc ct. im khc bit gia khung nhn v bng l khung nhn
khng c xem l mt cu trc lu tr d liu tn ti trong c s d liu. Thc cht
d liu quan st c trong khung nhn c ly t cc bng thng qua cu lnh truy
vn d liu.
Hnh 3.3 di y minh ho cho ta thy khung nhn c tn DSSV c nh
ngha thng qua cu lnh SELECT truy vn d liu trn hai bng SINHVIEN v LOP:
SELECT masv,hodem,ten,
DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop
FROM sinhvien,lop
WHERE sinhvien.malop=lop.malop
Khi khung nhn DSSV c nh ngha, ta c th s dng cu lnh SELECT
truy vn d liu t khung nhn nh i vi cc bng. Khi trong cu truy vn xut
hin khung nhn, h qun tr c s d liu s da vo inh ngha ca khung nhn
chuyn yu cu truy vn d liu lin quan n khung nhn thnh yu cu tng t trn
cc bng c s v vic truy vn d liu c thc hin bi yu cu tng ng trn
cc bng.
Vic s dng khung nhn trong c s d liu em li cc li ch sau y:
Bo mt d liu: Ngi s dng c cp pht quyn trn cc khung nhn
vi nhng phn d liu m ngi s dng c php. iu ny hn ch c
phn no vic ngi s dng truy cp trc tip d liu.
82
Khoa CNTT - Trng HKH Hu Gio trnh SQL
n gin ho cc thao tc truy vn d liu: Mt khung nhn ng vai tr
nh l mt i tng tp hp d liu t nhiu bng khc nhau vo trong mt
bng. Nh vo , ngi s dng c th thc hin cc yu cu truy vn d
liu mt cch n gin t khung nhn thay v phi a ra nhng cu truy vn
phc tp.
Tp trung v n gin ho d liu: Thng qua khung nhn ta c th cung
cp cho ngi s dng nhng cu trc n gin, d hiu hn v d liu trong
c s d liu ng thi gip cho ngi s dng tp trung hn trn nhng
phn d liu cn thit.
c lp d liu: Mt khung nhn c th cho php ngi s dng c c
ci nhn v d liu c lp vi cu trc ca cc bng trong c s d liu cho
d cc bng c s c b thay i phn no v cu trc.

Hnh 3.3 Khung nhn DSSV vi d liu c ly t bng SINHVIEN v LOP
Tuy nhin, vic s dng khung nhn ng tn ti mt s nhc im sau:
n trn
khung nhn thnh nhng truy vn trn cc bng c s nn nu mt khung
view DSSV
Table LOP
Table SINHVIEN
-

c
Do h qun tr c s d liu thc hin vic chuyn i cc truy v
83
Khoa CNTT - Trng HKH Hu Gio trnh SQL
nhn c nh ngha bi mt truy vn phc tp th s dn n chi ph v mt
thi gian khi thc hin truy vn lin quan n khung nhn s ln.
Mc d thng qua khung nhn c th thc hin c thao tc b sung v cp
nht d liu cho bng c s nhng ch hn ch i vi nhng khu

ng nhn n

.4.1 To khung nhn
c s dng to ra khung nhn v c c php

lnh di y to khung nhn c tn DSSV t cu lnh SELECT truy
LOP
odem,ten,
DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop
v nu c h


gin. i vi nhng khung nhn phc tp th thng khng thc hin c;
hay ni cch khc l d liu trong khung nhn l ch c.
3
Cu lnh CREATE VIEW
nh sau:
CREATE VIEW tn_khung_nhn[(danh_sch_tn_ct)]
AS
cu_lnh_SELECT
V d 3.11: Cu
vn d liu t hai bng SINHVIEN v
CREATE VIEW dssv
AS
SELECT masv,h

FROM sinhvien,lop
WHERE sinhvien.malop=lop.malop
th in cu lnh:
SELECT * FROM dssv
ta c c kt qu nh sau:

84
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Nu trong cu lnh CREATE VIEW, ta khng ch nh danh sch cc tn ct
d trn
i,lop)
SELECT masv,hodem,ten,
GETDATE()),tenlop
=lop.malop
v cu h:
T * FROM dssv
h sau:

Khi to khung nhn vi cu lnh CREATE VIEW, ta cn phi lu mt s
ung nhn v tn ct trong khung nhn, cng ging nh bng, phi tun
buc v to ch mc cho khung nhn.
c s dng
ca khung nhn trong cc trng hp sau y:
cho khung nhn, tn cc ct trong khung nhn s chnh l tiu cc ct trong kt qu
ca cu lnh SELECT. Trong trng hp tn cc ct ca khung nhn c ch nh,
chng phi c cng s lng vi s lng ct trong kt qu ca cu truy vn.
V d 3.12: Cu lnh di y to khung nhn t cu truy vn tng t nh v
nhng c t tn cho cc ct trong khung nhn:
CREATE VIEW dssv(ma,ho,ten,tuo
AS

DATEDIFF(YY,ngaysinh,
FROM sinhvien,lop
WHERE sinhvien.malop
ln
SELEC
trong trng hp ny c kt qu n


nguyn tc sau:
Tn kh
theo qui tc nh danh.
Khng th qui nh rng
Cu lnh SELECT vi mnh COMPUTE ... BY khng
nh ngha khung nhn.
Phi t tn cho cc ct
85
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Trong kt qu ca cu lnh SELECT c t nht mt ct c sinh
ra bi mt biu thc (tc l khng phi l mt tn ct trong bng
c s) v ct khng c t tiu .
Tn ti hai ct trong kt qu ca cu lnh SELECT c cng tiu
ct.
V d 3.13: Cu lnh di y l cu lnh sai do ct th 4 khng xc nh c tn ct
CREATE VIEW tuoisinhvien
AS
SELECT masv,hodem,ten,DATEDIFF(YY,ngaysinh,GETDATE())
FROM sinhvien

3.4.2 Cp nht, b sung v xo d liu thng qua khung nhn
i vi mt s khung nhn, ta c th tin hnh thc hin cc thao tc cp nhp,
b sung v xo d liu. Thc cht, nhng thao tc ny s c chuyn thnh nhng
thao tc tng t trn cc bng c s v c tc ng n nhng bng c s.
V mt l thuyt, c th thc hin thao tc b sung, cp nht v xo, mt
khung nhn trc tin phi tho mn cc iu kin sau y:
Trong cu lnh SELECT nh ngha khung nhn khng c s dng t
kho DISTINCT, TOP, GROUP BY v UNION.
Cc thnh phn xut hin trong danh sch chn ca cu lnh SELECT phi
l cc ct trong cc bng c s. Trong danh sch chn khng c cha cc
biu thc tnh ton, cc hm gp.
Ngoi nhng iu kin trn, cc thao tc thay i n d liu thng qua khung
nhn cn phi m bo tho mn cc rng buc trn cc bng c s, tc l vn m bo
tnh ton vn d liu. V d di y s minh ho cho ta thy vic thc hin cc thao
tc b sung, cp nht v xo d liu thng qua khung nhn.

V d 3.14: Xt nh ngha hai bng DONVI v NHANVIEN nh sau:
CREATE TABLE donvi
(
madv INT PRIMARY KEY,
tendv NVARCHAR(30) NOT NULL,
dienthoai NVARCHAR(10) NULL,
)

CREATE TABLE nhanvien
(
86
Khoa CNTT - Trng HKH Hu Gio trnh SQL
manv NVARCHAR(10) PRIMARY KEY,
hoten NVARCHAR(30) NOT NULL,
ngaysinh DATETIME NULL,
diachi NVARCHAR(50) NULL,
madv INT FOREIGN KEY
REFERENCES donvi(madv)
ON DELETE CASCADE
ON UPDATE CASCADE
)
Gi s trong hai bng ny c d liu nh sau:

Bng DONVI

Bng NHANVIEN

Cu lnh di y nh ngha khung nhn NV1 cung cp cc thng tin v m nhn
vin, h tn v m n v nhn vin lm vic:
CREATE VIEW nv1
AS
SELECT manv,hoten,madv FROM nhanvien
Nu ta thc hin cu lnh
INSERT INTO nv1 VALUES('NV04','Le Thi D',1)
Mt bn ghi mi s c b sung vo bng NHANVIEN v d liu trong bng ny s
l:
Bn ghi mi
87
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Thng qua khung nhn ny, ta cng c th thc hin thao tc cp nht v xo d liu.
Chng hn, nu ta thc hin cu lnh:
DELETE FROM nv1 WHERE manv='NV04'
Th bn ghi tng ng vi nhn vin c m NV04 s b xo khi bng NHANVIEN

Nu trong danh sch chn ca cu lnh SELECT c s xut hin ca biu thc
tnh ton n gin, thao tc b sung d liu thng qua khung nhn khng th thc hin
c. Tuy nhin, trong trng hp ny thao tc cp nht v xo d liu vn c th c
kh nng thc hin c (hin nhin khng th cp nht d liu i vi mt ct c
c t mt biu thc tnh ton).
V d 3.15: Xt khung nhn NV2 c nh ngha nh sau:
CREATE VIEW nv2
AS
SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,madv
FROM nhanvien
i vi khung nhn NV2, ta khng th thc hin thao tc b sung d liu nhng c th
cp nht hoc xo d liu trn bng thng qua khung nhn ny. Cu lnh di y l
khng th thc hin c trn khung nhn NV2
INSERT INTO nv2(manv,hoten,madv)
VALUES('NV05','Le Van E',1)
Nhng cu lnh:
UPDATE nv2 SET hoten='Le Thi X' WHERE manv='NV04'
hoc cu lnh
DELETE FROM nv2 WHERE manv='NV04'
li c th thc hin c v c tc ng i vi d liu trong bng NHANVIEN.

Trong trng hp khung nhn c to ra t mt php ni (trong hoc ngoi)
trn nhiu bng, ta c th thc hin c thao tc b sung hoc cp nht d liu nu
thao tc ny ch c tc ng n ng mt bng c s (cu lnh DELETE khng th
thc hin c trong trng hp ny).
V d 3.16: Vi khung nhn c nh ngha nh sau:
CREATE VIEW nv3
AS
SELECT manv,hoten,ngaysinh,
diachi,nhanvien.madv AS noilamviec,
donvi.madv,tendv,dienthoai
88
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FROM nhanvien FULL OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
Cu lnh:
INSERT INTO nv3(manv,hoten,noilamviec)
VALUES('NV05','Le Van E',1)
s b sung thm vo bng NHANVIEN mt bn ghi mi. Hoc cu lnh:
INSERT INTO nv3(madv,tendv) VALUES(3,'P. Ke toan')
b sung thm vo bng DONVI mt bn ghi do c hai cu lnh ny ch c tc ng
n ng mt bng c s.
Cu lnh di y khng th thc hin c do c tc ng mt lc n hai bng c
s.
INSERT INTO nv3(manv,hoten,noilamviec,madv,tendv)
VALUES('NV05','Le Van E',1,3,'P. Ke toan')

3.4.3 Sa i khung nhn
Cu lnh ALTER VIEW c s dng nh ngha li khung nhn hin c
nhng khng lm thay i cc quyn c cp pht cho ngi s dng trc .
Cu lnh ny s dng tng t nh cu lnh CREATE VIEW v c c php nh sau:
ALTER VIEW tn_khung_nhn [(danh_sch_tn_ct)]
AS
Cu_lnh_SELECT

V d 3.17: Ta nh ngha khung nhn nh sau:
CREATE VIEW viewlop
AS
SELECT malop,tenlop,tenkhoa
FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa='Khoa Vt l
v c th nh ngha li khung nhn trn bng cu lnh:
ALTER VIEW view_lop
AS
SELECT malop,tenlop,hedaotao
FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa='Khoa Cng ngh thng tin'


89
Khoa CNTT - Trng HKH Hu Gio trnh SQL
3.4.4 Xo khung nhn
Khi mt khung nhn khng cn s dng, ta c th xo n ra khi c s d liu
thng qua cu lnh:
DROP VIEW tn_khung_nhn
Nu mt khung nhn b xo, ton b nhng quyn cp pht cho ngi s dng trn
khung nhn cng ng thi b xo. Do , nu ta to li khung nhn th phi tin hnh
cp pht li quyn cho ngi s dng.
V d 3.18: Cu lnh di y xo khung nhn VIEW_LOP ra khi c s d liu
DROP VIEW view_lop

Bi tp chng 3
3.1 S dng cu lnh CREATE TABLE to cc bng trong c s d liu nh s
di y (bn t la chn kiu d liu cho ph hp)

90
Khoa CNTT - Trng HKH Hu Gio trnh SQL
3.2 B sung rng buc thit lp gi tr mc nh bng 1 cho ct SOLUONG v bng
0 cho ct MUCGIAMGIA trong bng CHITIETDATHANG
3.3 B sung cho bng DONDATHANG rng buc kim tra ngy giao hng v ngy
chuyn hng phi sau hoc bng vi ngy t hng.
3.4 B sung rng buc cho bng NHANVIEN m bo rng mt nhn vin ch
c th lm vic trong cng ty khi 18 tui v khng qu 60 tui.
3.5 Vi cc bng to c, cu lnh:
DROP TABLE nhacungcap
c th thc hin c khng? Ti sao?
3.6 Cho khung nhn c nh ngha nh sau:
CREATE VIEW view_donhang
AS
SELECT dondathang.sohoadon,makhachhang,manhanvien,
ngaydathang,ngaygiaohang,ngaychuyenhang,
noigiaohang,mahang,
giaban,soluong,mucgiamgia
FROM dondathang INNER JOIN chitietdathang
ON dondathang.sohoadon = chitietdathang.sohoadon
a. C th thng qua khung nhn ny b sung d liu cho bng
DONDATHANG c khng?
b. C th thng qua khung nhn ny b sung d liu cho bng
CHITIETDATHANG c khng?
3.7 Vi khung nhn c nh ngha nh sau:
CREATE VIEW view_donhang
AS
SELECT dondathang.sohoadon,makhachhang,manhanvien,
ngaydathang,ngaygiaohang,ngaychuyenhang,
noigiaohang,mahang,
giaban*soluong as thanhtien,
mucgiamgia
FROM dondathang INNER JOIN chitietdathang
ON dondathang.sohoadon = chitietdathang.sohoadon
a. C th thng qua khung nhn ny xo hay cp nht d liu trong bng
DONDATHANG c khng?
b. C th thng qua khung nhn ny cp nht d liu trong bng
CHITIETDATHANG c khng?

91
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Li gii
3.1 To cc bng d liu:
CREATE TABLE nhacungcap
(
macongty NVARCHAR(10) NOT NULL
CONSTRAINT pk_nhacungcap
PRIMARY KEY(macongty),
tencongty NVARCHAR(40) NOT NULL,
tengiaodich NVARCHAR(30) NULL,
diachi NVARCHAR(60) NULL,
dienthoai NVARCHAR(20) NULL,
fax NVARCHAR(20) NULL,
email NVARCHAR(50) NULL
)

CREATE TABLE loaihang
(
maloaihang INT NOT NULL
CONSTRAINT pk_loaihang
PRIMARY KEY(maloaihang),
tenloaihang NVARCHAR(15) NOT NULL
)

CREATE TABLE mathang
(
mahang NVARCHAR(10) NOT NULL
CONSTRAINT pk_mathang
PRIMARY KEY(mahang),
tenhang NVARCHAR(50) NOT NULL,
macongty NVARCHAR(10) NULL ,
maloaihang INT NULL ,
soluong INT NULL,
donvitinh NVARCHAR(20) NULL ,
giahang MONEY NULL
)

CREATE TABLE nhanvien
(
manhanvien NVARCHAR(10) NOT NULL
92
Khoa CNTT - Trng HKH Hu Gio trnh SQL
CONSTRAINT pk_nhanvien
PRIMARY KEY(manhanvien),
ho NVARCHAR(20) NOT NULL ,
ten NVARCHAR(10) NOT NULL ,
ngaysinh DATETIME NULL ,
ngaylamviec DATETIME NULL ,
diachi NVARCHAR(50) NULL ,
dienthoai NVARCHAR(15) NULL ,
luongcoban MONEY NULL ,
phucap MONEY NULL
)

CREATE TABLE khachhang
(
makhachhang NVARCHAR(10) NOT NULL
CONSTRAINT pk_khachhang
PRIMARY KEY(makhachhang),
tencongty NVARCHAR(50) NOT NULL ,
tengiaodich NVARCHAR(30) NOT NULL ,
diachi NVARCHAR(50) NULL ,
email NVARCHAR(30) NULL ,
dienthoai NVARCHAR(15) NULL ,
fax NVARCHAR(15) NULL
)

CREATE TABLE dondathang
(
sohoadon INT NOT NULL
CONSTRAINT pk_dondathang
PRIMARY KEY(sohoadon),
makhachhang NVARCHAR(10) NULL ,
manhanvien NVARCHAR(10) NULL ,
ngaydathang SMALLDATETIME NULL ,
ngaygiaohang SMALLDATETIME NULL ,
ngaychuyenhang SMALLDATETIME NULL ,
noigiaohang NVARCHAR(50) NULL
)

CREATE TABLE chitietdathang
(
93
Khoa CNTT - Trng HKH Hu Gio trnh SQL
sohoadon INT NOT NULL ,
mahang NVARCHAR(10) NOT NULL ,
giaban MONEY NOT NULL ,
soluong SMALLINT NOT NULL ,
mucgiamgia REAL NOT NULL,
CONSTRAINT pk_chitietdathang
PRIMARY KEY(sohoadon,mahang)
)

Thit lp mi quan h gia cc bng
ALTER TABLE mathang
ADD
CONSTRAINT fk_mathang_loaihang
FOREIGN KEY (maloaihang)
REFERENCES loaihang(maloaihang)
ON DELETE CASCADE ON UPDATE CASCADE ,
CONSTRAINT fk_mathang_nhacungcap
FOREIGN KEY (macongty)
REFERENCES nhacungcap(macongty)
ON DELETE CASCADE ON UPDATE CASCADE

ALTER TABLE dondathang
ADD
CONSTRAINT fk_dondathang_khachhang
FOREIGN KEY (makhachhang)
REFERENCES khachhang(makhachhang)
ON DELETE CASCADE ON UPDATE CASCADE ,
CONSTRAINT fk_dondathang_nhanvien
FOREIGN KEY (manhanvien)
REFERENCES nhanvien(manhanvien)
ON DELETE CASCADE ON UPDATE CASCADE

ALTER TABLE chitietdathang
ADD
CONSTRAINT fk_chitiet_dondathang
FOREIGN KEY (sohoadon)
REFERENCES dondathang(sohoadon)
ON DELETE CASCADE ON UPDATE CASCADE ,
CONSTRAINT fk_chitiet_mathang
94
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FOREIGN KEY (mahang)
REFERENCES mathang(mahang)
ON DELETE CASCADE ON UPDATE CASCADE
3.2 ALTER TABLE chitietdathang
ADD
CONSTRAINT df_chitietdathang_soluong
DEFAULT(1) FOR soluong,
CONSTRAINT df_chitietdathang_mucgiamgia
DEFAULT(0) FOR Mucgiamgia
3.3 ALTER TABLE dondathang
ADD
CONSTRAINT chk_dondathang_ngay
CHECK (ngaygiaohang>=ngaydathang AND
ngaychuyenhang>=ngaydathang)
3.4 ALTER TABLE nhanvien
ADD
CONSTRAINT chk_nhanvien_ngaylamviec
CHECK (datediff(yy,ngaysinh,ngaylamviec)
BETWEEN 18 AND 60)
3.5 Cu lnh khng thc hin c do bng cn xo ang c tham chiu bi bng
MATHANG
3.6 a. Khng. b. Khng
3.7 a.C th cp nht nhng khng th xo b. C th c

_______________________________________
95
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 4 4
B B O O M M T T T TR RO ON NG G S SQ QL L

4.1 Cc khi nim
Bo mt l mt trong nhng yu t ng vai tr quan trng i vi s sng cn
ca c s d liu. Hu ht cc h qun tr c s d liu thng mi hin nay u cung
cp kh nng bo mt c s d liu vi nhng chc nng nh:
Cp pht quyn truy cp c s d liu cho ngi dng v cc nhm ngi
dng, pht hin v ngn chn nhng thao tc tri php ca ngi s dng
trn c s d liu.
Cp pht quyn s dng cc cu lnh, cc i tng c s d liu i vi
ngi dng.
Thu hi (hu b) quyn ca ngi dng.
Bo mt d liu trong SQL c thc hin da trn ba khi nim chnh sau y:
Ngi dng c s d liu (Database user): L i tng s dng c s d
liu, thc thi cc thao tc trn c s d liu nh to bng, truy xut d liu,...
Mi mt ngi dng trong c s d liu c xc nh thng qua tn ngi
dng (User ID). Mt tp nhiu ngi dng c th c t chc trong mt
nhm v c gi l nhm ngi dng (User Group). Chnh sch bo mt c
s d liu c th c p dng cho mi ngi dng hoc cho cc nhm
ngi dng.
Cc i tng c s d liu (Database objects): Tp hp cc i tng,
cc cu trc lu tr c s dng trong c s d liu nh bng, khung nhn,
th tc, hm c gi l cc i tng c s d liu. y l nhng i
tng cn c bo v trong chnh sch bo mt ca c s d liu.
c quyn (Privileges): L tp nhng thao tc c cp pht cho ngi
dng trn cc i tng c s d liu. Chng hn mt ngi dng c th truy
xut d liu trn mt bng bng cu lnh SELECT nhng c th khng th
thc hin cc cu lnh INSERT, UPDATE hay DELETE trn bng .
SQL cung cp hai cu lnh cho php chng ta thit lp cc chnh sch bo mt
trong c s d liu:
96
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Lnh GRANT: S dng cp pht quyn cho ngi s dng trn cc i
tng c s d liu hoc quyn s dng cc cu lnh SQL trong c s d
liu.
Lnh REVOKE: c s dng thu hi quyn i vi ngi s dng.

4.2 Cp pht quyn
Cu lnh GRANT c s dng cp pht quyn cho ngi dng hay nhm
ngi dng trn cc i tng c s d liu. Cu lnh ny thng c s dng trong
cc trng hp sau:
Ngi s hu i tng c s d liu mun cho php ngi dng khc
quyn s dng nhng i tng m anh ta ang s hu.
Ngi s hu c s d liu cp pht quyn thc thi cc cu lnh (nh
CREATE TABLE, CREATE VIEW,...) cho nhng ngi dng khc.

4.2.1 Cp pht quyn cho ngi dng trn cc i tng c s d liu
Ch c ngi s hu c s d liu hoc ngi s hu i tng c s d liu
mi c th cp pht quyn cho ngi dng trn cc i tng c s d liu. Cu lnh
GRANT trong trng hp ny c c php nh sau:
GRANT ALL [PRIVILEGES]| cc_quyn_cp_pht
[(danh_sch_ct)] ON tn_bng | tn_khung_nhn
|ON tn_bng | tn_khung_nhn [(danh_sch_ct)]
|ON tn_th_tc
|ON tn_hm
TO danh_sch_ngi_dng | nhm_ngi_dng
[WITH GRANT OPTION ]
Trong :
ALL [PRIVILEGES]
Cp pht tt c cc quyn cho ngi dng trn i
tng c s d liu c ch nh. Cc quyn c th
cp pht cho ngi dng bao gm:
i vi bng, khung nhn, v hm tr v d
liu kiu bng: SELECT, INSERT, DELETE,
UPDATE v REFERENCES.
i vi ct trong bng, khung nhn:
SELECT v UPDATE.
i vi th tc lu tr v hm v hng:
97
Khoa CNTT - Trng HKH Hu Gio trnh SQL
EXECUTE.
Trong cc quyn c cp n trn, quyn
REFERENCES c s dng nhm cho php to
kha ngoi tham chiu n bng cp pht.
cc_quyn_cp_pht
Danh sch cc quyn cn cp pht cho ngi dng
trn i tng c s d liu c ch nh. Cc quyn
c phn cch nhau bi du phy
tn_bng|tn_khung_nhn
Tn ca bng hoc khung nhn cn cp pht quyn.
danh_sch_ct
Danh sch cc ct ca bng hoc khung nhn cn cp
pht quyn.
tn_th_tc
Tn ca th tc c cp pht cho ngi dng.
tn_hm
Tn hm (do ngi dng nh ngha) c cp pht
quyn.
danh_sch_ngi_dng
Danh sch tn ngi dng nhn quyn c cp pht.
Tn ca cc ngi dng c phn cch nhau bi du
phy.
WITH GRANT OPTION
Cho php ngi dng chuyn tip quyn cho ngi
dng khc.
Cc v d di y s minh ho cho ta cch s dng cu lnh GRANT cp pht
quyn cho ngi dng trn cc i tng c s d liu.
V d 4.1: Cp pht cho ngi dng c tn thuchanh quyn thc thi cc cu lnh
SELECT, INSERT v UPDATE trn bng LOP
GRANT SELECT,INSERT,UPDATE
ON lop
TO thuchanh
Cho php ngi dng thuchanh quyn xem h tn v ngy sinh ca cc sinh vin (ct
HODEM,TEN v NGAYSINH ca bng SINHVIEN)
GRANT SELECT
(hodem,ten,ngaysinh) ON sinhvien
TO thuchanh
hoc:
GRANT SELECT
ON sinhvien(hodem,ten,ngaysinh)
TO thuchanh
98
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Vi quyn c cp pht nh trn, ngi dng thuchanh c th thc hin cu lnh sau
trn bng SINHVIEN
SELECT hoden,ten,ngaysinh
FROM sinhvien
Nhng cu lnh di y li khng th thc hin c
SELECT * FROM sinhvien
Trong trng hp cn cp pht tt c cc quyn c th thc hin c trn i tng
c s d liu cho ngi dng, thay v lit k cc cu lnh, ta ch cn s dng t kho
ALL PRIVILEGES (t kha PRIVILEGES c th khng cn ch nh). Cu lnh di
y cp pht cho ngi dng thuchanh cc quyn SELECT, INSERT, UPDATE,
DELETE V REFERENCES trn bng DIEMTHI
GRANT ALL
ON DIEMTHI
TO thuchanh

Khi ta cp pht quyn no cho mt ngi dng trn mt i tng c s d
liu, ngi dng c th thc thi cu lnh c cho php trn i tng cp pht.
Tuy nhin, ngi dng khng c quyn cp pht nhng quyn m mnh c php
cho nhng ngi s dng khc.Trong mt s trng hp, khi ta cp pht quyn cho
mt ngi dng no , ta c th cho php ngi chuyn tip quyn cho ngi
dng khc bng cch ch nh tu chn WITH GRANT OPTION trong cu lnh
GRANT.
V d 4.2: Cho php ngi dng thuchanh quyn xem d liu trn bng SINHVIEN
ng thi c th chuyn tip quyn ny cho ngi dng khc
GRANT SELECT
ON sinhvien
TO thuchanh
WITH GRANT OPTION

4.2.2 Cp pht quyn thc thi cc cu lnh
Ngoi chc nng cp pht quyn cho ngi s dng trn cc i tng c s d
liu, cu lnh GRANT cn c th s dng cp pht cho ngi s dng mt s quyn
trn h qun tr c s d liu hoc c s d liu. Nhng quyn c th cp pht trong
trng hp ny bao gm:
To c s d liu: CREATE DATEBASE.
To bng: CREATE RULE
To khung nhn: CREATE VIEW
99
Khoa CNTT - Trng HKH Hu Gio trnh SQL
To th tc lu tr: CREATE PROCEDURE
To hm: CREATE FUNCTION
Sao lu c s d liu: BACKUP DATABASE

Cu lnh GRANT s dng trong trng hp ny c c php nh sau:
GRANT ALL | danh_sch_cu_lnh
TO danh_sch_ngi_dng

V d 4.3: cp pht quyn to bng v khung nhn cho ngi dng c tn l
thuchanh, ta s dng cu lnh nh sau:
GRANT CREATE TABLE,CREATE VIEW
TO thuchanh

Vi cu lnh GRANT, ta c th cho php ngi s dng to cc i tng c s
d liu trong c s d liu. i tng c s d liu do ngi dng no to ra s do
ngi s hu v do ngi ny c quyn cho ngi dng khc s dng i tng
v cng c th xa b (DROP) i tng do mnh to ra.
Khc vi trng hp s dng cu lnh GRANT cp pht quyn trn i
tng c s d liu, cu lnh GRANT trong trng hp ny khng th s dng tu
chn WITH GRANT OPTION, tc l ngi dng khng th chuyn tip c cc
quyn thc thi cc cu lnh c cp pht.
4.3 Thu hi quyn
Cu lnh REVOKE c s dng thu hi quyn c cp pht cho ngi
dng. Tng ng vi cu lnh GRANT, cu lnh REVOKE c s dng trong hai
trng hp:
Thu hi quyn cp pht cho ngi dng trn cc i tng c s d liu.
Thu hi quyn thc thi cc cu lnh trn c s d liu cp pht cho ngi
dng.
4.3.1 Thu hi quyn trn i tng c s d liu:
C php cu lnh REVOKE s dng thu hi quyn cp pht trn i
tng c s d liu c c php nh sau:
REVOKE [GRANT OPTION FOR]
ALL [PRIVILEGES]| cc_quyn_cn_thu_hi
[(danh_sch_ct)] ON tn_bng | tn_khung_nhn
|ON tn_bng | tn_khung_nhn [(danh_sch_ct)]
100
Khoa CNTT - Trng HKH Hu Gio trnh SQL
|ON tn_th_tc
|ON tn_hm
FROM danh_sch_ngi_dng
[CASCADE]

Cu lnh REVOKE c th s dng thu hi mt s quyn cp pht cho
ngi dng hoc l thu hi tt c cc quyn (ALL PRIVILEGES).

V d 4.4: Thu hi quyn thc thi lnh INSERT trn bng LOP i vi ngi dng
thuchanh.
REVOKE INSERT
ON lop
FROM thuchanh
Gi s ngi dng thuchanh c cp pht quyn xem d liu trn cc ct
HODEM, TEN v NGAYSINH ca bng SINHVIEN, cu lnh di y s thu hi
quyn cp pht trn ct NGAYSINH (ch cho php xem d liu trn ct HODEM
v TEN)
REVOKE SELECT
ON sinhvien(ngaysinh)
FROM thuchanh

Khi ta s dng cu lnh REVOKE thu hi quyn trn mt i tng c s d
liu t mt ngi dng no , ch nhng quyn m ta cp pht trc mi c
thu hi, nhng quyn m ngi dng ny c cho php bi nhng ngi dng khc
vn cn c hiu lc. Ni cch khc, nu hai ngi dng khc nhau cp pht cng cc
quyn trn cng mt i tng c s d liu cho mt ngi dng khc, sau ngi
thu nht thu hi li quyn cp pht th nhng quyn m ngi dng th hai cp pht
vn c hiu lc.
V d 4.5: Gi s trong c s d liu ta c 3 ngi dng l A, B v C. A v B u c
quyn s dng v cp pht quyn trn bng R. A thc hin lnh sau cp pht quyn
xem d liu trn bng R cho C:
GRANT SELECT
ON R TO C
v B cp pht quyn xem v b sung d liu trn bng R cho C bng cu lnh:
GRANT SELECT, INSERT
ON R TO C
Nh vy, C c quyn xem v b sung d liu trn bng R. By gi, nu B thc hin
lnh:
101
Khoa CNTT - Trng HKH Hu Gio trnh SQL
REVOKE SELECT, INSERT
ON R FROM C
Ngi dng C s khng cn quyn b sung d liu trn bng R nhng vn c th xem
c d liu ca bng ny (quyn ny do A cp cho C v vn cn hiu lc).

Nu ta cp pht quyn cho ngi dng no bng cu lnh GRANT vi tu
chn WITH GRANT OPTION th khi thu hi quyn bng cu lnh REVOKE phi ch
nh tu chn CASCADE. Trong trng hp ny, cc quyn c chuyn tip cho
nhng ngi dng khc cng ng thi c thu hi.
V d 4.6: Ta cp pht cho ngi dng A trn bng R vi cu lnh GRANT nh sau:
GRANT SELECT
ON R TO A
WITH GRANT OPTION
sau ngi dng A li cp pht cho ngi dng B quyn xem d liu trn R vi cu
lnh:
GRANT SELECT
ON R TO B
Nu mun thu hi quyn cp pht cho ngi dng A, ta s dng cu lnh REVOKE
nh sau:
REVOKE SELECT
ON NHANVIEN
FROM A CASCADE
Cu lnh trn s ng thi thu hi quyn m A cp cho B v nh vy c A v B u
khng th xem c d liu trn bng R.

Trong trng hp cn thu hi cc quyn c chuyn tip v kh nng
chuyn tip cc quyn i vi nhng ngi c cp pht quyn vi tu chn
WITH GRANT OPTION, trong cu lnh REVOKE ta ch nh mnh GRANT
OPTION FOR.
V d 4.7: Trong v d trn, nu ta thay cu lnh:
REVOKE SELECT
ON NHANVIEN
FROM A CASCADE
bi cu lnh:
REVOKE GRANT OPTION FOR SELECT
ON NHANVIEN
FROM A CASCADE
102
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Th B s khng cn quyn xem d liu trn bng R ng thi A khng th chuyn tip
quyn m ta cp pht cho nhng ngi dng khc (tuy nhin A vn cn quyn xem
d liu trn bng R).

4.3.2 Thu hi quyn thc thi cc cu lnh:
Vic thu hi quyn thc thi cc cu lnh trn c s d liu (CREATE
DATABASE, CREATE TABLE, CREATE VIEW,...) c thc hin n gin vi cu
lnh REVOKE c c php:
REVOKE ALL | cc_cu_lnh_cn_thu_hi
FROM danh_sch_ngi_dng

V d 4.8: khng cho php ngi dng thuchanh thc hin lnh CREATE TABLE
trn c s d liu, ta s dng cu lnh:
REVOKE CREATE TABLE
FROM thuchanh

_______________________________________












103
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 5 5
T TH H T T C C L L U U T TR R , , H H M M V V T TR RI IG GG GE ER R

5.1 Th tc lu tr (stored procedure)
5.1.1 Cc khi nim
Nh cp cc chng trc, SQL c thit k v ci t nh l mt
ngn ng thc hin cc thao tc trn c s d liu nh to lp cc cu trc trong c
s d liu, b sung, cp nht, xo v truy vn d liu trong c s d liu. Cc cu lnh
SQL c ngi s dng vit v yu cu h qun tr c s d liu thc hin theo ch
tng tc.
Cc cu lnh SQL c th c nhng vo trong cc ngn ng lp trnh, thng
qua chui cc thao tc trn c s d liu c xc nh v thc thi nh vo cc cu
lnh, cc cu trc iu khin ca bn thn ngn ng lp trnh c s dng.
Vi th tc lu tr, mt phn no kh nng ca ngn ng lp trnh c a
vo trong ngn ng SQL. Mt th tc l mt i tng trong c s d liu bao gm
mt tp nhiu cu lnh SQL c nhm li vi nhau thnh mt nhm vi nhng kh
nng sau:
Cc cu trc iu khin (IF, WHILE, FOR) c th c s dng trong th
tc.
Bn trong th tc lu tr c th s dng cc bin nh trong ngn ng lp
trnh nhm lu gi cc gi tr tnh ton c, cc gi tr c truy xut c
t c s d liu.
Mt tp cc cu lnh SQL c kt hp li vi nhau thnh mt khi lnh
bn trong mt th tc. Mt th tc c th nhn cc tham s truyn vo cng
nh c th tr v cc gi tr thng qua cc tham s (nh trong cc ngn ng
lp trnh). Khi mt th tc lu tr c nh ngha, n c th c gi
thng qua tn th tc, nhn cc tham s truyn vo, thc thi cc cu lnh
SQL bn trong th tc v c th tr v cc gi tr sau khi thc hin xong.
S dng cc th tc lu tr trong c s d liu s gip tng hiu nng ca c s
d liu, mang li cc li ch sau:
n gin ho cc thao tc trn c s d liu nh vo kh nng module ho
cc thao tc ny.
104
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Th tc lu tr c phn tch, ti u khi to ra nn vic thc thi chng
nhanh hn nhiu so vi vic phi thc hin mt tp ri rc cc cu lnh SQL
tng ng theo cch thng thng.
Th tc lu tr cho php chng ta thc hin cng mt yu cu bng mt cu
lnh n gin thay v phi s dng nhiu dng lnh SQL. iu ny s lm
gim thiu s lu thng trn mng.
Thay v cp pht quyn trc tip cho ngi s dng trn cc cu lnh SQL
v trn cc i tng c s d liu, ta c th cp pht quyn cho ngi s
dng thng qua cc th tc lu tr, nh tng kh nng bo mt i vi h
thng.

5.1.2 To th tc lu tr
Th tc lu tr c to bi cu lnh CREATE PROCEDURE vi c php nh
sau:

CREATE PROCEDURE tn_th_tc [(danh_sch_tham_s)]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
AS
Cc_cu_lnh_ca_th_tc

Trong :
tn_th_tc
Tn ca th tc cn to. Tn phi tun theo qui tc
nh danh v khng c vt qu 128 k t.
danh_sch_tham_s
Cc tham s ca th tc c khai bo ngay sau tn
th tc v nu th tc c nhiu tham s th cc khai
bo phn cch nhau bi du phy. Khai bo ca
mi mt tham s ti thiu phi bao gm hai phn:
tn tham s c bt u bi du @.
kiu d liu ca tham s
V d:
@mamonhoc nvarchar(10)
RECOMPILE
Thng thng, th tc s c phn tch, ti u v
dch sn ln gi u tin. Nu tu chn WITH
RECOMPILE c ch nh, th tc s c dch
li mi khi c gi.
105
Khoa CNTT - Trng HKH Hu Gio trnh SQL
ENCRYPTION
Th tc s c m ho nu tu chn WITH
ENCRYPTION c ch nh. Nu th tc c
m ho, ta khng th xem c ni dung ca th
tc.
cc_cu_lnh_ca_th_tc
Tp hp cc cu lnh s dng trong ni dung th
tc. Cc cu lnh ny c th t trong cp t kho
BEGIN...END hoc c th khng.

V d 5.1: Gi s ta cn thc hin mt chui cc thao tc nh sau trn c s d liu
1. B sung thm mn hc c s d liu c m TI-005 v s n v hc
trnh l 5 vo bng MONHOC
2. Ln danh sch nhp im thi mn c s d liu cho cc sinh vin hc
lp c m C24102 (tc l b sung thm vo bng DIEMTHI cc bn ghi
vi ct MAMONHOC nhn gi tr TI-005, ct MASV nhn gi tr ln
lt l m cc sinh vin hc lp c m C24105 v cc ct im l
NULL).
Nu thc hin yu cu trn thng qua cc cu lnh SQL nh thng thng, ta phi thc
thi hai cu lnh nh sau:
INSERT INTO MONHOC
VALUES('TI-005','C s d liu',5)

INSERT INTO DIEMTHI(MAMONHOC,MASV)
SELECT TI-005,MASV
FROM SINHVIEN
WHERE MALOP='C24102'
Thay v phi s dng hai cu lnh nh trn, ta c th nh ngha mt th tc lu tr vi
cc tham s vo l @mamonhoc, @tenmonhoc, @sodvht v @malop nh sau:
CREATE PROC sp_LenDanhSachDiem(
@mamonhoc NVARCHAR(10),
@tenmonhoc NVARCHAR(50),
@sodvht SMALLINT,
@malop NVARCHAR(10))
AS
BEGIN
INSERT INTO monhoc
VALUES(@mamonhoc,@tenmonhoc,@sodvht)

INSERT INTO diemthi(mamonhoc,masv)
106
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SELECT @mamonhoc,masv
FROM sinhvien
WHERE malop=@malop
END
Khi th tc trn c to ra, ta c th thc hin c hai yu cu t ra trn mt
cch n gin thng qua li gi th tc:
sp_LenDanhSachDiem 'TI-005','C s d liu',5,'C24102'

5.1.3 Li gi th tc lu tr
Nh thy v d trn, khi mt th tc lu tr c to ra, ta c th yu
cu h qun tr c s d liu thc thi th tc bng li gi th tc c dng:
tn_th_tc [danh_sch_cc_i_s]
S lng cc i s cng nh th t ca chng phi ph hp vi s lng v th t
ca cc tham s khi nh ngha th tc.
Trong trng hp li gi th tc c thc hin bn trong mt th tc khc, bn
trong mt trigger hay kt hp vi cc cu lnh SQL khc, ta s dng c php nh sau:
EXECUTE tn_th_tc [danh_sch_cc_i_s]
Th t ca cc i s c truyn cho th tc c th khng cn phi tun theo
th t ca cc tham s nh khi nh ngha th tc nu tt c cc i s c vit di
dng:
@tn_tham_s = gi_tr

V d 5.2: Li gi th tc v d trn c th vit nh sau:
sp_LenDanhSachDiem @malop='C24102',
@tenmonhoc='C s d liu',
@mamonhoc='TI-005',
@sodvht=5
5.1.4 S dng bin trong th tc
Ngoi nhng tham s c truyn cho th tc, bn trong th tc cn c th s
dng cc bin nhm lu gi cc gi tr tnh ton c hoc truy xut c t c s d
liu. Cc bin trong th tc c khai bo bng t kho DECLARE theo c php nh
sau:
DECLARE @tn_bin kiu_d_liu
Tn bin phi bt u bi k t @ v tun theo qui tc v nh danh. V d di
y minh ho vic s dng bin trong th tc

107
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 5.3: Trong nh ngha ca th tc di y s dung cc bin cha cc gi tr truy
xut c t c s d liu.
CREATE PROCEDURE sp_Vidu(
@malop1 NVARCHAR(10),
@malop2 NVARCHAR(10))
AS
DECLARE @tenlop1 NVARCHAR(30)
DECLARE @namnhaphoc1 INT
DECLARE @tenlop2 NVARCHAR(30)
DECLARE @namnhaphoc2 INT

SELECT @tenlop1=tenlop,
@namnhaphoc1=namnhaphoc
FROM lop WHERE malop=@malop1

SELECT @tenlop2=tenlop,
@namnhaphoc2=namnhaphoc
FROM lop WHERE malop=@malop2

PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)
print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)

IF @namnhaphoc1=@namnhaphoc2
PRINT 'Hai lp nhp hc cng nm'
ELSE
PRINT 'Hai lp nhp hc khc nm'

5.1.5 Gi tr tr v ca tham s trong th tc lu tr
Trong cc v d trc, nu i s truyn cho th tc khi c li gi n th tc l
bin, nhng thay i gi tr ca bin trong th tc s khng c gi li khi kt thc
qu trnh thc hin th tc.

V d 5.4: Xt cu lnh sau y
CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT)
AS
SELECT @c=@a+@b
Nu sau khi to th tc vi cu lnh trn, ta thc thi mt tp cc cu lnh nh sau:
DECLARE @tong INT
108
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong
SELECT @tong
Cu lnh SELECT @tong cui cng trong lot cc cu lnh trn s cho kt qu l: 0

Trong trng hp cn phi gi li gi tr ca i s sau khi kt thc th tc, ta
phi khai bo tham s ca th tc theo c php nh sau:
@tn_tham_s kiu_d_liu OUTPUT
hoc:
@tn_tham_s kiu_d_liu OUT
v trong li gi th tc, sau i s c truyn cho th tc, ta cng phi ch nh thm
t kho OUTPUT (hoc OUT)

V d 5.5: Ta nh ngha li th tc v d 5.4 nh sau:
CREATE PROCEDURE sp_Conghaiso(
@a INT,
@b INT,
@c INT OUTPUT)
AS
SELECT @c=@a+@b
v thc hin li gi th tc trong mt tp cc cu lnh nh sau:
DECLARE @tong INT
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong OUTPUT
SELECT @tong
th cu lnh SELECT @tong s cho kt qu l: 300

5.1.6 Tham s vi gi tr mc nh
Cc tham s c khai bo trong th tc c th nhn cc gi tr mc nh. Gi
tr mc nh s c gn cho tham s trong trng hp khng truyn i s cho tham
s khi c li gi n th tc.
Tham s vi gi tr mc nh c khai bo theo c php nh sau:
@tn_tham_s kiu_d_liu = gi_tr_mc_nh

V d 5.6: Trong cu lnh di y:
CREATE PROC sp_TestDefault(
109
Khoa CNTT - Trng HKH Hu Gio trnh SQL
@tenlop NVARCHAR(30)=NULL,
@noisinh NVARCHAR(100)='Hu')
AS
BEGIN
IF @tenlop IS NULL
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh
ELSE
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh AND
tenlop=@tenlop
END
th tc sp_TestDefault c nh ngha vi tham s @tenlop c gi tr mc nh l
NULL v tham s @noisinh c gi tr mc nh l Hu. Vi th tc c nh ngha
nh trn, ta c th thc hin cc li gi vi cc mc ch khc nhau nh sau:
Cho bit h tn ca cc sinh vin sinh ti Hu:
sp_testdefault
Cho bit h tn ca cc sinh vin lp Tin K24 sinh ti Hu:
sp_testdefault @tenlop='Tin K24'
Cho bit h tn ca cc sinh vin sinh ti Ngh An:
sp_testDefault @noisinh=N'Ngh An'
Cho bit h tn ca cc sinh vin lp Tin K26 sinh ti Nng:
sp_testdefault @tenlop='Tin K26',@noisinh=' Nng'

5.1.7 Sa i th tc
Khi mt th tc c to ra, ta c th tin hnh nh ngha li th tc bng
cu lnh ALTER PROCEDURE c c php nh sau:

ALTER PROCEDURE tn_th_tc [(danh_sch_tham_s)]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
AS
Cc_cu_lnh_Ca_th_tc

110
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Cu lnh ny s dng tng t nh cu lnh CREATE PROCEDURE. Vic sa i li
mt th tc c khng lm thay i n cc quyn cp pht trn th tc cng nh
khng tc ng n cc th tc khc hay trigger ph thuc vo th tc ny.

5.1.8 Xo th tc
xo mt th tc c, ta s dng cu lnh DROP PROCEDURE vi c
php nh sau:
DROP PROCEDURE tn_th_tc
Khi xo mt th tc, tt c cc quyn cp cho ngi s dng trn th tc cng
ng thi b xo b. Do , nu to li th tc, ta phi tin hnh cp pht li cc quyn
trn th tc .

5.2 Hm do ngi dng nh ngha
Hm l i tng c s d liu tng t nh th tc. im khc bit gia hm
v th tc l hm tr v mt gi tr thng qua tn hm cn th tc th khng. iu ny
cho php ta s dng hm nh l mt thnh phn ca mt biu thc (chng hn trong
danh sch chn ca cu lnh SELECT).
Ngoi nhng hm do h qun tr c s d liu cung cp sn, ngi s dng c
th nh ngha thm cc hm nhm phc v cho mc ch ring ca mnh.
5.2.1 nh ngha v s dng hm
Hm c nh ngha thng qua cu lnh CREATE FUNCTION vi c php
nh sau:

CREATE FUNCTION tn_hm ([danh_sch_tham_s])
RETURNS (kiu_tr_v_ca_hm)
AS
BEGIN
cc_cu_lnh_ca_hm
END

V d 5.7: Cu lnh di y nh ngha hm tnh ngy trong tun (th trong tun) ca
mt gi tr kiu ngy
CREATE FUNCTION thu(@ngay DATETIME)
RETURNS NVARCHAR(10)
AS
BEGIN
111
Khoa CNTT - Trng HKH Hu Gio trnh SQL
DECLARE @st NVARCHAR(10)
SELECT @st=CASE DATEPART(DW,@ngay)
WHEN 1 THEN 'Chu nht'
WHEN 2 THEN 'Th hai'
WHEN 3 THEN 'Th ba'
WHEN 4 THEN 'Th t'
WHEN 5 THEN 'Th nm'
WHEN 6 THEN 'Th su'
ELSE 'Th by'
END
RETURN (@st) /* Tr tr v ca hm */
END

Mt hm khi c nh ngha c th c s dng nh cc hm do h qun
tr c s d liu cung cp (thng thng trc tn hm ta phi ch nh thm tn ca
ngi s hu hm)

V d 5.8: Cu lnh SELECT di y s dng hm c nh ngha v d trc:
SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh
FROM sinhvien
WHERE malop=C24102
c kt qu l:

5.2.2 Hm vi gi tr tr v l d liu kiu bng
Ta bit c chc nng cng nh s tin li ca vic s dng cc khung nhn
trong c s d liu. Tuy nhin, nu cn phi s dng cc tham s trong khung nhn
(chng hn cc tham s trong mnh WHERE ca cu lnh SELECT) th ta li khng
th thc hin c. iu ny phn no lm gim tnh linh hot trong vic s dng
khung nhn.
112
Khoa CNTT - Trng HKH Hu Gio trnh SQL

V d 5.9: Xt khung nhn c nh ngha nh sau:
CREATE VIEW sinhvien_k25
AS
SELECT masv,hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE khoa=25
vi khung nhn trn, thng qua cu lnh:
SELECT * FROM sinhvien_K25
ta c th bit c danh sch cc sinh vin kho 25 mt cch d dng nhng r rng
khng th thng qua khung nhn ny bit c danh sch sinh vin cc kho khc
do khng th s dng iu kin c dng KHOA = @thamso trong mnh WHERE
ca cu lnh SELECT c.

Nhc im trn ca khung nhn c th khc phc bng cch s dng hm vi
gi tr tr v di dng bng v c gi l hm ni tuyn (inline function). Vic s
dng hm loi ny cung cp kh nng nh khung nhn nhng cho php chng ta s
dng c cc tham s v nh tnh linh hot s cao hn.
Mt hm ni tuyn c nh ngha bi cu lnh CREATE TABLE vi c php
nh sau:

CREATE FUNCTION tn_hm ([danh_sch_tham_s])
RETURNS TABLE
AS
RETURN (cu_lnh_select)

C php ca hm ni tuyn phi tun theo cc qui tc sau:
Kiu tr v ca hm phi c ch nh bi mnh RETURNS TABLE.
Trong phn thn ca hm ch c duy nht mt cu lnh RETURN xc nh
gi tr tr v ca hm thng qua duy nht mt cu lnh SELECT. Ngoi ra,
khng s dng bt k cu lnh no khc trong phn thn ca hm.

V d 5.10: Ta nh ngha hm func_XemSV nh sau:
CREATE FUNCTION func_XemSV(@khoa SMALLINT)
RETURNS TABLE
AS
113
Khoa CNTT - Trng HKH Hu Gio trnh SQL
RETURN(SELECT masv,hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE khoa=@khoa)
hm trn nhn tham s u vo l kha ca sinh vin cn xem v gi tr tr v ca hm
l tp cc dng d liu cho bit thng tin v cc sinh vin ca kho . Cc hm tr v
gi tr di dng bng c s dng nh l cc bng hay khung nhn trong cc cu
lnh SQL.
Vi hm c nh ngha nh trn, bit danh sch cc sinh vin kho 25, ta s
dng cu lnh nh sau:
SELECT * FROM dbo.func_XemSV(25)
cn cu lnh di y cho ta bit c danh sch sinh vin kho 26
SELECT * FROM dbo.func_XemSV(26)

i vi hm ni tuyn, phn thn ca hm ch cho php s xut hin duy nht
ca cu lnh RETURN. Trong trng hp cn phi s dng n nhiu cu lnh trong
phn thn ca hm, ta s dng c php nh sau nh ngha hm:

CREATE FUNCTION tn_hm([danh_sch_tham_s])
RETURNS @bin_bng TABLE nh_ngha_bng
AS
BEGIN
cc_cu_lnh_trong_thn_hm
RETURN
END

Khi nh ngha hm dng ny cn lu mt s im sau:
Cu trc ca bng tr v bi hm c xc nh da vo nh ngha ca
bng trong mnh RETURNS. Bin @bin_bng trong mnh
RETURNS c phm vi s dng trong hm v c s dng nh l mt tn
bng.
Cu lnh RETURN trong thn hm khng ch nh gi tr tr v. Gi tr tr
v ca hm chnh l cc dng d liu trong bng c tn l @binbng c
nh ngha trong mnh RETURNS
Cng tng t nh hm ni tuyn, dng hm ny cng c s dng trong cc
cu lnh SQL vi vai tr nh bng hay khung nhn. V d di y minh ho cch s
dng dng hm ny trong SQL.

114
Khoa CNTT - Trng HKH Hu Gio trnh SQL
V d 5.11: Ta nh ngha hm func_TongSV nh sau:
CREATE FUNCTION Func_Tongsv(@khoa SMALLINT)
RETURNS @bangthongke TABLE
(
makhoa NVARCHAR(5),
tenkhoa NVARCHAR(50),
tongsosv INT
)
AS
BEGIN
IF @khoa=0
INSERT INTO @bangthongke
SELECT khoa.makhoa,tenkhoa,COUNT(masv)
FROM (khoa INNER JOIN lop
ON khoa.makhoa=lop.makhoa)
INNER JOIN sinhvien
on lop.malop=sinhvien.malop
GROUP BY khoa.makhoa,tenkhoa
ELSE
INSERT INTO @bangthongke
SELECT khoa.makhoa,tenkhoa,COUNT(masv)
FROM (khoa INNER JOIN lop
ON khoa.makhoa=lop.makhoa)
INNER JOIN sinhvien
ON lop.malop=sinhvien.malop
WHERE khoa=@khoa
GROUP BY khoa.makhoa,tenkhoa
RETURN /*Tr kt qu v cho hm*/
END
Vi hm c nh ngha nh trn, cu lnh:
SELECT * FROM dbo.func_TongSV(25)
S cho kt qu thng k tng s sinh vin kho 25 ca mi khoa:

115
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Cn cu lnh:
SELECT * FROM dbo.func_TongSV(0)
Cho ta bit tng s sinh vin hin c (tt c cc kho) ca mi khoa:

5.3 Trigger
Trong chng 4, ta bit cc rng buc c s dng m bo tnh ton
vn d liu trong c s d liu. Mt i tng khc cng thng c s dng trong
cc c s d liu cng vi mc ch ny l cc trigger. Cng tng t nh th tc lu
tr, mt trigger l mt i tng cha mt tp cc cu lnh SQL v tp cc cu lnh
ny s c thc thi khi trigger c gi. im khc bit gia th tc lu tr v trigger
l: cc th tc lu tr c thc thi khi ngi s dng c li gi n chng cn cc
trigger li c gi t ng khi xy ra nhng giao tc lm thay i d liu trong cc
bng.
Mi mt trigger c to ra v gn lin vi mt bng no trong c s d
liu. Khi d liu trong bng b thay i (tc l khi bng chu tc ng ca cc cu lnh
INSERT, UPDATE hay DELETE) th trigger s c t ng kch hot.
S dng trigger mt cch hp l trong c s d liu s c tc ng rt ln trong
vic tng hiu nng ca c s d liu. Cc trigger thc s hu dng vi nhng kh
nng sau:
Mt trigger c th nhn bit, ngn chn v hu b c nhng thao tc lm
thay i tri php d liu trong c s d liu.
Cc thao tc trn d liu (xo, cp nht v b sung) c th c trigger pht
hin ra v t ng thc hin mt lot cc thao tc khc trn c s d liu
nhm m bo tnh hp l ca d liu.
116
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Thng qua trigger, ta c th to v kim tra c nhng mi quan h phc
tp hn gia cc bng trong c s d liu m bn thn cc rng buc khng
th thc hin c.

5.3.1 nh ngha trigger
Mt trigger l mt i tng gn lin vi mt bng v c t ng kch hot
khi xy ra nhng giao tc lm thay i d liu trong bng. nh ngha mt trigger bao
gm cc yu t sau:
Trigger s c p dng i vi bng no?
Trigger c kch hot khi cu lnh no c thc thi trn bng: INSERT,
UPDATE, DELETE?
Trigger s lm g khi c kch hot?

Cu lnh CREATE TRIGGER c s dng inh ngha trigger v c c
php nh sau:
CREATE TRIGGER tn_trigger
ON tn_bng
FOR {[INSERT][,][UPDATE][,][DELETE]}
AS
[IF UPDATE(tn_ct)
[AND UPDATE(tn_ct)|OR UPDATE(tn_ct)]
...]
cc_cu_lnh_ca_trigger

V d 5.12: Ta nh ngha cc bng nh sau:
Bng MATHANG lu tr d liu v cc mt hng:
CREATE TABLE mathang
(
mahang NVARCHAR(5) PRIMARY KEY, /*m hng*/
tenhang NVARCHAR(50) NOT NULL, /*tn hng*/
soluong INT, /*s lng hng hin c*/
)
Bng NHATKYBANHANG lu tr thng tin v cc ln bn hng
CREATE TABLE nhatkybanhang
(
stt INT IDENTITY PRIMARY KEY,
ngay DATETIME, /*ngy bn hng*/
117
Khoa CNTT - Trng HKH Hu Gio trnh SQL
nguoimua NVARCHAR(30), /*tn ngi mua hng*/
mahang NVARCHAR(5) /*m mt hng c bn*/
FOREIGN KEY REFERENCES mathang(mahang),
soluong INT, /*gi bn hng*/
giaban MONEY /*s lng hng c bn*/
)
Cu lnh di y nh ngha trigger trg_nhatkybanhang_insert. Trigger ny c chc
nng t ng gim s lng hng hin c khi mt mt hng no c bn (tc l
khi cu lnh INSERT c thc thi trn bng NHATKYBANHANG).
CREATE TRIGGER trg_nhatkybanhang_insert
ON nhatkybanhang
FOR INSERT
AS
UPDATE mathang
SET mathang.soluong=mathang.soluong-inserted.soluong
FROM mathang INNER JOIN inserted
ON mathang.mahang=inserted.mahang
Vi trigger va to trn, nu d liu trong bng MATHANG l:

th sau khi ta thc hin cu lnh:
INSERT INTO nhatkybanhang
(ngay,nguoimua,mahang,soluong,giaban)
VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200)
d liu trong bng MATHANG s nh sau:

Trong cu lnh CREATE TRIGGER v d trn, sau mnh ON l tn ca
bng m trigger cn to s tc ng n. Mnh tip theo ch nh cu lnh s kch
hot trigger (FOR INSERT). Ngoi INSERT, ta cn c th ch nh UPDATE hoc
DELETE cho mnh ny, hoc c th kt hp chng li vi nhau. Phn thn ca
trigger nm sau t kho AS bao gm cc cu lnh m trigger s thc thi khi c kch
hot.
118
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Chun SQL nh ngha hai bng logic INSERTED v DELETED s dng
trong cc trigger. Cu trc ca hai bng ny tng t nh cu trc ca bng m trigger
tc ng. D liu trong hai bng ny tu thuc vo cu lnh tc ng ln bng lm kch
hot trigger; c th trong cc trng hp sau:
Khi cu lnh DELETE c thc thi trn bng, cc dng d liu b xo s
c sao chp vo trong bng DELETED. Bng INSERTED trong trng
hp ny khng c d liu.
D liu trong bng INSERTED s l dng d liu c b sung vo bng
gy nn s kch hot i vi trigger bng cu lnh INSERT. Bng
DELETED trong trng hp ny khng c d liu.
Khi cu lnh UPDATE c thc thi trn bng, cc dng d liu c chu s
tc ng ca cu lnh s c sao chp vo bng DELETED, cn trong bng
INSERTED s l cc dng sau khi c cp nht.

5.3.2 S dng mnh IF UPDATE trong trigger
Thay v ch nh mt trigger c kch hot trn mt bng, ta c th ch nh
trigger c kch hot v thc hin nhng thao tc c th khi vic thay i d liu ch
lin quan n mt s ct nht nh no ca ct. Trong trng hp ny, ta s dng
mnh IF UPDATE trong trigger. IF UPDATE khng s dng c i vi cu lnh
DELETE.
V d 5.13: Xt li v d vi hai bng MATHANG v NHATKYBANHANG, trigger
di y c kch hot khi ta tin hnh cp nht ct SOLUONG cho mt bn ghi ca
bng NHATKYBANHANG (lu l ch cp nht ng mt bn ghi)
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
UPDATE mathang
SET mathang.soluong = mathang.soluong
(inserted.soluong-deleted.soluong)
FROM (deleted INNER JOIN inserted ON
deleted.stt = inserted.stt) INNER JOIN mathang
ON mathang.mahang = deleted.mahang
Vi trigger v d trn, cu lnh:
UPDATE nhatkybanhang
SET soluong=soluong+20
WHERE stt=1
119
Khoa CNTT - Trng HKH Hu Gio trnh SQL
s kch hot trigger ng vi mnh IF UPDATE (soluong) v cu lnh UPDATE
trong trigger s c thc thi. Tuy nhin cu lnh:
UPDATE nhatkybanhang
SET nguoimua='Mai Hu Ton'
WHERE stt=3
li khng kch hot trigger ny.

Mnh IF UPDATE c th xut hin nhiu ln trong phn thn ca trigger.
Khi , mnh IF UPDATE no ng th phn cu lnh ca mnh s c thc
thi khi trigger c kch hot.
V d 5.14: Gi s ta nh ngha bng R nh sau:
CREATE TABLE R
(
A INT,
B INT,
C INT
)
v trigger trg_R_update cho bng R:
CREATE TRIGGER trg_R_test
ON R
FOR UPDATE
AS
IF UPDATE(A)
Print 'A updated'
IF UPDATE(C)
Print 'C updated'
Cu lnh:
UPDATE R SET A=100 WHERE A=1
s kch hot trigger v cho kt qu l:
A updated
v cu lnh:
UPDATE R SET C=100 WHERE C=2
cng kch hot trigger v cho kt qu l:
C updated
cn cu lnh:
UPDATE R SET B=100 WHERE B=3
hin nhin s khng kch hot trigger
120
Khoa CNTT - Trng HKH Hu Gio trnh SQL

5.3.3 ROLLBACK TRANSACTION v trigger
Mt trigger c kh nng nhn bit c s thay i v mt d liu trn bng d
liu, t c th pht hin v hu b nhng thao tc khng m bo tnh ton vn d
liu. Trong mt trigger, hu b tc dng ca cu lnh lm kch hot trigger, ta s
dng cu lnh
(1)
:
ROLLBACK TRANSACTION
V d 5.15: Nu trn bng MATHANG, ta to mt trigger nh sau:
CREATE TRIGGER trg_mathang_delete
ON mathang
FOR DELETE
AS
ROLLBACK TRANSACTION
Th cu lnh DELETE s khng th c tc dng i vi bng MATHANG. Hay ni
cch khc, ta khng th xo c d liu trong bng.

V d 5.16: Trigger di y c kch hot khi cu lnh INSERT c s dng b
sung mt bn ghi mi cho bng NHATKYBANHANG. Trong trigger ny kim tra
iu kin hp l ca d liu l s lng hng bn ra phi nh hn hoc bng s lng
hng hin c. Nu iu kin ny khng tho mn th hu b thao tc b sung d liu.
CREATE TRIGGER trg_nhatkybanhang_insert
ON NHATKYBANHANG
FOR INSERT
AS
DECLARE @sl_co int /* S lng hng hin c */
DECLARE @sl_ban int /* S lng hng c bn */
DECLARE @mahang nvarchar(5) /* M hng c bn */

SELECT @mahang=mahang,@sl_ban=soluong
FROM inserted

SELECT @sl_co = soluong
FROM mathang where mahang=@mahang

/*Nu s lng hng hin c nh hn s lng bn
th hu b thao tc b sung d liu */

(1)
Cch s dng v ngha ca cu lnh ROLLBACK TRANSACTION c bn lun chi tit chng 6.
121
Khoa CNTT - Trng HKH Hu Gio trnh SQL
IF @sl_co<@sl_ban
ROLLBACK TRANSACTION
/* Nu d liu hp l
th gim s lng hng hin c */
ELSE
UPDATE mathang
SET soluong=soluong-@sl_ban
WHERE mahang=@mahang

5.3.4 S dng trigger trong trng hp cu lnh INSERT, UPDATE v
DELETE c tc ng n nhiu dng d liu
Trong cc v d trc, cc trigger ch thc s hot ng ng mc ch khi cc
cu lnh kch hot trigger ch c tc dng i vi ng mt dng d liu. Ta c th
nhn thy l cu lnh UPDATE v DELETE thng c tc dng trn nhiu dng, cu
lnh INSERT mc d t ri vo trng hp ny nhng khng phi l khng gp; l
khi ta s dng cu lnh c dng INSERT INTO ... SELECT ... Vy lm th no
trigger hot ng ng trong trng hp nhng cu lnh c tc ng ln nhiu dng d
liu?
C hai gii php c th s dng i vi vn ny:
S dng truy vn con.
S dng bin con tr.

5.3.4.1 S dng truy vn con
Ta hnh dung vn ny v cch khc phc qua v d di y:
V d 5.17: Ta xt li trng hp ca hai bng MATHANG v NHATKYBANHANG
nh s di y:
122
Khoa CNTT - Trng HKH Hu Gio trnh SQL

Trigger di y cp nht li s lng hng ca bng MATHANG khi cu lnh
UPDATE c s dng cp nht ct SOLUONG ca bng NHATKYBANHANG.
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
UPDATE mathang
SET mathang.soluong = mathang.soluong
(inserted.soluong-deleted.soluong)
FROM (deleted INNER JOIN inserted ON
deleted.stt = inserted.stt) INNER JOIN mathang
ON mathang.mahang = deleted.mahang
Vi trigger c nh ngha nh trn, nu thc hin cu lnh:
UPDATE nhatkybanhang
SET soluong = soluong + 10
WHERE stt = 1
th d liu trong hai bng MATHANG v NHATKYBANHANG s l:



Bng MATHANG Bng NHATKYBANHANG
Tc l s lng ca mt hng c m H1 c gim i 10. Nhng nu thc hin tip
cu lnh:
UPDATE nhatkybanhang
SET soluong=soluong + 5
WHERE mahang='H2'
d liu trong hai bng sau khi cu lnh thc hin xong s nh sau:
123
Khoa CNTT - Trng HKH Hu Gio trnh SQL


Bng MATHANG Bng NHATKYBANHANG
Ta c th nhn thy s lng ca mt hng c m H2 cn li 40 (gim i 5) trong khi
ng ra phi l 35 (tc l phi gim 10). Nh vy, trigger trn khng hot ng ng
trong trng hp ny.
khc phc li gp phi nh trn, ta nh ngha li trigger nh sau:
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
UPDATE mathang
SET mathang.soluong = mathang.soluong -
(SELECT SUM(inserted.soluong-deleted.soluong)
FROM inserted INNER JOIN deleted
ON inserted.stt=deleted.stt
WHERE inserted.mahang = mathang.mahang)
WHERE mathang.mahang IN (SELECT mahang
FROM inserted)
hoc:
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
/* Nu s lng dng c cp nht bng 1 */
IF @@ROWCOUNT = 1
BEGIN
UPDATE mathang
SET mathang.soluong = mathang.soluong
(inserted.soluong-deleted.soluong)
FROM (deleted INNER JOIN inserted ON
deleted.stt = inserted.stt) INNER JOIN mathang
ON mathang.mahang = deleted.mahang
124
Khoa CNTT - Trng HKH Hu Gio trnh SQL
END
ELSE
BEGIN
UPDATE mathang
SET mathang.soluong = mathang.soluong -
(SELECT SUM(inserted.soluong-deleted.soluong)
FROM inserted INNER JOIN deleted
ON inserted.stt=deleted.stt
WHERE inserted.mahang = mathang.mahang)
WHERE mathang.mahang IN (SELECT mahang
FROM inserted)
END

5.3.4.2 S dng bin con tr
Mt cch khc khc phc li xy ra nh trong v d 5.17 l s dng con tr
duyt qua cc dng d liu v kim tra trn tng dng. Tuy nhin, s dng bin con
tr trong trigger l gii php nn chn trong trng hp thc s cn thit.
Mt bin con tr c s dng duyt qua cc dng d liu trong kt qu ca
mt truy vn v c khai bo theo c php nh sau:
DECLARE tn_con_tr CURSOR
FOR cu_lnh_SELECT
Trong cu lnh SELECT phi c kt qu di dng bng. Tc l trong cu lnh
khng s dng mnh COMPUTE v INTO.
m mt bin con tr ta s dng cu lnh:
OPEN tn_con_tr
s dng bin con tr duyt qua cc dng d liu ca truy vn, ta s dng cu
lnh FETCH. Gi tr ca bin trng thi @@FETCH_STATUS bng khng nu cha
duyt ht cc dng trong kt qu truy vn.
Cu lnh FETCH c c php nh sau:
FETCH [[NEXT|PRIOR|FIST|LAST] FROM] tn_con_tr
[INTO danh_sch_bin ]
Trong cc bin trong danh sch bin c s dng cha cc gi tr ca cc
trng ng vi dng d liu m con tr tr n. S lng cc bin phi bng vi s
lng cc ct ca kt qu truy vn trong cu lnh DECLARE CURSOR.

V d 5.18: Tp cc cu lnh trong v d di y minh ho cch s dng bin con tr
duyt qua cc dng trong kt qu ca cu lnh SELECT
125
Khoa CNTT - Trng HKH Hu Gio trnh SQL
DECLARE contro CURSOR
FOR SELECT mahang,tenhang,soluong FROM mathang
OPEN contro
DECLARE @mahang NVARCHAR(10)
DECLARE @tenhang NVARCHAR(10)
DECLARE @soluong INT
/*Bt u duyt qua cc dng trong kt qu truy vn*/
FETCH NEXT FROM contro
INTO @mahang,@tenhang,@soluong
WHILE @@FETCH_STATUS=0
BEGIN
PRINT 'Ma hang:'+@mahang
PRINT 'Ten hang:'+@tenhang
PRINT 'So luong:'+STR(@soluong)
FETCH NEXT FROM contro
INTO @mahang,@tenhang,@soluong
END
/*ng con tr v gii phng vng nh*/
CLOSE contro
DEALLOCATE contro

V d 5.19: Trigger di y l mt cch gii quyt khc ca trng hp c cp
v d 5.17
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
BEGIN
DECLARE @mahang NVARCHAR(10)
DECLARE @soluong INT

DECLARE contro CURSOR FOR
SELECT inserted.mahang,
inserted.soluong-deleted.soluong AS soluong
FROM inserted INNER JOIN deleted
ON inserted.stt=deleted.stt

OPEN contro
126
Khoa CNTT - Trng HKH Hu Gio trnh SQL
FETCH NEXT FROM contro INTO @mahang,@soluong
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE mathang SET soluong=soluong-@soluong
WHERE mahang=@mahang
FETCH NEXT FROM contro INTO @mahang,@soluong
END
CLOSE contro
DEALLOCATE contro
END
END

Bi tp chng 5

Da trn c s d liu bi tp chng 2, thc hin cc yu cu sau:
5.1 To th tc lu tr thng qua th tc ny c th b sung thm mt bn ghi mi
cho bng MATHANG (th tc phi thc hin kim tra tnh hp l ca d liu cn
b sung: khng trng kho chnh v m bo ton vn tham chiu)
5.2 To th tc lu tr c chc nng thng k tng s lng hng bn c ca mt
mt hng c m bt k (m mt hng cn thng k l tham s ca th tc).
5.3 Vit hm tr v mt bng trong cho bit tng s lng hng bn c ca mi
mt hng. S dng hm ny thng k xem tng s lng hng (hin c v
bn) ca mi mt hng l bao nhiu.
5.4 Vit trigger cho bng CHITIETDATHANG theo yu cu sau:
Khi mt bn ghi mi c b sung vo bng ny th gim s lng hng
hin c nu s lng hng hin c ln hn hoc bng s lng hng c
bn ra. Ngc li th hu b thao tc b sung.
Khi cp nht li s lng hng c bn, kim tra s lng hng c
cp nht li c ph hp hay khng (s lng hng bn ra khng c
vt qu s lng hng hin c v khng c nh hn 1). Nu d liu
hp l th gim (hoc tng) s lng hng hin c trong cng ty, ngc
li th hu b thao tc cp nht.
5.5 Vit trigger cho bng CHITIETDATHANG sao cho ch chp nhn gi hng
bn ra phi nh hn hoc bng gi gc (gi ca mt hng trong bng
MATHANG)

127
Khoa CNTT - Trng HKH Hu Gio trnh SQL
5.6 qun l cc bn tin trong mt Website, ngi ta s dng hai bng sau:
Bng LOAIBANTIN (loi bn tin)
CREATE TABLE loaibantin
(
maphanloai INT NOT NULL
PRIMARY KEY,
tenphanloai NVARCHAR(100) NOT NULL ,
bantinmoinhat INT DEFAULT(0)
)
Bng BANTIN (bn tin)
CREATE TABLE bantin
(
maso INT NOT NULL
PRIMARY KEY,
ngayduatin DATETIME NULL ,
tieude NVARCHAR(200) NULL ,
noidung NTEXT NULL ,
maphanloai INT NULL
FOREIGN KEY
REFERENCES loaibantin(maphanloai)
)
Trong bng LOAIBANTIN, gi tr ct BANTINMOINHAT cho bit m s ca
bn tin thuc loi tng ng mi nht (c b sung sau cng).
Hy vit cc trigger cho bng BANTIN sao cho:
Khi mt bn tin mi c b sung, cp nht li ct BANTINMOINHAT
ca dng tng ng vi loi bn tin va b sung.
Khi mt bn tin b xo, cp nht li gi tr ca ct BANTINMOINHAT
trong bng LOAIBANTIN ca dng ng vi loi bn tin va xa l m s
ca bn tin trc (da vo ngy a tin). Nu khng cn bn tin no
cng loi th gi tr ca ct ny bng 0.
Khi cp nht li m s ca mt bn tin v nu l bn tin mi nht th
cp nht li gi tr ct BANTINMOINHAT l m s mi.

Li gii:

5.1 CREATE PROCEDURE sp_insert_mathang(
@mahang NVARCHAR(10),
128
Khoa CNTT - Trng HKH Hu Gio trnh SQL
@tenhang NVARCHAR(50),
@macongty NVARCHAR(10) = NULL,
@maloaihang INT = NULL,
@soluong INT = 0,
@donvitinh NVARCHAR(20) = NULL,
@giahang money = 0)
AS
IF NOT EXISTS(SELECT mahang FROM mathang
WHERE mahang=@mahang)
IF (@macongty IS NULL OR EXISTS(SELECT macongty
FROM nhacungcap
WHERE macongty=@macongty))
AND
(@maloaihang IS NULL OR
EXISTS(SELECT maloaihang FROM loaihang
WHERE maloaihang=@maloaihang))
INSERT INTO mathang
VALUES(@mahang,@tenhang,
@macongty,@maloaihang,
@soluong,@donvitinh,@giahang)
5.2 CREATE PROCEDURE sp_thongkebanhang(@mahang NVARCHAR(10))
AS
SELECT mathang.mahang,tenhang,
SUM(chitietdathang.soluong) AS tongsoluong
FROM mathang LEFT OUTER JOIN chitietdathang
ON mathang.mahang=chitietdathang.mahang
WHERE mathang.mahang=@mahang
GROUP BY mathang.mahang,tenhang
5.3 nh ngha hm:
CREATE FUNCTION func_banhang()
RETURNS TABLE
AS
RETURN (SELECT mathang.mahang,tenhang,
CASE
WHEN sum(chitietdathang.soluong) IS NULL THEN 0
ELSE sum(chitietdathang.soluong)
END AS tongsl
FROM mathang LEFT OUTER JOIN chitietdathang
ON mathang.mahang = chitietdathang.mahang
129
Khoa CNTT - Trng HKH Hu Gio trnh SQL
GROUP BY mathang.mahang,tenhang)
S dng hm nh ngha:
SELECT a.mahang,a.tenhang,soluong+tongsl
FROM mathang AS a INNER JOIN dbo.func_banhang() AS b
ON a.mahang=b.mahang
5.4 CREATE TRIGGER trg_chitietdathang_insert
ON chitietdathang
FOR INSERT
AS
BEGIN
DECLARE @mahang NVARCHAR(100)
DECLARE @soluongban INT
DECLARE @soluongcon INT
SELECT @mahang=mahang,@soluongban=soluong
FROM inserted
SELECT @soluongcon=soluong FROM mathang
WHERE mahang=@mahang
IF @soluongcon>=@soluongban
UPDATE mathang SET soluong=soluong-@soluongban
WHERE mahang=@mahang
ELSE
ROLLBACK TRANSACTION
END

CREATE TRIGGER trg_chitietdathang_update_soluong
ON chitietdathang
FOR UPDATE
AS
IF UPDATE(soluong)
BEGIN
IF EXISTS(SELECT sohoadon FROM inserted WHERE soluong<0)
ROLLBACK TRANSACTION
ELSE
BEGIN
UPDATE mathang
SET soluong=soluong-
(SELECT SUM(inserted.soluong-deleted.soluong)
FROM inserted INNER JOIN deleted
ON inserted.sohoadon=deleted.sohoadon AND
130
Khoa CNTT - Trng HKH Hu Gio trnh SQL

inserted.mahang=deleted.mahang
WHERE inserted.mahang=mathang.mahang
GROUP BY inserted.mahang)
WHERE mahang IN (SELECT DISTINCT mahang
FROM inserted)
IF EXISTS(SELECT mahang FROM mathang
WHERE soluong<0)
ROLLBACK TRANSACTION
END
END
5.5 CREATE TRIGGER trg_chitietdathang_giaban
ON chitietdathang
FOR INSERT,UPDATE
AS
IF UPDATE(giaban)
IF EXISTS(SELECT inserted.mahang
FROM mathang INNER JOIN inserted
ON mathang.mahang=inserted.mahang
WHERE mathang.giahang>inserted.giaban)
ROLLBACK TRANSACTION

_______________________________________


131
Khoa CNTT - Trng HKH Hu Gio trnh SQL

C Ch h n ng g 6 6
G GI IA AO O T T C C S SQ QL L


6.1 Giao tc v cc tnh cht ca giao tc
Mt giao tc (transaction) l mt chui mt hoc nhiu cu lnh SQL c kt
hp li vi nhau thnh mt khi cng vic. Cc cu lnh SQL xut hin trong giao tc
thng c mi quan h tng i mt thit vi nhau v thc hin cc thao tc c lp.
Vic kt hp cc cu lnh li vi nhau trong mt giao tc nhm m bo tnh ton vn
d liu v kh nng phc hi d liu. Trong mt giao tc, cc cu lnh c th c lp
vi nhau nhng tt c cc cu lnh trong mt giao tc i hi hoc phi thc thi trn
vn hoc khng mt cu lnh no c thc thi.
Cc c s d liu s dng nht k giao tc (transaction log) ghi li cc thay
i m giao tc to ra trn c s d liu v thng qua c th phc hi d liu trong
trng hp gp li hay h thng c s c.
Mt giao tc i hi phi c c bn tnh cht sau y:
Tnh nguyn t (Atomicity): Mi thay i v mt d liu hoc phi c
thc hin trn vn khi giao tc thc hin thnh cng hoc khng c bt k s
thay i no v d liu xy ra nu giao tc khng thc hin c trn vn.
Ni cch khc, tc dng ca cc cu lnh trong mt giao tc phi nh l mt
cu lnh n.
Tnh nht qun (Consistency): Tnh nht quan i hi sau khi giao tc kt
thc, cho d l thnh cng hay b li, tt c d liu phi trng thi nht
qun (tc l s ton vn d liu phi lun c bo ton).
Tnh c lp (Isolation): Tnh c lp ca giao tc c ngha l tc dng ca
mi mt giao tc phi ging nh khi ch mnh n c thc hin trn chnh
h thng . Ni cch khc, mt giao tc khi c thc thi ng thi vi
nhng giao tc khc trn cng h thng khng chu bt k s nh hng no
ca cc giao tc .
Tnh bn vng (Durability): Sau khi mt giao tc thc hin thnh cng,
mi tc dng m n to ra phi tn ti bn vng trong c s d liu, cho
d l h thng c b li i chng na.

132
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SELECT
INSERT
UPDATE
DELETE
UPDATE
SELECT
INSERT
UPDATE
DELETE
SELECT
INSERT
UPDATE
Li chng
trnh!
Li phn cng!
R
O
L
L
B
A
C
K
R
O
L
L
B
A
C
K
Trng thi CSDL
trc khi giao tc
tin hnh
Trng thi CSDL
sau khi giao tc
tin hnh
Giao tc

Hnh 6.1: Giao tc SQL

6.2 M hnh giao tc trong SQL
Giao tc SQL c nh ngha da trn cc cu lnh x l giao tc sau y:
BEGIN TRANSACTION: Bt u mt giao tc
SAVE TRANSACTION: nh du mt v tr trong giao tc (gi l im
nh du).
ROLLBACK TRANSACTION: Quay lui tr li u giao tc hoc mt im
nh du trc trong giao tc.
COMMIT TRANSACTION: nh du im kt thc mt giao tc. Khi cu
lnh ny thc thi cng c ngha l giao tc thc hin thnh cng.
ROLLBACK [WORK]: Quay lui tr li u giao tc.
COMMIT [WORK]: nh du kt thc giao tc.
Mt giao tc trong SQL c bt u bi cu lnh BEGIN TRANSACTION.
Cu lnh ny nh du im bt u ca mt giao tc v c c php nh sau:
BEGIN TRANSACTION [tn_giao_tc]
Mt giao tc s kt thc trong cc trng hp sau:
133
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Cu lnh COMMIT TRANSACTION (hoc COMMIT WORK) c thc
thi. Cu lnh ny bo hiu s kt thc thnh cng ca mt giao tc. Sau cu
lnh ny, mt giao tc mi s c bt u.
Khi cu lnh ROLLBACK TRANSACTION (hoc ROLLBACK WORK)
c thc thi hu b mt giao tc v a c s d liu v trng thi nh
trc khi giao tc bt u. Mt giao tc mi s bt u sau khi cu lnh
ROLLBACK c thc thi.
Mt giao tc cng s kt thc nu trong qu trnh thc hin gp li (chng
hn h thng gp li, kt ni mng b t,...). Trong trng hp ny, h
thng s t ng phc hi li trng thi c s d liu nh trc khi giao tc
bt u (tng t nh khi cu lnh ROLLBACK c thc thi hu b mt
giao tc). Tuy nhin, trong trng hp ny s khng c giao tc mi c bt
u.

V d 6.1: Giao tc di y kt thc do lnh ROLLBACK TRANSACTION v mi
thay i v mt d liu m giao tc thc hin (UPDATE) u khng c tc dng.
BEGIN TRANSACTION giaotac1
UPDATE monhoc SET sodvht=4 WHERE sodvht=3
UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL
ROLLBACK TRANSACTION giaotac1
cn giao tc di y kt thc bi lnh COMMIT v thc hin thnh cng vic cp
nht d liu trn cc bng MONHOC v DIEMTHI.
BEGIN TRANSACTION giaotac2
UPDATE monhoc SET sodvht=4 WHERE sodvht=3
UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL
COMMIT TRANSACTION giaotac2

Cu lnh:
SAVE TRANSACTION tn_im_dnh_du
c s dng nh du mt v tr trong giao tc. Khi cu lnh ny c thc thi,
trng thi ca c s d liu ti thi im s c ghi li trong nht k giao tc.
Trong qu trnh thc thi giao tc c th quay tr li mt im nh du bng cch s
dng cu lnh:
ROLLBACK TRANSACTION tn_im_nh_du
Trong trng hp ny, nhng thay i v mt d liu m giao tc thc hin t im
nh du n trc khi cu lnh ROLLBACK c triu gi s b hu b. Giao tc s
c tip tc vi trng thi c s d liu c c ti im nh du . Hnh 6.2 m t
cho ta thy hot ng ca mt giao tc c s dng cc im nh du:
134
Khoa CNTT - Trng HKH Hu Gio trnh SQL

BEGIN TRANSACTION trans_example
INSERT
Trng thi CSDL
trc khi giao tc
tin hnh
Trng thi CSDL
sau khi giao tc
tin hnh
UPDATE
SAVE TRANSACTION a
UPDATE
SAVE TRANSACTION b
INSERT
UPDATE
ROLLBACK TRANSACTION b
UPDATE
SELECT
COMMIT TRANSACTION
Trng thi CSDL
ti im nh du a
Trng thi CSDL
ti im nh du b
Giao tc:
Bt u bi lnh
BEGIN
TRANSACTION
v kt thc bi
lnh COMMIT
TRANSACTION
Hnh 6.2: Hot ng ca mt giao tc

Sau khi cu lnh ROLLBACK TRANSACTION c s dng quay lui li
mt im nh du trong giao tc, giao tc vn c tip tc vi cc cu lnh sau .
Nhng nu cu lnh ny c s dng quay lui li u giao tc (tc l hu b giao
tc), giao tc s kt thc v do cu lnh COMMIT TRANSACTION trong trng
hp ny s gp li.
V d 6.2: Cu lnh COMMIT TRANSACTION trong giao tc di y kt thc
thnh cng mt giao tc
BEGIN TRANSACTION giaotac3
UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL
135
Khoa CNTT - Trng HKH Hu Gio trnh SQL
SAVE TRANSACTION a
UPDATE monhoc SET sodvht=4 WHERE sodvht=3
ROLLBACK TRANSACTION a
UPDATE monhoc SET sodvht=2 WHERE sodvht=3
COMMIT TRANSACTION giaotac3
v trong v d di y, cu lnh COMMIT TRANSACTION gp li:
BEGIN TRANSACTION giaotac4
UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL
SAVE TRANSACTION a
UPDATE monhoc SET sodvht=4 WHERE sodvht=3
ROLLBACK TRANSACTION giaotac4
UPDATE monhoc SET sodvht=2 WHERE sodvht=3
COMMIT TRANSACTION giaotac4
6.3 Giao tc lng nhau
Cc giao tc trong SQL c th c lng vo nhau theo tng cp. iu ny
thng gp i vi cc giao tc trong cc th tc lu tr c gi hoc t mt tin
trnh trong mt giao tc khc.
V d di y minh ho cho ta trng hp cc giao tc lng nhau.
V d 6.3: Ta nh ngha bng T nh sau:
CREATE TABLE T
(
A INT PRIMARY KEY,
B INT
)
v th tc sp_TransEx:
CREATE PROC sp_TranEx(@a INT,@b INT)
AS
BEGIN
BEGIN TRANSACTION T1
IF NOT EXISTS (SELECT * FROM T WHERE A=@A )
INSERT INTO T VALUES(@A,@B)
IF NOT EXISTS (SELECT * FROM T WHERE A=@A+1)
INSERT INTO T VALUES(@A+1,@B+1)
COMMIT TRANSACTION T1
END
Li gi n th tuch sp_TransEx c thc hin trong mt giao tc khc nh sau:
BEGIN TRANSACTION T3
136
Khoa CNTT - Trng HKH Hu Gio trnh SQL
EXECUTE sp_tranex 10,20
ROLLBACK TRANSACTION T3
Trong giao tc trn, cu lnh ROLLBACK TRANSACTION T3 hu b giao tc v do
tc dng ca li gi th tc trong giao tc khng cn tc dng, tc l khng c dng
d liu no mi c b sung vo bng T (cho d giao tc T1 trong th tc sp_tranex
thc hin thnh cng vi lnh COMMIT TRANSACTION T1).
Ta xt tip mt trng hp ca mt giao tc khc trong c li gi n th tc
sp_tranex nh sau:
BEGIN TRANSACTION
EXECUTE sp_tranex 20,40
SAVE TRANSACTION a
EXECUTE sp_tranex 30,60
ROLLBACK TRANSACTION a
EXECUTE sp_tranex 40,80
COMMIT TRANSACTION
sau khi giao tc trn thc hin xong, d liu trong bng T s l:
A B
20 40
21 41
40 80
41 81
Nh vy, tc dng ca li gi th tc sp_tranex 30,60 trong giao tc b hu b
bi cu lnh ROLLBACK TRANSACTION trong giao tc.
Nh thy trong v d trn, khi cc giao tc SQL c lng vo nhau, giao tc
ngoi cng nht l giao tc c vai tr quyt nh. Nu giao tc ngoi cng nht c u
thc (commit) th cc giao tc c lng bn trong cng ng thi u thc; V nu
giao tc ngoi cng nht thc hin lnh ROLLBACK th nhng giao tc lng bn trong
cng chu tc ng ca cu lnh ny (cho d nhng giao tc lng bn trong thc
hin lnh COMMIT TRANSACTION).

_______________________________________
137
Khoa CNTT - Trng HKH Hu Gio trnh SQL

P PH H L L C C

A. C s d liu mu s dng trong gio trnh
Trong ton b ni dung gio trnh, hu ht cc v d c da trn c s d
liu mu c m t di y. C s d liu ny c ci t trong h qun tr c s
d liu SQL Server 2000 v c s dng qun l sinh vin v im thi ca sinh
vin trong mt trng i hc. tin cho vic tra cu v kim chng i vi cc v
d, trong phn u ca ph lc chng ti gii thiu s qua v c s d liu ny.
C s d liu bao gm cc bng sau y:
Bng KHOA lu tr d liu v cc khoa hin c trong trng
Bng LOP bao gm d liu v cc lp trong trng
Bng SINHVIEN c s dng lu tr d liu v cc sinh vin trong
trng.
Bng MONHOC bao gm cc mn hc (hc phn) c ging dy trong
trng
Bng DIEMTHI vi d liu cho bit im thi kt thc mn hc ca cc sinh
vin
Mi quan h gia cc bng c th hin qua s di y



138
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Cc bng trong c s d liu, mi quan h gia chng v mt s rng buc c ci
t nh sau:
CREATE TABLE khoa
(
makhoa NVARCHAR(5) NOT NULL
CONSTRAINT pk_khoa PRIMARY KEY,
tenkhoa NVARCHAR(50) NOT NULL ,
dienthoai NVARCHAR(15) NULL
)

CREATE TABLE lop
(
malop NVARCHAR(10) NOT NULL
CONSTRAINT pk_lop PRIMARY KEY,
tenlop NVARCHAR(30) NULL ,
khoa SMALLINT NULL ,
hedaotao NVARCHAR(25) NULL ,
namnhaphoc INT NULL ,
siso INT NULL ,
makhoa NVARCHAR(5) NULL
)

CREATE TABLE sinhvien
(
masv NVARCHAR(10) NOT NULL
CONSTRAINT pk_sinhvien PRIMARY KEY,
hodem NVARCHAR(25) NOT NULL ,
ten NVARCHAR(10) NOT NULL ,
ngaysinh SMALLDATETIME NULL ,
gioitinh BIT NULL ,
noisinh NVARCHAR(100) NULL ,
malop NVARCHAR(10) NULL
)

CREATE TABLE monhoc
(
mamonhoc NVARCHAR(10) NOT NULL
CONSTRAINT pk_monhoc PRIMARY KEY,
tenmonhoc NVARCHAR(50) NOT NULL ,
139
Khoa CNTT - Trng HKH Hu Gio trnh SQL
sodvht SMALLINT NOT NULL
)

CREATE TABLE diemthi
(
mamonhoc NVARCHAR(10) NOT NULL ,
masv NVARCHAR(10) NOT NULL ,
diemlan1 NUMERIC(5, 2) NULL ,
diemlan2 NUMERIC(5, 2) NULL,
CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv)
)

ALTER TABLE lop
ADD
CONSTRAINT fk_lop_khoa
FOREIGN KEY(makhoa)
REFERENCES khoa(makhoa)
ON DELETE CASCADE
ON UPDATE CASCADE

ALTER TABLE sinhvien
ADD
CONSTRAINT fk_sinhvien_lop
FOREIGN KEY (malop)
REFERENCES lop(malop)
ON DELETE CASCADE
ON UPDATE CASCADE

ALTER TABLE diemthi
ADD
CONSTRAINT fk_diemthi_monhoc
FOREIGN KEY (mamonhoc)
REFERENCES monhoc(mamonhoc)
ON DELETE CASCADE
ON UPDATE CASCADE,

CONSTRAINT fk_diemthi_sinhvien
FOREIGN KEY (masv)
REFERENCES sinhvien(masv)
ON DELETE CASCADE
140
Khoa CNTT - Trng HKH Hu Gio trnh SQL
ON UPDATE CASCADE

ALTER TABLE monhoc
ADD
CONSTRAINT chk_monhoc_sodht
CHECK(sodvht>0 and sodvht<=5)

ALTER TABLE diemthi
ADD
CONSTRAINT chk_diemthi_diemlan1
CHECK (diemlan1>=0 and diemlan1<=10),
CONSTRAINT chk_diemthi_diemlan2
CHECK (diemlan2>=0 and diemlan2<=10)

B. Mt s hm thng s dng
Mc d trong SQL chun khng cung cp c th cc nhng trong cc h qun tr
c s d liu lun cung cp cho ngi s dng cc hm ci sn (hay cn gi l cc
hm ca h thng). Trong phn ny, chng ti cung cp mt s hm thng c s
dng trong SQL Server tin cho vic tra cu v s dng trong thc hnh
B.1 Cc hm trn d liu kiu chui
Hm ASCII
ASCII(string)
Hm tr v m ASCII ca k t u tin bn tri ca chui i s
Hm CHAR
CHAR(ascii_code)
Hm tr v k t c m ASCII tng ng vi i s
Hm CHARINDEX
CHARINDEX(string1,string2[,start])
Hm tr v v tr u tin tnh t v tr start ti chui string1 xut hin trong
chui string2.
Hm LEFT
LEFT(string,number)
Hm trch ra number k t t chui string tnh t pha bn tri
Hm LEN
LEN(string)
141
Khoa CNTT - Trng HKH Hu Gio trnh SQL
Hm tr v di ca chui string.
Hm LOWER
LOWER(string)
Hm c chc nng chuyn chui string thnh ch thng, kt qu c tr v
cho hm
Hm LTRIM
LTRIM(string)
Ct b cc khong trng tha bn tri chui string
Hm NCHAR
NCHAR(code_number)
Hm tr v k t UNICODE c m c ch nh
Hm REPLACE
REPLACE(string1,string2,string3)
Hm tr v mt chui c c bng cch thay th cc chui string2 trong chui
string1 bi chui string3.
Hm REVERSE
REVERSE(string)
Hm tr v chui o ngc ca chui string.
Hm RIGHT
RIGHT(string, number)
Hm trch ra number k t t chui string tnh t pha bn phi.
Hm RTRIM
RTRIM(string)
Ct b cc khong trng tha bn phi ca chui string.
Hm SPACE
SPACE(number)
Hm tr v mt chui vi number khong trng.
Hm STR
STR(number [,length [,decimal]])
Chuyn gi tr kiu s number thnh chui
Hm SUBSTRING
SUBSTRING(string, m, n)
Trch ra t n k t t chui string bt u t k t th m.
Hm UNICODE
142
Khoa CNTT - Trng HKH Hu Gio trnh SQL
UNICODE(UnicodeString)
Hm tr v m UNICODE ca k t u tin bn tri ca chui UnicodeString.
Hm UPPER
UPPER(string)
Chuyn chui string thnh ch hoa

B.2 Cc hm trn d liu kiu ngy gi
Hm DATEADD
DATEADD(datepart, number, date)
Hm tr v mt gi tr kiu DateTime bng cch cng thm mt khong gi tr
l number vo ngy date c ch nh. Trong , datepart l tham s ch nh thnh
phn s c cng i vi gi tr date bao gm:

Datepart Vit tt
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
hour hh
minute mi, n
second ss, s
millisecond ms
Hm DATEDIFF
DATEDIFF(datepart, startdate, enddate)
Hm tr v khong thi gian gia hai gi tr kiu ny c ch nh tu thuc
vo tham s datepart
Hm DATEPART
DATEPART(datepart, date)
Hm tr v mt s nguyn c trch ra t thnh phn (c ch nh bi tham
s partdate) trong gi tr kiu ngy c ch nh.
Hm GETDATE
GETDATE()
Hm tr v ngy hin ti
Hm DAY, MONTH, YEAR
143
Khoa CNTT - Trng HKH Hu Gio trnh SQL
DAY(date), MONTH(date), YEAR(date)
Hm tr v gi tr ngy (thng hoc nm) ca gi tr kiu ngy c ch nh.

B.3 Hm chuyn i kiu
Hm CAST
CAST (biu_thc AS kiu_d_liu)
Chuyn i gi tr ca biu thc sang kiu c ch nh
Hm CONVERT
CONVERT(kiu_d_liu, biu_thc [,kiu_chuyn_i])
Hm c chc nng chuyn i gi tr ca biu thc sang kiu d liu c ch
nh. Tham s kiu_chuyn_i l mt gi tr s thng c s dng khi chuyn i
gi tr kiu ngy sang kiu chui nhm qui nh khun dng d liu c hin th v
c qui nh nh sau:
Nm 2 ch s Nm 4 ch s Khun dng d liu
0 hoc 100 mon dd yyyy hh:mi AM (PM)
1 101 mm/dd/yy
2 102 yy.mm.dd
3 103 dd/mm/yy
4 104 dd.mm.yy
5 105 dd-mm-yy
6 106 dd mon yy
7 107 Mon dd, yy
8 108 hh:mm:ss
9 hoc 109 mon dd yyyy hh:mi:ss:mmmAM (PM)
10 110 mm-dd-yy
11 111 yy/mm/dd
12 112 yymmdd
13 hoc 113 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 hh:mi:ss:mmm(24h)
144
Khoa CNTT - Trng HKH Hu Gio trnh SQL
20 hoc 120 yyyy-mm-dd hh:mi:ss(24h)
21 hoc 121 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-dd Thh:mm:ss:mmm(no spaces)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM
V d: Cu lnh:
SELECT hodem,ten,
CONVERT(NVARCHAR(20),ngaysinh,101) AS ngaysinh
FROM sinhvien
cho kt qu l:

_______________________________________

145
Khoa CNTT - Trng HKH Hu Gio trnh SQL

T T I I L LI I U U T TH HA AM M K KH H O O

1. James R, Groff, Paul N.Weinberg, SQL: The Complete Reference, McGraw-
Hill/Osborne, 2002.
2. Diana Lorentz, SQL Reference, Oracle Corporation, 2001.
3. Marcilina S. Garcia, Jamie Reding, Edward Whalen, Steve Adrien DeLuca, SQL
Server 2000 Administrators Companion, Microsoft Press, 2000.
4. C. J. Date, Hugh Darwen, A Guide to the SQL Standard, Addison-Wesley
Publishing, 1992.

146

You might also like