Vous êtes sur la page 1sur 133

CHÖÔNG V

NGOÂN NGÖÕ ÑAÏI SOÁ QUAN HEÄ

5.1. Daãn nhaäp.

Ngoân ngöõ ñaïi soá quan heä laø ngoân ngöõ bieåu dieãn caâu hoûi veà caùc
quan heä.

Do caùc caùch bieåu dieãn khaùc nhau neân trong taøi lieäu naøy, ngoân
ngöõ ñaïi soá quan heä ñöôïc chia laøm 3 nhoùm: Caùc pheùp toaùn taäp hôïp -
caùc pheùp toaùn naøy ñöôïc bieåu dieãn nhö caùc pheùp toaùn treân taäp hôïp,
caùc pheùp toaùn quan heä vaø caùc pheùp toaùn khaùc lieân quan chuû yeáu ñeán
pheùp keát noái.

5.2. Caùc pheùp toaùn taäp hôïp treân caùc quan heä.

Saùu pheùp toaùn cô baûn treân taäp hôïp ñöôïc aùp duïng treân taäp caùc
boä giaù trò cuûa caùc quan heä, ñoù laø: Hôïp (Union), Hieäu (Minus), Giao
(Intersection), Tích Ñeà-caùc (Cartesian), pheùp chia (Division) vaø pheùp
buø (Complement).
Giaû thieát: U =  A1, A2, A3, ... An  laø taäp caùc thuoäc tính.
R vaø S laø 2 quan heä ñöôïc ñònh nghóa treân U coù cuøng thöù töï cuûa
caùc thuoäc tính. Vaø ôû ñaây chuùng ta luoân luoân giaû thieát laø R vaø S coù soá
löôïng höõu haïn caùc boä giaù trò.

5.2.1. Pheùp hôïp 2 quan heä (Union).

Hôïp cuûa hai quan heä R vaø S - ñöôïc kyù hieäu laø R  S - laø moät
quan heä Q xaùc ñònh treân taäp thuoäc tính U, coù cuøng thöù töï thuoäc tính
nhö trong quan heä R vaø S, ñöôïc ñònh nghóa nhö sau:
94
Q = R  S =  t / t  R hoaëc t  S 
Noùi moät caùch noâm na, hôïp cuûa 2 quan heä R vaø S laø moät quan
heä coù cuøng ngoâi vôùi quan heä R vaø S vôùi caùc boä giaù trò baèng goäp caùc
boä giaù trò cuûa caû R vaø S; nhöõng boä giaù trò truøng nhau chæ ñöôïc giöõ laïi 1
boä.

Ví duï 5.2.1:
Quan heä ÑônvòA coù caùc boä giaù trò sau:
MaõSoá Hoï-teân Phaùi Chöùc-danh Löông MaõÑV
100 Nguyeãn Vaên Nam Nam Giaùm ñoác 2.500.000 10
101 Hoaøng Thò Xuaân Nöõ Keá toaùn tröôûng 1.700.000 10
103 Ñaëng Ngoïc Chieán Nöõ Thö kyù 1.000.000 10
105 Phan Kyø Nhaân Nam Laùi xe 700.000 10

Quan heä ÑônvòB coù caùc boä giaù trò sau:


MaõSoá Hoï-teân Phaùi Chöùc-danh Löông MaõÑV
210 Nguyeãn Thò Cao Nöõ Tröôûng phoøng 1.200.000 30
101 Hoaøng Thò Xuaân Nöõ Keá toaùn tröôûng 1.700.000 10
221 Ñoã Höõu Ngoïc Nam Phoù phoøng 1.000.000 30
233 Hoaøng Thao Nam Chuyeân vieân 1.000.000 30

Hôïp cuûa hai quan heä treân cho keát quaû laø quan heä NV-CTy coù 7 boä giaù
trò sau:
MaõSoá Hoï-teân Phaùi Chöùc-danh Löông MaõÑV
100 Nguyeãn Vaên Nam Nam Giaùm ñoác 2.500.000 10
101 Hoaøng Thò Xuaân Nöõ Keá toaùn tröôûng 1.700.000 10
103 Ñaëng Ngoïc Chieán Nöõ Thö kyù 1.000.000 10
105 Phan Kyø Nhaân Nam Laùi xe 700.000 10
210 Nguyeãn Thò Cao Nöõ Tröôûng phoøng 1.200.000 30
221 Ñoã Höõu Ngoïc Nam Phoù phoøng 1.000.000 30
233 Hoaøng Thao Nam Chuyeân vieân 1.000.000 30

95
Boä giaù trò coù maõ soá nhaân vieân laø 101 xuaát hieän 2 laàn trong 2
quan heä ÑônvòA vaø ÑônvòB, nhöng trong quan heä NV-Cty boä naøy chæ
ñöôïc giöõ laïi 1 laàn, do ñoù chæ coøn 7 boä giaù trò.

5.2.2. Pheùp tröø hai quan heä (Minus).

Hieäu cuûa hai quan heä R vaø S, ñöôïc kyù hieäu laø R - S, laø moät
quan heä Q xaùc ñònh treân taäp thuoäc tính U, coù cuøng thöù töï thuoäc tính
nhö trong quan heä R vaø S, ñöôïc ñònh nghóa nhö sau:
Q = R - S =  t / t  R vaø t  S 
Noùi moät caùch noâm na, hieäu cuûa 2 quan heä R vaø S laø moät quan
heä coù cuøng ngoâi vôùi quan heä R vaø S vôùi caùc boä giaù trò laø caùc boä giaù trò
cuûa R sau khi ñaõ loaïi boû ñi caùc boä coù maët trong quan heä S.

Ví duï 5.2.2:
Vôùi hai quan heä nhö treân, hieäu cuûa ÑônvòA vaø ÑônvòB laø quan
heä NV-CtyA vôùi caùc boä sau:

MaõSoá Hoï-teân Phaùi Chöùc-danh Löông MaõÑV


100 Nguyeãn Vaên Nam Nam Giaùm ñoác 2.500.000 10
103 Ñaëng Ngoïc Chieán Nöõ Thö kyù 1.000.000 10
105 Phan Kyø Nhaân Nam Laùi xe 700.000 10

5.2.3. Giao cuûa 2 quan heä (Intersection).

Giao cuûa hai quan heä R vaø S, ñöôïc kyù hieäu laø R  S, laø moät
quan heä Q xaùc ñònh treân taäp thuoäc tính U, coù cuøng thöù töï thuoäc tính
nhö trong quan heä R vaø S, ñöôïc ñònh nghóa nhö sau:
Q = R  S =  t / t  R vaø t  S 

96
Noùi moät caùch noâm na, giao cuûa 2 quan heä R vaø S laø moät quan
heä coù cuøng ngoâi vôùi quan heä R vaø S vôùi caùc boä giaù trò laø caùc boä gioáng
nhau cuûa caû hai quan heä R vaø S.

Ví duï 5.2.3:
Vôùi hai quan heä nhö treân, hieäu cuûa ÑônvòA vaø ÑônvòB laø quan
heä NV-CtyA vôùi caùc boä sau:
MaõSoá Hoï-teân Phaùi Chöùc-danh Löông MaõÑV
101 Hoaøng Thò Xuaân Nöõ Keá toaùn tröôûng 1700.000 10

5.2.4. Tích Ñeà-caùc cuûa 2 quan heä (Cartesian).

R (A1, A2, ..., An) vaø S (B1, B2, ..., Bm) laø hai quan heä coù soá boä
giaù trò höõu haïn. Tích Ñeà-caùc cuûa hai quan heä R vaø S, ñöôïc kyù hieäu laø
R x S, laø moät quan heä Q xaùc ñònh treân taäp thuoäc tính cuûa R vaø S (vôùi
n + m thuoäc tính) vaø ñöôïc ñònh nghóa nhö sau:
Q = R x S =  t / t coù daïng (a1, a2, ..., an, b1, b2, ..., bm) trong ñoù
(a1, a2, ..., an)  R vaø (b1, b2, ..., bm)  S 

Noùi moät caùch noâm na, tích Ñeà-caùc cuûa 2 quan heä R vaø S laø moät
quan heä Q coù soá ngoâi baèng toång soá ngoâi cuûa R vaø S, vôùi caùc boä giaù trò
goàm 2 phaàn: phaàn beân traùi laø moät boä giaù trò cuûa R vaø phaàn beân phaûi
laø moät boä giaù trò cuûa S. Nhö vaäy, neáu R coù n1 boä giaù trò vaø S coù n2 boä
giaù trò, thì Q seõ coù n1 x n2 boä giaù trò.

Ví duï 5.2.4:
R (A B C) vaø S (D E F)
a1 b1 c1 d1 e1 f1
a2 b2 c2 d2 e2 f2
a3 b3 c3

97
R x S = Q (A B C D E F)
a1 b1 c1 d1 e1 f1
a1 b1 c1 d2 e2 f2
a2 b2 c2 d1 e1 f1
a2 b2 c2 d2 e2 f2
a3 b3 c3 d1 e1 f1
a3 b3 c3 d2 e2 f2

5.2.5. Pheùp chia hai quan heä (Division).

R laø quan heä n ngoâi vaø S laø quan heä m ngoâi (n > m vaø S  ),
coù m thuoäc tính chung (gioáng nhau veà maët ngöõ nghóa, hoaëc caùc thuoäc
tính coù theå so saùnh ñöôïc) giöõa R vaø S. Pheùp chia 2 quan heä R vaø S, kyù
hieäu laø RS, laø moät quan heä Q coù n - m ngoâi ñöôïc ñònh nghóa nhö sau:

Q = RS = { t / sc: uS, (t,u)  R }

Söû duïng ñònh nghóa pheùp tích Ñeà-caùc, coù theå ñònh nghóa pheùp
chia hình thöùc hôn nhö sau:
RS = Q sao cho Q x S  R (vôùi giaû thieát theâm laø thöù töï thuoäc
tính cuûa R, S, Q laø khoâng quan troïng).

Ví duï 5.2.5:

R (A, B, C, D) S (C, D) RS= (A, B)


a b c d c d a b
a b e f e f c d
b c e f
c d c d
c d e f
a b d e

98
Ví duï 5.2.6: (TS. Ñoàng Thò Bích Thuûy)
Cho quan heä veà khaû naêng laùi caùc loaïi maùy bay cuûa caùc phi
coâng:
KHAÛ-NAÊNG (Soá-hieäu-phi-coâng, Soá-hieäu-maùy-bay)

Soá-hieäu-phi-coâng Soá-hieäu-maùy-bay
32 102
30 101
30 103
32 103
33 100
30 102
31 102
30 100
31 100
Caâu hoûi: Cho bieát caùc phi coâng coù khaû naêng laùi ñöôïc caû 3 loaïi maùy
bay 100, 101, vaø 103 ?
Traû lôøi: Ñoù laø thöông cuûa pheùp chia quan heä KHAÛ-NAÊNG cho quan heä
MAÙY-BAY (Soá-hieäu-maùy-bay):

100
101
103

Vaø keát quaû laø quan heä PHI-COÂNG (Soá-hieäu-phi-coâng) coù 1 boä giaù trò (30).

5.2.6. Pheùp buø cuûa moät quan heä (Complement).

Cho quan heä R (A1, A2, ..., An) vôùi caùc mieàn giaù trò cuûa thuoäc
tính Ai laø MGT(Ai). Pheùp buø cuûa quan heä R laø quan heä Q xaùc ñònh
treân taäp thuoäc tính R+, kyù hieäu laø R, ñöôïc ñònh nghóa nhö sau:
Q = R =  t (a1, a2, ..., an) vaø ai  MGT(Ai) i=1.. n / t  R 
99
Nghóa laø taäp taát caû caùc boä giaù trò coù theå coù cuûa tích Ñeà-caùc
mieàn giaù trò MGT(Ai) nhöng chöa coù maët trong theå hieän cuûa quan heä
R. Quan heä buø cuûa moät quan heä coù soá löôïng boä giaù trò laø raát lôùn, vì
vaäy trong thöïc teá raát ít heä quaûn trò CSDL caøi ñaët pheùp toaùn naøy.

Ví duï 5.2.7:
Quan heä CUNG-CAÁP (Maõ-NCC, Haøng-hoùa) vôùi Maõ-NCC =  S1, S2, S3 
vaø caùc Haøng-hoùa cung caáp laø  Ñinh, OÁc, Vít 
Maõ-NCC Haøng-hoùa
S1 Ñinh
S1 Vít
S2 OÁc
S2 Ñinh
S3 Vít

Quan heä buø cuûa quan heä CUNG-CAÁP coù caùc boä giaù trò sau:

Maõ-NCC Haøng-hoùa
S1 OÁc
S2 Vít
S3 OÁc
S3 Ñinh

5.3. Caùc thao taùc cô sôû treân caùc quan heä

ÔÛ muïc treân chuùng ta ñaõ trình baøy moät caùch tieáp caän trong vieäc
hình thaønh ngoân ngöõ truy vaán döõ lieäu (Data Query Language) qua caùc
pheùp toaùn taäp hôïp treân caùc boä giaù trò cuûa caùc quan heä. Caùc pheùp toaùn
ñaëc bieät treân caùc quan heä sau ñaây laø moät caùch tieáp caän khaùc trong
vieäc bieåu dieãn caâu hoûi cuûa ngoân ngöõ ñaïi soá quan heä, chuùng cuõng coù

100
lieân quan chaët cheõ tôùi nhöõng thao taùc cô baûn Theâm (Insert), Söûa
(Update) vaø Xoùa (Delete) caùc boä giaù trò treân quan heä.

5.3.1. Pheùp chieáu (Projection)

Giaû söû R laø moät quan heä xaùc ñònh treân taäp thuoäc tính U =  A1,
A2, ..., An . X  U. Pheùp chieáu quan heä R treân taäp con caùc thuoäc tính
X laø moät quan heä Q xaùc ñònh treân taäp thuoäc tính X, kyù hieäu laø R [X],
ñöôïc ñònh nghóa nhö sau:

Q = R [X]  q / t  R: q = t.X 

Ñoâi khi ngöôøi ta coøn kyù hieäu pheùp chieáu quan heä R treân taäp
thuoäc tính X baèng X(R). Neáu X = Ai1, Ai2, ... Aim  thì coù theå vieát
cuï theå laø Ai1Ai2...Aim(R) [3].

Ngöõ nghóa: Trích töø R moät soá thuoäc tính naøo ñoù ñeå taïo thaønh
moät quan heä môùi. Soá ngoâi cuûa quan heä môùi naøy baèng soá thuoäc tính
cuûa taäp con X. Caùc boä giaù trò cuûa caùc coät ñöôïc trích neáu gioáng nhau
seõ ñöôïc loaïi boû ñeå chæ giöõ laïi moät boä duy nhaát (trong theå hieän cuûa
quan heä môùi khoâng coù 2 boä naøo gioáng nhau).

Pheùp chieáu ñöôïc bieåu dieãn baèng sô ñoà nhö sau:


Q

Hình 5.3.1. Sô ñoà bieåu dieãn pheùp chieáu

101
Ví duï 5.3.1:
Cho quan heä veà caùc nhaân vieân ñang laøm vieäc taïi moät Coâng ty
(EMPLOYEE) nhö sau:

Empno Name Job Salary Comm Deptno Sex


100 Wilson Clrk 1.700 10 M
101 Smith Slsm 2.500 1.300 40 F
103 Reed Anlt 3.500 30 M
105 Watson Mngr 4.500 0 30 M
109 Allen Mngr 3.800 8.000 40 F
110 Turner Clrk 1.800 50 M
200 Chen Mngr 2.900 10 F
210 Ramirez Mngr 3.600 50 M
213 McDonnel Clrk 1.625 60 M
214 Simpson Drvr 825 60 M
215 Di Salvo Spvr 2.700 60 M
220 Schwartz Slsm 4.200 5.300 40 F

Caâu hoûi: Haõy cho bieát caùc loaïi coâng vieäc maø caùc nhaân vieân cuûa
Cty ñang laøm?
Caâu traû lôøi: Chieáu quan heä EMPLOYEE leân thuoäc tính Job, chæ
giöõ laïi caùc giaù trò khaùc nhau. Keát quaû laø moät quan heä JOBEMPLOYEE =
EMPLOYEE [JOB] goàm 1 coät 6 doøng vôùi caùc giaù trò  Clrk, Slsm, Anlt,
Mngr, Drvr, vaø Spvr .

5.3.2. Pheùp choïn (Selection)

Pheùp choïn cho pheùp choïn löïa chæ nhöõng baûn ghi thoûa maõn moät
ñieàu kieän Ñ naøo ñoù ñeå ñöa vaøo quan heä keát quaû. Ñieàu kieän Ñ chính laø
moät bieåu thöùc loâgíc cho keát quaû hoaëc laø ñuùng (True) hoaëc laø sai
(False) khi ñaùnh giaù treân caùc boä giaù trò cuûa quan heä nguoàn; noù laø toå
hôïp cuûa caùc bieåu thöùc loâgic cô sôû. Moãi bieåu thöùc cô sôû chöùa moät pheùp
so saùnh: nhoû hôn (<), nhoû hôn hay baèng (<=), lôùn hôn (>), lôùn hôn hay
baèng (>=), baèng nhau (=) vaø khaùc ( hoaëc <>) coù daïng:
102
- Thuoäc tính so saùnh vôùi thuoäc tính.
- Thuoäc tính so saùnh vôùi haèng (literal)
Caùc bieåu thöùc loâgic cô sôû ñöôïc toå hôïp vôùi nhau bôûi caùc pheùp toaùn
loâgic: pheùp “vaø” loâgic - hay coøn goïi laø pheùp noái lieàn ( -
conjunction), pheùp “hoaëc” loâgic - hay coøn goïi laø pheùp noái rôøi ( -
disjunction) vaø pheùp phuû ñònh ( - not).

Giaû söû R (A1, A2, ... An) laø moät quan heä, vaø Ñ laø moät ñieàu kieän
(hoaëc coøn goïi laø moät phaùt bieåu) döïa treân taäp con thuoäc tính R+. Ñaùnh
giaù ñieàu kieän Ñ treân boä giaù trò t  R ñöôïc kyù hieäu laø E (tÑ) hoaëc ñeå
ñôn giaûn, ta coù theå vieát Ñ(t). Pheùp choïn caùc baûn ghi cuûa R thoûa maõn
ñieàu kieän Ñ laø moät quan heä Q coù cuøng ngoâi vôùi R, kyù hieäu laø R:Ñ,
ñöôïc ñònh nghóa hình thöùc nhö sau:

Q =  t  R / Ñ (t) = ñuùng 

Pheùp choïn cuõng coù theå ñöôïc kyù hieäu theo C.J.Date [3] bôûi daáu
sigma (): F(R).
Pheùp choïn ñöôïc bieåu dieãn baèng sô ñoà nhö sau:

Hình 5.3.2. Sô ñoà bieåu dieãn pheùp choïn

103
Ví duï 5.3.2:
Cuõng vôùi quan heä EMPLOYEE nhö trong ví duï 5.3.1, ñieàu kieän
choïn laø: “nhöõng ngöôøi laøm laõnh ñaïo caùc phoøng ban vaø coù möùc löông
thaùng töø 3.500 $ trôû leân”. Baèng ngoân ngöõ ñaïi soá qua heä vôùi pheùp toaùn
choïn, caâu hoûi ñöôïc dieãn ñaït nhö sau:

EMPLOYEE : (Job = Mngr)  (Salary >= 3500) .

Keát quaû laø moät quan heä goàm 3 doøng sau:

Empno Name Job Salary Comm Deptno Sex


105 Watson Mngr 4.500 30 M
109 Allen Mngr 3.800 8.000 40 F
210 Ramirez Mngr 3.600 50 M

5.3.3. Pheùp keát noái hai quan heä (Join)

Giaû söû coù 2 quan heä R (A1, A2, ..., An) vaø S (B1, B2, ..., Bm).
t = (a1, a2, ..., an) laø moät boä giaù trò cuûa R vaø u = (b1, b2, ..., bm) laø
moät boä giaù trò cuûa S. Goïi v laø boä gheùp noái u vaøo t (hay boä giaù trò t vaø u
ñöôïc “xeáp caïnh nhau” ñeå taïo thaønh boä giaù trò môùi v) ñöôïc ñònh nghóa
nhö sau:
v = (t, u) = (a1, a2, ..., an, b1, b2, ..., bm).
A  R+ vaø B  S+ laø hai thuoäc tính coù theå so saùnh ñöôïc.
Goïi  laø moät trong caùc pheùp toaùn so saùnh  <, <=, >, >=, =,  .
Pheùp keát noái hai quan heä (coù theå noùi taét laø pheùp keát) R vôùi S
treân caùc thuoäc tính A vaø B vôùi pheùp so saùnh , vôùi giaû thieát laø giaù trò
coät R[A] coù theå so saùnh ñöôïc (qua pheùp so saùnh ) vôùi moãi giaù trò cuûa
coät R[B], ñöôïc ñònh nghóa qua:
AB
R S =  v = (t, u)  t  R , u  S vaø t.A  u.B

104
Hoaëc:
AB
R S = (R x S) : (A  B).

Pheùp keát noái 2 quan heä R vaø S coù theå xem nhö ñöôïc thöïc hieän
qua 2 böôùc:
Böôùc 1: Thöïc hieän tích Ñeà-caùc hai quan heä R vaø S.
Böôùc 2: Choïn caùc boä giaù trò thoûa maõn ñieàu kieän A  B.

Ngöõ nghóa: Ñònh nghóa treân cho ta keát quaû cuûa pheùp keát noái hai
quan heä R vaø S vôùi pheùp so saùnh  treân 2 thuoäc tính A vaø B laø moät
quan heä môùi, Ñoù laø keát quaû cuoái cuøng cuûa pheùp toaùn quan heä (pheùp
Choïn) treân quan heä keát quaû cuûa pheùp toaùn taäp hôïp (tích Ñeà-caùc).

Neáu  laø pheùp toaùn so saùnh baèng nhau (=) thì ta goïi ñoù laø pheùp
keát noái baèng (Equi Join). Neáu caùc thuoäc tính so saùnh laø gioáng teân
nhau thì trong keát quaû cuûa pheùp keát noái seõ loaïi boû ñi moät trong 2
thuoäc tính ñoù, khi ñoù pheùp keát noái ñöôïc goïi laø pheùp keát noái töï nhieân
(Natural Join) vaø söû duïng kyù hieäu cho pheùp toaùn laø “ * “ hoaëc chæ kyù
hieäu (khoâng coù A  B) ôû phía treân cuûa pheùp toaùn. Trong caùc
tröôøng hôïp coøn laïi, pheùp toaùn ñöôïc goïi chung laø pheùp keát noái theta (-
Join).

Pheùp keát noái ñöôïc bieåu dieãn baèng sô ñoà nhö sau:
Q

AB

R S

Hình 5.3.3. Sô ñoà bieåu dieãn pheùp keát noái

105
Ví duï 5.3.3:
Cho 2 quan heä R vaø S vôùi caùc boä giaù trò cho trong baûng ôû coät
lôùn thöù nhaát vaø thöù hai beân traùi. Keát quaû pheùp keát noái theta (-Join)
cuûa 2 quan heä treân ñöôïc cho trong baûng ôû coät lôùn thöù ba döôùi ñaây:

R.B  S.C
R (A B C) S (C D E) R S =Q (A B C C D E)
a1 1 1 1 d1 e1 a1 1 1 1 d1 e1
a2 2 1 2 d2 e2 a2 2 1 1 d1 e1
a3 2 2 3 d3 e3 a2 2 1 2 d2 e2
a3 2 2 1 d1 e1
a3 2 2 2 d2 e2

Keát quaû pheùp keát noái töï nhieân cuûa 2 quan heä R vaø S laø quan heä
Q’ vôùi caùc boä giaù trò nhö sau:

R S = Q (A B C D E)
a1 1 1 d1 e1
a2 2 1 d1 e1
a3 2 2 d2 e2

Ví duï 5.3.4:
Cho CSDL veà caùn boä - vieân chöùc Nhaø nöôùc (CBVC) vôùi caùc
quan heä sau ñaây:
1. Quan heä ÑÔN-VÒ:
Maõ-ÑV Teân-ñôn-vò Loaïi
10002 Tröôøng Kyõ thuaät nghieäp vuï maùy tính 3
10003 Phoøng quaûn lyù haønh chaùnh 2
10022 Vaên phoønh ñaïi dieän Thanh nieân 2
10070 Ban quaûn lyù voán sinh vieân 5
10071 Löïc löôïng quaûn lyù thò tröôøng 5

106
2. Quan heä loaïi hình toå chöùc cuûa ñôn vò LOAI-ÑV:
Loaïi Teân-loaïi-hình
2 Haønh chaùnh
3 Söï nghieäp hoaøn toaøn
5 Haïch toaùn ñoäc laäp

3. Quan heä Ngaïch-CBVC:


Ngaïch Teân ngaïch
01002 Chuyeân vieân chính
01003 Chuyeân vieân
01004 Caùn söï
01005 Kyõ thuaät vieân ñaùnh maùy
01008 Nhaân vieân vaên thö
01010 Laùi xe cô quan

4. Quan heä Ngaïch-Baäc-löông:


Ngaïch Baäc Heä-soá-löông
01002 01 3.35
01002 02 3.63
01002 03 3.91
01003 05 2.82
01003 07 3.31
01003 08 3.56
01004 07 2.18
01004 08 2.30
01004 10 2.55
01004 11 2.68
01005 04 2.06
01005 05 2.18
01005 06 2.30
01008 11 2.12
01010 08 2.47
01010 11 2.80
01010 13 3.02

107
5. Quan heä danh saùch CBVC vôùi caùc boä giaù trò sau:

Maõ-ÑV Maõ-CC Hoï-loùt Teân Giôùi Ngaøy-sinh Ngaïch Baäc Ngaøy-xeáp


10002 1000028 Traàn Töù Haûi Nam 05/09/40 01003 08 01/12/96
10002 1000040 Traàn Ngoïc Sôn Nam 04/08/57 01003 05 01/12/97
10002 1000042 Nguyeãn Vaên Sang Nam 20/04/61 01004 10 01/01/97
10002 1000043 Nguyeãn Vaên Thaønh Nam 04/10/44 01004 10 01/01/97
10002 1000065 Huyønh Thò Hoa Nöõ 06/04/61 01004 07 01/01/97
10003 1000156 Huyønh Ngoïc Thuùy Nöõ 28/10/54 01005 06 01/09/97
10003 1000134 Nguyeãn Vaên Baïc Nam 08/09/42 01010 13 01/12/97
10003 1000159 Laâ Vaên Sang Nam 15/06/50 01008 11 01/03/96
10003 1000160 Trònh Ngoïc Taâm Nam 18/11/66 01010 08 01/02/96
10022 1000218 Nguyeãn Cöûu Chaâu Nam 19/11/47 01010 11 01/10/96
10022 1000219 Nguyeãn Vaên Huøng Nam 15/05/55 01003 05 01/12/95
10022 1000220 Nguyeãn Kim Löu Nöõ 22/07/55 01004 12 01/12/95

(Caùc quan heä 4 vaø 5 ñaõ ñöôïc neâu trong caùc ví duï 4.2.3 vaø 4.2.5
trong Chöông IV, muïc 4.2).
Pheùp keát noái töï nhieân 2 quan heä ÑÔN-VI vaø LOAÏI-ÑV laø moät
quan heä goàm 4 thuoäc tính: Maõ-ÑV, Teân-ñôn-vò, Loaïi vaø Teân-loaïi vôùi
caùc boä giaù trò sau:

Maõ-ÑV Teân-ñôn-vò Loaïi Teân-loaïi-hình


10002 Tröôøng Kyõ thuaät nghieäp vuï maùy tính 3 Söï nghieäp hoaøn toaøn
10003 Phoøng quaûn lyù haønh chaùnh 2 Haønh chaùnh
10022 Vaên phoønh ñaïi dieän Thanh nieân 2 Haønh chaùnh
10070 Ban quaûn lyù voán sinh vieân 5 Haïch toaùn ñoäc laäp
10071 Löïc löôïng quaûn lyù thò tröôøng 5 Haïch toaùn ñoäc laäp

 Ghi chuù : Baïn ñoïc caàn ghi nhaän laïi caùc quan heä trong ví duï
naøy. Chuùng seõ ñöôïc duøng laïi trong caùc chöông tôùi.

5.4. Caùc pheùp toaùn khaùc.

Muïc naøy trình baøy 3 pheùp toaùn keát noái môû roäng khaùc ñaëc bieät
quan troïng, maø baûn chaát cuûa chuùng vaãn laø keát noái. Chuùng ñaõ ñöôïc caøi
108
ñaët trong moät soá heä quan trò CSDL nhö MicroSoft Access, SQL-
Server, Oracle. Caùc pheùp keát noái ñoù laø: Keát noái noäi (Inner Join), Keát
noái traùi (Left Join) vaø Keát noái phaûi (Right Join).

5.4.1. Pheùp keát noái noäi (Inner Join).

Thöïc chaát laø pheùp keát noái baèng ñaõ trình baøy treân. Tuy nhieân,
ngay caû trong tröôøng hôïp hai thuoäc tính so saùnh coù cuøng teân thì keát
quaû pheùp keát noái vaãn giöõ laïi 2 teân thuoäc tính ñoù.

Ví duï 5.4.1.1:
Cho 2 quan heä R (A, B, C) vaø S (A, D, E, F) vôùi caùc boä giaù trò
nhö döôùi ñaây. Keát quaû cuûa pheùp keát noái noäi ñöôïc cho trong baûng phía
beân phaûi.
R.A = S.A
R (A B C) S (A D E F) R S =Q (A B C A D E F)
a1 b1 c1 a1 d1 e1 f1 a1 b1 1 a1 d1 e1 f1
a2 b2 c2 a2 d2 e2 f 2 a2 b2 c2 a2 d2 e2 f2
a3 b3 c3 a4 d4 e4 f 4 a7 b7 c7 a7 d7 e7 f7
a5 b5 c5 a6 d6 e6 f 6
a7 b7 c7 a7 d7 e7 f 7

Ví duï 5.4.1.2:
Pheùp keát noái noäi 2 quan heä ÑÔN-VÒ vaø LOAÏI-ÑV cho keát quaû
laø moät baûng sau:
Maõ-ÑV Teân-ñôn-vò Loaïi Loaïi Teân-loaïi-hình
10002 Tröôøng K.thuaät nghieäp vuï maùy tính 3 3 SN hoaøn toaøn
10003 Phoøng quaûn lyù haønh chaùnh 2 2 Haønh chaùnh
10022 Vaên phoønh ñaïi dieän Thanh nieân 2 2 Haønh chaùnh
10070 Ban quaûn lyù voán sinh vieân 5 5 Haïch toaùn ñ.laäp
10071 Löïc löôïng quaûn lyù thò tröôøng 5 5 Haïch toaùn ñ.laäp

109
5.4.2. Pheùp keát noái traùi (Left Join)

Giaû söû coù 2 quan heä R (A1, A2, ..., An) vaø S (B1, B2, ..., Bm).
t = (a1, a2, ..., an) vaø u = (b1, b2, ..., bm) laø hai boä giaù trò cuûa R vaø
S. Goïi v laø boä gheùp noái u vaøo t (hay boä giaù trò t vaø u ñöôïc “xeáp caïnh
nhau”) vaø kyù hieäu laø:
v = (t, u) = (a1, a2, ..., an, b1, b2, ..., bm).
Boä tNULL = (NULL, NULL, ..., NULL) laø moät boä ñaëc bieät cuûa R goàm n
giaù trò cuûa caùc thuoäc tính A1, A2, ..., An ñeàu laø khoâng xaùc ñònh vaø
uNULL = (NULL, NULL, ..., NULL) laø moät boä ñaëc bieät cuûa S goàm m giaù trò
cuûa caùc thuoäc tính B1, B2, ..., Bm ñeàu laø khoâng xaùc ñònh.

A  R+ vaø B  S+ laø hai thuoäc tính coù theå so saùnh ñöôïc.


Pheùp keát noái traùi hai quan heä R vôùi S treân caùc thuoäc tính A vaø
B vôùi pheùp so saùnh baèng ( = ), vôùi giaû thieát laø giaù trò coät R[A] coù theå
so saùnh töông ñöông ñöôïc vôùi moãi giaù trò cuûa coät S[B], ñöôïc ñònh
nghóa laø:
A=B
R S =  v = (t, u)  (t  R , u  S vaø t.A  u.B) hoaëc (t 
R, u = uNULL vôùi t.A S[B]) 

nghóa laø, taát caû caùc boä v coù ñöôïc nhôø caùch ñaët boä giaù trò cuûa R vaø S
xeáp caïnh nhau, neáu coù giaù trò gioáng nhau treân 2 thuoäc tính keát noái; vaø
caùc boä v coù ñöôïc nhôø caùch ñaët boä cuûa R vôùi caùc boä NULL cuûa S, neáu
khoâng tìm ñöôïc giaù trò töông öùng cuûa thuoäc tính keát noái treân quan heä
S.

Ví duï 5.4.2.1:
Vôùi hai quan heä R vaø S cuøng caùc boä giaù trò cuûa chuùng ñaõ ñöôïc
cho trong ví duï 5.4.1, keát quaû cuûa pheùp keát noái traùi cuûa R vaø S laø:

110
R.A = S.A
R S = Q (A B C A D E F)
a1 b1 1 a1 d1 e1 f1
a2 b2 c2 a2 d2 e2 f2
a3 b3 c3 - - - -
a5 b5 c5 - - - -
a7 b7 c7 a7 d7 e7 f7

Kyù hieäu daáu tröø (-) trong caùc thuoäc tính cuûa S ñöôïc hieåu laø giaù
trò khoâng xaùc ñònh (giaù trò Null).
Caùc doøng coù giaù trò thuoäc tính A cuûa R laø a3 vaø a5 khoâng tìm
ñöôïc giaù trò cuûa thuoäc tính A töông öùng trong quan heä S, neân phaàn
coøn laïi cuûa noù ñöôïc ñeå laø khoâng xaùc ñònh. Qua baûng keát quaû trình baøy
treân, chuùng ta thaáy yù nghóa cuûa pheùp toaùn naøy laø nhaèm xaùc ñònh caùc
boä giaù trò cuûa quan heä beân traùi nhöng khoâng coù boä giaù trò töông öùng
trong quan heä phía beân phaûi.

Ví duï 5.4.2.2:
Giaû söû chuùng ta theâm moät boä môùi cho baûng ÑÔN-VÒ goàm coù
Maõ-ÑV laø 10090, Teân-ñôn-vò laø Hoäi khuyeán noâng Quaän X vaø loaïi
hình ñôn vò laø 7. Khi ñoù pheùp keát noái traùi (Left Join) hai quan heä
ÑÔN-VÒ vaø LOAÏI-ÑV cho keát quaû laø quan heä coù theå hieän nhö sau:
Maõ-ÑV Teân-ñôn-vò Loaïi Loaïi Teân-loaïi-hình
10002 Tröôøng K.thuaät nghieäp vuï maùy tính 3 3 SN hoaøn toaøn
10003 Phoøng quaûn lyù haønh chaùnh 2 2 Haønh chaùnh
10022 Vaên phoønh ñaïi dieän Thanh nieân 2 2 Haønh chaùnh
10070 Ban quaûn lyù voán sinh vieân 5 5 Haïch toaùn ñ.laäp
10071 Löïc löôïng quaûn lyù thò tröôøng 5 5 Haïch toaùn ñ.laäp
10090 Hoäi khuyeán noâng Quaän X 7 Null Null

Bôûi vì trong quan heä LOAÏI-ÑV khoâng coù boä naøo coù giaù trò ôû coät
Loaïi laø 7, do ñoù ôû doøng cuoái cuøng cuûa quan heä treân, moät boä goàm toaøn

111
giaù trò NULL ôû caû hai coät Loaïi vaø Teân-loaïi-hình ñöôïc ñaët caïnh boä giaù
trò môùi ñöôïc boå sung trong theå hieän cuûa quan heä ÑÔN-VÒ.

ÖÙng duïng cuûa pheùp keát noái naøy coù theå thaáy roõ trong baøi toaùn
quaûn lyù CBVC neâu treân: Tröôùc heát caàn xaùc ñònh nhöõng ñôn vò coù loaïi
hình toå chöùc khoâng coù trong danh muïc Loaïi-ÑV. Caâu traû lôøi raát ñôn
giaûn: chæ vieäc choïn ra caùc doøng cuûa baûng keát noái coù giaù trò NULL ôû
coät Loaïi trong phaàn ñuoâi cuûa boä giaù trò laø NULL.

Cuõng trong baøi toaùn quaûn lyù CBVC neâu treân: Theo yeâu caàu
quaûn lyù, moãi CBVC coù teân trong danh saùch cuûa ñôn vò phaûi coù moät
baûn khai lyù lòch, töùc laø moät boä giaù trò veà lyù lòch chi tieát. Moãi CBVC coù
moät maõ soá CBVC ñeå phaân bieät vaø nhaän daïng ñoàng thôøi khoùa cuûa
quan heä lyù lòch cuõng laø maõ soá naøy. Coù theå öùng duïng pheùp keát noái traùi
ñeå xaùc ñònh nhöõng CBVC naøo coù teân trong danh saùch maø chöa coù lyù
lòch trong CSDL.

5.4.3. Pheùp keát noái phaûi (Right Join)

Vaãn vôùi caùc quan heä R, S; caùc thuoäc tính A, B; vaø caùc boä giaù trò
v, t, u, tNULL, uNULL ñöôïc xaùc ñònh nhö treân.
Pheùp keát noái phaûi hai quan heä R vôùi S treân caùc thuoäc tính A vaø
B vôùi pheùp so saùnh =, vôùi giaû thieát laø giaù trò coät R[A] coù theå so saùnh
töông ñöông ñöôïc vôùi moãi giaù trò cuûa coät S[B], ñöôïc ñònh nghóa laø:
A=B
R S = { v = (t, u)  (t  R , u  S vaø t.A  u.B) hoaëc (t =
tNULL , u  S, vôùi t.B R[A]) }

nghóa laø, taát caû caùc boä v coù ñöôïc nhôø caùch ñaët boä giaù trò cuûa R vaø S
xeáp caïnh nhau neáu chuùng coù giaù trò gioáng nhau treân 2 thuoäc tính keát

112
noái, vaø caùc boä NULL cuûa R vôùi caùc boä cuûa S, neáu khoâng tìm ñöôïc
giaù trò töông öùng cuûa thuoäc tính keát noái treân quan heä R.

Ví duï 5.4.3.1:
Giaû söû vôùi caùc quan heä R vaø S cuøng caùc boä giaù trò cuûa chuùng
ñöôïc xaùc ñònh nhö trong ví duï 5.4.2 neâu treân. Keát quaû cuûa pheùp keát
noái phaûi R vôùi S laø quan heä vôùi caùc boä giaù trò sau:
R.A = S.A
R S = Q (A, B, C, A, D, E, F)
a1 b1 1 a1 d1 e1 f1
a2 b2 c2 a2 d2 e2 f2
- - - a4 d4 e4 f4
- - - a6 d6 e6 f6
a7 b7 c7 a7 d7 e7 f7

Kyù hieäu daáu tröø (-) trong caùc thuoäc tính cuûa R ñöôïc hieåu laø giaù trò
khoâng xaùc ñònh (giaù trò Null).
Caùc doøng coù giaù trò taïi thuoäc tính A cuûa S laø a4 vaø a6 khoâng tìm
ñöôïc giaù trò cuûa thuoäc tính A töông öùng trong quan heä R, do ñoù phaàn
ñaàu cuûa noù ñöôïc ñeå laø khoâng xaùc ñònh. Qua baûng keát quaû trình baøy
treân, chuùng ta thaáy yù nghóa cuûa pheùp toaùn naøy laø nhaèm xaùc ñònh caùc
boä giaù trò cuûa quan heä beân phaûi khoâng coù boä giaù trò töông öùng trong
quan heä phía beân traùi.

Ví duï 5.4.3.2:
Giaû söû chuùng ta theâm moät boä môùi cho quan heä LOAÏI_ÑV goàm
coù maõ Loaïi laø 6, Teân-loaïi-hình laø Cô quan Ñaûng / Ñoaøn. Khi ñoù pheùp
keát noái phaûi (Right Join) hai quan heä ÑÔN-VÒ vaø LOAÏI-ÑV cho keát
quaû laø quan heä coù theå hieän nhö sau:

113
Maõ-ÑV Teân-ñôn-vò Loaïi Loaïi Teân-loaïi-hình
10002 Tröôøng K.thuaät nghieäp vuï maùy tính 3 3 SN hoaøn toaøn
10003 Phoøng quaûn lyù haønh chaùnh 2 2 Haønh chaùnh
10022 Vaên phoønh ñaïi dieän Thanh nieân 2 2 Haønh chaùnh
10070 Ban quaûn lyù voán sinh vieân 5 5 Haïch toaùn ñ.laäp
10071 Löïc löôïng quaûn lyù thò tröôøng 5 5 Haïch toaùn ñ.laäp
10090 Hoäi khuyeán noâng Quaän X 7 Null Null
Null Null Null 6 Cô quan Ñaûng

Vì khoâng coù ñôn vò naøo coù loaïi hình toå chöùc ñôn vò laø 6, neân ôû
doøng cuoái cuøng trong baûng treân, caû 3 coät thuoäc phaàn cuûa quan heä
ÑÔN-VÒ ñaõ bò ñeå troáng baèng caùc giaù trò Null khoâng xaùc ñònh.

Moät öùng duïng cuûa pheùp keát noái naøy laø: xaùc ñònh nhöõng CBVC
naøo coù lyù lòch trong CSDL (do nhaäp sai maõ soá CBVC) nhöng khoâng
coù teân trong danh saùch (töùc laø caùc lyù lòch voâ chuû). Hoaëc: xaùc ñònh caùc
loaïi hình ñôn vò (Loaïi) maø khoâng coù ñôn vò naøo thuoäc vaøo.

Trong moät soá ngoân ngöõ truy vaán CSDL (MicroSoft SQL-
Server, Oracle ...) ngöôøi ta goïi 2 pheùp toaùn keát noái traùi (Left Join) vaø
keát noái phaûi (Right Join) baèng chung moät töø laø “pheùp keát noái ngoaøi”
(Outer Join). Muïc ñích cuûa pheùp keát noái naøy laø cho pheùp giöõ laïi taát caû
caùc baûn ghi (hoaëc boä giaù trò) cuûa 2 quan heä coù cuøng giaù trò cuûa caùc
thuoäc tính keát noái vaø nhöõng boä giaù trò cuûa caû 2 quan heä khoâng tìm
ñöôïc boä giaù trò gioáng nhau treân caùc thuoäc tính keát noái thuoäc quan heä
ñoái öùng.

Toùm taét.
Trong baøi naøy chuùng ta ñaõ laøm quen vôùi caùc pheùp toaùn taäp hôïp
treân caùc quan heä: Hôïp (Union), Tröø (Minus), Giao (Intersection), Tích
Ñeà-caùc (Cartesian), Chia (Division) hai quan heä, vaø pheùp Buø
(Complement) cuûa 1 quan heä; ñoàng thôøi cuõng ñaõ tieáp caän vôùi 2 pheùp
114
toaùn cuûa ñaïi soá quan heä laø pheùp Chieáu (Projection) vaø pheùp Choïn
(Selection).

BAØI TAÄP THÖÏC HAØNH.


Cho CSDL EMPLOYMENT veà quaûn lyù nhaân vieân cuûa moät coâng ty
bao goàm quan heä EMPLOYEE vôùi caùc boä giaù trò ñaõ cho trong ví duï 5.3.1
vaø caùc quan heä khaùc DEPARTMENT, JOBS vaø EMPLHIST. Quan heä
DEPARTMENT (phoøng, ban) ñònh nghóa treân caùc thuoäc tính: DeptNo (Maõ
phoøng), DeptName (Teân phoøng), Loc (Ñòa ñieåm), Mgr (Maõ NV phuï traùch
phoøng), Exp_budg (Ngaân saùch / kinh phí hoaït ñoäng), Rev_budg (Doanh
thu) vôùi caùc boä giaù trò sau:
DeptNo DeptName Loc Mgr Exp_budg Rev_budg
10 Accounting Dallas 200 10.000
30 Research San Fransisco 105 125.000
40 Sales Boston 109 280.000 800.000
50 Manufacturing Houston 210 130.000
60 Shipping Houston 215 90.000

Vaø quan heä JOBS (caùc chöùc danh coâng vieäc) ñònh nghóa treân caùc
thuoïc tính: Job (Maõ chöùc danh), JobName (Teân goïi chöùc danh),
MinSalary (möùc löông toái thieåu), MaxSalary (möùc löông toái ña) MgrFlag
(Coù theå tieán cöû laøm laõnh ñaïo ?) vôùi caùc boä giaù trò sau:
Job JobName MinSalary MaxSalary MgrFlag
Mngr Manager 2.500 5.500 Y
Clrk Clerk 950 1.800 N
Slsa Sales Assist 950 2.000 N
Amgr Assist Manager 1.500 3.000 Y
Drvr Driver 1.050 1.700 N
Slsm Salesman 750 5.000 N
Spvr Supervisor 1.500 2.000 Y
Anlt Analyst 1.300 3.500 N
Secy Secretary 800 2.200 N
Newh New Hire 500 800 N

115
Vaø cuoái cuøng laø quan heä EMPLHIST veà quaù trình thay ñoåi löông,
phoøng laøm vieäc, thaêng quan tieán chöùc cuûa caùc nhaân vieân ñònh nghóa
treân caùc thuoäc tính EmpNo (Maõ soá nhaân vieân), Seq (Soá thöù töï laàn thay
ñoåi), Date_beg, Date_end, Salary, Frjob, Tojob, Frdept, Todept, Promo vôùi
caùc boä giaù trò ñöôïc cho nhö sau:

EmpNo Seq Date_Beg Date_End Salary FrJob ToJob Promo FrDept ToDept
101 1 01/03/81 30/06/81 800 Newh Slsa N 40
101 2 01/07/81 30/06/82 1125 Slsa Slsa N 40 40
101 3 01/07/82 30/06/84 1900 Slsa Slsm Y 40 40
101 4 01/07/84 2500 Slsm Slsm N 40 40
109 1 01/04/80 30/09/80 725 Newh Slsa N 40
109 2 01/10/80 30/06/82 1500 Slsa Slsm Y 40 40
109 3 01/07/82 31/03/83 2600 Slsm Amgr Y 40 40
109 4 01/04/83 30/06/85 3200 Amgr Mngr Y 40 40
109 5 01/07/85 3800 Mngr Mngr N 40 40
220 1 01/05/82 31/08/82 1900 Newh Mngr N 60
220 2 01/09/82 30/06/83 1600 Mngr Slsm N 60 40
220 3 01/07/83 31/12/83 2200 Slsm Slsm N 40 40
220 4 01/01/84 30/06/84 3400 Slsm Slsm N 40 40
220 5 01/07/84 4250 Slsm Slsm N 40 40

Baøi taäp 2: Haõy bieåu dieãn caùc caâu hoûi sau baèng ngoân ngöõ ñaïi soá quan
heä:
Caâu 1: Cho bieát Maõ phoøng (DeptNo), Teân phoøng (DeptName) vaø ngaân
saùch hoaït ñoäng (Exp_budg) cuûa caùc phoøng ban.
Caâu 2: Cho Teân phoøng ban (Deptname) vaø ñòa ñieåm truï sôû (Loc) cuûa
caùc phoøng ban.
Caâu 3: Cho teân chöùc danh coâng vieäc (Jobname) vaø möùc löông toái
thieåu (MinSalary) vaø toái ña (MaxSalary) cuûa töøng chöùc danh
coâng vieäc.
Caâu 4: Cho danh saùch caùc phoøng ban ôû thaønh phoá Houston.
Caâu 5: Cho danh saùch caùc chöùc danh coâng vieäc coù möùc löông toái
thieåu töø 1.500$ trôû leân.

116
Caâu 6: Cho Teân phoøng ban (DeptName), Maõ soá ngöôøi laõnh ñaïo (Mgr),
Ngaân saùch (Exp_budg) vaø Doanh thu (Rev_Budg) cuûa caùc
phoøng coù Doanh thu.

117
CHÖÔNG VI
NGOÂN NGÖÕ TRUY VAÁN CÔ SÔÛ DÖÕ LIEÄU SQL

Nhö trong Chöông I muïc 1.4 ñaõ trình baøy, moät heä quaûn trò
CSDL phaûi coù ngoân ngöõ giao tieáp giöõa ngöôøi söû duïng vôùi CSDL
(hoaëc cuõng coøn goïi laø ngoân ngöõ truy nhaäp CSDL). Ngoân ngöõ giao tieáp
CSDL goàm caùc phaïm truø:
 Ngoân ngöõ moâ taû döõ lieäu (Data Definition Language - DDL) ñeå cho
pheùp khai baùo caáu truùc caùc baûng cuûa CSDL, khai baùo caùc moái lieân
heä cuûa döõ lieäu (Data RelationShip) vaø caùc quy taéc (Rules,
Constraint) quaûn lyù aùp ñaët leân caùc döõ lieäu ñoù.
 Ngoân ngöõ thao taùc döõ lieäu (Data Manipulation Language - DML)
cho pheùp ngöôøi söû duïng coù theå theân (Insert), xoùa (Delete), söûa
(Update) döõ lieäu trong CSDL.
 Ngoân ngöõ truy vaán döõ lieäu, hay ngoân ngöõ hoûi ñaùp coù caáu truùc
(Structured Query Language - SQL) cho pheùp nhöõng ngöôøi khai
thaùc CSDL (chuyeân nghieäp hoaëc khoâng chuyeân) söû duïng ñeå truy
vaán caùc thoâng tin caàn thieát trong CSDL.
 Ngoân ngöõ quaûn lyù döõ lieäu (Data Control Language - DCL) cho
pheùp nhöõng ngöôøi quaûn trò heä thoáng thay ñoåi caáu truùc cuûa caùc
baûng döõ lieäu, khai baùo baûo maät thoâng tin vaø caáp quyeàn haïn khai
thaùc CSDL cho ngöôøi söû duïng.
Nhöõng naêm 1975-1976, IBM laàn ñaàu tieân ñöa ra heä quaûn trò
CSDL kieåu quan heä mang teân SYSTEM-R vôùi ngoân ngöõ giao tieáp
CSDL laø SEQUEL (Structured English QUEry Language), ñoù moät
ngoân ngöõ con ñeå thao taùc vôùi CSDL.
Naêm 1976 ngoân ngöõ SEQUEL ñöôïc caûi tieán thaønh SEQUEL2.
Khoaûng naêm 1978-1979 SEQUEL2 ñöôïc caûi tieán vaø ñoåi teân thaønh
Ngoân Ngöõ Truy Vaán Coù Caáu Truùc (Structured Query Language -
118
SQL) vaø cuoái naêm 1979 heä quaûn trò CSDL ñöôïc caûi tieán thaønh
SYSTEM-R*.
Naêm 1986 Vieän Tieâu Chuaån Quoác Gia Myõ (American National
Standards Institute - ANSI) ñaõ coâng nhaän vaø chuaån hoùa ngoân ngöõ
SQL, vaø sau ñoù Toå chöùc Tieâu chuaån Theá giôùi (International Standards
Organization - ISO) cuõng ñaõ coâng nhaän ngoân ngöõ naøy. Ñoù laø chuaån
SQL-86.
Tôùi nay SQL ñaõ qua 3 laàn chuaån hoùa laïi (1989, 1992, 1996) ñeå
môû roäng caùc pheùp toaùn vaø taêng cöôøng khaû naêng baûo maät vaø tính toaøn
veïn döõ lieäu. Taøi lieäu naøy trình baøy Ngoân ngöõ truy vaán CSDL döïa treân
chuaån SQL-92 vaø coù tham khaûo vôùi SQL, SQL*PLUS, PL/SQL cuûa
Oracle Server Release 7.3 (1996) vaø MicroSoft SQL Server 7.1 vôùi
caùc phaïm truø neâu treân.
Ñeå vieäc trình baøy cuù phaùp caùc caâu leänh SQL ñöôïc goïn gaøng vaø
deã hieåu, taøi lieäu naøy coù ñöa ra moät soá quy öôùc kyù phaùp (Typographic
Conventions) nhö sau:
 Caùc töø khoùa (KeyWords), caùc haøm (Functions), teân baûng
(quan heä - Table Names) cuûa caùc caâu leänh ñöôïc vieát baèng chöõ
in hoa (UpperCase).
 Caùc teân thuoäc tính (Column Names) cuûa caùc baûng ñöôïc vieát
ñaäm. Nhöõng teân thuoäc tính coù daáu tieáng Vieät hay coù khoaûng
traéng ñöôïc vieát trong daáu ngoaëc vuoâng ( [ ] ) theo kyù phaùp
cuûa SQL-Server.
Ví duï: SELECT Deptno, Deptname FROM DEPARTMENT;
 Caùc bieán cuù phaùp (Syntax Variables), töùc laø caùc thaønh phaàn
ngoân ngöõ maø ngöôøi söû duïng phaûi ñieàn cuï theå vaøo khi vieát
leänh, seõ ñöôïc vieát baèng chöõ thöôøng (LowerCase), trong caëp
daáu ( < > ) vaø nghieâng.
Ví duï: CREATE TABLE <teân baûng> (<teân coät> <kieåu>, <teân coät>
<kieåu>, ...);

119
 Caùc thaønh phaàn tuøy choïn (Optional), töùc laø coù theå coù hoaëc
khoâng ñöôïc vieát trong caëp daáu ngoaëc vuoâng ñaäm neùt ([ ]).
Ví duï: UPDATE <teân quan heä>
SET <teân coät> = <bieåu thöùc>, <teân coät> = <bieåu
thöùc>, ...
[ WHERE <ñieàu kieän> ];
 Vieäc löïa choïn moät trong caùc khaû naêng ñöôïc theå hieän bôûi daáu
xoå ñöùng ñaäm ( ).
 Thaønh phaàn baét buoäc phaûi choïn trong danh saùch ñöôïc vieát
trong caëp daáu moùc ñaäm neùt (  ).
 Giaù trò maëc ñònh (Default Value) ñöôïc vieát vôùi daáu gaïch chaân
(Underline).
Ví duï: SELECT  * <bieåu thöùc 1>, <bieåu thöùc 2>, ... 
FROM <caùc baûng>
[ORDER BY <teân coät><bieåu thöùc> [ ASC  DESC
], ...]

Leänh SQL coù theå ñöôïc vieát treân nhieàu doøng vaø keát thuùc leänh
bôûi daáu chaám phaûy ( ; ), tuy nhieân töø khoùa, teân haøm, teân thuoäc tính,
teân baûng, teân ñoái töôïng (Objects) thì khoâng ñöôïc pheùp vieát taùch
xuoáng haøng. Trong vaän duïng thöïc teá, töø khoùa, teân thuoäc tính, teân baûng,
teân ñoái töôïng ñöôïc vieát in hoa hoaëc chöõ thöôøng laø nhö nhau.

Cho ñeán baây giôø chuùng ta ñaõ coù caùc CSDL vôùi ñaày ñuû döõ lieäu
veà quaûn lyù hoïc vieân - ñöôïc trình baøy trong Chöông III (goàm caùc quan
heä: KHOA, GIAÛNG-VIEÂN, LÔÙP-HOÏC, MOÂN-HOÏC, HOÏC-VIEÂN, KQUAÛ-THI), quaûn
lyù nhaân söï cuûa moät coâng ty EMPLOYMENT – ñöôïc trình baøy trong
Chöông V, muïc 5.3 (goàm caùc quan heä: DEPARTMENT, EMPLOYEE,
JOBS, EMPLHIST) vaø CSDL quaûn lyù caùn boä - coâng chöùc CCVC – ñöôïc
trình baøy trong Chöông V, muïc 5.4 (goàm caùc baûng: ÑÔN-VÒ, LOAÏI-ÑVÒ,
NGAÏCH-CBVC, NGAÏCH-BAÄC-LÖÔNG vaø CBVC). Caùc CSDL naøy seõ ñöôïc söû

120
duïng laøm caùc maãu cho vieäc trình baøy caùc caâu leänh SQL trong toaøn boä
chöông naøy.

6.1. Caùc leänh hoûi - tìm kieám döõ lieäu: (Data Retrieval SQL)

Caâu leänh SELECT - SQL tìm kieám döõ lieäu laø moät trong soá caùc
caâu leänh SQL caøi ñaët ñaày ñuû caùc pheùp toaùn quan heä döïa treân caùc töø
khoùa cô baûn SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING.
Ñaây laø caâu leänh ñöôïc söû duïng phoå bieán nhaát vôùi muïc ñích tìm kieám
thoâng tin trong CSDL quan heä. Cuù phaùp toång quaùt cuûa caâu leänh nhö
sau:
SELECT [DISTINCT <bieåu thöùc 1>, <bieáu thöùc 2>, ...
FROM <teân baûng 1>, <teân baûng 2>, ...
[WHERE <ñieàu kieän choïn> ]
[GROUP BY <teân coät 1>, <teân coät 2>, ...]
[ORDER BY <teân coät 1>  <bieåu thöùc soá 1> [ASC  DESC ], ...]
[HAVING <ñieàu kieän in keát quaû> ];

Chuùng ta seõ laàn löôït laøm roõ töøng phaàn cuûa cuù phaùp ngoân ngöõ.
Cô sôû döõ lieäu ñöôïc söû duïng ñeå minh hoïa caùc ví duï trong chöông naøy
laø heä quaûn lyù nhaân söï cuûa moät coâng ty EMPLOYMENT vôùi caùc baûng –
quan heä: DEPARTMENT, EMPLOYEE, JOBS, EMPLHIST ñaõ noùi treân.

6.1.1 Tìm thoâng tin töø caùc coät cuûa baûng.

SELECT [DISTINCT{ *  <bieåu thöùc 1> [AS <Teân môùi 1>],


<bieáu thöùc 2>[AS <Teân môùi 2>], ... }
FROM <teân baûng>;

Caâu hoûi 6.1ï.1: Cho danh saùch caùc phoøng ban (bao goàm taát caû
caùc thoâng tin veà Maõ soá (DeptNo), Teân (DeptName), Ñòa ñieåm (Loc), Maõ

121
soá ngöôøi laõnh ñaïo (Mgr), Kinh phí hoaït ñoäng (Exp_Budg) vaø Doanh thu
(Rev_Budg) cuûa caùc phoøng ban) trong Coâng ty:
SELECT Deptno, Deptname, Loc, Mgr, Exp_budg, Rev_budg
FROM DEPARTMENT;

Khi caàn laáy thoâng tin veà taát caû caùc coät cuûa baûng chuùng ta coù theå
söû duïng daáu sao ( * ) thay cho vieäc lieät keâ caùc teân coät cuûa baûng. Caâu
leänh treân töông ñöông vôùi caâu leänh:
SELECT * FROM DEPARTMENT;

Keát quaû cuûa caâu leänh laø moät baûng (naèm trong boä nhôù trong):
DepTno DeptName Loc Mgr Exp_Budg Rev_Budg
10 Accounting Dallas 200 10.000
30 Research San Fransisco 105 125.000
40 Sales Boston 109 280.000 800.000
50 Manufacturing Houston 210 130.000
60 Shipping Houston 215 90.000

Caâu hoûi 6.1.2: Cho Maõ soá, Teân, Ñòa ñieåm, Kinh phí hoaït ñoäng cuûa
töøng phoøng ban trong Coâng ty:
SELECT DeptNo, DeptName, Loc, Exp_Budg
FROM DEPARTMENT;

Caâu leänh naøy laø caøi ñaët cuûa pheùp chieáu treân 4 thuoäc tính DeptNo,
DeptName, Loc vaø Exp_Budg cuûa baûng DEPARTMENT. Keát quaû cuûa caâu leänh
laø moät baûng (naèm trong boä nhôù trong):
DepTno DeptName Loc Exp_Budg
10 Accounting Dallas 10.000
30 Research San Fransisco 125.000
40 Sales Boston 280.000
50 Manufacturing Houston 130.000
60 Shipping Houston 90.000

Chuùng ta giaû thieát raèng caàn ñaët teân khaùc (goïi laø bí danh - Alias)
cho caùc coät cuûa baûng keát quaû baèng tieáng Vieät thay vì duøng teân cuûa

122
thuoäc tính cuûa baûng döõ lieäu nguoàn. Vieäc naøy ñöôïc thöïc hieän baèng
caùch theâm töø khoùa AS theo sau laø moät teân môùi. Neáu teân coù chöùa caùc
kyù töï ñaëc bieät vaø/hoaëc khoaûng traéng thì vieát teân ñoù trong caëp daáu
ngoaëc vuoâng ( [ ] ). Ví duï treân ñöôïc söûa thaønh:

SELECT DeptNo AS [Maõ soá], DeptName AS [Teân phoøng], Loc AS [Ñòa dieåm],
Exp_Budg as [Kinh phí]

FROM DEPARTMENT;

Keát quaû cuûa caâu leänh laø nhö sau:


Maõ soá Teân phoøng Ñòa ñieåm Kinh phí
10 Accounting Dallas 10.000
30 Research San Fransisco 125.000
40 Sales Boston 280.000
50 Manufacturing Houston 130.000
60 Shipping Houston 90.000

Caâu leänh SELECT khoâng chæ thöïc hieän vieäc trích thoâng tin töø
caùc coät ñôn leû cuûa baûng maø coù theå thöïc hieän tính toaùn theo coâng thöùc
hay bieåu thöùc baát kyø döïa treân giaù trò cuûa caùc coät treân töøng baûn ghi cuûa
baûng. Trong ñoù:
Bieåu thöùc (expression) laø moät daõy caùc toaùn haïng (Operand) noái
vôùi nhau bôûi caùc pheùp toaùn (Operator). ÔÛ ñaây:
* Toaùn haïng coù theå laø:
1- Tröïc haèng (Literals): bao goàm haèng soá (Number - Ví duï.
1234.56), haèng vaên baûn (Text) trong caëp daáu nhaùy ñôn (Ví duï. ‘Nguyeãn
Hoàng Anh’ ) , haèng ngaøy thaùng (Date/Time) ñaët trong caëp daáu haøng raøo (
# - Ví duï. #19/05/1890# ), vaø haèng loâgic (True hay False) hoaëc teân goïi
cuûa tröïc haèng.
2- Teân thuoäc tính (coù theå keøm theo teân baûng vaø daáu chaám ñöùng
tröôùc). Ví duï. DEPARTMENT.DeptNo.
3- Teân haøm (function). Ví duï. SUM (...), COUNT(...), SIN (...),
COS(...)
4 - Teân bieán (Variable).
123
* Caùc pheùp toaùn coù theå laø:
1- Caùc pheùp toaùn soá hoïc: ^ (luõy thöøa); * (nhaân), / (chia), %
(chia nguyeân), Mod (phaàn dö); + (coäng),  (tröø). Thöù töï öu tieân cao
nhaát theo 3 cuïm töø traùi qua phaûi. Caùc pheùp toaùn soá hoïc thöôøng cho
keát quaû laø moät soá.
2- Caùc pheùp toaùn so saùnh: <, <=, >, >=, =, <>. Keát quaû pheùp so
saùnh laø giaù trò loâgíc (True hoaëc False).
3- Caùc pheùp toaùn phaïm vi: IN (<danh saùch giaù trò>),
BETWEEN <Min> AND <Max>, LIKE <Maãu v.baûn>.
4- Caùc pheùp toaùn loâgic: NOT (phuû ñònh), AND (noái lieàn -
conjunction), OR (noái rôøi - disjunction). Keát quaû caùc pheùp toaùn loâgíc
laø moät giaù trò loâgíc.

Caâu hoûi 6.1.3: Cho bieát Maõ soá, Teân vaø löông caû naêm cuûa caùc
nhaân vieân trong coâng ty:
SELECT EmpNo AS [Maõ soá], Name AS [Teân], Salary * 12 AS [Löông naêm]
FROM EMPLOYEE;

Keát quaû laø baûng:


Maõ soá Teân Löông naêm
100 Wilson 20.400
101 Smith 30.000
103 Reed 42.000
105 Watson 54.000
109 Allen 45.600
110 Turner 21.600
200 Chen 34.800
210 Ramirez 43.200
213 McDonnel 19.500
214 Simpson 9.900
215 Di Salvo 32.400
220 Schwartz 50.400

124
Khi thöïc hieän pheùp chieáu teân moät quan heä, caùc boä giaù trò gioáng
nhau coù theå ñöôïc choïn. Töø khoùa DISTINCT ñöôïc söû duïng neáu muoán chæ
giöõ laïi 1 boä trong caùc boä giaù trò gioáng nhau tìm ñöôïc.

Caâu hoûi 6.1.4: Cho bieát caùc nhaân vieân cuûa coâng ty ñang ñaûm
nhaän caùc coâng vieäc gì? Ñaây chính laø pheùp chieáu treân thuoäc tính Job
cuûa quan heä EMPLOYEE.

SELECT DISTINCT Job FROM EMPLOYEE;

Keát quaû laø baûng vôùi 6 doøng vaø 1 coät nhö sau:
Job
Clrk
Anlt
Mngr
Drvr
Spvr
Slsm

6.1.2 Choïn caùc doøng cuûa baûng - Meänh ñeà WHERE

Trong nhieàu tröôøng hôïp chuùng ta chæ caàn choïn ra nhöõng boä giaù
trò cuûa baûng thoûa maõn ñieàu kieän naøo ñoù. Meänh ñeà WHERE (WHERE
Clause) vôùi cuù phaùp WHERE <ñieàu kieän> cho pheùp thöïc hieän ñieàu ñoù.
ÔÛ ñaây <ñieàu kieän> laø moät bieåu thöùc maø keát quaû laø moät giaù trò loâgic
hoaëc ñuùng (True) hoaëc sai (False). Ñaây laø söï caøi ñaët cuûa pheùp choïn
(Selection) trong ñaïi soá quan heä.

Caâu hoûi 6.1.5: Cho danh saùch nhaân vieân cuûa phoøng soá 40?.
SELECT * FROM EMPLOYEE WHERE Deptno = 40;

Keát quaû laø baûng coù 3 doøng (treân toång soá 12 doøng cuûa baûng
nguoàn):
125
EmpNo Name Job Salary Comm DeptNo Sex
101 Smith Slsm 2.500 1.300 40 F
109 Allen Mngr 3.800 8.000 40 F
220 Schwartz Slsm 4.200 5.300 40 F

Caâu hoûi 6.1.6: Cho danh saùch nhaân vieân cuûa phoøng soá 10, 30 vaø 50.
SELECT * FROM EMPLOYEE
WHERE (DeptNo = 10) OR (DeptNo = 30) OR (DeptNo = 50);

Hoaëc vieát caùch khaùc:


SELECT * FROM EMPLOYEE WHERE DeptNo IN (10, 30, 50);

Keát quaû laø baûng:


EmpNo Name Job Salary Comm DeptNo Sex
100 Wilson Clrk 1.700 10 M
103 Reed Anlt 3.500 30 M
105 Watson Mngr 4.500 0 30 M
110 Turner Clrk 1.800 50 M
200 Chen Mngr 2.900 10 F
210 Ramirez Mngr 3.600 50 M

Caâu hoûi 6.1.7: Cho danh saùch caùc nhaân vieân coù löông thaùng 1öø
3500 ñeán 4500 USD:
SELECT * FROM EMPLOYEE
WHERE (Salary >= 3500) AND (Salary >= 4500);

Hoaëc vieát caùch khaùc:


SELECT * FROM EMPLOYEE
WHERE Salary BETWEEN 3500 AND 4500;

EmpNo Name Job Salary Comm DeptNo Sex


103 Reed Anlt 3.500 30 M
105 Watson Mngr 4.500 0 30 M
109 Allen Mngr 3.800 8.000 40 F
210 Ramirez Mngr 3.600 50 M
220 Schwartz Slsm 4.200 5.300 40 F

126
Maãu so saùnh trong pheùp toaùn LIKE laø moät giaù trò kieåu Text, ñoù
laø moät daõy kyù töï baát kyø trong ñoù coù 2 kyù töï coù yù nghóa ñaëc bieät sau
ñaây:
_ : Ñaïi dieän cho moät kyù töï baát kyø taïi vò trí daáu ?
% : Ñaïi dieän cho moät nhoùm kyù töï baát kyø taïi vò trí ñoù.
Ví duï: Vôùi tieáng Vieät 1 byte (VNI, VietWare, ABC, ...) maãu
‘Nguy_n’ ñaïi dieän cho moät daõy kyù töï coù 6 kyù töï, trong ñoù coù 4 kyù töï
ñaàu laø ‘Nguy ’, kyù töï thöù 5 laø gì cuõng ñöôïc vaø kyù töï thöù 6 laø chöõ ‘n’.
Maãu %toå chöùc% ñaïi dieän cho baát cöù giaù trò vaên baûn naøo coù
chöùa hai töø “toå chöùc”.

Caâu hoûi 6.1.8: Cho danh saùch nhaân vieân coù teân baét ñaàu baèng
chöõ W:

SELECT * FROM EMPLOYEE WHERE Name LIKE ‘W%’;

EmpNo Name Job Salary Comm DeptNo Sex


100 Wilson Clrk 1.700 10 M
105 Watson Mngr 4.500 0 30 M

 Löu yù: Trong MS Access, haèng vaên baûn ñöôïc ñaët trong caëp
daáu nhaùy keùp – ví duï ”Nguyeãn Hoàng An” - vaø kyù töï ñaïi dieän trong maãu so
saùnh vôùi pheùp LIKE laø:
? : Ñaïi dieän cho moät kyù töï baát kyø taïi vò trí daáu ?
* : Ñaïi dieän cho moät nhoùm kyù töï baát kyø taïi vò trí ñoù.

6.1.3 Thöù töï hieån thò caùc baûn ghi - Meänh ñeà ORDER BY

Trong ví duï 6.1.6 vaø 6.1.7 chuùng ta thaáy caùc nhaân vieân khoâng
ñöôïc saép xeáp theo phoøng ban hay khoâng theo thö töï taêng hay giaûm
daàn cuûa möùc löông thaùng. Ñeå thöïc hieän ñöôïc caùc ñieàu treân, SQL hoã

127
trôï bôûi meänh ñeà ORDER BY ñeå saép xeáp keát quaû tìm ñöôïc. Cuù phaùp
meänh ñeà naøy laø:
ORDER BY <teân coät>  <bieåu thöùc> [ASC  DESC], <teân coät> 
<bieåu thöùc> [ASC  DESC], ...

Bieåu thöùc phaûi coù giaù trò soá; noù theå hieän soá thöù töï cuûa coät trong
baûng keát quaû ñöôïc chæ ñònh phaûi saép xeáp thöù töï thay vì phaûi chæ roõ teân
coät, hôn nöõa neáu coät keát quaû laø coät tính toaùn thì noù chöa coù teân neân
caùc söû duïng bieåu thöùc laø moät bieän phaùp thay theá höõu duïng. Coù theå
saép xeáp theo thöù töï taêng daàn (vôùi töø khoùa ASC - Vieát taét cuûa
ASCending - maëc ñònh laø ASC) hoaëc giaûm daàn (DESCending) theo
giaù trò coät. Tröôùc heát caùc baûn ghi ñöôïc xeáp theo thöù töï cuûa coät thöù
nhaát; caùc baûn ghi coù cuøng giaù trò ôû coät 1 seõ ñöôïc saép xeáp theo thöù töï
coät thöù 2, Caùc baûn ghi coù cuøng giaù trò ôû caû 2 coät 1 vaø 2 seõ ñöôïc xeáp
theo coät thöù 3 vaø v.v...

Caâu hoûi 6.1.9: Cho danh saùch caùc nhaân vieân cuûa phoøng 10, 30
vaø 50. Keát quaû in ra theo thöù töï taêng daàn cuûa maõ phoøng vaø giaûm daàn
theo möùc löông.
SELECT * FROM EMPLOYEE WHERE Deptno IN (10, 30, 50)
ORDER BY Deptno, Salary DESC;

Hoaëc caùch vieát khaùc:


SELECT * FROM EMPLOYEE WHERE DeptNo IN (10, 30, 50)
ORDER BY 6 ASC, 4 DESC;

Keát quaû laø baûng:


EmpNo Name Job Salary Comm DeptNo Sex
200 Chen Mngr 2.900 10 F
100 Wilson Clrk 1.700 10 M
105 Watson Mngr 4.500 0 30 M
103 Reed Anlt 3.500 30 M
210 Ramirez Mngr 3.600 50 M
110 Turner Clrk 1.800 50 M

128
6.1.4 Ñieàu kieän hieån thò caùc baûn ghi - Meänh ñeà HAVING

Meänh ñeà WHERE cho pheùp choïn caùc baûn ghi cuûa baûng thoûa maõn
ñieàu kieän tìm kieám. Trong moät soá tröôøng hôïp sau khi tìm ñöôïc caùc
baûn ghi thoûa ñieàu kieän tìm, chuùng ta chæ muoán hieån thò chæ nhöõng baûn
ghi thoûa moät ñieàu kieän khaùc nöõa. SQL hoã trôï yeâu caàu naøy bôûi meänh
ñeà HAVING <ñieàu kieän>. Thoâng thöôøng meänh ñeà naøy ñöôïc aùp duïng
trong nhöõng caâu leänh tìm caùc boä giaù trò thoâng qua caùc quaù trình tính
toaùn treân nhoùm.

Caâu hoûi 6.1.10 ñöa ra sau ñaây ñeå laøm ví duï khoâng ñöôïc “ñaét
giaù” cho laém nhöng cuõng ñuû ñeå minh hoïa ñieàu vöøa neâu. “Haõy cho
danh saùch caùc nhaân vieân phoøng 10, 30 vaø 50. Chæ in nhöõng ngöôøi laø
laõnh ñaïo phoøng ban”.

SELECT * FROM EMPLOYEE WHERE Deptno IN (10, 30, 50)


ORDER BY 6 ASC, 4 DESC
HAVING Job = “Mngr”;

Keát quaû laø baûng:


EmpNo Name Job Salary Comm DeptNo Sex
200 Chen Mngr 2.900 10 F
105 Watson Mngr 4.500 0 30 M
210 Ramirez Mngr 3.600 50 M

Caâu hoûi 6.1.11: Cho Maõ phoøng maø ngöôøi coù möùc löông cao
nhaát cuûa phoøng lôùn hôn 4000 $US.
Roõ raøng ôû ñaây phaûi thöïc hieän 3 coâng vieäc:
- Phaân toå caùc nhaân vieân theo caùc phoøng ban.
- Xaùc ñònh möùc löông cao nhaát cuûa töøng phoøng ban.
- Choïn phoøng naøo coù möùc löông cao nhaát treân 4000 $US. Vieäc
naøy chæ coù theå tieán haønh ñöôïc sau khi ñaõ tìm ra taát caû caùc möùc löông
cao nhaát cuûa töøng phoøng ban. Caâu leänh sau ñaây laø moät gôïi môû cuûa
muïc 6.2 saép ñöôïc trình baøy döôùi ñaây.
129
SELECT Deptno, MAX(Salary) FROM EMPLOYEE
GROUP BY DeptNo
HAVING MAX(Salary) > 4000;

Deptno Max (Salary)


30 4.500
40 4.200

6.1.5 Truy vaán thoâng tin töø nhieàu baûng döõ lieäu.

Vieäc thöïc hieän caùc caâu truy vaán treân nhieàu baûng, veà baûn chaát
laø gioáng nhö treân moät baûng, töùc laø caàn chæ ra thoâng tin gì caàn tìm vaø
laáy töø caùc nguoàn döõ lieäu naøo. Caùc baûng döõ lieäu nguoàn naøy caàn chæ ra
trong meänh ñeà FROM trong caâu leänh SELECT.
Neáu caùc baûng döõ lieäu nguoàn coù caùc teân thuoäc tính gioáng nhau
thì teân thuoäc tính naøy phaûi ñöôïc vieát töôøng minh trong bieåu thöùc tìm
kieám vôùi teân baûng ñi keøm phía tröôùc. Noùi chung trong moät CSDL
quan heä, caùc baûng thöôøng coù caùc moái lieân heä vôùi nhau. Caùc baûng
ñöôïc lieân heä vôùi nhau thoâng qua pheùp keát noái vaø thöôøng laø keát noái
baèng (Equi-Join). Moái lieân heä phaûi ñöôïc theå hieän trong pheùp keát noái
cuûa meänh ñeà FROM hoaëc thoâng qua ñieàu kieän cuûa meänh ñeà WHERE
cuûa caâu leänh SELECT. Neáu khoâng theå hieän moái lieân heä naøy, keát quaû seõ
laø baûng tích Ñeà-caùc cuûa 2 baûng.

Caâu hoûi 6.1.12: Cho Maõ phoøng, Teân phoøng vaø teân ngöôøi laõnh
ñaïo phoøng töông öùng.
Trong caâu hoûi naøy, Teân phoøng ñöôïc laáy töø baûng DEPARTMENT,
Maõ phoøng coù theå laáy töø DEPARTMENT hoaëc töø baûng EMPLOYEE, coøn teân
nhaân vieân laøm laõnh ñaïo phoøng ñöôïc laáy töø baûng EMPLOYEE. Hai baûng
naøy ñöôïc keát noái vôùi nhau thoâng qua giaù trò cuûa thuoäc tính Mgr cuûa
DEPARTMENT vaø EmpNo cuûa EMPLOYEE.

130
Moät ñieåm nöõa caàn löu yù laø thuoäc tính DeptNo coù trong caû 2 baûng
DEPARTMENT vaø EMPLOYEE, do ñoù khi vieát leänh phaûi chæ roõ DeptNo cuûa
baûng naøo (maëc duø chuùng laø nhö nhau)

SELECT DEPARTMENT.DeptNo, DeptName FROM


DEPARTMENT, EMPLOYEE
WHERE DEPARTMENT.Mgr = EMPLOYEE.EmpNo;

Hoaëc coù theå vieát caùch khaùc nhôø söû duïng pheùp keát noái baèng INNER JOIN
(ñaõ trình baøy trong chöông V, muïc 5.1, ñieåm 5.1.1) nhö sau:

SELECT DEPARTMENT.DeptNo, DeptName FROM


DEPARTMENT INNER JOIN EMPLOYEE
ON (DEPARTMENT.Mgr = EMPLOYEE.EmpNo);

Ñeå giaûm nheï coâng vieäc phaûi vieát teân baûng nhieàu laàn trong
leänh, SQL hoã trôï teân bí danh cho baûng baèng caùch ñaët bí danh ngay
sau teân baûng nguoàn. Bí danh naøy coù theå ñöôïc duøng tröôùc khi noù ñöôïc
ñaët. Daïng ñaàu tieân cuûa ví duï naøy ñöôïc vieát laïi töông ñöông nhö sau:

SELECT D.DeptNo, D.DeptName, E.Name


FROM DEPARTMENT D, EMPLOYEE E
WHERE D.Mgr = E.Empno;

Keát quaû cuûa caû 3 caùch theå hieän caâu hoûi treân laø:
D.Deptno D.Deptname E.Name
10 Accounting Chen
30 Research Watson
40 Sales Allen
50 Manufacturing Ramirez
60 Shipping Di Salvo

131
6.1.6 Caùc caâu truy vaán loàng nhau (Query with SubQuery).

Trong nhieàu tröôøng hôïp chuùng ta caàn phaûi tìm kieám thoâng tin
qua nhieàu böôùc: keát quaû cuûa böôùc tröôùc ñöôïc söû duïng trong bieåu thöùc
cuûa caâu truy vaán tieáp theo, roài keát quaû cuûa caâu truy vaán naøy laïi ñöôïc
duøng trong bieåu thöùc cuûa caâu truy vaán tieáp theo nöõa v.v... Baèng ngoân
ngöõ thuû tuïc, qua moãi böôùc chuùng ta phaûi ghi nhôù laïi caùc keát quaû trung
gian naøy. Neáu nhö vaäy thì coâng vieäc truy vaán döõ lieäu seõ raát vaát vaû
cho nhöõng ngöôøi thao taùc tröïc tieáp vôùi CSDL. SQL - SELECT cho pheùp
laáy ngay keát quaû cuûa moät caâu truy vaán ñeå xaây döïng bieàu thöùc ñieàu
kieän cho moät caâu hoûi khaùc. Caâu hoûi trung gian ñoù ñöôïc goïi laø caâu hoûi
con (SubQuery). Caâu hoûi con phaûi ñöôïc bao trong caëp daáu ngoaëc troøn
trong bieåu thöùc cuûa caâu hoûi chính. Söï cho pheùp caâu hoûi con laø moät
trong nhöõng öu ñieåm noåi baät cuûa ngoân ngöõ quaûn trò CSDL quan heä.

Caâu hoûi 6.1.13: Cho danh saùch nhöõng ngöôøi laøm vieäc cuøng
phoøng vôùi oâng Watson:
Phaân tích caâu hoûi naøy ta coù 2 böôùc:
Böôùc 1: Tìm soá hieäu phoøng (maø) oâng Watson laø nhaân vieân (giaû söû
phoøng tìm ñöôïc coù maõ laø pp).
Böôùc 2: Tìm nhöõng ngöôøi coù soá hieäu phoøng laøm vieäc baèng pp
Caâu hoûi ôû böôùc 1 laø caâu hoûi con cho caâu hoûi ôû böôùc 2. Caâu leänh SQL
nhö sau:

SELECT * FROM EMPLOYEE


WHERE DeptNo = ANY ( SELECT DeptNo
FROM EMPLOYEE WHERE Name = ‘Watson’ );

Keát quaû laø baûng:


EmpNo Name Job Salary Comm DeptNo Sex

103 Reed Anlt 3.500 30 M


105 Watson Mngr 4.500 0 30 M

132
Caâu hoûi 6.1.14: Cho bieát Maõ soá, Teân vaø Möùc löông cuûa ngöôøi
laõnh ñaïo cuûa oâng Smith.
Caâu hoûi naøy phaûi ñöôïc thöïc hieän qua 3 böôùc:
Böôùc 1: Tìm Maõ soá phoøng (maø) oâng Smith laøm nhaân vieân (phoøng pp).
Böôùc 2: Tìm Maõ soá ngöôøi laõnh ñaïo phoøng pp (nhaân vieân xx).
Böôùc 3: Tìm Maø soá, Teân, Möùc löông cuûa nhaân vieân coù maõ soá laø xx.

Nhö vaäy chuùng ta phaûi vieát 2 caâu hoûi con loàng nhau trong moät
caâu hoûi chính:

SELECT EmpNo, Name, Salary FROM EMPLOYEE


WHERE EmpNo = ANY
( SELECT Mgr FROM DEPARTMENT
WHERE DeptNo = SOME
( SELECT DeptNo FROM EMPLOYEE
WHERE Name = ‘Smith’
)
);

Caâu traû lôøi laø:


Empno Name Salary
109 Allen 3.800

Keát quaû cuûa caâu hoûi con ñöôïc söû duïng trong pheùp so saùnh vôùi
moät giaù trò khaùc trong bieåu thöùc ñieàu kieän cuûa caâu hoûi bao noù. Caùc
pheùp so saùnh coù daïng:
<pheùp so saùnh> [<löôïng töø>] (SELECT - caâu hoûi con)

ÔÛ ñaây :
<Pheùp so saùnh> coù theå laø caùc pheùp so saùnh soá hoïc (>, >=, <,
<=, <>, =) hoaëc pheùp toaùn taäp hôïp IN, LIKE hoaëc NOT LIKE.

133
<Löôïng töø> coù theå laø ALL, ANY (hoaëc SOME). Pheùp so saùnh =
ANY coù theå ñöôïc thay töông ñöông baèng pheùp toaùn IN; pheùp so saùnh <>
ALL coù theå thay töông ñöông baèng pheùp toaùn NOT IN.

Caâu hoûi 6.1.15: Cho danh saùch nhaân vieân coù möùc löông lôùn hôn
hay baèng möùc löông cao nhaát cuûa phoøng oâng McDonnel:
Böôùc 1: Tìm soá hieäu phoøng (maø) oâng McDonnel laø nhaân vieân (Maõ
phoøng pp).
Böôùc 2: Taïo nhoùm nhaân vieân coù maõ phoøng laøm vieäc laø pp roài tính
löông trung bình cuûa nhöõng ngöôøi naøy (Löông cao nhaát zz).
Böôùc 3: Tìm nhöõng ngöôøi coù löông lôùn hôn hay baèng zz.

SELECT * FROM EMPLOYEE


WHERE Salary >= ALL
( SELECT MAX(Salary) FROM EMPLOYEE
WHERE DeptNo = ANY
( SELECT DeptNo FROM EMPLOYEE
WHERE Name = ‘McDonnel’
)
);

Löông cao nhaát phoøng oâng McDonnel laø 2700 $US. Baûng keát
quaû laø:
EmpNo Name Job Salary Comm DeptNo Sex
103 Reed Anlt 3.500 30 M
105 Watson Mngr 4.500 0 30 M
109 Allen Mngr 3.800 8.000 40 F
200 Chen Mngr 2.900 10 F
210 Ramirez Mngr 3.600 50 M
215 Di Salvo Spvr 2.700 60 M
220 Schwartz Slsm 4.200 5.300 40 F

134
6.2. Nhoùm thöïc hieän tính toaùn.

6.2.1 Caùc haøm tính toaùn treân nhoùm caùc baûn ghi (Aggregate
Functions):

Qua ví duï treân, chuùng ta ñaõ nhaän thaáy söï caàn thieát cuûa nhöõng
tính toaùn trong caâu leänh SELECT. SQL cung caáp moät soá haøm xaây döïng
saün (Built-in) laøm vieäc treân nhoùm theo kyõ thuaät tính toaùn nhanh tieân
tieán RushMore. Ñoù laø caùc haøm: COUNT (*  <teân coät>) - ñeám soá baûn ghi
coù giaù trò xaùc ñònh taïi coät ñöôïc cho bôûi <teân coät>, SUM (<bieåu thöùc>)
- tính toång giaù trò caùc bieåu thöùc, MIN (<bieåu thöùc>) - tìm giaù trò nhoû
nhaát, MAX (<bieåu thöùc>) - tìm giaù trò lôùn nhaát vaø AVG (<bieåu thöùc>) -
tính giaù trò trung bình cuûa bieåu thöùc döïa treân caùc baûn ghi cuûa caùc
nhoùm. Caùc haøm naøy thöôøng phaûi ñöôïc ñi keøm vôùi meänh ñeà GROUP BY
ñeå thöïc hieän phaân nhoùm caùc baûn ghi theo giaù trò caùc coät naøo ñoù tröôùc
khi tính toaùn. Neáu khoâng coù meänh ñeà GROUP BY thì caâu leänh seõ coi
toaøn boä caùc baûn ghi cuûa baûng laø moät nhoùm.

Caâu hoûi 6.2.1: Cho bieát khoaûn tieàn hueâ hoàng (Commission) cao
nhaát vaø trung bình cuûa caùc nhaân vieân (coù khoaûn naøy).

SELECT MAX ( Comm ), AVG ( Comm ) FROM EMPLOYEE;

Baûng keát quaû:


MAX(Comm) AVG(Comm)
8000 3650

Chuùng ta thaáy raèng caùc haøm treân chæ tính toaùn treân caùc giaù trò
xaùc ñònh. Do ñoù, maëc duø khoâng coù söï phaân nhoùm nhöng haøm MAX (.)
SUM (.), COUNT (.) vaø AVG (.) chæ tính treân caùc giaù trò xaùc ñònh. Chæ coù 4
ngöôøi coù tieàn hueâ hoàng, neân giaù trò trung bình laø (1300 + 0 + 8000 +
5300) / 4 = 3650.

135
Caâu hoûi 6.2.2: Cho bieát Maõ soá, Teân, Toång soá nhaân vieân, möùc
löông cao nhaát, thaáp nhaát, vaø trung bình cuûa caùc phoøng ban:

SELECT A.DeptNo AS [Maõ soá], A.DeptName AS [Teân phoøng],


COUNT (*) AS [Tg.soá n/v], MAX (Salary) AS [Löông Max],
MIN (Salary) AS [Löông Min],
AVG (Salary) AS [Löông TBình]
FROM DEPARTMENT A, EMPLOYEE B
WHERE A.Deptno = B.Deptno
GROUP BY A.Deptno, A.Deptname;

Baûng keát quaû:


Maõ soá Teân phoøng TgSoá n/v Löông Max Löông Min Löông TBình
10 Accounting 2 2.900 1.700 2.300
30 Research 2 4.500 3.500 4.000
40 Sales 3 4.200 2.500 3.500
50 Manufacturing 2 3.600 1.800 2.700
60 Shipping 3 2.700 825 1.716

Treân ñaây laø danh saùch caùc phoøng ban vôùi caùc möùc löông cao
nhaát, thaáp nhaát vaø trung bình cuûa caùc nhaân vieân trong töøng phoøng. Coù
theå bieát ñöôïc nhöõng ai trong phoøng coù möùc löông cao nhaát hay thaáp
nhaát trong caùc phoøng ban khoâng ?

Caâu hoûi 6.2.3: Cho bieát caùc nhaân vieân coù möùc löông cao nhaát
(töông töï: löông thaáp nhaát, vaø löông trung bình) cuûa caùc phoøng:
ÔÛ ñaây caàn phaûi tieán haønh theo hai böôùc:
Böôùc 1: Xaùc ñònh caùc möùc löông cao nhaát cuûa töøng phoøng.
Böôùc 2: Tìm nhöõng nhaân vieân coù möùc löông baèng vôùi möùc
löông cao nhaát cuûa phoøng ñoù.
Caàn löu yù raèng, keát quaû cuûa caâu hoûi con ñöôïc duøng laøm toaùn
haïng trong caâu hoûi khaùc, do ñoù giaù trò caùc phaàn töû (hay boä giaù trò) cuûa
baûng keát quaû phaûi laø voâ höôùng, töùc laø, caâu leänh SELECT con chæ ñöôïc
choïn moät bieåu thöùc trong caâu leänh. Chuùng ta khoâng theå chæ choïn moät

136
coät möùc löông cao nhaát trong böôùc 1, ñeå roài trong böôùc 2 choïn ra
nhöõng ngöôøi coù möùc löông truøng vôùi moät trong caùc möùc löông tìm
ñöôïc. Bôûi vì, ngöôøi coù möùc löông cao nhaát cuûa moät phoøng coù theå
baèng vôùi möùc löông cuûa moät ngöôøi bình thöôøng trong phoøng khaùc.
Phaûi laøm sao gaùn ñöôïc möùc löông cao nhaát ñi keøm vôùi phoøng cuï theå.
Chuùng ta thöïc hieän vieäc bieán ñoåi nhoû: Ñoåi Maõ phoøng vaø möùc löông
cao nhaát cuûa phoøng thaønh chuoãi roài gheùp laïi vôùi nhau thaønh moät
chuoãi ñaëc tröng cho töøng phoøng. Trong caâu hoûi chính, chuùng ta cuõng
gheùp hai chuoãi ñoåi ñöôïc töø Maõ phoøng vaø möùc löông cuûa töøng nhaân
vieân, roài so khôùp vôùi keát quaû ôû böôùc treân. Caâu leänh ñöôïc vieát trong
MicroSoft SQL-Server nhö sau:

SELECT *
FROM EMPLOYEE
WHERE STR ( Deptno, 2 ) + STR ( Salary, 5 ) IN
( SELECT STR ( Deptno, 2 ) + STR ( MAX (Salary), 5)
FROM EMPLOYEE GROUP BY DeptNo
)
ORDER BY DeptNo;

Baûng keát quaû:

EmpNo Name Job Salary Comm DeptNo Sex


200 Chen Mngr 2.900 10 F
105 Watson Mngr 4.500 0 30 M
220 Schwartz Slsm 4.200 5.300 40 F
210 Ramirez Mngr 3.600 50 M
215 Di Salvo Spvr 2.700 60 M

 Ghi chuù:
- Haøm STR (<ExpN> [, m [, n] ]) thöïc hieän vieäc ñoåi moät giaù trò cuûa
bieåu thöùc soá <ExpN> ra daõy kyù töï chöõ soá goàm m kyù töï, trong ñoù
coù n soá leû sau daáu chaám thaäp phaân. Neáu trong haøm khoâng coù n thì
n coù giaù trò maëc nhieân laø 0 – khoâng coù soá leû; neáu khoâng coù m thì
giaù trò maëc nhieân cuûa m laø 10.
137
- Trong MS Access coù theå söû duïng pheùp toaùn daáu “vaø” (&) ñeå
gheùp noái hai giaù trò coù kieåu baát kyø thaønh moät giaù trò coù kieåu bieán
theå (Variant).

Ngoaøi caùc haøm COUNT, SUM, MIN, MAX, AVG ngoân ngöõ quaûn trò
CSDL coøn caøi ñaët moät soá haøm thoáng keâ trong ñoù coù haøm tính phöông
sai (VAR = Variance) vaø tính ñoä leäch chuaån STDEV (Standard
Deviation) cuûa moät daõy bieåu thöùc döïa treân caùc coät soá cuûa caùc baûn ghi
cuûa (caùc) baûng. Ñoù laø caùc haøm tính toaùn treân nhoùm caùc baûn ghi, ñoøi
hoûi coù meänh ñeà GROUP BY trong caùc caâu leänh truy vaán SQL.

6.2.2 Caùc haøm tính toaùn treân baûn ghi:

Haàu heát caùc heä quaûn trò CSDL ñeàu caøi ñaët thö vieän caùc haøm
xaây döïng saün trong ngoân ngöõ truy vaán döõ lieäu nhaèm hoã trôï vieäc xaây
döïng caùc bieåu thöùc tính toaùn cho töøng boä giaù trò (hay baûn ghi) cuûa caùc
quan heä. Vì moãi haõng cung caáp heä quaûn trò CSDL ñaët teân caùc haøm coù
theå khaùc nhau hoaëc boå sung moät haøm rieâng bieät cuûa haõng hay loaïi boû
bôùt moät soá haøm, do ñoù, muïc naøy cuûa baøi giaûng chæ neâu ra caùc haøm
thuoäc moät soá lónh vöïc mang tính gôïi môû. Khi caøi ñaët CSDL treân moät
ngoân ngöõ quaûn trò CSDL cuï theå, caùc hoïc vieân coøn phaûi hoïc hoûi nhieàu
thoâng qua caùc caùc baøi giaûng tröïc tieáp (Tutorials) vaø taøi lieäu höôùng
daãn cuûa haõng cung caáp ngoân ngöõ quaûn trò CSDL.

6.2.2.1 Caùc haøm toaùn hoïc:


ABS(x): Trò tuyeät ñoái cuûa x
SQRT(x): Caên baäc hai cuûa x (Access vaø SQL-Server laø:
SQR(x))
LOG(x): Logarit töï nhieân cuûa x
EXP(x): Haøm muõ cô soá e cuûa x: ex.
SIGN(x): Laáy daáu cuûa soá x (-1: x<0, 0: x=0, +1: x>0)

138
ROUND(x,n): Laøm troøn tôùi n soá leû (Access vaø SQL-Server:
RND(x))
... vaø caùc haøm löôïng giaùc: SIN, COS, TAN, ASIN, ACOS, ATAN ...

6.2.2.2 Caùc haøm xöû lyù chuoãi kyù töï:


LEN (str): Cho chieàu daøi daõy kyù töï str.
LEFT(str,n): Laáy n kyù töï phía traùi cuûa daõy str.
RIGHT(str,n): Laáy n kyù töï phía phaûi cuûa daõy str.
MID(str,p,n): Laáy n kyù töï cuûa daõy str keå töø vò trí p trong daõy.

6.2.2.3 Caùc haøm xöû lyù ngaøy thaùng vaø thôøi gian:
DATE(): Cho ngaøy thaùng naêm hieän taïi (Oracle:
SYSDATE)
DAY(dd): Cho soá thöù töï ngaøy trong thaùng cuûa bieåu thöùc
ngaøy dd.
MONTH(dd): Cho soá thöù töï thaùng trong naêm cuûa bieåu thöùc
ngaøy dd.
YEAR(dd): Cho naêm cuûa bieåu thöùc ngaøy dd.
HOUR(tt): Cho giôø trong ngaøy (0  23)
MINUTE(tt): Cho soá phuùt cuûa thôøi gian tt.
SECONDS(tt): Cho soá giaây cuûa bieåu thöùc giôø tt.

6.2.2.4 Caùc haøm chuyeån ñoåi kieåu giaù trò:


FORMAT(bthöùc, maãu): Ñoåi bieåu thöùc coù kieåu baát kyø thaønh
chuoãi theo maãu ñaõ cho trong tham soá thöù 2. Coù theå söû duïng haøm STR
ñeå thay theá.
... vaø hoï caùc haøm chuyeån ñoåi bieåu thöùc coù kieåu baát kyø thaønh
moät giaù trò thuoäc kieåu xaùc ñònh: CSTR, CINT, CLNG, CSIN, CDBL, v.v...

Cuù phaùp vaø ngöõ nghóa cuï theå cuûa caùc haøm naøy coù theå ñöôïc tìm
thaáy trong caùc taøi lieäu höôùng daãn cuï theå cuûa caùc haõng cung caáp phaàn

139
meàm. Taøi lieäu naøy khoâng coù tham voïng trình baøy chi tieát caùc haøm cuûa
ngoân ngöõ heä quaûn trò CSDL cuï theå.

6.3. Nhoùm leänh caäp nhaät döõ lieäu.

Nhoùm leänh thao taùc döõ lieäu (Data Manipulation Language) bao
goàm caùc leänh Theâm boä giaù trò môùi, Söûa giaù trò cuûa (caùc) boä cuûa quan
heä vaø Huûy boû (caùc) boä giaù trò cuûa (caùc) quan heä (hoaëc caùc baûng).
Nhöõng leänh naøy ñöôïc goïi chung laø leänh caäp nhaät CSDL.

6.3.1. Boå sung (caùc) boä giaù trò môùi.

Coù 2 caùch boå sung boä giaù trò môùi cho baûng. Caùch 1, boå sung
tröïc tieáp moät boä bôûi moät leänh SQL vaø caùch 2, boå sung nhieàu boä giaù trò
laáy töø (caùc) boä giaù trò cuûa (caùc) baûng cuûa CSDL.

6.3.1.1. Boå sung tröïc tieáp moät boä giaù trò.

Cuù phaùp:
INSERT INTO <teân baûng> [ (<teân coät 1>, <teân coät 2> ...)]
VALUES (<bieåu thöùc 1>, <bieåu thöùc 2>, ...);

Ngöõ nghóa: Theâm moät boä giaù trò (baûn ghi) môùi vaøo baûng coù teân
ñöôïc chæ ra sau töø khoùa INTO vôùi giaù trò cuûa <bieåu thöùc 1> ñöôïc gaùn
cho <teân coät 1>, <bieåu thöùc 2> ñöôïc gaùn cho <teân coät 2> v.v...
 Löu yù: Soá löôïng bieåu thöùc vaø kieåu giaù trò cuûa caùc bieåu thöùc
phaûi töông öùng vôùi soá löôïng vaø kieåu giaù trò cuûa caùc teân coät trong danh
saùch teân coät cuûa baûng. Ngoaøi ra, caùc giaù trò coøn phaûi phuø hôïp vôùi caùc
raøng buoäc toaøn veïn ñònh nghóa treân quan heä, trong ñoù coù RBTV veà
khoùa chính (Primary key), khoùa ngoaïi (Foreign Key) vaø mieàn giaù trò.
Teân thuoäc caùc tính khoùa chính vaø khoùa ngoaïi phaûi coù maët trong danh
saùch teân coät cuûa leänh. Neáu caùc giaù trò cuûa caùc bieåu thöùc sau töø khoùa
140
VALUES vi phaïm RBTV thì heä quaûn trò CSDL seõ thoâng baùo loãi vaø boä
giaù trò môùi seõ khoâng ñöôïc boå sung vaøo baûng.

Ví duï 6.3.1.
Theâm moät phoøng môùi coù teân laø Marketing, Maõ soá laø 20, ñaët taïi
ñòa ñieåm San Diego, kinh phí hoaït ñoäng 240.000 $ / naêm. Phoøng
khoâng coù doanh thu vaø chöa coù ngöôøi phuï traùch. Caâu leänh SQL nhö
sau:
INSERT INTO DEPARTMENT
(DeptNo, DeptName, Loc, Mgr, Exp_Budg, Rev_Budg )
VALUES (20, ‘Marketing’, ‘San Diego’, NULL, 240000, NULL);

Keát quaû ta coù baûng DEPARTMENT vôùi theå hieän môùi nhö sau:
Deptno Deptname Loc Mgr Exp_budg Rev_budg
10 Accounting Dallas 200 10.000
20 Marketing San Diego 240.000
30 Research San Fransisco 105 125.000
40 Sales Boston 109 280.000 800.000
50 Manufacturing Houston 210 130.000
60 Shipping Houston 215 90.000

Neáu giaù trò cuûa caùc bieåu thöùc trong ngoaëc troøn sau töø khoaù
VALUES hoaøn toaøn phuø hôïp veà soá löôïng, mieàn giaù trò vaø thöù töï cuûa caùc
coät trong baûng thì danh saùch teân caùc coät cuûa baûng sau töø khoùa INTO
coù theå ñöôïc boû qua. Ví duï treân coù theå vieát töông ñöông (vaø cho keát
quaû nhö baûng treân):
INSERT INTO DEPARTMENT
VALUES (20, ‘Marketing’, ‘San Diego’, NULL, 240000, NULL);

6.3.1.2. Theâm moät hay nhieàu boä giaù trò töø baûng CSDL.

Cuù phaùp:
INSERT INTO <teân baûng> [ (<teân coät 1>, <teân coät 2> ...)]
SELECT <bieåu thöùc 1>, <bieåu thöùc 2> , ....

141
FROM <danh saùch caùc baûng nguoàn>
[WHERE <ñieàu kieän>]
[GROUP BY <danh saùch coät phaân nhoùm>]
[ORDER BY <coät 1> [ASC  DESC], <coät 1> [ASC  DESC],... ]
[HAVING <ñieàu kieän>];

Ngöõ nghóa: Cuõng nhö treân, soá löôïng bieåu thöùc vaø kieåu giaù trò
cuûa caùc bieåu thöùc sau SELECT phaûi phuø hôïp vôùi soá löôïng vaø kieåu
cuûa caùc coät coù teân trong danh saùch ñi sau teân baûng, ñoàng thôøi phaûi
phuø hôïp vôùi caùc RBTV ñöôïc ñònh nghóa treân quan heä ñoù. Neáu boä giaù
trò SELECT ñöôïc vi phaïm RBTV ñònh nghóa treân quan heä ñöôïc boå sung
thì seõ coù caùc thoâng baùo loãi thích hôïp vaø boä ñoù khoâng ñöôïc boå sung
vaøo baûng.
Neáu giaù trò cuûa caùc bieåu thöùc sau töø khoaù SELECT hoaøn toaøn
phuø hôïp veà soá löôïng, mieàn giaù trò vaø thöù töï cuûa caùc coät trong baûng thì
danh saùch teân caùc coät cuûa baûng sau töø khoùa INTO coù theå ñöôïc boû qua.

Ví du 6.3.2:
Boå sung caùc baûn ghi cho baûng EMPLHIST ñoái vôùi nhöõng nhaân
vieân chöa coù quaù trình coâng taùc naøo trong baûng, vôùi giaû thieát theâm
raèng hoï ñöôïc tuyeån duïng vaøo laøm taïi Coâng ty keå töø ngaøy 01/01/1980.
Caâu leänh SQL ñöôïc vieát nhö sau:

INSERT INTO EMPLHIST


(EmpNo, Seq, Date_Beg, Salary, FrJob, ToJob, Promo, ToDept)
SELECT EmpNo, 1, #01/01/1980#, Salary, Job, Job, No, Dept
FROM EMPLOYEE
WHERE EmpNo NOT IN
(SELECT DISTINCT EmpNo FROM EMPLOYEE);

Hoaëc vieát töông ñöông (theâm 2 giaù trò khoâng xaùc ñònh NULL cho
2 coät Date_End vaø FrJob ñeå cho chuùng hoaøn toaøn phuø hôïp veà soá löôïng,

142
thöù töï vaø kieåu giaù tri cuûa danh saùch thuoäc tính cuûa baûng, ñoàng thôøi boû
qua danh saùch thuoäc tính sau teân baûng):

INSERT INTO EMPLHIST


SELECT EmpNo, 1, #01/01/1980#, NULL, Salary, Job, Job, No, NULL,
DeptNo
FROM EMPLOYEE
WHERE Empno NOT IN
(SELECT DISTINCT Empno FROM EMPLHIST
WHERE EMPLHIST.Empno = EMPLOYEE.Empno
);

Keát quaû chuùng ta coù theân boä giaù trò môùi sau ñaây seõ ñöôïc boå
sung vaøo baûng EMPLHIST:
EmpNo Seq Date_Beg Date_End Salary FrJob ToJob Promo FrDept ToDept
100 1 01/01/80 1700 Clrk Clrk N 10
103 1 01/01/81 3500 Anlt Anlt N 30
105 1 01/01/81 4500 Mngr Mngr N 30
110 1 01/01/81 1800 Clrk Clrk N 50
200 1 01/01/81 2900 Mngr Mngr N 10
210 1 01/01/81 3600 Mngr Mngr N 50
213 1 01/01/81 1625 Clrk Clrk N 60
214 1 01/01/81 825 Drvr Drvr N 60
215 1 01/01/81 2700 Spvr Spvr N 60

6.3.2. Taïo môùi moät baûng vôùi caùc boä giaù trò laáy töø CSDL.

Caùc caâu truy vaán döõ lieäu ñeå tìm kieám thoâng tin taïo ra moät baûng
trung gian vôùi nhöõng moái lieân heä sao cho coù theå xem vaø, neáu ñöôïc
pheùp, coù theå söûa chöõa döõ lieäu hoaëc xoùa boû chuùng. Caùc QUERY ñoù ñaõ
taïo ra nhöõng khung nhìn (VIEW). Trong nhieàu tröôøng hôïp chuùng ta
muoán caùc baûng naøy trôû thaønh nhöõng baûng vaät lyù, ñöôïc löu tröõ laâu daøi
trong CSDL. Ñieàu naøy coù theå ñöôïc thöïc hieän nhôø 1 leänh truy vaán
haønh ñoäng (Action Query) goïi laø truy vaán taïo baûng môùi (Make Table
Query).
143
Cuù phaùp:
SELECT <bieåu thöùc 1>, <bieåu thöùc 2> , ....
FROM <danh saùch caùc baûng nguoàn>
INTO TABLE <teân baûng>
[WHERE <ñieàu kieän>]
[GROUP BY <danh saùch coät phaân nhoùm>]
[ORDER BY <coät 1> [ASC  DESC], <coät 1> [ASC  DESC],... ]
[HAVING <ñieàu kieän>];

 Ghi chuù: Trong Oracle, caâu leänh naøy laø CREATE TABLE coù cuù
phaùp nhö sau:
CREATE TABLE <teân baûng> AS
SELECT <bieåu thöùc 1>, <bieåu thöùc 2> , ....
FROM <danh saùch caùc baûng nguoàn> INTO TABLE <teân baûng>
[WHERE <ñieàu kieän>]
[GROUP BY <danh saùch coät phaân nhoùm>]
[ORDER BY <coät 1> [ASC  DESC], <coät 1> [ASC  DESC],... ]
[HAVING <ñieàu kieän>];

Ví duï 6.3.3.
Taïo baûng môùi teân laø MANAGER bao goàm chæ nhöõng nhaân vieân
phuï traùch caùc phoøng ban.
SELECT * FROM EMPLOYEE INTO TABLE MANAGER
WHERE Job = ‘Mngr’ ORDER BY DeptNo;

Keát quaû ta coù moät baûng môùi MANAGER vôùi caùc baûn ghi sau:
EmpNo Name Job Salary Comm DeptNo Sex
200 Chen Mngr 2.900 10 F
105 Watson Mngr 4.500 0 30 M
109 Allen Mngr 3.800 8.000 40 F
210 Ramirez Mngr 3.600 50 M

144
6.3.3. Söûa noäi dung caùc baûn ghi:

Thoâng thöôøng coù theå söûa noäi dung cuûa (caùc) baûn ghi baèng caùch
cho hieän noäi dung cuûa baûng (goïi laø Browse hoaëc Open baûng), di
chuyeån con troû (Cursor) ñeán baûn ghi caàn söûa vaø thöïc hieän vieäc söûa
ñoåi giaù trò cuûa caùc field cuûa baûn ghi theå theo yeâu caàu. Tuy nhieân caùch
laøm naøy laø phuø hôïp vôùi caùc baûng cuûa CSDL nhoû, vaø soá löôïng baûn ghi
caàn söûa cuõng raát ít. Ñoái vôùi caùc baûng lôùn nhieàu ngaøn - thaäm chí haøng
chuïc ngaøn nhö baûng CCVC trong CSDL quaûn lyù coâng chöùc vieân chöùc
thaønh phoá, hay traêm ngaøn nhö baûng caùc ñoái töôïng chính saùch trong
CSDL quaûn lyù caùc ñoái töôïng chính saùch, coù coâng Caùch maïng; hoaëc
nhieàu trieäu baûn ghi nhö baûng thoâng tin chi tieát veà moät cö daân trong
CSDL quaûn lyù daân soá TP.Hoà Chí Minh v.v... thì vieäc söûa (caäp nhaät)
thoâng tin bieán ñoäng chæ 1 baûn ghi thoâi cuõng ñaõ laø khoù khaên.
Ngoân ngöõ quaûn trò CSDL cung caáp moät leänh cho pheùp söûa ñoåi
noäi dung caùc baûn ghi trong CSDL moät caùch deã daøng, chính xaùc vaø
nhanh choùng.

Cuù phaùp leänh nhö sau:


UPDATE <teân baûng>
SET <teân coät 1> = <bieåu thöùc 1>,
<teân coät 2> = <bieåu thöùc 2>, ...
<teân coät n> = <bieåu thöùc n>
[WHERE <ñieàu kieän>];

Ngöõ nghóa: Giaù trò cuûa caùc field coù teân trong danh saùch <teân coät
1>, <teân coät 2> ... cuûa nhöõng baûn ghi thoaû maõn ñieàu kieän sau WHERE
seõ ñöôïc söûa ñoåi thaønh giaù trò cuûa caùc <bieåu thöùc 1>, <bieåu thöùc 2> ...
töông öùng. Neáu khoâng coù meänh ñeà ñieàu kieän WHERE, thì taát caû caùc
baûn ghi cuûa baûng seõ ñöôïc söûa ñoåi.

 Ghi chuù: SQL/Plus cuûa Oracle môû roäng cuù phaùp, cho pheùp
lieät keâ danh saùch caùc teân coät cuûa baûng caàn söûa ñoåi giaù trò trong caëp
145
daáu ngoaëc troøn sau töø khoùa SET vaø danh saùch caùc giaù trò môùi cuûa
chuùng trong caëp daáu ngoaëc troøn theo sau daáu baèng ( = ), ñoàng thôøi
chaáp nhaän nhieàu danh saùch nhö theá trong caâu leänh UDATE. Cuù phaùp
nhö sau:

UPDATE <teân baûng>


SET<d/saùch teân coät 1> = <d/saùch bieåu thöùc 1>,
< d/saùch teân coät 2> = < d/saùch bieåu thöùc 2>, ...
< d/saùch teân coät n> = < d/saùch bieåu thöùc n>
[WHERE <ñieàu kieän>];

Ví duï 6.3.4:
Taêng löông theâm 10% cho caùc nhaân vieân phuï traùch caùc phoøng ban.

UPDATE EMPLOYEE
= Salary * 1.1
SET Salary
WHERE Job = ‘Mngr’;

Keát quaû laø, löông môùi cuûa caùc nhaân vieân phuï traùch caùc phoøng
ban ñöôïc theå hieän nhö trong baûng döôùi ñaây:
EmpNo Name Job Salary Comm DeptNo Sex
200 Chen Mngr 3.190 10 F
105 Watson Mngr 4.950 0 30 M
109 Allen Mngr 4.180 8.000 40 F
210 Ramirez Mngr 3.960 50 M

6.3.4. Xoùa boû caùc baûn ghi khoûi moät baûng:

Vieäc loaïi boû moät baûn ghi khoûi moät baûng trong CSDL laø moät
trong nhöõng thao taùc caäp nhaät döõ kieäu ñöôïc tieán haønh moät caùch
thöôøng xuyeân nhaèm ñaûn baûo phaûn aùnh tình traïng môùi nhaát cuûa CSDL.
146
Cuù phaùp:
DELETE FROM <teân baûng>
[WHERE <ñieàu kieän>];
Ngöõ nghóa: Caùc baûn ghi thoaû maõn ñieàu kieän sau WHERE seõ bò
xoaù khoûi baûng. Neáu khoâng coù meänh ñeà WHERE thì taát caû caùc baûn ghi
cuûa baûng seõ bò xoùa khoûi baûng.

 Löu yù: Neáu thao taùc treân View, töùc laø moät baûng trung gian
cuûa moät caâu leänh truy vaán SQL, vaø ngöôøi söû duïng ñöôïc quyeàn caäp
nhaät xoùa döõ lieäu, thì khi thöïc hieän leänh naøy caùc baûn ghi trong caùc
baûng vaät lyù cuûa CSDL cuõng seõ bò xoùa.

Ví duï 6.3.5:
Xoùa taát caû caùc nhaân vieân phuï traùch caùc phoøng ban khoûi baûng
nhaân vieân EMPLOYEE. Caâu leänh SQL nhö sau:
DELETE FROM EMPLOYEE
WHERE Job = ‘Mngr’;
Keát quaû laø, baûng EMPLOYEE chæ coøn caùc baûn ghi sau:
EmpNo Name Job Salary Comm DeptNo Sex
100 Wilson Clrk 1.700 10 M
101 Smith Slsm 2.500 1.300 40 F
103 Reed Anlt 3.500 30 M
110 Turner Clrk 1.800 50 M
213 McDonnel Clrk 1.625 60 M
214 Simpson Drvr 825 60 M
215 Di Salvo Spvr 2.700 60 M
220 Schwartz Slsm 4.200 5.300 40 F

147
6.4. Caùc leänh khai baùo caáu truùc CSDL

Muïc naøy seõ trình baøy caùc khía caïnh loâgic veà baûng vaø coät cuûa
baûng, vaø caùc leänh caàn thieát ñeå taïo caùc baûng cuøng caùc raøng buoäc toaøn
veïn ñònh nghóa treân caùc baûng. Ñaây laø phaàn ñaàu tieân trong soá caùc leänh
SQL trong ngoân ngöõ ñònh nghóa döõ lieäu (Data Definition Language -
DDL).

6.4.1. Caùch ñaët teân ñoái töôïng:

SQL chuaån hoùa (86, 89, 92, 96) ñeàu quy ñònh caùch ñaët teân caùc
ñoái töôïng nhö teân baûng, teân coät cuûa baûng, teân View, teân RBTV v.v...
(goïi chung laø ñònh danh - Identifier) nhö sau:
Teân goïi goàm toái ña 32 kyù töï chöõ caùi Latinh, chöõ soá Araäp vaø daáu
gaïch chaân (Underscore) vaø phaûi baét ñaàu baèng moät chöõ caùi Latinh
hoaëc daáu gaïch chaân. Tuyeät ñoái khoâng chöùa khoaûng traéng hay kyù töï
chöõ caùi khoâng phaûi Latinh nhö tieáng Vieät chaúng haïn. Chöõ in hoa hay
chöõ thöôøng ñeàu ñöôïc xem laø nhö nhau. Teân baûng phaûi laø duy nhaát
trong CSDL vaø teân baûng trung gian, vaø khoâng truøng vôùi baát cöù töø
khoùa naøo trong ngoân ngöõ quaûn trò CSDL.
Teân coät cuûa moät baûng phaûi laø khaùc nhau, nhöng chuùng coù theå
gioáng nhau neáu chuùng naèm trong caùc baûng khaùc nhau. Ngöôøi ta ñeà
nghò raèng nhöõng teân mang ngöõ nghóa gioáng nhau vaø moâ taû cuøng moät
thöïc theå thi neân ñaët teân gioáng nhau. Chaúng haïn, teân coät soá hieäu
phoøng ban neân ñaët laø DEPTNO trong caû hai baûng EMPLOYEE vaø
DEPARTMENT, hay teân coät maõ ngaïch coâng chöùc vieân chöùc (CCVC)
neân ñaët laø MA_NGACH trong caû 3 baûng CCVC, danh muïc ngaïch CCVC:
NGACH_LG vaø baûng ngaïch - baäc - heä soá löông: NGACH_BAC_HESO.

Ví duï 6.4.1:

EMP_85 : laø teân hôïp leä


85EMPL : khoâng hôïp leä, vì töï ñaàu tieân laø chöõ soá.
148
BAÛNG_NV : khoâng hôïp leä vì coù kyù töï tieáng Vieät
BANG-N/V : khoâng hôïp leä vì coù daáu tröø (-) vaø daáu chia (/)
DANH SACH : khoâng hôïp leä vì coù khoaûng traéng
UPDATE : khoâng hôïp leä vì laø töø daønh rieâng cuûa ngoân ngöõ .

6.4.2. SQL Taïo baûng CSDL:

Moät trong nhöõng daïng ñôn giaûn nhaát cuûa caâu leänh taïo baûng
CSDL quan heä coù cuù phaùp nhö sau:

CREATE TABLE <teân baûng> (


<teân coät 1> <kieåu döõ lieäu 1>(<kích thöôùc 1>),
<teân coät 2> <kieåu döõ lieäu 2>(<kích thöôùc 2>),

<teân coät n> <kieåu döõ lieäu n>(<kích thöôùc n>)
);

Kieåu döõ lieäu coù theå laø:


CHAR (w) : Kieåu kyù töï vôùi kích thöôùc coá ñònh. Chieàu daøi cuûa
giaù trò döõ lieäu luoân luoân laø w kyù töï. Neáu coät ñöôïc
gaùn giaù trò laø moät chuoãi kyù töï coù chieàu daøi nhoû hôn
w thì caùc kyù töï khoaûng caùch (space) seõ ñöôïc ñieàn
vaøo beân phaûi chuoãi (Right Padded) ñeå cho ñuû w kyù
töï. Kích thöôùc toái thieåu laø 1 vaø toái ña laø 255 kyù töï.
VARCHAR(w) : Kieåu kyù töï vôùi kích thöôùc thay ñoåi töø 0 ñeán w kyù
töï. Giaù trò lôùn nhaát cuûa w laø 2000.
NUMBER (w, s): Kieåu döõ lieäu soá coù kích thöôùc toái ña w kyù töï (keå
chöùa daáu chaám thaäp phaân), trong ñoù coù s chöõ soá
sau daáu chaám theå hieän phaàn soá leû.
DATE : Kieåu döõ lieäu ngaøy thaùng naêm
LOGICAL : Kieåu döõ lieäu loâgic 1 byte coù giaù trò hoaëc ñuùng (True),
hoaëc sai (False).

149
Ví duï 6.4.2:
Leänh SQL ñeå taïo baûng DEPARTMENT nhö ñaõ neâu trong Chöông
V, muïc 5.3, baøi 7 nhö sau:

CREATE TABLE DEPARTMENT (


Deptno NUMBER (2),
Deptname CHAR (15),
Loc CHAR (15),
Mgr NUMBER (3),
Exp_budg NUMBER (7),
Rev_budg NUMBER (7)
);

Trong baûng naøy chuùng ta ñaõ xaùc ñònh DeptNo laø thuoäc tính khoùa;
moät phoøng ban phaûi coù moät teân goïi, ñòa ñieåm, vaø kinh phí hoaït ñoäng
xaùc ñònh, nghóa laø DeptName, Loc, Exp_Budg phaûi khaùc NULL; ñoàng thôøi
chuùng ta coù theå muoán ñòa ñieåm maëc ñònh cuûa caùc phoøng ban laø
‘Houston’. Caùch khai baùo caùc RBTV kieåu naøy ñöôïc hoã trôï bôûi caùc töø
khoùa PRIMARY KEY, DEFAULT, UNIQUE vaø NOT NULL nhö sau:

CREATE TABLE DEPARTMENT (


DeptNo NUMBER (2) PRIMARY KEY,
DeptName CHAR (15) NOT NULL,
Loc CHAR (15) NOT NULL DEFAULT ‘Houston’,
Mgr NUMBER (3),
Exp_Budg NUMBER (7) NOT NULL,
Rev_Budg NUMBER (7)
);

Ví duï 6.4.3:
Taïo caáu truùc baûng caùc chöùc danh (coâng vieäc) JOBS coù theå coù
cuûa coâng ty:

150
CREATE TABLE JOBS (
Job CHAR (5) CONSTRAINT PK PRIMARY KEY,
Jobname CHAR(15) NOT NULL UNIQUE,
Minsalary NUMBER(4),
Maxsalary NUMBER(4),
Mgrflag CHAR(1)
);

Nhöng chæ vôùi caùch khai baùo nhö treân thì chuùng ta vaãn coøn quaù
nhieàu vieäc phaûi laøm trong vieäc ñònh nghóa caùc RBTV treân baûng vaø
caùc baûng: RBTV veà mieàn giaù trò cuûa moät thuoäc tính, RBTV ñònh
nghóa treân nhieàu thuoäc tính cuûa moät baûng, RBTV phuï thuoäc toàn taïi,
RBTV lieân thuoäc tính, lieân quan heä v.v... Ngoân ngöõ quaûn trò CSDL
cho pheùp khai baùo caùc RBTV naøy trong khi taïo caáu truùc caùc baûng bôûi
meänh ñeà CONSTRAINT maø chuùng ta seõ ñöôïc laøm quen trong muïc 6.5
döôùi ñaây.

6.5. Khai baùo caùc RBTV

Nhö ñaõ trình baøy trong Chöông V, muïc 5.3, caùc ví duï töø 5.3.1
ñeán 5.3.12 vaø phaàn baøi taäp cuoái Chöông V, cô sôû döõ lieäu veà quaûn lyù
nhaân vieân vôùi caùc baûng DEPARTMENT, EMPLOYEE, JOBS vaø EMPLHIST
coù caùc RBTV ñònh nghóa treân chuùng nhö:
- Maõ soá phoøng ban DeptNo trong baûng DEPARTMENT, EMPLOYEE
chæ coù theå laø 10, 20, 30, 40, 50, 60, 70, 80, 90; ñoàng thôøi maõ
phoøng ban trong baûng EMPLOYEE laø khoùa ngoaïi.
- Maõ soá nhaân vieân Empno laø moät soá goàm 3 chöõ soá coù giaù trò töø
100 ñeán 999.
- Maõ coâng vieäc trong baûng EMPLOYEE laø khoùa ngoaïi tham chieáu
tôùi baûng caùc coâng vieäc JOBS.
- Trong baûng coâng vieäc JOBS, möùc löông toái thieåu (MinSalary)
cuûa moãi coâng vieäc phaûi nhoû hôn möùc löông toái ña cuûa noù.

151
- Khoùa cuûa quan heä (baûng) EMPLHIST goàm 2 thuoäc tính: EmpNo
vaø Seq.
- Caùc thuoäc tính FrJob, ToJob cuûa baûng EMPLHIST laø caùc thuoäc
tính khoùa ngoaïi tham chieáu tôùi baûng JOBS; FrDept, ToDept cuûa
baûng EMPLHIST laø caùc thuoäc tính khoùa ngoaïi tham chieáu tôùi
baûng DEPARTMENT.

Caùch khai baùo caùc RBTV treân nhö theá naøo, chuùng ta seõ laàn löôït
ñöôïc laøm quen töøng böôùc qua caùc meänh ñeà CONSTRAINT döôùi ñaây:

6.5.1. RBTV veà mieàn giaù trò:

Cuù phaùp:
[CONSTRAINT <teân RBTV>] CHECK (<ñieàu kieän>)
Raøng buoäc toaøn veïn veà mieàn giaù trò naøy coù theå ñònh nghóa treân
moät coät cuûa baûng, coù theå ñöôïc vieát ngay sau teân thuoäc tính maø khoâng
caàn phaûi vieát teân RBTV trong cuïm CONSTRAINT <teân RBTV>. Neáu
ñònh nghóa treân nhieàu coät cuûa baûng thì neân söû duïng cuïm naøy vaø ñöôïc
vieát sau khi ñaõ khai baùo xong caùc thuoäc tính cuûa baûng.
<Ñieàu kieän> laø moät bieåu thöùc loâgic baát kyø nhö ñaõ trình baøy
trong phaàn caâu leänh truy vaán thoâng tin, tuy nhieân trong bieåu thöùc
khoâng ñöôïc chöùa caùc caâu hoûi con (SubQueries).

Ví duï 6.5.4:
Vieát laïi caâu leänh khai baùo caáu truùc baûng DEPARTMENT vôùi
RBTV veà mieàn giaù trò cho coät DeptNo:

CREATE TABLE DEPARTMENT (


DeptNo NUMBER (2) PRIMARY KEY CHECK (DeptNo MOD 10 = 0),
DeptName CHAR (15) NOT NULL,
Loc CHAR (15) NOT NULL DEFAULT “Houston”,

152
Mgr NUMBER (3),
Exp_Budg NUMBER (7) NOT NULL,
Rev_Budg NUMBER (7)
);

Pheùp toaùn MOD duøng ñeå laáy phaàn dö cuûa moät pheùp chia hai soá
nguyeân. Meänh ñeà CHECK ôû treân cho pheùp chæ nhaän nhöõng baûn ghi coù
giaù trò ôû coät DeptNo laø boäi cuûa 10: 10, 20, 30, ... vaø 90. Caâu leänh treân
coù theå ñöôïc vieát caùch khaùc töông ñöông nhö sau:

CREATE TABLE DEPARTMENT (


DeptNo NUMBER (2) PRIMARY KEY,
DeptName CHAR (15) NOT NULL,
Loc CHAR (15) NOT NULL DEFAULT ‘Houston’,
Mgr NUMBER (3),
Exp_Budg NUMBER (7) NOT NULL,
Rev_Budg NUMBER (7)
CONSTRAINT PK_VAL CHECK (DeptNo MOD 10 = 0)
);

6.5.2. RBTV veà khoùa ngoaïi hay phuï thuoäc toàn taïi:

Cuù phaùp: Ñònh nghóa cho baûng treân nhieàu coät cuûa baûng

, [CONSTRAINT <teân RBTV>]


FOREIGN KEY (<caùc thuoäc tính khoùa ngoaïi>)
REFERENCES <teân baûng> (<caùc coät khoùa chính>)

Vaø ñònh nghóa cho moät coät khoùa ngoaïi cuûa baûng:

[CONSTRAINT <teân RBTV>]


REFERENCES <teân baûng> (<caùc coät khoùa chính>)

153
 Löu yù: trong cuù phaùp ñònh nghóa treân moät coät cuûa baûng
khoâng coù caùc töø khoùa FOREIGN KEY vaø khoâng coù daáu phaûy ôû tröôùc
CONSTRAINT. Caùc RBTV ñònh nghóa treân coät ñöôïc vieát ngay trong
doøng moâ taû coät.

Ví duï 6.5.5:
Ñònh nghóa caáu truùc caùc baûng EMPLOYEE vaø EMPLHIST:

CREATE TABLE EMPLOYEE (


EmpNo NUMBER(3) PRIMARY KEY,
Name CHAR (10) NOT NULL,
Job CHAR (5) REFERENCES JOBS (Job),
Salary NUMBER (5) NOT NULL,
Comm NUMBER (5),
DeptNo NUMBER (2) REFERENCES DEPARTMENT (DeptNo),
Sex CHAR (1) CHECK (Sex = ‘F’ OR Sex = ‘M’)
);

Vaø:
CREATE TABLE EMPLHIST (
EmpNo NUMBER(3),
Seq NUMBER(3) NOT NULL,
Date_Beg DATE NOT NULL,
Date_End DATE,
Salary NUMBER (5) NOT NULL,
FrJob CHAR (5) REFERENCES JOBS (Job),
Tojob CHAR (5),
Promo LOGICAL NOT NULL,
FrDept NUMBER (2),
ToDept NUMBER (2) REFERENCES DEPARTMENT (DeptNo),
CONSTRAINT P_KEY PRIMARY KEY (EmpNo, Seq)
);

Vôùi RBTV veà khoùa ngoaïi coøn coù theå söû duïng tuøy choïn (Option)
ON DELETE CASCADE ñeå thöïc hieän vieäc xoùa moät boä cuûa baûng chöùa

154
khoùa chính thì seõ xoùa taát caû caùc baûn ghi cuûa baûng chöùa khoùa ngoaïi.
Chaúng haïn, khi xoùa ñi moät phoøng ban khoûi baûng DEPARTMENT, thì taát
caû caùc nhaân vieân thuoäc phoøng ñoù cuõng seõ bò xoùa boû khoûi baûng
EMPLOYEE. Meänh ñeà xoùa ON DELETE CASCADE mang tính “lan toûa”
naøy ñöôïc ñaët sau meänh ñeà REFERENCES.

Ví duï 6.5.6:
Ñònh nghóa caáu truùc caùc baûng EMPLOYEE vaø EMPLHIST ñöôïc vieát
laïi vôùi RBTV veà khoùa ngoaïi coù söï xoùa “lan toûa” nhö sau:

CREATE TABLE EMPLOYEE (


EmpNo NUMBER(3) PRIMARY KEY,
Name CHAR (10) NOT NULL,
Job CHAR (5) REFERENCES JOBS (Job),
Salary NUMBER (5) NOT NULL,
Comm NUMBER (5),
DeptNo NUMBER (2),
Sex CHAR (1) CHECK (Sex = ‘F’ OR Sex = ‘M’),
CONSTRAINT DEPT_CASC REFERENCES DEPARTMENT (DeptNo)
ON DELETE CASCADE
);

Vaø:
CREATE TABLE EMPLHIST (
EmpNo NUMBER(3),
Seq NUMBER(3) NOT NULL,
Date_Beg DATE NOT NULL,
Date_End DATE,
Salary NUMBER (5) NOT NULL,
FrJob CHAR (5) REFERENCES JOBS (Job),
ToJob CHAR (5),
Promo LOGICAL NOT NULL,
FrDept NUMBER (2),
ToDept NUMBER (2) REFERENCES DEPARTMENT (DeptNo),
CONSTRAINT PKEY PRIMARY KEY (EmpNo, Seq),

155
CONSTRAINT FKEY FOREIGN KEY (EmpNo)
REFERENCES EMPLOYEE (EmpNo, Seq)
ON DELETE CASCADE
);

6.5.3. Moät soá tuøy choïn khaùc:

DISABLE : Neáu boå sung töø khoùa naøy vaøo sau RBTV, thì heä quaûn
trò CSDL vaãn ghi nhaän RBTV nhöng khoâng baét buoäc kieåm tra söï vi
phaïm RBTV khi caäp nhaät döõ lieäu cho baûng. Ngöôøi chuû sôû höõu hoaëc
ngöôøi quaûn trò CSDL coù theå baét ñaàu baét buoäc kieåm tra RBTV baèng
caùch kích hoaït vôùi töø khoùa ENABLE khi thöïc hieän leänh söûa ñoåi caáu truùc
baûng ALTER TABLE (trình baøy trong muïc 6.6 cuûa chöông naøy).
EXCEPTIONS INTO <teân baûng> : Nhöõng baûn ghi vi phaïm RBTV
khi caäp nhaät döõ lieäu (trong quaù trình caäp nhaät theo loâ - Batch
Updating) hoaëc khi kích hoaït kieåm tra RBTV seõ khoâng ñöôïc döa vaøo
baûng chính maø seõ ñöôïc löu laïi trong baûng caùc ngoaïi leä chæ ra sau caùc
töø khoùa EXCEPTIONS INTO.

Toùm laïi, cuù phaùp toång quaùt cuûa leänh taïo caáu truùc baûng trong
CSDL nhö sau:
CREATE TABLE <teân baûng> (
<Column 1> <Type 1> (<Size 1>) [ CONSTRAINT clause 1],
<Column 2> <Type 2> (<Size 2>) [ CONSTRAINT clause 2],
...
<Column n> <Type n> (<Size n>) [ CONSTRAINT clause n]
, [ CONSTRAINT clause 1],
, [ CONSTRAINT clause 2],

, [ CONSTRAINT clause m],
);

Trong ñoù cuù phaùp cuûa caùc khai baùo RBTV laø nhö sau:
156
[ CONSTRAINT <teân RBTV> ] NULL  NOT NULL 
UNIQUE [ (<teân coät>, <teân coät>... ) ]
PRIMARY KEY(<teân coät>, <teân coät>... ) ]
FOREIGN KEY (<teân coät>, <teân coät>... ) ] ]
REFERENCES <teân baûng> (<teân coät>, <teân coät>... ) 
CHECK (<ñieàu kieän>)

6.6. Caùc leänh quaûn lyù baûng vaø töø ñieån döõ lieäu:

Trong phaàn thöù hai veà Ngoân ngöõ Ñònh nghóa Döõ lieäu (Data
Definition Language - DDL) chuùng ta seõ tieáp tuïc trình baøy caùc leänh
quaûn lyù baûng: Söûa ñoåi caáu truùc vaø huûy boû baûng cuøng caùc RBTV ñònh
nghóa treân baûng.

6.6.1. Söûa ñoåi caáu truùc baûng:

Coù theå söû duïng leänh ALTER TABLE ñeå thay ñoåi caáu truùc baûng.
Coù 3 caùc thay ñoåi caáu truùc baûng, ñoù laø Boå sung theâm coät môùi (ADD
Column); Söûa ñoåi ñònh nghóa cuûa coät (MODIFY Column) vaø leänh huûy
boû RBTV treân coät hay treân caû baûng.

6.6.1.1: Boå sung theâm coät môùi: Leänh coù cuù phaùp nhö sau:
ALTER TABLE <teân baûng>
ADD ( <moâ taû coät> [< RBTV coät> ])
[ meänh ñeà ENABLE  DISABLE ];
ÔÛ ñaây:
< moâ taû coät > :: = <teân coät> <kieåu d.l> [ (<kích thöôùc>) ]

157
Ví duï 6.6.1:
Boå sung theâm coät teân Vôï/ Choàng (Spouses_name) daøi 15 kyù töï
cuûa nhaân vieân trong baûng EMPLOYEE:
ALTER TABLE EMPLOYEE
ADD ( Spouses_Name CHAR(15) );

6.6.1.1: Söûa ñoåi ñònh nghóa coät môùi: Leänh coù cuù phaùp nhö sau:

ALTER TABLE <teân baûng>


MODIFY (<Teân coät> <kieåu> (<kích thöôùc>) [ NULL ] )
[ meänh ñeà ENABLE  DISABLE ]

Ví duï 6.6.2:
Söûa laïi kích thöôùc coät teân nhaân vieân (Name) thaønh 25 kyù töï:
ALTER TABLE EMPLOYEE
MODIFY ( Name CHAR (25) );

Moät soá ñieåm löu yù:

- Khoâng theå söûa ñoåi moät coät coù chöùa giaù trò NULL töø thuoäc tính
NULL thaønh NOT NULL.
- Khoâng theå boå sung coät môùi vôùi thuoäc tính NOT NULL ñöôïc.
Muoán vaäy phaûi thöïc hieän qua 3 böôùc: (i) theâm coät vôùi thuoäc tính
NULL, (ii) ñieàn ñaày ñuû caùc giaù trò cho coät, (iii) ñoåi laïi thuoäc tính cuûa
coät thaønh NOT NULL.
- Khoâng ñöôïc pheùp söûa ñoåi kích thöôùc cuûa coät cho nhoû laïi, vaø
cuõng khoâng ñöôïc pheùp thay ñoåi kieåu döõ lieäu cuûa coät, tröø tröôøng hôïp
coät ñoù chöa coù döõ lieäu gì.
- Khoâng duøng tuøy choïn MODIFY ñeå ñònh nghóa RBTV treân coät
ngoaïi tröø RBTV NULL vaø NOT NULL
Ñeå söûa ñoåi caùc RBTV khaùc, tröôùc heát caàn loaïi boû (DROP) chuùng
roài sau ñoù boå sung RBTV môùi.

158
6.6.1.3. Huûy boû RBTV khoûi baûng.

Cuù phaùp:
ALTER TABLE <teân baûng>
DROP [ CONSTRAINT <teân RBTV> 
PRIMARY KEY 
UNIQUE (<coät>, <coät> ...) ] [ CASCADE ];

Töø khoùa CASCADE ñöôïc söû duïng khi muoán taát caû caùc RBTV phuï thuoäc
toàn taïi cuõng seõ ñöôïc huûy boû.

Ví duï 6.6.3:
Huûy boû RBTV khoùa chính cuûa baûng EMPLHIST:
ALTER TABLE EMPLHIST
DROP PRIMARY KEY

Ví duï 6.6.4:
Huûy boû RBTV khoùa chính cuûa baûng EMPLOYEE ñoàng thôøi huûy
boû caùc RBTV phuø thuoäc toàn taïi khaùc:
ALTER TABLE EMPLOYEE
DROP PRIMARY KEY CASCADE

Caâu leänh naøy cuõng huûy boû luoân caû RBTV khoùa ngoaïi
EMPLHIST.EmpNo

6.6.1.4. Meänh ñeà ENABLE vaø DISABLE cuûa caâu leänh ALTER TABLE:

Cuù phaùp toång quaùt cuûa caâu leänh ALTER TABLE vôùi meänh ñeà ENABLE
ALTER TABLE <teân baûng>
ENABLE UNIQUE PRIMARY KEY  CONSTRAINT <teân RBTV> [ CASCADE ] ;

159
VaØ cuù phaùp toång quaùt cuûa caâu leänh ALTER TABLE vôùi meänh ñeà
DISABLE
ALTER TABLE <teân baûng>
DISABLE UNIQUE  PRIMARY KEY  CONSTRAINT <teân RBTV> [ CASCADE ] ;

Ngöõ nghóa: Coù theå kích hoaït (ENABLE) hoaëc taïm ngöng kieåm tra
(DISABLE) ñoái vôùi caùc RBTV veà giaù trò duy nhaát (UNIQUE), khoùa chính
(PRIMARY KEY) hoaëc caùc RBTV khaùc (CONSTRAINT <teân RBTV).

 Ghi chuù:
- Khi kích hoaït moät RBTV thì RBTV ñoù seõ coù taùc duïng treân
toaøn boä döõ lieäu cuûa baûng. Taát caû caùc döõ lieäu trong baûng ñeàu phaûi thoûa
maõn RBTV.
- Khi kích hoaït caùc RBTV UNIQUE hoaëc PRIMARY KEY thì baûng
chæ muïc (INDEX) töông öùng seõ töï ñoäng ñöôïc taïo laäp.
- Meänh ñeà ENABLE vaø DISABLE coù theå ñöôïc söû duïng caû trong
caâu leänh CREATE TABLE vaø ALTER TABLE.
- Töø khoùa CASCADE cho pheùp kích hoaït hoaëc taïm ngöng kích
hoaït taát caû caùc RBTV phuï thuoäc toàn taïi khaùc coù lieân quan.

Ví duï 6.6.5:
Ngöng kích hoaït RBTV veà khoùa ngoaïi cuûa baûng EMPLOYEE ñoái
vôùi baûng DEPARTMENT:
ALTER TABLE EMPLOYEE
DISABLE CONSTRAINT PKEY;

Ví duï 6.6.6:
Ngöng kích hoaït RBTV khoùa chính cuûa quan heä EMPLOYEE
ñoàng thôøi ngöng kích hoaït RBTV khoùa ngoaïi cuûa quan heä EMPLHIST:
ALTER TABLE EMPLOYEE
DISABLE PRIMARY KEY CASCADE;

160
Vi duï 6.6.7:
Kích hoaït RBTV khoùa ngoaïi cuûa EMPLOYEE vöøa taïm ngöng ôû
treân ñeå noù hoaït ñoäng trôû laïi:
ALTER TABLE EMPLOYEE
ENABLE CONSTRAINT PKEY;

Ví duï 6.6.8:
Kích hoaït RBTV khoùa chính cuûa quan heä EMPLOYEE ñoàng thôøi
kích hoaït RBTV khoùa ngoaïi cuûa quan heä EMPLHIST hoaït ñoäng trôû laïi:
ALTER TABLE EMPLOYEE
ENABLE PRIMARY KEY CASCADE;

6.6.2. Huûy boû baûng

Cuù phaùp:
DROP TABLE <teân baûng>  <teân View>  <teân Index> [CASCADE
CONSTRAINTS] ;

Ngöõ nghóa: Huûy boû baûng coù teân sau töø khoùa DROP TABLE ra khoûi
CSDL. Khi ñoù taát caû caùc döõ lieäu trong baûng ñeàu bò xoùa boû. Ñeå huûy boû
caùc RBTV khaùc coù lieân quan tôùi baûng, caàn phaûi boå sung vaøo caâu leänh
töø khoùa CASCADE CONSTRAINTS.

 Ghi chuù: Khi moät baûng ñaõ bò huûy boû khoûi CSDL thì taát caû
caùc VIEW, caùc thuû tuïc vaø haøm coù lieân quan tôùi baûng vaàn toàn taïi, nhöng
khoâng coøn hôïp leä nöõa.
Chæ nhöõng ngöôøi taïo ra baûng hoaëc ngöôøi quaûn trò CSDL
(DataBase Administrator - DBA) môùi coù quyeàn huûy boû baûng khoûi
CSDL.

161
Coù theå söû duïng leänh DROP ñeå huûy boû caùc baûng loâgíc (VIEW) vaø
chæ muïc (INDEX).

Ví duï 6.6.9:
Huûy boû baûng EMPLHIST khoûi CSDL:
DROP TABLE EMPLHIST ;

6.6.3. Ñoåi teân baûng / khung nhìn:

Cuù phaùp:
RENAME <teân baûng cuõ> | <teân View cuõ> TO <teân baûng môùi> |
<teân View môùi> ;

Ngöõ nghóa: Teân baûng hoaëc teân View seõ ñöôïc ñoåi thaønh teân môùi
sau töø khoùa TO.
 Ghi chuù: Khi teân baûng hoaïc teân View ñöôïc ñoåi thaønh teân
môùi, thì caùc teân View coù lieân quan hay caùc chöông trình öùng duïng coù
söû duïng baûng (hoaëc View) cuõng phaûi ñöôïc söûa ñoåi theo teân môùi, neáu
khoâng seõ khoâng söû duïng ñöôïc.

Ví duï 6.6.10:
Ñoåi teân baûng DEPARTMENT thaønh DEPT vaø EMPLOYEE thaønh EMPL:
RENAME DEPARTMENT TO DEPT;
RENAME EMPLOYEE TO EMPL;

6.6.4. Xoùa boû taát caû caùc doøng cuûa baûng vaø giaûi phoùng vuøng nhôù:

Cuù phaùp:
TRUNCATE TABLE <teân baûng> ;

162
Ngöõ nghóa: Khaùc vôùi DELETE FROM <teân baûng> ñöôïc söû duïng
ñeå xoùa baûn ghi khoûi baûng nhöng vuøng nhôù treân boä nhôù thöù caáp (ñóa töø
hoaëc vaät mang tin töø tính khaùc) vaãn khoâng ñöôïc giaûi phoùng ñeå duøng
laïi. Leänh TRUNCATE sau khi ñaõ xoùa boû caùc baûn ghi khoûi baûng thì vuøng
nhôù cuûa caùc baûn ghi naøy seõ ñöôïc thu hoài vaø cho pheùp caùc baûng khaùc
söû duïng.

 Ghi chuù: Chæ coù ngöôøi taïo ra baûng hoaëc nhöõng ngöôøi quaûn trò
CSDL môùi coù quyeàn haïn TRUNCATE baûng.

6.6.5. Taïo moät khung nhìn (VIEW) cho ngöôøi söû duïng:

VIEW laø moät baûng loâgic, khoâng phaûi laø baûng vaät lyù (physical)
cuûa CSDL. Noù laø keát quaû cuûa caùc pheùp toaùn quan heä treân caùc baûng
vaät lyù hoaëc caùc VIEW trong CSDL. Noù khoâng coù rieâng moät baûn ghi
naøo, maø chæ nhö moät cuûa soå (Window) maø treân ñoù döõ lieäu cuûa caùc
baûng coù theå ñöôïc hieån thò vaø ñöôïc thay ñoåi. Caùc baûng ñeå laáy döõ lieäu
cho VIEW ñöôïc goïi laø baûng cô sôû (Base Tables), coøn VIEW ñöôïc löu
tröõ trong töø ñieån döõ lieäu (DATA DICTIONARY) döôùi daïng moät caâu leänh
truy vaán SQL. VIEW ñöôïc taïo töø moät baûng cô sôû, vôùi caùc pheùp toaùn
choïn vaø/hoaëc pheùp chieáu, ñöôïc goïi laø VIEW ñôn giaûn (Simple View),
ngöôïc laïi, VIEW ñöôïc taïo töø moät hay nhieàu baûng vaø/hoaëc coù söû duïng
caùc haøm tính toaùn treân caùc baûn ghi (hoaëc caùc nhoùm baûn ghi) ñöôïc goïi
laø VIEW phöùc taïp (Complex View).

Cuù phaùp:
CREATE [OR REPLACE] [ FORCE  NOFORCE ] VIEW <teân View>
[ (<teân alias>, <teân alias>, ... ) ]
AS SELECT <bieåu thöùc> [AS <teân coät>], <bieåu thöùc> [AS <teân
coät>], ...
FROM <baûng 1> [ <alias 1>], <baûng 2> [ <alias 2>] ...
[ WHERE <ñieàu kieän> ]
[ GROUP BY <teân coät>, <teân coät>, ... ]
163
[ HAVING <ñieàu kieän>]
[ ORDER BY <teân coät> [ ASCDESC ], <teân coät> [ ASC DESC ], ...
[ WITH CHECK OPTION [CONSTRAINT <teân RBTV> ] ]
[ WITH READ ONLY] ;

Ngöõ nghóa:
Cuïm töø khoùa OR REPLACE ñöôïc söû duïng ñeå taïo moät VIEW môùi
(neáu chöa coù) hoaëc söûa laïi ñònh nghóa cuûa VIEW ( neáu noù ñaõ toàn taïi).
Cuïm töø WITH CHECK OPTION ñöôïc söû duïng ñeå ñaûm baûo raèng
caùc baûn ghi môùi ñöôïc boå sung (INSERT) hay caäp nhaät (UPDATE) qua
VIEW ñeàu phaûi ñöôïc kieåm tra thoûa ñieàu kieän cuûa leänh SQL cuûa VIEW.

Neáu View ñöôïc taïo chæ cho pheùp ngöôøi söû duïng xem thoâng tin,
khoâng ñöôïc quyeàn boå sung hay söûa ñoåi döõ lieäu thì caàn boå sung cuïm töø
WITH READ ONLY trong caâu leänh taïo View.

 Ghi chuù: Ngöôøi söû duïng View khoâng söûa ñöôïc giaù trò cuûa caùc
coät tính toaùn ngay caû khi ñöôïc caáp quyeàn haïn (Privilege) theâm, söûa
döõ lieäu thoâng qua View.

Ví duï 6.6.11:
Taïo moät khung nhìn teân laø PERSONAL bao goàm caùc thoâng tin maõ
soá phoøng ban, teân phoøng ban, soá nhaân vieân, kinh phí hoaït ñoäng,
doanh thu, löông thaáp nhaát, löông cao nhaát, vaø löông trung bình cuûa
caùc nhaân vieân trong töøng phoøng ban. Caâu leänh nhö sau:

CREATE VIEW PERSONAL


( Deptno, Deptname, NumOfEmp, Exp_budg, Rev_budg, MinSalary,
MaxSalary, AvgSalary )
AS SELECT DeptNo, DeptName, COUNT(*), Exp_Budg, Rev_Budg,
MIN(Salary), MAX(Salary), AVG(Salary)
FROM DEPARTMENT A, EMPLOYEE B
WHERE A.DeptNo = B.DeptNo
GROUP BY DeptNo, DeptName, Exp_Budg, Rev_Budg ;
164
Ví duï 6.6.12:
Taïo View teân laø MANAGER bao goàm taát caû caùc nhaân vieân phuï
traùch caùc phoøng ban:
CREATE OR REPLACE VIEW MANAGER
AS SELECT * FROM EMPLOYEE WHERE JOB = ‘Mngr’
WITH CHECK OPTION CONSTRAINT Empl_ck;

Neáu ngöôøi söû duïng View ñònh söûa coâng vieäc cuûa nhaân vieân coù
maõ soá 109 thaønh coâng vieäc giaùm saùt (Sprv) bôûi caâu leänh :
UPDATE MANAGER
SET Job = ‘Sprv’
WHERE EmpNo = 109;

thì loãi seõ ñöôïc thoâng baùo, bôûi vì View quy ñònh: ñoù laø caùc nhaân vieân
phuï traùch caùc phoøng ban.

Cuõng vôùi ví duï treân neáu ta theâm cuïm töø WITH READ ONLY thì
caâu leänh:
DELETE FROM MANAGER WHERE EmpNo = 109;

seõ khoâng ñöôïc thi haønh vaø loãi thao taùc khoâng ñöôïc pheùp seõ ñöôïc hieän
ra ñeå nhaéc nhôû.

View coù theå ñöôïc huûy boû khoûi töø ñieån döõ lieäu bôûi leänh
DROP VIEW <teân View> ;

6.6.6. Taïo chæ muïc (INDEX) cho (caùc) coät:

Vieäc saép xeáp caùc baûn ghi theo thöù töï taêng hay giaûm daàn seõ laøm
taêng toác ñoä thao taùc thoâng tin treân CSDL. Chi phí tính toaùn cho vieäc
tìm kieám moät doøng cuûa baûng ñaõ ñöôïc saép laø log2(n) + 1 pheùp toaùn ñoái
165
chieáu/so saùnh, ôû ñaây n laø soá doøng (soá record) cuûa baûng. Haõy cöù töôûng
töôïng, vôùi moät baûng coù 4,2 tyû doøng, maùy chæ maát coù toái ña 33 laàn so
saùnh khi tìm kieám moät baûn ghi. Vieäc laäp chæ muïc (Indexing) laø taïo ra
moät baûng löu tröõ vò trí cuûa caùc baûn ghi döïa treân giaù trò cuûa moät (hay
moät soá) coät naøo ñoù. Vieäc taïo baûng chæ muïc khoâng laøm thay ñoåi thöù töï
vaät lyù cuûa caùc baûn ghi trong baûng.

Cuù phaùp:
CREATE INDEX <teân baûng Index>
ON <teân baûng> (<coät 1>, <coät 2>, ...)

Ngöõ nghóa: Taïo baûng chæ muïc ñeå löu thöù töï saép xeáp caùc baûn
ghi theo giaù trò taêng daàn cuûa caùc coät ñöôïc cho trong danh saùch.
 Ghi chuù: Chæ neân taïo chæ muïc cho caùc baûng coù soá löôïng lôùn
caùc baûn ghi vaø ít ñöôïc caäp nhaät, vaø chæ neân taïo treân caùc coät maø thoâng
tin cuûa noù thöôøng xuyeân ñöôïc tham khaûo tôùi.

Ví duï 6.6.13:
Taïo chæ muïc treân coät Name cuûa baûng EMPLOYEE ñeå giuùp tìm
kieám nhaân vieân theo teân moät caùch nhanh choùng:
CREATE INDEX ON EMPLOYEE (Name) ;
Vieäc loaïi boû baûng chæ muïc naøo ñoù khoûi töø ñieån döõ lieäu cuõng
ñöôïc thöïc hieän bôûi caâu leänh DROP INDEX <teân Index>

6.6.7. Khai baùo ngöôøi söû duïng môùi ñoái vôùi CSDL.

Khoâng phaûi ai cuõng coù theå tuøy tieän truy nhaäp vaøo CSDL. Ngöôøi
quaûn trò CSDL (DBA) seõ phaûi thöïc hieän moät leänh khai baùo ngöôøi
(hoaëc nhoùm ngöôøi) söû duïng CSDL vaø caáp quyeàn haïn cho hoï treân töøng
baûng cuûa CSDL.

166
Cuù phaùp leänh khai baùo ngöôøi söû duïng:
CREATE USER <teân ngöôøi söû duïng> IDENTIFIED BY <maät khaåu>;
Ví duï 6.6.14:
Khai baùo ngöôøi söû duïng môùi coù teân laø MINH_HAI vôùi maät
khaåu truy nhaäp laø employment:
CREATE USER MINH_HAI IDENTIFIED BY employment;

Söûa laïi maät khaåu cho ngöôøi söû duïng bôûi leänh:
ALTER USER <teân ngöôøi söû duïng> IDENTIFIED BY <maät khaåu môùi>;

Baõi mieãn moät ngöôøi söû duïng quyeàn truy nhaäp CSDL bôûi leänh:
DROP USER <teân ngöôøi söû duïng> ;

6.6.8 Caáp quyeàn haïn heä thoáng treân CSDL:

GRANT <quyeàn haïn>, <quyeàn haïn> , ... TO <ngöôøi duøng>,


<ngöôøi duøng>, ...;
Trong ñoù quyeàn haïn heä thoáng goàm coù: CREATE TABLE, CREATE
VIEW, CREATE PROCEDURE.

Vaø leänh caáp quyeàn haïn thao taùc treân caùc ñoái töôïng cuûa CSDL
vôùi cuù phaùp:
GRANT  <quyeàn treân ñoái töôïng> [ (<coät>, <coät>, ...)  ALL 
[ (<caùc coät>) ]
ON <ñoái töôïng>
TO  <ngöôøi söû duïng>, <ngöôøi söû duïng>, ...   PUBLIC
[ WITH GRANT OPTION ];

ÔÛ ñaây quyeàn haïn treân ñoái töôïng goàm coù: ALTER, DELETE,
EXECUTE, INDEX, INSERT, REFERENCES, SELECT, UPDATE.
167
Töø khoùa ALL ñeå chæ moïi quyeàn haïn vöøa neâu. PUBLIC ñeå chæ taát
caû nhöõng ngöôøi ñöôïc ñaêng kyù truy nhaäp CSDL. Cuïm töø WITH GRANT
OPTION cho pheùp ngöôøi ñöôïc trao quyeàn haïn treân ñöôïc quyeàn trao laïi
cho ngöôøi khaùc nuõa.

Ví duï 6.6.15:
Caáp quyeàn truy vaán döõ lieäu (SELECT) vaøø caäp nhaät 2 field Name
vaø Sex (UPDATE) cho ngöôøi söû duïng coù teân laø MINH_HAI treân baûng
EMPLOYEE:
GRANT SELECT, UPDATE (Name, Sex)
ON EMPLOYEE TO MINH_HAI;

6.6.9. Ñoøi laïi quyeàn haïn treân caùc ñoái töôïng ñaõ trao cho NSD:

Cuù phaùp:
REVOKE  <quyeàn haïn>, <quyeàn haïn>, ...  ALL 
ON <ñoái töôïng>
FROM <ngöôøi duøng>, <ngöôøi duøng>, ... PUBLIC 
[ CASCADE CONSTRAINTS ] ;

Meänh ñeà CASCADE CONSTRAINTS ñöôïc söû duïng khi muoán huûy
taát caû caùc RBTV veà phuï thuoäc toàn taïi ñaõ taïo treân ñoái töôïng nhôø
quyeàn haïn REFERENCES.

Ví duï 6.6.16:
Ñoøi laïi caùc quyeàn truy vaán döõ lieäu (SELECT) vaøø caäp nhaät
(UPDATE) ñaõ trao cho ngöôøi söû duïng MINH_HAI treân baûng EMPLOYEE:
REVOKE SELECT, UPDATE
ON EMPLOYEE
FROM MINH_HAI;

168
Toùm taét

Chöông naøy ñaõ trình baøy caùc caâu leänh SQL khaùc nhau thuoäc
caùc phaïm truø: tìm kieám thoâng tin, tính toaùn, thao taùc döõ lieäu (Theâm,
xoùa, Söûa), ñònh nghóa döõ lieäu (caáu truùc baûng, View, RBTV), ñieàu
khieån döõ lieäu (thay ñoåi caáu truùc baûng, caáp quyeàn haïn söû duïng vaø khai
thaùc CSDL. Ñaây gaàn nhö laø troïn boä taäp leänh cuûa haàu heát caùc ngoân
ngöõ quaûn trò CSDL.

BAØI TAÄP THÖÏC HAØNH.

Xeùt CSDL quaûn lyù coâng chöùc vieân chöùc CCVC, goàm caùc baûng
ÑÔN-VÒ, LOAÏI-ÑVÒ, NGAÏCH-CBVC, NGAÏCH-BAÄC-LÖÔNG vaø CBVC. Haõy vieát
caùc caâu leänh SQL cho caùc caâu hoûi sau ñaây:
1. Cho danh saùch CBVC theo thöù töï Alphabet cuûa teân cuûa caùc CBVC.
2. Cho danh saùch CBVC coù heä soá löông töø 3.0 trôû leân.
3. Cho bieát toång heä soá löông cuûa töøng ñôn vò.
4. Cho danh saùch CBVC thuoäc caùc ñôn vò maø teân coù chöõ “phoøng”.
5. Cho danh saùch CBVC thuoäc caùc ñôn vò coù teân loaïi hình toå chöùc laø
“haønh chaùnh”
6. Cho danh saùch CBVC thuoäc ngaïch “caùn söï” coù baäc 7 trôû leân,
hoaëc nhöõng ngöôøi coù heä soá löông lôn hôn 3.06
7. Cho danh saùch CBVC (maø) coù thôøi haïn xeáp löông tính ñeán cuoái
naêm 1998 laø 3 naêm trôû leân ñoái vôùi caùc ngaïch chuyeân vieân vaø
chuyeân vieân chính; hoaëc 2 naêm trôû leân ñoái vôùi caùc ngaïch coøn laïi.
(Ñaây laø danh saùch CBVC ñeán haïn naâng löông trong naêm 1998).
8. Cho danh saùch caùc CBVC coù heä soá löông cao hôn heä soá löông cuûa
nhöõng ngöôøi thuoäc ngaïch “caùn söï”.
9. Taùch rieâng nhöõng CBVC thuoäc ngaïch “chuyeân vieân” vaø “chuyeân
vieân chính” thaønh moät baûng teân laø CBVC_CV.
10. Xoùa caùc CBVC laø “chuyeân vieân” vaø “chuyeân vieân chính” khoûi
baûng CBVC.

169
11. Caäp nhaät naêng löông cho nhöõng CBVC thuoäc caùc ngaïch “chuyeân
vieân” vaø “chuyeân vieân chính” leân baäc tieáp theo ñoái vôùi nhöõng
ngöôøi ñaõ ñuû 3 naêm keå töø ngaøy xeáp löông cuoái cuøng tính ñeán
31/12/1998.
12. Töông töï, caäp nhaät naâng löông cho nhöõng ngöôøi thuoäc dieän 2
naêm.
13. Vieát caùc caâu leänh taïo laäp caáu truùc caùc baûng noùi treân nhöng theâm
chöõ soá ‘1’ vaøo teân baûng (ñeå traùnh truøng laép teân baûng trong
CSDL).

170
171
CHÖÔNG VII
NGOÂN NGÖÕ TAÂN TÖØ

7.1 Loâgic toaùn vaø öùng duïng cuûa noù vaøo CSDL

Ñònh nghóa 7.1.1:

Bieåu thöùc loâgic laø moät phaùt bieåu (Statment) maø giaù trò cuûa noù
coù theå hoaëc laø ñuùng hoaëc laø sai. Bieåu thöùc loâgic coù giaù trò luoân luoân
ñuùng (hoaëc luoân luoân sai) ñöôïc goïi laø haèng ñuùng (hoaëc haèng sai -
töông öùng).

Ví duï 7.1:
 Hoâm nay trôøi seõ coù möa.
 2 > 1 laø bieåu thöùc haèng ñuùng.
 1 > 5 laø bieåu thöùc haèng sai.

Loâgic taân töø laø moät meänh ñeà döïa treân taân töø cuûa phaùt bieåu ñoù.
Noù goàm coù 2 phaàn: Phaàn cuù phaùp vaø phaàn dieãn giaûi.

7.1.1. Phaàn cuù phaùp:

Tröôùc heát chuùng ta caàn phaûi thoáng nhaát veà caùc kyù hieäu:
 () - Bieåu thöùc trong ngoaëc.
 Bieán: Teân goïi cuûa moät ñaïi löôïng bieán thieân trong moät mieàn giaù trò
xaùc ñònh. Thöôøng duøng caùc chöõ caùi nhoû ôû cuoái baûng maãu töï ñeå ñaët
teân cho bieán: x, y, z, ...
 Haèng: Laø caùc ñaïi löôïng khoâng ñoåi. Thöôøng söû duïng caùc chöõ caùi ôû
ñaàu baûng maãu töï nhö a, b, c, ... laøm teân haèng.

172
 Haøm: Laø moät aùnh xaï töø moät mieàn giaù trò vaøo taäp hôïp goàm 2 giaù trò
hoaëc ñuùng hoaëc sai. Thöôøng duøng caùc chöõ nhoû ôû giöõa baûng maãu töï
nhö f, g, h. ...
 Taân töø: Laø moät bieåu thöùc ñöôïc xaây döïng döïa treân bieåu thöùc loâgic.
Thöôøng duønhg caùc chöõ in hoa ôû giöõa nhö P, Q, R, ...
 Caùc pheùp toaùn loâgic: phuû ñònh (  ), keùo theo ( ), noái lieàn (  -
conjuction) vaø noái rôøi ( - disjunction).
 Caùc löôïng töø: vôùi moïi (  ) vaø toàn taïi ( )

Ñònh nghóa 7.1.2:

Taân töø moät ngoâi ñöôïc ñònh nghóa treân 1 taäp X vaø moät bieán x coù
giaù trò chaïy treân caùc phaàn töû cuûa X.
Vôùi moãi giaù trò cuûa x, taân töø P(x) laø moät meänh ñeà loâgic, töùc laø
noù coù giaù trò hoaëc laø ñuùng (Ñ), hoaëc laø sai (S).

Ví duï 7.2:
• P(x), x laø bieán chaïy treân X, laø moät taân töø.
• P(gt), gt  X laø moät meänh ñeà.

Ví duï 7.3:
X laø taäp hôïp nhöõng ngöôøi coù teân nhö sau:
X =  Nguyeãn Vaên Nam, Ñaëng Thò Thuùy, Hoà thieäu Huøng 

Vôùi taân töø NÖÕ (x) ñöôïc xaùc ñònh nhö: “x laø ngöôøi nöõ”. Khi ñoù
meänh ñeà:
NÖÕ (Nguyeãn Vaên Nam) - cho keát quaû laø sai.
NÖÕ (Ñaëng Thò Thuùy) - Cho keát quaû laø ñuùng.

173
Ñònh nghóa 7.1.3:

Taân töø n ngoâi ñöôïc ñònh nghóa treân caùc taäp X1, X2,  Xn vaø n
bieán x1, x2,  xn laáy giaù trò treân caùc taäp Xi töông öùng. Vôùi moãi ai  Xi
xi = ai. Taân töø n ngoâi laø moät meänh ñeà.
Kyù hieäu: P(x1, x2,  xn )

Ví duï 7.4. CHA (x1, x2): “x1 laø CHA cuûa x2”.

Chuù yù:
 Caùc Xi khoâng nhaát thieát phaûi laø rôøi nhau.
 Vôùi xi = ai, P(x1, x2,, , ai,  xn) laø taân töø n-1 ngoâi.

Ñònh nghóa 7.1.4:

Töø (Word) ñöôïc ñònh nghóa moät caùch truy hoài nhö sau:
(í) Töø laø moät haèng hay moät bieán.
(ii) f (t1, t2, , tn) laø moät haøm n ngoâi thì f laø moät töø.

Ñònh nghóa 7.1.5:

Coâng thöùc (Formula):


(i) Coâng thöùc nguyeân toá laø moät taân töø n ngoâi P(t1, t2, , tn);
ÔÛ ñaây t1, t2, , tn laø caùc töø.
Coâng thöùc nguyeân toá laø moät coâng thöùc.
(ii) Neáu F1, F2, , Fn laø caùc coâng thöùc thì caùc bieåu thöùc sau cuõng
laø caùc coâng thöùc:
() F1  F2
() F1  F2
() F1  F2
() F1

174
(iii) Neáu F1 laø moät coâng thöùc thì x: F1, x: F1 cuõng laø caùc coâng
thöùc.
(iv) Neáu F1 laø moät coâng thöùc thì ( F1 ) cuõng laø moät coâng thöùc.

 Löu yù: Chuùng ta ñaõ bieát caùc pheùp bieán ñoåi töông ñöông sau:
() F1  F2   F1  F2
() ( F1  F2)  F1  F2
()  (x  F1)  x F1

Ñònh nghóa 7.1.6:

(-) Moät coâng thöùc ñöôïc goïi laø “ñoùng” neáu moïi bieán cuûa noù ñeàu
coù keøm vôùi löôïng töø.
(-) Moät coâng thöùc ñöôïc goïi laø “môû” neáu toàn taïi moät bieán khoâng
coù keøm vôùi löôïng töø.Bieán naøy coøn ñöôïc goïi laø bieán töï do.

Ñònh nghóa 7.1.7: Daïng chuaån Prenexe:


F laø moät coâng thöùc coù daïng: Q1 x1, Q2 x2, , Qn xn M
Vôùi: Qi laø caùc löôïng töø (i = 1, 2, , n).
xi laø caùc bieán.
M laø moät ma traän coâng thöùc.
Neáu M khoâng chöùa löôïng töø thì ta noùi raèng F coù daïng chuaån
Prenexe.

Ví duï 7.5:
x t y z ( P(x, y,a)  Q(y, z, t)  R (x, t))

7.1.2 Dieãn giaûi vaø moâ hình

7.1.2.1 Dieãn giaûi cuûa 1 coâng thöùc:

Moät dieãn giaûi cuûa moät coâng thöùc goàm 4 phaàn:


175
- Mieàn giaù trò cuûa caùc bieán cuûa coâng thöùc (kyù hieäu laø taäp M)
- Vieäc söû duïng coâng thöùc:
* Haèng laø moät giaù trò cuï theå thuoäc M.
n n
* Haøm n ngoâi cuûa M leân M laø moät aùnh xaï f : M  M
n n
* Taân töø treân M laø moät quan heä n ngoâi treân taäp M .
- YÙ nghóa cuûa coâng thöùc vaø
n
- Xaùc ñònh 1 quan heä n ngoâi treân taäp M

Ví duï 7.6:

Cho M =  Trí, Minh, Höng, Long, Ñoaøn, Tuaánvaø moät coâng


thöùc C coù daïng nhö sau:

C: x y ( z (P(x,y) P(y,z)  Q(x, z))

Taäp dieãn giaûi cuûa coâng thöùc coù theå laø:


- M: laø mieàn giaù trò cuûa caùc bieán x, y, z.
- Caùc taân töø:
P: CHA
Q: OÂNG
- YÙ nghóa:
 CHA (x, y): x coù cha laø y (hoaëc: cha cuûa x laø y).
 OÂNG (x, y): x coù oâng laø y (hoaëc oâng cuûa x laø y)
- Caùc quan heä 2 ngoâi treân M2:
CHA = (Trí, Minh), (Long, Ñoaøn), (Minh, Huy), (Ñoaøn, Tuaán)
OÂNG =  (Trí, Huy), (Long, Tuaán) 

Moãi khi xaùc ñònh ñöôïc dieãn giaûi phaûi ñaùnh giaù
(i) Coâng thöùc laø ñuùng hay laø sai. ÔÛ ñaây C laø ñuùng.
(ii) Vôùi coâng thöùc môû coù m bieán töï do thì noù xaùc ñònh 1 quan heä
m ngoâi treân Mm.

176
Vôùi moät boä cuûa quan heä naøy, neáu ta thay theán m giaù trò vaøo cho
m bieán thì coâng thöùc trôû thaønh “ñoùng” vaø noù coù giaù trò hoaëc ñuùng
hoaëc sai.
Neáu taäp caùc boä m ñöôïc cho bôûi coâng thöùc “môû” maø roãng
(khoâng coù boä naøo ñeå coâng thöùc laø ñuùng, thì ta noùi raèng “coâng thöùc
naøy laø sai”, ngöôïc laïi thì coâng thöùc laø ñuùng.

7.1.2.2 Caùc quy taéc löôïng giaù coâng thöùc.

(i). Löôïng giaù Taân töø:


Taân töø baäc n P(x1, x2, , xn) ñöôïc lieân keát vôùi 1 quan heä n ngoâi
treân R.
Löôïng giaù P khi x1 laáy giaù trò ai, i = 1, 2, , n, vaø (a1, a2, ..., an)
 R:
P(x1, x2, , xn) : Ñ  (a1, a2, ..., an)  R
P(x1, x2, , xn) : S  (a1, a2, ..., an)  R.

(ii) Vôùi caùc pheùp toaùn , ,  vaø  thì söû duïng baûng chaân trò
(hoaëc coøn goïi laø baûng söï thaät) sau:

F1  F1 F1 F2 F1  F2 F1  F2 F1  F2
Ñ S Ñ Ñ Ñ Ñ Ñ
S Ñ Ñ S S Ñ S
S Ñ S Ñ Ñ
S S S S Ñ

(iii) x laø bieán cuûa coâng thöùc F : Coâng thöùc x F(x) laø ñuùng vôùi
moïi trò a  M maø x laáy giaù trò F(a) laø ñuùng.
Neáu ngöôïc laïi thì x F(x) laø sai. Do ñoù x F(x) ñoàng nhaát vôùi
coâng thöùc: F(a ) treân taát caû caùc a  M.
i i

177
(iv) Coâng thöùc x F(x) laø ñuùng khi coù ít nhaát moät ai  M sao
cho F(ai) laø ñuùng. Do ñoù noù ñoàng nhaát vôùi F(a ) treân taát caû caùc a 
i i

M.

Ñònh nghóa 7.1.8

Moät dieãn giaûi cuûa moät taäp caùc coâng thöùc F ñöôïc goïi laø moät moâ
hình neáu vaø chæ neáu F  F , F laø ñuùng treân dieãn giaûi naøy.

Ñònh nghóa 7.1.9

Moät coâng thöùc E laø heä quaû loâgic cuûa F, kyù hieäu laø F  E, neáu
vaø chæ neáu E laø ñuùng treân moïi moâ hình cuûa F.

7.1.3. ÖÙng duïng loâgic toaùn trong CSDL.

7.1.3.1 Daãn nhaäp

CSDL: moâ hình hoùa thoâng tin goàm caùc caùc söï kieän ñöôïc lieân
keát hay bieåu dieãn moät tình traïng cuûa theá giôùi thöïc.

Ví duï 7.7: Cho taäp cô sôû veà ngöôøi:


M = { Trí, Minh, Huy, Long, Ñoaøn, Tuaán }
Ta coù caùc söï kieän:
- Cha cuûa Trí laø Minh.
- Cha cuûa Long laø Ñoaøn.
Caùc söï kieän naøy ñöôïc taäp hôïp laïi thaønh CSDL.
- Trong ngoân ngöõ taân töø noù laø coâng thöùc ñoùng, khoâng coù
bieán, chæ coù haèng (töùc laø caùc meänh ñeà).
- Khaùi nieäm CHA ñöôïc lieân keát vôùi toaùn töû CHA:
CHA (Trí, Minh): thay cho phaùt bieåu “Cha cuûa Trí laø Minh”.
178
Ngoaøi ra, chuùng ta coøn quan taâm ñeán caùc tính chaát toång quaùt
hôn:
(T1) Neáu cha cuûa x laø y thì y coù con laø x.
(T2) Moïi ngöôøi x ñeàu coù cha laø y.
(T3) Neáu x coù cha laø y vaø y coù cha laø z, thì oâng cuûa x laø z.
Caùc tính chaát treân ñaûm baûo tính chaát nhaát quaùn cuûa thoâng tin cô sôû.

Chuùng ta coù theå coâng thöùc hoùa caùc tính chaát treân nhö sau:
(T1) x y (CHA(x, y)  CON(y, x))
(T2) x (x (CHA(x, y))
(T3) y (z (CHA (x, z)  CHA(z, y)  OÂNG (x, y))

* Tham khaûo CSDL:

(i) Caâu hoûi ñoùng töông öùng vôùi coâng thöùc ñoùng. Caâu traû lôøi laø coù hieäu
löïc, laø ñuùùng hoaëc sai.
Ví duï 7.8:
1. Trí coù cha laø Minh ? CHA (Trí, Minh) ?
2. Con cuûa Minh laø ai ? x CON (Minh, x) ?
3. OÂng cuûa Long laø Tuaán ? OÂNG (Long, Tuaán) ?
Caâu traû lôøi cho (1) vaø (3) laø ñuùng hoaëc sai ñöôïc döïa treân thoâng tin cô
sôû. Ñoái vôùi caâu (2) vieäc tìm caâu traû lôøi phaûi döïa vaøo suy luaän:
- AÙp duïng (T1) thay theá bieán y baèng Minh, ta coù:
x CHA (x, Minh)  CON (Minh, x)

Söû duïng coâng thöùc naøy, döïa treân thoâng tin cô sôû ta coù:
CHA (Trí, Minh)  CON (Minh, Trí)
Vaäy:
CON (Minh, Trí): laø caâu traû lôøi ñuùng.

(ii) Caâu hoûi môû töông öùng vôùi moät coâng thöùc môû.

179
Ví duï 7.9:
(c1) Cha cuûa Trí laø ai? CHA (Trí, x) ?
(c2) Xaùc ñònh oâng cuûa Trí ? OÂNG (Trí, x) ?

Moät phaàn töû laø moät caâu traû lôøi cuûa coâng thöùc môû neáu khi thay
vaøo bieán x thì coâng thöùc ñoùng thu ñöôïc trò laø ñuùng.
 Loâgic monolypeùc: Caùc bieán laáy trò töø 1 taäp giaù trò duy nhaát.
 Loâgíc multilypeùc: Moãi bieán laáy giaù trò töø moät taäp giaù trò rieâng.
Ví duï 7.10:
CÖÔÙI (NAM, NÖÕ)
CÖÔÙI (x, y) x laáy trò töø mieàn giaù trò NAM
y laø trò töø mieàn giaù trò NÖÕ

7.2. Ngoân ngöõ taân töø coù bieán laø boä-n.

7.2.1 Moät caâu hoûi trong ngoân ngöõ taân töø coù bieán laø boä-n thoûa caùc quy
taéc sau:
(1) Bieán laø moät boä cuûa quan heä.
(2) Töø: laø haèng, bieán hay bieåu thöùc coù daïng s[c], c laø bieán; c laø
taäp caùc thuoäc tính cuûa quan heä, coøn ñöôïc goïi laø töø chieáu.
(3) Caùc bieåu thöùc:
 R s : Vôùi R: laø moät quan heä; s : laø bieán boä-n.
ñöôïc goïi laø töø. Mieàn giaù trò seõ ñònh nghóa mieàn bieán thieân
cuûa s.
 t1 a, t1 t2.
ÔÛ ñaây t1 vaø t2 laø caùc töø chieáu, coøn a laø moät haèng.  laø toaùn töû so saùnh
=,  , <, <=, >, >= ñöôïc goïi laø coâng thöùc nguyeân toá.
(4) Moät coâng thöùc nguyeân toá laø moät coâng thöùc.
180
(5) Neáu F1 vaø F2 laø caùc coâng thöùc thì F1  F2, F1  F2, F2 vaø F1
 F2, cuõng laø caùc coâng thöùc.
(6) Neáu F laø moät coâng thöùc vaø s laø moät bieán töï do thì s F vaø sF
cuõng laø caùc coâng thöùc.
(7) Neáu F laø coâng thöùc thì (F) cuõng laø coâng thöùc (coâng thöùc ñaët
trong ngoaëc troøn cuõng laø coâng thöùc).

Ñònh nghóa 7.2.1:


Moät caâu hoûi trong ngoân ngöõ taân töø coù bieán laø boä-n ñöôïc bieåu dieãn nhö
sau:
sF
ÔÛ ñaây s laø bieán boä – n, F laø moät coâng thöùc chæ coù moät bieán töï do laø s.
Ví duï 7.11:
Quan heä BIEÂNGIÔÙI (Nöôùc, Tænh_TP): Danh saùch caùc nöôùc coù bieân
giôùi giaùp vôùi Vieät nam.
Pheùp toaùn quan heä BIEÂNGIÔÙI [Nöôùc] ñöôïc chuyeån thaønh caâu hoûi
trong ngoân ngöõ taân töø coù bieán laø boä:
 s [Nöôùc] BIEÂNGIÔÙI s 

7.2.2. Coâng thöùc an toaøn:

(a) Mieàn giaù trò cuûa coâng thöùc:


Ñònh nghóa 7.2.2:
Cho coâng thöùc F coù söï hieän dieän cuûa caùc quan heä Q1, Q2, … Qn vaø
caùc haèng a1, a2, … ap. Mieàn giaù trò cuûa coâng thöùc F, kyù hieäu laø
DOM(F) hay MGT(F), ñöôïc ñònh nghóa laø:
DOM (F) =  (a1, a2, … ap : laø taäp giaù trò cuûa caùc thaønh phaàn cuûa caùc
boä thuoäc Q1, Q2, … Qn.

181
Ví duï 7.12: Cho 2 quan heä R vaø S nhö sau:
R A B S A B
1 2 3 4
3 4 2 2
2 5
Coâng thöùc F(s): Rs  Ss.
Mieàn giaù trò cuûa coâng thöùc F laø DOM(F) =  1, 2, 3, 4, 5 
* Nhaän xeùt: DOM(F) = DOM ( F). Thaät vaäy:
F = Rs  Rs. S vaãn bieán thieân treân R vaø S.

(b) Coâng thöùc an toaøn:


Ñònh nghóa 7.2.3:
Moät coâng thöùc F ñöôïc goïi laø an toaøn neáu noù thoûa maõn 3 ñieàu
kieän sau ñaây:
(i) Neáu s laø boä-n thoûa: F(s) laø ñuùng thì moïi thaønh phaàn cuûa s laø phaàn
töû cuûa DOM(F).
(F(s) : Ñuùng  si  DOM (F); i, s = (s1, s2, …, sn)
(ii) Vôùi moãi coâng thöùc con F’ cuûa F coù daïng s F’(s), neáu s thoûa
F’(s): Ñuùng, thì s  DOM(F’).
(iii) Vôùi moãi coâng thöùc con F’ cuûa F coù daïng s F’(s), neáu coù moät
thaønh phaàn naøo ñoù cuûa s khoâng naèm trong DOM(F’) thì F’(s) laø
ñuùng. Nghóa laø s  DOM(F)  F’(s): Ñuùng, hay F’(s): Sai  s
 DOM (F’).
Ví duï 7.13: Nhö ví duï trong ñieåm (a): 2 quan heä R vaø S nhö sau:
R A B S A B
1 2 3 4
3 4 2 2
2 5

182
Caùc caâu hoûi:
c1:  s  Rs Ss 
c2:  s  Rs Ss 
F1: Rs Ss khoâng an toaøn vì cho s =  3,7 , si  DOM(F) maø khoâng
thoûa S  s thoûa F1.
(s : F1 (s): laø Ñuùng vaø s  DOM(F1))

F2 = Rs  Ss : laø an toaøn, neáu s thoûa F2  Rs : laø Ñuùng  s  R do


ñoù moïi thaønh phaàn cuûa s  DOM(F2).

Chuùng ta coù:
(+) F = Rs  F’(s) laø an toaøn, vôùi F’ laø 1 coâng thöùc (khoâng coù
coâng thöùc con coù daïng u F(u) vaø u F(u)).
(+) s ( F(s)  G(s)) vôùi F laø an toaøn.
(+) s ( F(s)  G(s)) vôùi G laø moät coâng thöùc.

(1)  (2).
(1) : u F ’ (u), neáu u thoûa F ’(u) : Ñuùng  u  DOM(F ’ ).
u F ’ (u)   u F ’ (u)),
u F ’ (u)).
Theo (1):
u (F ’ (u) : Ñuùng  u  Dom(F ’ ).
u ( u  Dom(F ’ )  F ’(u) : Ñuùng ),
maø
DOM (F ‘ ) = DOM (F ’),
neân ta coù:
u ( u  DOM(F ’ )  F ’(u) : Ñuùng )

183
7.3. Ngoân ngöõ taân töø coù bieán laø mieàn giaù trò.

x laø bieán laáy giaù trò treân mieàn thuoäc tính cuûa caùc quan heä.
Quy taéc ñònh nghóa coâng thöùc:
1) Töø: laø haèng hoaëc bieán
2) Coâng thöùc nguyeân toá:
(i) Q (t1, t2, … tn ) ti laø caùc töø, Q laø moät quan heä.
(ii) t1  a1, t2  a2, … ôû ñaây ti laø caùc töø vaø  laø pheùp toaùn.
3) Coâng thöùc nguyeân toá laø moät coâng thöùc.
4) F1, F2 laø caùc coâng thöùc thì F1  F2 vaø F1  F2 cuõng laø caùc coâng
thöùc.
5) F laø moät coâng thöùc vaø t laø moät bieán töï do thì t F vaø t F cuõng
laø caùc coâng thöùc.
6) F laø coâng thöùc thi ( F ) cuõng laø moät coâng thöùc.

Trong moät CSDL, caâu hoûi baèng ngoân ngöõ taân töø coù daïng:  ( x1,
x2, … xk )  F ( x1, x2, … xk ) 
ÔÛ ñaây xi (i = 1, 2, … k) laø caùc bieán töï do cuûa F, vaø F khoâng coù
bieán töï do naøo khaùc.

Caâu traû lôøi laø taäp caùc boä giaù trò (x1, x2, … xk ) maø khi thay vaøo F
thì F laø ñuùng.
Coâng thöùc F laø an toaøn neáu noù thoûa caùc ñieàu kieän sau:
(i) F ( x1, x2, … xn ) laø Ñuùng  xi  DOM (F) vôùi i = 1, 2, …,
n.
(ii) Coâng thöùc con u F ‘ (u) neáu u thoûa F ‘ (u) laø Sai
thì  u  DOM (F ‘).

Ví duï 7.3.1:

Cho moät CSDL goàm caùc quan heä sau:


1. VAÄÂN_CHUYEÅN (Khaùch_Haøng, Giaù_Trò, Ga_Ñeán, #Toa, Maët_Haøng, Khoái_Löôïng,
N_Dôõ_Haøng)

184
2. TAØU (#Taøu, #Toa)
3. TOA (#Toa, Loaïi_Toa, TL_Roãng, Khaû_Naêng_Chöùa, Tình_Traïng, Ga)
4. HAØNG (Ga_Goác, Ga_Ñích, GA_TT, #T_Ñöôøng)
5. TUYEÁN_ÑÖÔØNG ( #T_Ñöôøng, Haøng, Ga)
6. LÒCH_TRÌNH (#Taøu, #T_Ñöôøng, Ngaøy)

Caâu hoûi 1: Cho danh saùch caùc loaïi toa “Frigo” ñang saün saøng ôû ga
“Tour” vaø coù khaû naêng chöùa treân 10 toa ?

Caâu hoûi treân coù theå ñöôïc bieåu dieãn baèng ngoân ngöõ ñaïi soá quan heä
nhö sau:
(TOA : (Loaïi_Toa = “Frigo”  Khaû_Naêng_Chöùa > 10  Ga = “Tour” 
Tình_Traïng = “Td” ) [#Toa],

Dieãn taû baèng ngoân ngöõ taân töø coù bieán laø boä nhö sau:
 r [#Toa]  TOA r  r[Loaïi_Toa] = “Frigo”  r[Khaû_Naêng_Chöùa] > 10  r[Ga]
= “Tour” r[Tình_Traïng] = “Td” 

Vaø baèng ngoân ngöõ taân töø coù bieán laø mieàn giaù trò nhö sau:
 n  x c ( TOA (n, “Frigo”, x, c, “Td”, “Tour”)  c > 10) 

Caâu hoûi 2: Cho danh saùch caùc loaïi toa cuûa taøu soá 4002 ?

Caâu hoûi ñöôïc bieåu dieãn baèng ngoân ngöõ ñaïi soá quan heä:
((( TAØU : #Taøu = 4002) [ #Toa] ) * TOA ) [ Loaïi_Toa]

Baèng ngoân ngöõ taân töø coù bieán laø boä giaù trò :
 r [Loaïi_Toa]  p (TOA r  TAØU p  r [#Toa] = p[ #Toa]  p[ #Taøu] = 4002

Baèng ngoân ngöõ taân töø coù bieán laø mieàn giaù trò chuùng ta coù coâng thöùc
sau:

185
 t | u p c e g (TAØU (w, 4002)  TOA (w, t, p, c, e, g)) 

Caâu hoûi 3: Cho danh saùch caùc con ñöôøng ñi qua ga “Tour” ?

Caâu hoûi ñöôïc bieåu dieãn baèng ngoân ngöõ ñaïi soá quan heä:
R1  TUYEÁN_ÑÖÔØNG * ( #Tuyeán_ñöôøng1 = #Tuyeán_ñöôøng2)
Tuyeán_ñöôøng2:
R2  (R1 : (Ga = “Tour”  Haïng1 < Haïng2) [ #Tuyeán_ñöôøng1]

Baèng ngoân ngöõ taân töø coù bieán laø boä giaù trò :
 r [ #Tuyeán_Ñöôøng]  TUYEÁN_ÑÖÔØNG r  p (TUYEÁN_ÑÖÔØNG p  r
[#Tuyeán_Ñöôøng] = p[ #Tuyeán_Ñöôøng]  r[ Haïng] < p[ Haïng]  r[Ga] = “Tour”

Baèng ngoân ngöõ taân töø coù bieán laø mieàn giaù trò chuùng ta coù coâng thöùc
sau:
 l | r1 r2 g (TUYEÁN_ÑÖÔØNG (l, r1, “Tour”)  TUYEÁN_ÑÖÔØNG (l, r2, g) 
(r2 > r1)) 

Caâu hoûi 4: Cho danh saùch caùc ga maø toa taøu ñi töø “Anger” ñeán
“Bezier” ?
Chuùng ta caàn moät löôïc ñoà – coâng thöùc sau:
1. x := g  l HAÏNG (“Anger”, “Bezier”, g, l) 
2. Output (x)
3. While x “Bezier”
4. X := { g  l HAÏNG (“Anger”, “Bezier”, g, l) 
5. Output (x)
6. End.

186
7.4 Söï töông ñöông cuûa caùc ngoân ngöõ thao taùc CSDL:

Tính töông ñöông: Moät caâu hoûi ñöôïc bieåu dieãn baèng moät trong
3 ngoân ngöõ thao taùc CSDL: ngoân ngöõ ñaïi soá quan heä, ngoân ngöõ taân töø
coù bieán laø boä, ngoân ngöõ taân töø coù bieán laø mieàn giaù trò laø töông ñöông
nhau:
Ngoân ngöõ Ñaïi
soá quan heä.

Ngoân ngöõ taân


töø coù bieán laø boä

Ngoân ngöõ taân töø


coù bieán laø mieàn
giaù trò.

Quy trình chöùng minh nhö treân.

Moät soá ñònh lyù:

Ñònh lyù 7.1:

Neáu B laø moät bieåu thöùc trong ngoân ngöõ ñaïi soá quan heä thì toàn taïi 1
bieåu thöùc an toaøn trong ngoân ngöõ taân töø coù bieán laø n-boä töông ñöông
vôùi bieåu thöùc B.

Chöùng minh: (Baèng phöông phaùp quy naïp theo soá pheùp toaùn hieän
dieän trong B).
(i) Tröôøng hôïp B khoâng coù pheùp toaùn:
B laø moät baûng caùc haèng  t1, t2, … , tn  hoaëc B laø moät quan heä.
187
(-) Neáu B laø moät quan heä Q, thì chuùng ta coù bieåu thöùc an toaøn
coù daïng  t  Q .
(-) Neáu B laø moät baûng haèng  t1, t2, … , tn , thì chuùng ta coù coâng
thöùc : B’ =  t  t = t1  t = t2  t = t3 …  t = tn .
Trong ñoù ti laø daïng vieát taét cuûa t1 = ti1, t2 = ti2, …, tk = tik; ôû ñaây tj laø
thaønh phaàn thöù j cuûa boä t.
Vì t1, t2, … , tn laø caùc boä hoaëc caùc haèng neân mieàn giaù trò MGT(B)
=  t1, t2, … , tn  vaø DOM (B’) =  t1, t2, … , tn ; hay coâng thöùc :  t  t =
t1  t = t2  t = t3 …  t = tn laø töông ñöông vôùi bieåu thöùc B ñaõ cho.

(ii) Tröôøng hôïp B coù chöùa pheùp toaùn.


Giaû söû B coù daïng B = B1  B2.
B1, B2 laø caùc bieåu thöùc quan heä vaø  laø pheùp toaùn quan heä coù soá pheùp
toaùn ít hôn B. Chuùng ta caàn tìm C, bieåu thöùc an toaøn töông ñöông vôùi
B.
Caùc pheùp toaùn quan heä ñöôïc xeùt laø: Hôïp ( - Union), Hieäu ( 
Minus), Chieáu ([ ] - Project), Tích Ñeà caùc (x - Cartesian) vaø Choïn (
:() - Selection).

Phaân tích pheùp toaùn:

a) Tröôøng hôïp 1: Pheùp Hôïp ( - Union). Neáu B = B1  B2 thì ta coù:


B1   t  C1(t) 
B2   t  C2(t) 
C1(t) vaø C2(t) laø caùc coâng thöùc an toaøn.
Xeùt coâng thöùc C(t) = C1(t)  C2(t). Chuùng ta caàn chöùng minh
C(t) laø coâng thöùc an toaøn. Xeùt coâng thöùc trong ngoân ngöõ taân töø B’ = 
t  C(t)  vôùi C(t) laø coâng thöùc an toaøn, töùc laø vôùi moïi t laø n-boä t 
DOM(B’) ñeå C(t) laø ñuùng. Khi ñoù B töông ñöông vôùi B’, kyù hieäu: B 
B’.

Nhaän xeùt: DOM(C1)  DOM(C2)  DOM(C).

188
Xeùt ñieàu kieän 1 cuûa ñònh nghóa coâng thöùc an toaøn:
Neáu t0 thoûa C(t) = C1(t)  C2(t) thì:
- Hoaëc t0 thoûa C1(t)  t0  DOM(C1), bôûi vì C1 laø coâng thöùc an toaøn; -
- Hoaëc t0 thoûa C2(t)  t0  DOM(C2), bôûi vì C2 laø coâng thöùc an toaøn.
 Nhö vaäy ñieàu kieän 1 laø thoûa.

Xeùt ñieàu kieän 2 & 3:


Neáu coù coâng thöùc u F(u) hoaëc u F(u) laø caùc coâng thöùc con cuûa C thì
chuùng naèm goïn trong C1 hoaëc C2.
Do C1 vaø C2 laø caùc coâng thöùc an toaøn neân caùc coâng thöùc con cuõng
thoûa caùc ñieàu kieän an toaøn.
Do u0 thoûa u F(u)  u0  DOM(F).
Do u0 thoûa u F(u)  u0  DOM(F).
Bôûi vì C(t) = C1(t)  C2(t), do ñoù B  B’ theo ñònh nghóa cuûa pheùp hôïp
(  ).

b) Tröôøng hôïp 2: Pheùp Hieäu ( Minus). Neáu B = B1  B2 thì ta coù:


B’   t  C1(t)  C2(t) 
C(t) = C1(t)  C2(t).

Xeùt ñieàu kieän 1 cuûa ñònh nghóa coâng thöùc an toaøn:


(** Löu yù: DOM(C) = DOM(C1)  DOM(C2)).
Neáu t0 thoûa C(t)  t0  DOM(C1)  DOM(C)
Nghóa laø vôùi t laø moät n-boä thoûa C(t) thì t thuoäc vaøo mieàn giaù trò cuûa
coâng thöùc C(t). Ñieàu kieän 1 thoûa.

Ñieàu kieän 2:
Neáu coù coâng thöùc u F(u) laø coâng thöùc con cuûa C thì :
- u F(u) laø coâng thöùc con C1. C1 laø an toaøn neân u0 thoûa F(u0) laø
ñuùng  u0  DOM(F). Vaø
- u F(u) laø coâng thöùc con C2. C2 laø an toaøn neân u0 thoûa F(u0) laø
sai  u0  DOM(F). Hay u0 thoûa F(u0) laø ñuùng  u0  DOM(F).

189
Vaäy ñieàu kieän 2 thoûa maõn.

Ñieàu kieän 3: (hoaøn toaøn töông töï nhö treân)


Neáu coù coâng thöùc u F(u) laø coâng thöùc con cuûa C thì :
- u F(u) laø coâng thöùc con C1. C1 laø an toaøn neân u0 thoûa F(u0) laø
ñuùng  u0  DOM(F). Vaø
- u F(u) laø coâng thöùc con C2. C2 laø an toaøn neân u0 thoûa F(u0) laø
sai  u0  DOM(F). Hay u0 thoûa F(u0) laø ñuùng  u0 
DOM(F).
Vaäy ñieàu kieän 3 thoûa maõn.

c) Tröôøng hôïp 3: Pheùp chieáu ([ ] - Project)


Bieåu thöùc quan heä coù daïng: B = B1[X]. ÔÛ ñaây, X laø taäp caùc thuoäc
tính.
B1 coù bieåu thöùc töông ñöông laø B’ =  t  C1(t)  vaø C1(t) laø moät coâng
thöùc an toaøn.
Xeùt B’ =  u  t (C(t)  u = t[X] 
A laø taäp caùc haèng vaø caùc giaù trò cuûa thuoäc tính X cuûa caùc quan heä coù
maët trong bieåu thöùc ñaïi soá quan heä B1. Khi ñoù:
DOM (C1) = MGT(X)  A.
Ñaët E = MGT(X) - A. 
DOM(C) = DOM(C1) - E.

Veà ñieàu kieän 1:


u0 thoûa C, t0 (C1(t0) u = t0[X] laø ñuùng.  C1(t0) : laø ñuùng.
C1 laø an toaøn  t0  DOM(C1).
t0j = u0j, thaønh phaàn thöù j cuûa t0 vaø u0.
u0j  X  u0j  DOM(C1) - E, hay u0  DOM(C1)
Nhö vaäy C laø coâng thöùc an toaøn.

190
Ñieàu kieän 2 & 3:
u F(u) hoaëc u F(u) laø caùc coâng thöùc con cuûa C. Suy ra chuùng laø
caùc coâng thöùc con cuûa C1.

Nhö vaäy C(t) laø coâng thöùc an toaøn vaø chuùng ta coù: B  B’.

Tröôøng hôïp 4: Pheùp tích Ñeà caùc ( x - Cartesian).


Bieåu thöùc B coù daïng B = B1 x B2.
B1 coù coâng thöùc an toaøn C1 töông ñöông vaø
B2 coù coâng thöùc an toaøn C2 töông ñöông.
Chuùng ta xaây döïng bieåu thöùc trong ngoân ngöõ taân töø coù bieán boä-n nhö
sau:
B’ =  u  t v (C1(t)  C2(v)  u[X] = t  u[Y] = v 
ÔÛ ñaây X vaø Y laø taäp caùc thuoäc tính cuûa B1 vaø B2. Chuùng ta caàn chöùng
minh coâng thöùc laø an toaøn  B  B’.
Xeùt ñieàu kieän 1:
u0 thoûa C. 
- u0 [X] = t0 thoûa C1, C1 laø coâng thöùc an toaøn  t0  DOM(C1).
- u0 [Y] = v0 thoûa C2, C2 laø coâng thöùc an toaøn  v0  DOM(C2).
 u0  DOM(C1)  DOM(C2)  DOM (C)  Ñieàu kieän 1 thoûa.

Ñieàu kieän 2& 3: (khoâng coù)

Tröôøng hôïp 5: Ñoái vôùi pheùp choïn ( :() - Selection)

Bieåu thöùc trong ngoân ngöõ ñaïi soá quan heä coù daïng:
B = B1 : (E)
(pheùp choïn theo ñieàu kieän E). B1 coù bieåu thöùc an toaøn laø C1. Bieåu thöùc
trong ngoân ngöõ taân töø coù bieán boä-n laø:
B’ =  t  C1(t)  E’ 
ÔÛ ñaây E’ ñöôïc suy töø E baèng caùch laáy caùc toaùn haïng bieåu dieãn bôûi
thuoäc tính X laø t[X].

191
C(t) = C1(t)  E’. Caàn chöùng minh C laø moät coâng thöùc an toaøn.

DOM(C) = DOM(C1)  Taäp haèng (E’).


t0 thoûa C1 laø ñuùng  t0  DOM(C1).
 ñieàu kieän 1 laøthoûa.
Ñieàu kieän 2 &3 (khoâng coù) Nhö vaäy C(t) = C1(t)  E’ laø moät coâng
thöùc an toaøn. Ta coù B  B’.

Keát luaän: Moät caâu hoûi ñöôïc bieåu dieãn baèng ngoân ngöõ ñaïi soá quan heä
luoân luoân tìm ñöôïc bieåu thöùc töông ñöông vôùi noù bieåu dieãn baèng ngoân
ngöõ taân töø coù bieán laø boä-n.

Ví duï 7.3.1:
Cho 2 quan heä R(A,B) vaø S(C,D).
Bieåu thöùc trong ngoân ngöõ ñaïi soá quan heä laø:
((R x S) : (B = C)) [A,B,D].

Bieåu dieãn trong ngoân ngöõ taân töø coù bieán laø boä-n:
* Vôùi R x S:
 t  u v (R u  S v  (t[A] = u[A])  (t[B] = u[B])  t[C] = v[C])
 t[D] = v[D] 
* Saâu hôn nöõa tôùi pheùp choïn (: (B=C)), vaø roài pheùp chieáu :
 w  t ( u v (R u  S v  (t[A] = u[A])  (t[B] = u[B])  t[C] =
v[C])  t[D] = v[D] )  (t[B] = t[C])  (w[A] = t[A])  (w[C] = t[C]) 
(w[D] = t[D]) 

Ñôn giaûn bieåu thöùc chuùng ta thu ñöôïc :


 w  u v (R u  S v  (w[A] = u[A])  (w[C] = v[C])  w[D] =
v[D] )  (u[B] = v[C]) 
ñoù laø bieåu thöùc töông ñöông ñöôïc bieåu dieãn baèng ngoân ngöõ taân töø coù
bieán laø boä-n cuûa bieåu thöùc trong ngoân ngöõ ñaïi soá quan heä neâu treân.

192
Ñònh lyù 7.2:

ÖÙng vôùi moãi bieåu thöùc an toaøn trong ngoân ngöõ taân töø coù bieán laø
boä-n ta coù moät bieåu thöùc an toaøn töông ñöông trong ngoân ngöõ taân töø coù
bieán laø mieàn giaù trò.

Quaù trình bieán ñoåi caâu hoûi tron ngoân ngöõ taân töø coù bieán laø boä-n
sang caâu hoûi tron ngoân ngöõ taân töø coù bieán laø mieàn giaù trò:

 Cho caâu hoûi daïng  t | C(t) , ÔÛ ñaây t laø moät boä-n coù k baäc töï do.
t0 phaùt sinh ra k bieán mieàn giaù trò töï do laø x1, x2, x3, ..., xk.
 Trong coâng thöùc C(t), moãi bieåu thöùc Q t maø Q laø moät quan heä, thì
ñöôïc ñoåi thaønh Q (x1, x2, x3, ..., xk).
 Moãi bieåu thöùc coù söï hieän dieän cuûa t[xi] thì ñöôïc ñoåi thaønh xi.
 Trong caùc bieåu thöùc con coù daïng u G(u) hay u G(u) ñöôïc bieán
ñoåi nhö sau:
 Bieán u ñöôïc ñoåi thaønh y1, y2, …, ym, ÔÛ ñaây m laø baäc cuûa u.
 R(u) ñöôïc ñoåi thaønh R (y1, y2, …, ym).
 u[yi] ñöôïc ñoåi thaønh yi.
 u ñöôïc ñoåi thaønh y1, y2, y3 , …, ym,
 u ñöôïc ñoåi thaønh y1, y2, y3 , …, ym,

Toùm taét:
Chöông VII ñaõ trình baøy moät caùch tieáp caän khaùc veà ngoân ngöõ
truy vaán CSDL quan heä, ngoân ngöõ taân töø, vôùi 2 caùch theå hieän: bieán laø
boä-n vaø bieán laø mieàn giaù trò. Trong chöông naøy Baïn ñoïc tìm thaáy 2
ñònh lyù veà vieäc bieán ñoåi töông ñöông moät caâu hoûi ñöôïc bieåu dieãn
193
trong ngoân ngöõ ñaïi soá quan heä sang daïng bieåu dieãn trong ngoân ngöõ
taân töø coù bieán laø boä-n, sang daïng bieåu dieãn trong ngoân ngöõ taân töø coù
bieán laø mieàn giaù trò vaø ngöôïc laïi. Nhöõng chöùng minh chi tieát vaø ñaày
ñuû hôn coù theå tìm thaáy trong taøi lieäu [5] cuûa J.Ullman. “DataBase and
Knowledge Base Systems” taäp 3, baûn dòch tieáng Vieät cuûa Traàn Ñöùc
Quang. NXB Thoáng keâ Haø noäi 1999).

Baøi taäp thöïc haønh.


Haõy bieåu dieãn caùc caâu hoûi baèng ngoân ngöõ ñaïi soá quan heä sau
thaønh caùc bieåu thöùc töông ñöông trong ngoân ngöõ taân töø coù bieán laø boä-
n vaø ngoân ngöõ taân töø coù bieán laø mieàn giaù trò. Cô sôû döõ lieäu ñöôïc cho
laø EMPLOYMENT goàm caùc baûng DEPARTMENT, EMPLOYEE, JOBS vaø EMPLHIST
ñaõ trình baøy trong Chöông VI.
Caâu 1: Cho bieát Maõ phoøng (DeptNo), Teân phoøng (DeptName) vaø ngaân
saùch hoaït ñoäng (Exp_budg) cuûa caùc phoøng ban.
Caâu 2: Cho Teân phoøng ban (Deptname) vaø ñòa ñieåm truï sôû (Loc) cuûa
caùc phoøng ban.
Caâu 3: Cho teân chöùc danh coâng vieäc (Jobname) vaø möùc löông toái
thieåu (MinSalary) vaø toái ña (MaxSalary) cuûa töøng chöùc danh
coâng vieäc.
Caâu 4: Cho danh saùch caùc phoøng ban ôû thaønh phoá Houston.
Caâu 5: Cho danh saùch caùc chöùc danh coâng vieäc coù möùc löông toái
thieåu töø 1.500$ trôû leân.
Caâu 6: Cho Teân phoøng ban (DeptName), Maõ soá ngöôøi laõnh ñaïo (Mgr),
Ngaân saùch (Exp_budg) vaø Doanh thu (Rev_Budg) cuûa caùc
phoøng coù Doanh thu.

194
195
CHÖÔNG VIII
TOÁI ÖU HOÙA MOÄT CAÂU HOÛI

8.1. Ñaët vaán ñeà

Caùc ngoân ngöõ baäc cao noùi chung vaø ngoân ngöõ con döõ lieäu noùi
rieâng khi thöïc hieän trong maùy ñeàu maát raát nhieàu thôøi gian. Do ñoù,
tröôøc khi thöïc hieän caùc caâu leänh thuoäc caùc ngoân ngöõ ñoù caàn thieát phaûi
bieán ñoåi hôïp lyù veà daïng töông ñöông, töùc laø daïng cho cuøng moät keát
quaû, ñeå giaûm thôøi gian tính toaùn. Vieäc laøm ñoù ñöôïc goïi laø “toái öu
hoùa” (Optimiztation). Vieäc toái öu hoùa khoâng nhaát thieát phaûi ñöôïc toái
öu treân moïi khaû naêng coù theå coù cuûa caùc caùch caøi ñaët caùc caâu hoûi. Coù
theå thoûa hieäp giöõa thuaät giaûi phöùc taïp, hoaëc / vaø toán keùm khoâng gian
löu tröõ vôùi vieäc tieát kieäm thôøi gian xöû lyù. Chuùng ta bieát raèng, CSDL
coù theå laø raát lôùn, haøng chuïc ngaøn (nhö heä quaûn lyù caùn boä - coâng chöùc)
hay haøng traêm ngaøn (nhö vieäc quaûn lyù caùc ñoái töôïng chính saùch - coù
coâng Caùch maïng), hoaëc haøng trieäu baûn ghi (nhö CSDL quaûn lyù daân cö
thaønh phoá Hoà Chí Minh) v.v... Nhöõng baøi toaùn naøy, neáu moãi thao taùc
treân moät baûn ghi chuùng ta tieát kieäm ñöôïc  thôøi gian thì moät caâu truy
n
vaán treân 1 baûng ñaõ coù theå tieát kieäm ñöôïc 10 *  thôøi gian, ôû ñaây n laø
soá baûn ghi cuûa baûng. Chuùng ta haõy thöû töôûng töôïng, vôùi baûng löu tröõ
caùc baûn ghi coù ñoä daøi coá ñònh veà nhaân khaåu, trong voøng 1 giaây maùy
coù theå xöû lyù cöïc nhanh 1000 baûn ghi, thì ñeå xöû lyù 4.850.000 nhaân
khaåu cuûa baûng, maùy phaûi toán 4.850 giaây! Quaû laø moät thôøi gian khoù coù
theå chaáp nhaän cho vieäc chôø ñôïi nhaän keát quaû cuûa moät caâu leänh truy
vaán !

Noùi chung, trong vieäc toái öu hoùa xöû lyù thoâng tin, ngöôøi ta öu
tieân vieäc toái öu hoùa veà thôøi gian hôn so vôùi vieäc toái öu hoùa löu tröõ döõ
lieäu. Trong moät soá tröôøng hôïp, ngöôøi ta coøn phaûi “hy sinh” caû daïng
chuaån (Normal Form) ñeå ñaït toác ñoä xöû lyù nhanh hôn. Trong ví duï veà

196
heä CSDL quaûn lyù CBVC neâu taïi muïc 5.3 trong chöông V, (ví duï
5.3.4), moãi khi caàn xem xeùt ñeán heä soá löông cuûa moät CBVC ngöôøi ta
ñeàu phaûi tham khaûo qua baûng NGAÏCH-BAÄC-LÖÔNG thoâng qua
pheùp keát töï nhieân vôùi baûng CBVC treân caùc thuoäc tính Ngaïch vaø Baäc.
Neáu trong danh saùch CBVC chuùng ta boå sung coät Heä-soá-löông nöõa thì
daãn tôùi vieäc truøng laép (vaø dö thöøa) thoâng tin - nguy cô daãn ñeán vieäc
maát tính nhaát quaùn döõ lieäu - ñoàng thôøi khoâng ñaûm baûo daïng chuaån toát
cho baûng naøy vaø buoäc phaûi boå sung RBTV :

CBVC [Ngaïch,ø Baäc, Heä-soá-löông]  NGAÏCH-BAÄC-LÖÔNG [Ngaïch,ø Baäc, Heä-


soá-löông].

Boä nhôù thöù caáp (baêng töø, ñóa töø ...) cuûa maùy tính giôø ñaây khoâng
coøn laø vaán ñeà laøm moïi ngöôøi phaûi baän taâm khi xaây döïng caùc heä
CSDL lôùn. Dung löôïng moät ñóa cöùng ñaõ ñaït tôùi haøng chuïc Giga bytes.
Tuy nhieân vaãn coù theå toàn taïi nguy cô thieáu khoâng gian tính toaùn cho
maùy neáu khoâng löu taâm ñeán vieäc toái öu hoùa caùc caâu hoûi tröôùc khi ñöa
vaøo maùy vaø yeâu caàu maùy thi haønh. Moät nguyeân nhaân daãn tôùi ñieàu
naøy laø vieäc thöïc hieän caùc pheùp keát noái vaø pheùp tích Ñeà-caùc cuûa caùc
quan heä. Chuùng ta ñaõ bieát, tích Ñeà-caùc (ñaõ trình baøy taïi ñieåm 5.2.4,
muïc 5.2,) vaø caùc pheùp keát (-Join, Natural Join, Equi Join, Outer Join
- ñaõ trình baøy taïi ñieåm 5.3.3 muïc 5.3 vaø muïc 5.4 cuûa Chöông V) ñoøi
hoûi khaù nhieàu khoâng gian löu tröõ vaø thôøi gian xöû lyù.

Cho R (A1, A2, ..., An) vaø S (B1, B2, ..., Bm) laø hai quan heä ñònh
nghóa treân 2 taäp thuoäc tính  A1, A2, ..., An  vaø  B1, B2, ..., Bm . Neáu
R coù N1boä giaù trò vaø S coù N2 boä giaù trò thì tích Ñeà-caùc seõ cho keát quaû
laø moät baûng môùi goàm m + n thuoäc tính vôùi N1 * N2 boä giaù trò. Chæ caàn
moãi quan heä coù 10 thuoäc tính chöùa soá löôïng boä giaù trò khaù khieâm toán,
1000 boä, thì tích Ñeà-caùc ñaõ taïo ra baûng trung gian coù soá thuoäc tính laø
20 vaø soá löôïng boä giaù trò laø 1.000.000. Neáu moãi field chæ roäng 5 bytes
thoâi (maø treân thöïc teá thì raát ít coù nhöõng quan heä nhæ nhö vaäy) thì quan
heä trung gian naøy ñaõ “ngoán” maát 1/10 Giga bytes ! Ñöông nhieân laø,

197
thôøi gian truy nhaäp CSDL vaø truy xuaát ñóa töø ñeå taïo ra ngaàn aáy baûn
ghi cuõng khoâng phaûi laø ít. Söï buøng noå soá löôïng vaø “baønh tröôùng” kích
thöôùc (chieàu daøi) baûn ghi naøy ñaët chuùng ta vaøo vieäc phaûi nghieân cöùu
ñeå toái öu caâu hoûi tröôùc khi ñöa vaøo maùy tính toaùn.

Chöông naøy chuû yeáu trình baøy moät vaøi phöông phaùp toái öu
hoùa caùc bieåu thöùc quan heä, ñaëc bieät laø xöû lyù bieåu thöùc coù lieân quan
tôùi pheùp keát noái vaø tích Ñeà-caùc. Sau ñoù seõ trình baøy chi tieát moät
phöông phaùp toái öu hoùa cho moät lôùp phoå caäp caùc bieåu thöùc quan heä.
Nguoàn taøi lieäu tham khaûo chuû yeáu döïa treân caùc lyù thuyeát vaø ví duï
minh hoïa trong chöông VI cuûa PGS.PTS.Leâ Tieán Vöông [8].

8.2. Caùc nguyeân taéc toång quaùt ñeå toái öu hoùa moät caâu hoûi.

Chuùng ta haõy xeùt moät ví duï ñôn giaûn sau ñaây :


Cho hai quan heä R(A,B) vôùi n baûn ghi vaø S (C,D) vôùi m baûn ghi. Tích
Ñeà-caùc cuûa R vaø S laø moät quan heä Q (A,B,C,D) coù n * m baûn ghi
(Xem 5.2.4. Pheùp tích Ñeà-caùc cuûa 2 quan heä, muïc 5,2, Chöông V).
Chuùng ta coù caâu hoûi “Laáy giaù trò cuûa thuoäc tính A sao cho B=C vaø
D=50”. Caâu hoûi ñöôïc vieát laïi döôùi daïng ngoân ngöõ ñaïi soá quan heä nhö
sau:

( ( R(A,B) x S(C,D) ) : (B=C  D=50) ) [A]

Neáu ñöa pheùp choïn D=50 vaøo beân trong pheùp tích Ñeà-caùc seõ
ñöôïc:

(( R (A,B) x ( S(C,D) : (D = 50) ) ) : (B=C) ) [A]

vaø sau ñoù chuyeån pheùp choïn B=C cuûa tích Ñeà-caùc thaønh pheùp “keát
noái baèng” chuùng ta thu ñöôïc:

198
B=C
( R(A,B) S(CD) : (D=50) ) [A]

Roõ raøng, pheùp tính cuoái cuøng seõ ñôõ toán keùm thôøi gian hôn raát
nhieàu.

Cuï theå laø: Chæ choïn treân quan heä S nhöõng boä coù giaù trò D=50 thì
soá boä laáy ra seõ ít hôn toaøn boä soá boä cuûa caû quan heä treân S. Soá boä ñöôïc
choïn ra xong töø S môùi ñem keát noái vôùi quan heä R. Pheùp keát noái naøy
chæ choïn ra boä naøo thuoäc R maø coù giaù trò taïi B laø baèng boä coù giaù trò taïi
C thuoäc S môùi ñöôïc laáy ra ñeå keát laïi vôùi nhau. Ñieàu ñoù hoaøn toaøn
nhanh hôn laø laáy tích Ñeà-caùc cuûa R x S roài môùi choïn trong keát quaû
nhöõng boä coù giaù trò taïi B baèng giaù trò taïi C.

Vieäc bieán ñoåi caâu hoûi thaønh caâu hoûi töông ñöông nhö ví duï
neâu treân laø moät minh hoïa cho vieäc giaûm bôùt thôøi gian traû lôøi caâu hoûi
baèng caùch giaûm bôùt soá laàn caàn truy nhaäp tôùi boä nhôù thöù caáp döïa treân
nguyeân taéc thöïc hieän pheùp choïn caøng sôùm caøng toát. Trình töï thöïc
hieän caùc pheùp tính seõ ñoùng moät vai troø quan troïng quaù trình toå chöùc
caâu hoûi.

J. D. Ullman [5] trong caùc keát quaû nghieân cöùu coâng boá laàn ñaàu
tieân cuûa mình ñaõ trình baøy 6 chieán löôïc toång quan cho vieäc toái öu hoùa
caâu hoûi nhö sau:

1. Thöïc hieän pheùp choïn caøng sôùm caøng toát.


Bieán ñoåi caâu hoûi ñeå ñöa pheùp choïn vaøo thöïc hieän tröôùc nhaèm laøm
giaûm bôùt kích côõ cuûa keát quaû trung gian vaø do vaäy chi phí phaûi traû cho
vieäc truy nhaäp boä nhôù thöù caáp cuõng nhö löu tröõ cuûa boä nhôù chính seû
nhoû ñi.

2. Toå hôïp nhöõng pheùp choïn xaùc ñònh vôùi pheùp tích Ñeà-caùc thaønh
pheùp keát noái.
Nhö ñaõ bieát, pheùp keát noái, ñaëc bieät laø pheùp keát noái baèng (Equi Join)
coù theå ñöôïc thöïc hieän ít toán keùm hôn nhieàu so vôùi pheùp tích Ñeà-caùc
199
treân cuøng caùc quan heä. Neáu keát quaû cuûa tích Ñeà-caùc RxS laø ñoái soá
cuûa pheùp choïn vaø pheùp choïn lieân quan tôùi caùc pheùp so saùnh giöõa caùc
thuoäc tính cuûa R vaø S thì roõ raøng pheùp tích Ñeà-caùc laø pheùp keát noái.

3. Toå hôïp daõy caùc pheùp toaùn quan heä moät ngoâi nhö caùc pheùp
choïn vaø pheùp chieáu.
Moät daõy caùc pheùp moät ngoâi nhö pheùp choïn hoaëc pheùp chieáu maø keát
quaû cuûa chuùng phuï thuoäc vaøo caùc boä cuûa moät quan heä ñoäc laäp thì coù
theå nhoùm caùc pheùp ñoù laïi.

4. Tìm caùc bieåu thöùc con chung trong moät bieåu thöùc.
Neáu keát quaû cuûa moät bieåu thöùc con chung (töùc laø bieåu thöùc xuaát hieän
nhieàu hôn moät laàn) laø moät quan heä khoâng lôùn vaø noù coù theå ñöôïc ñoïc
töø boä nhôù thöù caáp vôùi ít thôøi gian thì neân tính toaùn tröôùc bieåu thöùc ñoù
chæ moät laàn. Neáu bieåu thöùc con chung coù lieân quan tôùi moät pheùp keát
noái thì trong tröôøng hôïp toång quaùt khoâng theå thay ñoåi ñöôïc noù baèng
caùch “ñaåy” pheùp choïn vaøo trong.
Ñieàu ñaùng quan taâm laø, caùc bieåu thöùc con chung coù taàn soá xuaát
hieän lôùn thöôøng ñöôïc bieåu dieãn trong caùc VIEW (khung nhìn) cuûa
ngöôøi söû duïng, bôûi vì, ñeå thöïc hieän caùc caâu hoûi ñoù caàn phaûi thay theá
noù baèng moät bieåu thöùc coá ñònh cho VIEW.

5. Tieàn xöû lyù caùc quan heä / baûng (Table Preprocessing).


Coù hai vaán ñeà quan troïng caàn xöû lyù tröôùc cho caùc quan heä laø
saép xeáp tröôùc caùc boä giaù trò theo thöù töï vaät lyù vaø saép xeáp loâgíc - töùc laø
thieát laäp caùc baûng chæ muïc (Index) cho caùc baûn ghi. Khi ñoù vieäc thöïc
hieän caùc pheùp toaùn coù lieân quan tôùi hai quan heä (caùc pheùp toaùn hai
ngoâi) seõ nhanh hôn raát nhieàu.

6. Ñaùnh giaù tröôùc khi thöïc hieän tính toaùn.


Moãi khi caàn choïn trình töï thöïc hieän caùc pheùp toaùn trong bieåu thöùc,
hoaëc choïn moät trong hai ñoái soá cuûa moät pheùp hai ngoâi, thì caàn tính
toaùn xem chí phí (Cost) thöïc hieän caùc pheùp tính ñoù (thöôøng tính theo
soá pheùp toaùn, thôøi gian, hoaëc/vaø dung löôïng boä nhôù caàn thieát so vôùi
200
kích thöôùc cuûa caùc quan heä, töø ñoù xaùc ñònh ñöôïc chi phí toång theå phaûi
traû cho caùc caùch khaùc nhau khi thöïc hieän caùc caâu hoûi.

Döïa vaøo caùc nguyeân taéc neâu treân, chuùng ta seõ bieán ñoåi caâu truy
vaán thaønh caâu hoûi töông ñöông toái öu hôn, ñeå vieäc thöïc hieän coù chi
phí xöû lyù ít hôn. Nhöng tröôùc khi coù theå “toái öu hoùa” caùc bieåu thöùc,
caàn laøm roõ khaùi nieäm khi naøo thì hai bieåu thöùc ñöôïc goïi laø töông
ñöông. Trong phaàn sau seõ cho bieát moät caùch hình thöùc khaùi nieäm
töông ñöông.

8.2.1. Bieåu thöùc töông ñöông.

Tröôùc heát, xem xeùt laïi khaùi nieäm veà ñònh nghóa quan heä ñaõ
ñöôïc söû duïng trong caùc chöông 2 vaø 3 ñeå thaáy söï töông ñöông cuûa caùc
quan heä döïa theo ñònh nghóa. Vôùi caùc ñònh nghóa khaùc nhau chuùng
cho caùc tính chaát toaùn hoïc cuõng khaùc nhau. Neáu quan nieäm quan heä
laø moät taäp hôïp caùc boä (k - boä) vôùi k coá ñònh, khi ñoù hai quan heä laø
töông ñöông khi vaø chæ khi chuùng coù cuøng moät taäp caùc boä. Vôùi quan
nieäm quan heä laø taäp caùc aùnh xaï töø taäp teân thuoäc tính vaøo taäp giaù trò,
thì khi ñoù hai quan heä laø baèng nhau neáu chuùng coù cuøng moät taäp aùnh
xaï. Ñònh nghóa thöù nhaát coù theå bieán ñoåi sang ñònh nghóa thöù hai baèng
caùch thay ñoåi teân thuoäc tính thaønh teân caùc coät trong baûng vaø, ngöôïc
laïi ñoåi töø ñònh nghóa thöù hai sang ñònh nghóa thöù nhaát baèng caùch coá
ñònh thöù töï cho caùc thuoäc tính. Sau ñaây seõ söû duïng ñònh nghóa thöù hai,
nghóa laø, quan heä laø moät taäp aùnh xaï töø taäp thuoäc tính vaøo taäp caùc giaù
trò. Moät ngoân ngöõ truy vaán hieän höõu luoân luoân ñoøi hoûi phaûi bieát teân
cuûa caùc coät trong moät quan heä. Do ñoù, teân caùc thuoäc tính trong moät
quan heä phaûi laø moät bieán trong moät bieåu thöùc vaø cuõng theå hieän ôû keát
quaû cuûa bieåu thöùc.

+ Bieåu thöùc trong ngoân ngöõ ñaïi soá quan heä coù caùc haïng thöùc laø bieán
quan heä (relation variables) R1,...., Rn; caùc quan heä haèng (constant

201
relation), ñöôïc xaùc ñònh nhö laø moät aùnh xaï töø caùc k-boä cuûa caùc quan
heä (r1, ..., rk) trong ñoù ri laø quan heä treân löôïc ñoà ri vaø thay theá ri vaøo
Ri khi ñaùnh giaù bieåu thöùc. Hai bieåu thöùc E1 vaø E2 ñöôïc goïi laø töông
ñöông (Equivalent), vieát taét laø E1  E2, neáu chuùng bieåu dieãn cuøng moät
aùnh xaï, nghóa laø, neáu chuùng ta thay theá cuøng caùc quan heä cho teân caùc
löôïc ñoà töông öùng ôû hai bieåu thöùc E1 vaø E2, thì chuùng seõ cho ra cuøng
moät keát quaû.

Vôùi ñònh nghóa töông ñöông naøy chuùng ta coù moät pheùp chuyeån
dòch ñaïi soá thoâng thöôøng sau ñaây:

8.2.2. Caùc quy taéc lieân quan tôùi pheùp keát vaø tích Ñeà-caùc.
 Quy taéc giao hoaùn cuûa pheùp keát noái vaø tích Ñeà-caùc
Neáu E1 vaø E2 laø hai bieåu thöùc quan heä vaø F laø ñieàu kieän treân caùc
thuoäc tính cuûa E1 vaø E2 thì:
E1 E2  E2 E1 // Tính giao hoaùn cuûa keát
E1 * E2  E1 * E2 // Tính giao hoaùn cuûa keát baèng
E1 x E2  E1 x E2 // Tính giao hoaùn cuûa tích Ñeà-caùc.

Chuùng ta chöùng minh quy taéc giao hoaùn cuûa pheùp keát noái. Giaû söû E1
coù caùc thuoäc tính A1, ..., An; E2 coù caùc thuoäc tính B1, ..., Bm vaø caùc
thuoäc tính A, B khoâng nhaát thieát phaûi laø phaân bieät. Goïi r1 vaø r2 laø hai
quan heä töông öùng cuûa E1vaø E2. Giaù trò cuûa E1 E2 laø taäp caùc aùnh
xaï  töø A1 ... An, B1 ... Bm vaøo taäp giaù trò sao cho caùc aùnh xaï 1  r1
vaø 2  r2 thoûa maõn ñieàu kieän:
 [Ai] = 1[Ai], i = 1,2,...,n
 [Bi] = 1[Bi], i = 1,2,...,m

vaø ñieàu kieän F laø ñuùng khi thay  [C] cho moãi thuoäc tính C trong F.
Neáu bieåu dieãn E2 E1 cuõng nhö treân, chuùng ta deã daøng
nhaän thaáy hai pheùp keát treân cho chính xaùc cuøng moät taäp keát quaû. Do
vaäy hai bieåu thöùc laø töông ñöông.

202
Chuù yù: Neáu quan nieäm quan heä laø taäp caùc boä (coù thöù töï thuoäc tính coá
ñònh) thì pheùp -keát, keát töï nhieân vaø tích Ñeà-caùc khoâng theå giao hoaùn
ñöôïc vì thöù töï caùc thuoäc tính trong quan heä keát quaû bò thay ñoåi.

 Quy taéc keát hôïp cuûa pheùp keát noái vaø tích Ñeà-caùc.
Neáu E1, E2 vaø E3 laø caùc bieåu thöùc quan heä: F1, F2 laø ñieàu kieän thì:
(E1 E2) E3  E1 (E2 E3)
(E1 * E2) * E3  E1 * (E2 * E3)
(E1 * E2) x E3  E1 x (E2 x E3)

Vieäc kieåm tra tính töông ñöông cuûa caùc quy taéc treân khaù deã daøng.

8.2.3. Caùc quy taéc lieân quan tôùi pheùp choïn vaø pheùp chieáu
Daõy caùc pheùp chieáu coù theå toå hôïp laïi thaønh moät pheùp chieáu, bieåu
dieãn theo caùc tröôøng hôïp sau:

 Daõy caùc pheùp chieáu

(E [B1B2 ... Bm]) [A1A2 ... An]  E [A1 ... An]

ÔÛ ñaây, caùc thuoäc tính A1, ..., An phaûi naèm trong taäp caùc thuoäc tính
B1, ..., Bm. Ngöõ nghóa cuûa vieäc bieán ñoåi töông ñöông naøy laø: Neáu thöïc
hieän moät pheùp chieáu bieåu thöùc quan heä E treân taäp caùc thuoäc tính B,
roài sau ñoù thöïc hieän tieáp pheùp chieáu treân taäp con caùc thuoäc tính A 
B cuûa quan heä vöøa tìm ñöôïc, thì keát quaû cuûa daõy pheùp chieáu naøy
hoaøn toaøn töông ñöông vôùi moät pheùp chieáu bieåu thöùc quan heä E treân
taäp thuoäc tính A.

Töông töï, daõy caùc pheùp choïn coù theå toå hôïp thaønh moät pheùp
choïn ñeå kieåm tra taát caû caùc ñieàu kieän cuøng moät luùc vaø ñöôïc bieåu dieãn
nhö sau:

203
 Daõy caùc pheùp choïn:
( ((E : (f1)) : f2) : ... ) : fn  E : (f1  f2 ...  fn)
Ngöõ nghóa: Vieäc laàn löôït thöïc hieän caùc pheùp choïn treân quan heä keát
quaû cuûa moät pheùp choïn tröôùc ñoù ñoái vôùi bieåu thöùc quan heä E laø töông
ñöông vôùi vieäc choïn treân E caùc boä giaù trò thoûa maõn ñoàng thôøi taát caû
caùc ñieàu kieän choïn f1, f2 ... fn.

 Giao hoaùn pheùp choïn vaø pheùp chieáu:


(E [A1... An] : (f))  (E : (f)) [A1 ... An]

Moät caùch toång quaùt hôn, neáu ñieàu kieän choïn f lieân quan tôùi caùc thuoäc
tính B1, ... Bm maø khoâng naèm trong taäp thuoäc tính A1, ... An thì:
(E [A1 ... An]) : (f)  ((E [A1 ... An B1 ... Bm ]) : (f)) [A1 ... An]

 Giao hoaùn pheùp choïn vaø tích Ñeà-caùc:


Neáu taát caû caùc thuoäc tính cuûa F laø thuoäc tính cuûa E1 thì:
(E1 x E2) : (f)  (E1 : (f)) x E2

Töø ñoù deã daøng suy ra raèng, neáu F coù daïng f = f1  f2 trong ñoù f1 chæ
lieân quan tôùi caùc thuoäc tính cuûa E1; f2 chæ lieân quan tôùi caùc thuoäc tính
cuûa E2 , thì coù theå söû duïng caùc luaät ,, vaø  ñeå coù:
(E1 x E2) : (f)  (E1 : (f1)) x (E2 : (f2))
Hôn nöõa neáu f1 chæ lieân quan tôùi caùc thuoäc tính cuûa E1, nhöng f2
lieân quan tôùi caùc thuoäc tính cuûa caû E1 vaø E2 thì:
(E1 x E2) : (f)  ((E1 : (f1)) x E2) : (f2)

 Giao hoaùn pheùp choïn vaø moät pheùp hôïp:

Neáu coù bieåu thöùc E = E1  E2; coù theå giaû thieát theâm raèng, caùc thuoäc
tính cuûa E1 vaø E2 coù cuøng teân nhö cuûa E hoaëc ít nhaát moãi thuoäc tính

204
cuûa E laø phuø hôïp vôùi moät thuoäc tính duy nhaát cuûa E1 vaø moät thuoäc
tính duy nhaát cuûa E2 . Khi ñoù:
(E1  E2) : (f)  (E1 : (f))  (E2 : (f))

Neáu teân caùc thuoäc tính cuûa E1 vaø hoaëc E2 khaùc vôùi teân thuoäc
tính cuûa E thì trong f ôû veá phaûi cuûa coâng thöùc treân caàn thay ñoåi ñeå söû
duïng teân cho phuø hôïp.

 Giao hoaùn pheùp choïn vaø moät pheùp hieäu taäp hôïp
(E1 - E2) : (f)  (E1 : (f)) - (E2 : (f))

Nhö ñaõ neâu trong luaät , neáu teân caùc thuoäc tính cuûa E1 vaøø E2 laø khaùc
nhau thì caàn thay theá caùc thuoäc tính trong f ôû veá phaûi bieåu thöùc töông
ñöông töông öùng vôùi E1. Chuù yù raèng, pheùp choïn (E2 : (f)) coù theå laø
khoâng caàn thieát. Trong nhieàu tröôøng hôïp, vieäc thöïc hieän pheùp choïn
(E2 : (f)) tröôùc seõ coù hieäu quaû hôn laø tính toaùn tröïc tieáp vôùi E2 vì kích
côõ quan heä luùc ñoù seõ beù ñi raát nhieàu.

Caùc quy taéc neâu treân noùi chung laø ñaåy pheùp choïn xuoáng tröôùc
pheùp keát noái vì pheùp keát noái thöôøng thöïc hieän laâu nhö pheùp tích Ñeà
Caùc. Quy taéc ñaåy pheùp choïn xuoáng tröôùc pheùp keát noái suy ra töø quy
taéc ,  vaø . Quy taéc ñaåy pheùp chieáu xuoáng tröôùc pheùp tích Ñeà-
caùc hoaëc pheùp hôïp cuõng töông töï nhö quy taéc  vaø . Chuù yù laø
khoâng coù phöông phaùp toång quaùt cho vieäc ñaåy pheùp chieáu xuoáng
tröôùc pheùp hieäu caùc taäp hôïp.

 Giao hoaùn moät pheùp chieáu vôùi moät pheùp tích Ñeà-caùc:
Goïi E1, E2 laø hai bieåu thöùc quan heä, A1 ... An laø taäp caùc thuoäc
tính trong ñoù B1, ... Bm laø caùc thuoäc tính cuûa E1, caùc thuoäc tính coøn laïi
C1, ..., Ck thuoäc E2. Khi ñoù:
(E1 x E2) [A1 ... An]  E1 [B1 ... Bm] x E2 [C1 ... Ck]
205
 Giao hoaùn moät pheùp chieáu vôùi moät pheùp hôïp:
(E1  E2) [A1 ... An]  E1[A1 ... An]  E2[A1 ... An]

Nhö ñaõ neâu trong luaät , neáu teân caùc thuoäc tính cuûa E1 vaø / hoaëc E2
laø khaùc vôùi caùc thuoäc tính trong E1  E2 thì caàn thay A1 ... An beân veá
phaûi baèng caùc teân phuø hôïp.

8.2.4. Ví duï veà moät thuaät toaùn toái öu hoùa bieåu thöùc quan heä.

Tôùi ñaây coù theå aùp duïng caùc quy taéc neâu trong muïc 8.2 ñeå coù
theå toái öu hoùa caùc bieåu thöùc quan heä. Bieåu thöùc “toái öu” keát quaû phaûi
tuaân theo caùc nguyeân taéc ñaõ neâu ôû phaàn 8.1 maëc duø raèng caùc nguyeân
taéc ñoù khoâng coù nghóa laø baûo ñaûm ñeå toái öu cho moïi tröôøng hôïp töông
ñöông.

Löu yù raèng, luoân luoân ñaåy pheùp choïn vaø pheùp chieáu xuoáng möùc
caøng saâu caøng toát trong caây bieåu dieãn bieåu thöùc quan heä nhaèm taïo
neân moät daõy caùc pheùp choïn cuõng nhö pheùp chieáu ñeå töø ñoù coù theå toå
chöùc thaønh moät pheùp choïn theo sau moät pheùp chieáu. Nhoùm caùc pheùp
choïn vaø pheùp chieáu laïi trong moät nhoùm ñeå thöïc hieän tröôùc caùc pheùp
tính hai ngoâi nhö pheùp hôïp, tích Ñeà-caùc, hieäu taäp hôïp v.v...

Coù moät soá tröôøng hôïp ñaëc bieät xaûy ra khi moät pheùp tính hai
ngoâi coù caùc haïng thöùc chöùa pheùp choïn vaø / hoaëc pheùp chieáu ñöôïc aùp
duïng ñoái vôùi laù cuûa caây bieåu dieãn bieåu thöùc. Khi ñoù caàn xem xeùt
caån thaän taùc ñoäng cuûa pheùp tính hai ngoâi vì moät soá tröôøng hôïp caàn
phaûi lieân keát pheùp choïn hoaëc pheùp chieáu vôùi pheùp hai ngoâi ñoù.

Keát quaû ñaàu ra (Output) cuûa thuaät toaùn laø moät chöông trình bao
goàm caùc böôùc nhö sau:
a. AÙp duïng cuûa moät pheùp choïn hoaëc moät pheùp chieáu ñôn giaûn.
206
b. AÙp duïng cuûa moät pheùp choïn vaø moät pheùp chieáu hoaëc
c. AÙp duïng cuûa moät tích Ñeà-caùc, pheùp hôïp hoaëc pheùp hieäu taäp
hôïp cho hai haïng thöùc maø tröôùc ñoù caùc pheùp choïn hoaëc caùc pheùp
chieáu ñaõ ñöôïc aùp duïng cho moät hoaëc caû hai haïng thöùc.

Haõy xeùt moät CSDL quaûn lyù thö vieän bao goàm caùc quan heä sau ñaây:

1. SAÙCH (Teân-saùch, Taùc-giaû, Nhaø_XB, Maõ-saùch): laø quan heä veà caùc loaïi saùch
trong thö vieän.
2. NHAØ-XUAÁT-BAÛN (Nhaø_XB, Ñòa-chæ, Thaønh-phoá): quan heä veà nhaø xuaát baûn.
3. ÑOÄC-GIAÛ (Teân-ÑG, Ñchæ-ÑG, Tphoá-ÑG, Soá-theû) : quan heä veà ñoäïc giaû
4. MÖÔÏN-SAÙCH (Soá-theû, Maõ-saùch, Ngaøy-möôïn): quan heä soå theo doõi möôïn.

Ñeå löu tröõ thoâng tin veà saùch coù theå giaû thieát theâm raèng coù moät khung
nhìn (VIEW) theo doõi caùc saùch ñöôïc möôïn, TD-MÖÔÏN, bao goàm moät soá
thoâng tin boå sung veà saùch ñöôïc möôïn, laø keát quaû cuûa keát noái töï nhieân
cuûa quan heä SAÙCH, ÑOÄC-GIAÛ vaø MÖÔÏN-SAÙCH, chaúng haïn ñöôïc xaùc ñònh
qua bieåu thöùc quan heä:

( (SAÙCH x ÑOÄC-GIAÛ x MÖÔÏN-SAÙCH) : (f)) [S]

ÔÛ ñaây:
f ::= (ÑOÄC-GIAÛ.Soá-theû = MÖÔÏN-SAÙCH.Soá-theû)  (SAÙCH.Maõ-saùch =
MÖÔÏN-SAÙCH.Maõ-saùch).

vaø S laø taäp caùc thuoäc tính:


S =  Teân-saùch, Taùc-giaû, Nhaø_XB, SAÙCH.Maõ-saùch, Teân_ÑG, Ñchæ-ÑG, Tphoá-ÑG,
ÑOÄC-GIAÛ.Soá-theû, Ngaøy-möôïn .

Caâu hoûi: Cho danh saùch nhöõng cuoán saùch ñaõ cho möôïn tröôùc ngaøy
27/03/1999. Bieåu thöùc quan heä ñöôïc vieát nhö sau:

(TD-MÖÔÏN : (Ngaøy-möôïn < 27/03/1999) ) [ Teân-saùch ]

207
Hình caây cuûa bieåu thöùc treân ñöôïc bieåu dieãn baèng hình 8.1. Xin
löu yù laø, caùc pheùp toaùn naèm ôû phiaù döôùi laø caùc pheùp toaùn ñöôïc thöôïc
hieän tröôùc caùc pheùp toaùn ôû phiaù treân cuûa caây.

[ Teân-saùch] // Chieáu laáy coät teân saùch



: (Ngaøy-möôïn < 27/03/1999) // Choïn saùch cho möôïn tröôùc
 // ngaøy 27/03/1999
[Teân-saùch, Taùc-giaû, SAÙCH.Maõ-saùch, Teân-ÑG, Ñchæ-ÑG,
TPhoá-ÑG, ÑOÄC-GIAÛ.Soá-theû, Ngaøy-möôïn ]

: ((SAÙCH.Maõ-saùch = MÖÔÏN-SAÙCH.Maõ-saùch) 
(MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû))

x


x SAÙCH


MÖÔÏN-SAÙCH ÑOÄC-GIAÛ

Hình 8.1: Bieåu dieãn caây cuûa bieåu thöùc hoûi

Thay theá caùc giaù trò f vaø S vaøo bieåu thöùc hoûi coù ñöôïc caây bieåu
dieãn cuûa bieåu thöùc quan heä nhö trong hình 8.1

Böôùc thöù nhaát cuûa toái öu laø taùch pheùp choïn f thaønh hai pheùp choïn vôùi
ñieàu kieän:

SAÙCH.Maõ-saùch = MÖÔÏN-SAÙCH.Maõ-saùch

208
vaø
MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû

Baây giôø chuùng ta coù 3 pheùp choïn. Caàn “ñaåy” chuùng xuoáng möùc thaáp
hôn chöøng naøo coøn coù theå ñöôïc.

Pheùp choïn vôùi ñieàu kieän Ngaøy-möôïn < 27/03/1999 ñöôïc ñaåy
xuoáng döôùi pheùp chieáu vaø hai pheùp choïn kia baèng caùch aùp duïng caùc
quy taéc (hoaëc luaät)  vaø . Pheùp choïn ñaàøu ñöôïc aùp duïng cho tích
Ñeà-caùc ((MÖÔÏN-SAÙCH x ÑOÄC-GIAÛ) x SAÙCH). Vì thuoäc tính Ngaøy-möôïn
trong pheùp choïn chæ coù ôû quan heä MÖÔÏN-SAÙCH neân coù theå thay theá:

((MÖÔÏN-SAÙCH x ÑOÄC-GIAÛ) x SAÙCH) : (Ngaøy-möôïn < 27/03/1999)


baèng bieåu thöùc:
((MÖÔÏN-SAÙCH x ÑOÄC-GIAÛ) : (Ngaøy-möôïn < 27/03/1999)) x SAÙCH)
vaø tieáp tuïc ñaåy xuoáng nöõa, cuoái cuøng ta ñöôïc bieåu thöùc:
(((MÖÔÏN-SAÙCH : (Ngaøy-möôïn < 27/03/1999)) x ÑOÄC-GIAÛ) x SAÙCH)

Nhö vaäy ñaõ ñaåy ñöôïc pheùp choïn theo ngaøy möôïn saùch naøy xuoáng saâu
nhö coù theå.

Baây giôø tieáp tuïc ñaåy pheùp choïn vôùi ñieàu kieän SAÙCH.Maõ-saùch =
MÖÔÏN-SAÙCH.Maõ-saùch. xuoáng möùc thaáp nhaát neáu coù theå. Khoâng theå ñaåy
pheùp choïn naøy xuoáng döôùi tích Ñeà-caùc vì noù lieân quan tôùi moät thuoäc
tính cuûa quan heä SAÙCH vaø moät thuoäc tính thuoäc quan heä MÖÔÏN-SAÙCH.
Do vaäy pheùp choïn:

: MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû

coù theå ñaåy xuoáng ñeå aùp duïng cho tích Ñeâ-caùc:
(MÖÔÏN-SAÙCH x ÑOÄC-GIAÛ) : (Ngaøy-möôïn < 27/03/1999)

Chuù yù raèng MÖÔÏN-SAÙCH.Soá-theû laø teân moät thuoäc tính cuûa pheùp choïn:

209
MÖÔÏN-SAÙCH : (Ngaøy-möôïn < 27/03/1999).

Böôùc tieáp theo: Toå hôïp hai pheùp chieáu thaønh moät pheùp chieáu laø
[Teân-saùch] nhôø luaät . Keát quaû ñöôïc cho nhö trong hình 8.2. Sau ñoù aùp
duïng quy taéc môû roäng  thay theá:

:(MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû) vaø chieáu [Teân_saùch]

nhôø daõy pheùp toaùn:


[Teân-saùch, SAÙCH.Maõ_saùch, MÖÔÏN-SAÙCH.maõ-saùch ] (1)
:(SAÙCH.Maõ_saùch = MÖÔÏN-SAÙCH.Maõ-saùch) (2)
roài chieáu ñeå laáy teân saùch:
[Teân-saùch] (3)

AÙp duïng quy taéc  ñeå thay theá bieåu thöùc ñaàu tieân, bieåu thöùc soá
(1), cuûa pheùp chieáu nhôø pheùp chieáu:

[Teân-saùch, SAÙCH.Maõ_saùch]

ñeå aùp duïng cho quan heä SAÙCH vaø [MÖÔÏN-SAÙCH.maõ-saùch] aùp duïng cho
haïng thöùc phiaù traùi cuûa tích Ñeà-caùc trong hình 8.2.

Pheùp chieáu cuoái vaø pheùp choïn coù theå aùp duïng quy taéc môû roäng
 ñeå coù daõy:

[MÖÔÏN-SAÙCH.Maõ_saùch, MÖÔÏN-SAÙCH.Soá-theû, ÑOÄC-GIAÛ.Soá-theû] (5)


: (MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû) (6)
[MÖÔÏN-SAÙCH.Maõ_saùch] (7)

Pheùp chieáu ñaàu, soá (5), ñöôïc phaân taùch chuyeån xuoáng tích Ñeà-
caùc nhôø quy taéc .
Moät phaàn pheùp chieáu ÑOÄC-GIAÛ.Soá-theû xuoáng haïng thöùc ÑOÄC-GIAÛ
vì laø thuoäc tính cuûa quan heä naøy.
210
[ Teân-saùch ]


: ( SAÙCH.Maõ_saùch = MÖÔÏN-SAÙCH.Maõ-saùch )


x

(MÖÔÏN-SAÙCH.Soá-theû = ÑOÄC-GIAÛ.Soá-theû ) SAÙCH




x

: (Ngaøy-möôïn < 27/03/1999) ÑOÄC-GIAÛ




MÖÔÏN-SAÙCH

Hình 8.2 Caây vôùi toå hôïp pheùp choïn vaø pheùp chieáu

Phaàn coøn laïi laø pheùp chieáu ñeå laáy 3 thuoäc tính:

[ MÖÔÏN-SAÙCH.Maõ_saùch, MÖÔÏN-SAÙCH.Soá-theû, Ngaøy-möôïn ]

ñöôïc ñaåy xuoáng haïng thöùc thöù MÖÔÏN-SAÙCH. Caùc thuoäc tính khoâng phuø
hôïp seõ bò loaïi boû. Bieåu dieãn caây cuoái cuøng cuûa bieåu thöùc nhö trong
hình 8.3.

211
Nhoùm caùc pheùp tính baèng ñöôøng muõi teân giaùn ñoaïn. Moãi tích
Ñeà-caùc ñöôïc toå hôïp vôùi pheùp choïn ñeå taïo thaønh moät pheùp keát noái
baèng nhau (Equi Join) raát coù hieäu quaû. Ñaëc bieät pheùp choïn treân quan
heä MÖÔÏN-SAÙCH vaø pheùp chieáu cuûa ÑOÄC-GIAÛ ñeå laáy thuoäc tính Soá-theû ôû
phía döôùi laø ñuû ñeå toå hôïp vôùi tích Ñeà-caùc. Thöù töï thöïc hieän cuûa caây
bieåu thöùc trong caùc hình 8.3, 8.2 vaø 8.3 laø töø döôùi leân: Nhoùm caùc pheùp
toaùn naèm ôû phía döôùi ñöôïc thöïc hieän tröôùc caùc pheùp toaùn ôû phiaù treân.

[ Teân-saùch ]


: ( SAÙCH.Maõ_saùch = MÖÔÏN-SAÙCH.Maõ-saùch )


x

[ MÖÔÏN-SAÙCH.Maõ-saùch ] [SAÙCH.Maõ-saùch, Teân-saùch]


 
 
x SAÙCH

[MÖÔÏN-SAÙCH.Maõ-Saùch, MÖÔÏN-SAÙCH.Soá-theû] [ÑOÄC-GIAÛ.Soá-theû]


 
 
: (Ngaøy-möôïn < 27/03/1999) ÑOÄC-GIAÛ


MÖÔÏN-SAÙCH

Hình 8.3 Caây keát quaû bieåu dieãn vieäc phaân nhoùm caùc bieåu thöùc.

212
8.3. Moät thuaät toaùn ñeå toái öu hoùa caâu hoûi trong ngoân ngöõ ÑSQH

Ví duï treân cho ta moät minh hoïa veà vieäc chuyeån ñoåi moät caâu hoûi
baèng ngoân ngöõ Ñaïi soá quan heä veà daïng töông ñöông toát hôn (hay toái
öu hôn). Phöông phaùp treân taäp trung chuû yeáu vaøo caùc pheùp chieáu,
pheùp choïn vaø tích Ñeà-caùc, vôùi muïc ñích laøm sao “ñaåy” ñöôïc pheùp
choïn vaø pheùp chieáu xuoáng möùc thaáp nhaát, töùc laø thi haønh caùc pheùp
toaùn naøy caøng sôùm caøng toát, neáu coù theå. Tieáp theo, keát hôïp caùc pheùp
choïn vôùi tích Ñeà-caùc thaønh pheùp keát töï nhieân ñeå laøm giaûm caùc keát
quaû trung gian. Coát loõi cuûa vaán ñeà toái öu hoùa chính laø vieäc laøm giaûm
thieåu löu tröõ trung gian vaø töø ñoù laøm taêng nhanh toác ñoä xöû lyù caâu hoûi.

Tuy nhieân, ñeå thöïc hieän ñöôïc caùc quaù trình toái öu hoùa nhö treân,
chuùng ta caàn löu yù tôùi thöù töï thöïc hieän caùc pheùp toaùn ñeå coù theå “ñaåy”
caùc pheùp toaùn xuoáng caùc möùc hôïp lyù caàn thieát. Baûng döôùi ñaây cho
pheùp chuùng ta caùch thöïc hieän caùc pheùp bieán ñoåi töông ñöông ñoái vôùi
caùc pheùp Hoäi (Union), Tröø (Minus), Giao (Intersect), Tích Ñeà-caùc
(Cartesian), Chia (Division), Chieáu (Projection) vaø Choïn (Selection).

(B1). Keát töï nhieân töông ñöông vôù daõy pheùp tích Ñeà-caùc, pheùp choïn
vaø pheùp chieáu:
Q1 (A,B) * Q2 (B,C)  (Q1 x Q2 : (Q1[B]=Q2[B])) [A,B,C]

(B2). Pheùp theta keát töông ñöông vôùi daõy pheùp tích Ñeà-caùc vaø
pheùp choïn vôùi ñieàu kieän theta:
BD
Q1(A,B) Q2(C,D)  (Q1 x Q2) : (BD)

(B3). Pheùp giao (Intersect) töông ñöông vôùi phaàn buø


(Complement) cuûa hoäi hai phaàn buø cuûa 2 quan heä:
Q1  Q2   (( Q1)  ( Q2)) vaø (B4)

213
(B4). Pheùp buø cuûa moät quan heä töông ñöông vôùi tích Ñeà-caùc cuûa
caùc pheùp chieáu treân töøng thuoäc tính cuûa quan heä tröø ñi caùc boä giaù trò
ñaõ coù trong theå hieän cuûa quan heä:
 Q(X1, X2,Xn)  (Q[X1] x Q[X2] x  x Q[Xn]) - Q(X1,Xn)

(B5). Thöông cuûa 2 quan heä töông ñöông vôùi hieäu cuûa caùc quan
heä trung gian sau:
Q1(A,B)  Q2(A) = Q1[B] - ((Q1[B] x Q2[A] - Q1(A,B)) [B]

AÙp duïng caùc caùch bieán ñoåi töông ñöông treân, keát hôïp vôùi caùc
quy taéc “ñaåy” vaø keát hôïp nhö ñaõ trình baøy trong muïc 8.2, chuùng ta
ñöa ra thuaät toaùn toång quaùt ñeå toái öu hoùa caùc caâu hoûi trong ngoân ngöõ
ñaïi soá quan heä.

Thuaät toaùn:
Ñaàu vaøo (Input): Sô ñoà cuù phaùp caâu hoûi baèng ngoân ngöõ ñaïi soá
quan heä.
Ñaàu ra (Output): Sô ñoà cuù phaùp toái öu.

Böôùc 1. AÙp duïng caùc pheùp bieán ñoåi töông ñöông neâu trong
baûng (B1) ñeán (B5) treân.
Böôùc 2. AÙp duïng luaät  bieán ñoåi daõy caùc pheùp choïn töông
ñöông: taùch pheùp choïn thaønh caùc pheùp choïn con.
Böôùc 3. Ñoái vôùi moãi pheùp choïn, aùp duïng caùc luaät ,, vaø 
nhaèm ñaåy caùc pheùp toaùn choïn ñoù xuoáng caøng saâu caøng toát.
Böôùc 4. Ñoái vôùi moãi pheùp chieáu, aùp duïng caùc quy taéc , vaø
 nhaèm ñaåy caùc pheùp toaùn chieáu ñoù xuoáng caøng saâu caøng toát.
Böôùc 5.
+ Taäp trung caùc pheùp choïn nhaèm aùp duïng luaät 
+ AÙp duïng luaät  ñeå loaïi boû bôùt caùc pheùp chieáu voâ ích.
+ Taäp trung caùc pheùp choïn vôùi tích Ñeà-caùc, neáu ñöôïc, ñeå
chuyeån thaønh pheeùp keát töï nhieân hay theta keát baèng caùch aùp duïng
caùc luaät  vaø .

214
Nhaän xeùt:

1. Thuaät giaûi neâu treân chuû yeáu nhaèm giaûm khoái löôïng döõ lieäu
trung gian chöù khoâng chæ ra thöù töï thöïc hieän caùc pheùp keát. Ví duï:
(Q1 (A,B) * Q2 (B,C)) * Q3(A,C) 
(Q1 (A,B) * Q3 (A,C)) * Q2(B,C)

2. Thuaät giaûi naøy khoâng cho chuùng ta moät keát quaû toái öu maø noù
chæ ñöa ra moät giaûi phaùp toâeùt.

3. Caùc pheùp bieán ñoåi chæ döïa treân caùc pheùp toaùn cô baûn laø Hoäi
(Union), Tröø (Minus), Giao (Intersect), Tích Ñeà-caùc (Cartesian), Chia
(Division), Chieáu (Projection) vaø Choïn (Selection) maø chuùng ta coøn
coù theå thöïc hieän caùc pheùp bieán ñoåi döïa treân caùc pheùp toaùn khaùc nöõa.

8.4. Moät soá kyõ thuaät toái öu caáp thaáp.

Trong muïc 8.2 ñaõ trình baøy caùc tö töôûng cô baûn ñeå thöïc hieän toái
öu moät bieåu thöùc quan heä. Trong phaàn naøy seõ trình baøy moät lôùp caùc
caâu truy vaán raát phoå duïng vaø ñaõ ñöôïc nhieàu heä thoáng caøi ñaët coù hieäu
quaû. Vaán ñeà ñaët ra laø khi caâu hoûi ñaõ ñöôïc bieán ñoåi vaø toái öu coù töông
ñöông vôùi caâu hoûi ban ñaàu hay khoâng? Lôùp caâu hoûi seõ quan saùt bao
goàm pheùp chieáu (Projection), pheùp choïn (Selection) vaø pheùp keát töï
nhieân (Natural Join) coù nghóa laø caùc bieåu thöùc truy vaán chæ bao goàm
ba pheùp tính ñoù. Keát quaû caøi ñaët cuûa nhieàu heä thoáng (nhö trong
System R) laø hieäu quaû nhöng khoâng phaûi laø toång quaùt cho taát caû.
Nhö phaàn treân ñaõ trình baøy, trong caùc pheùp toaùn quan heä thì
pheùp tích Ñeà caùc, pheùp keát (Join) laøm maát raát nhieàu thôøi gian xöû lyù
vaø toán nhieàu boä nhôù. Vì vaäy, nguyeân taéc cô baûn cuûa phaàn naøy laø laøm
theá naøo ñeå bieåu thöùc toái öu cuoái cuøng (töông ñöông vôùi bieåu thöùc ban
ñaàu) coù soá pheùp keát laø toái thieåu. Do vaäy, trong quaù trình bieán ñoãi

215
töông ñöông, ñieàu quan troïng laø loaïi boû ñöôïc caùc pheùp keát khoâng caàn
thieát.
Ñeå tieän lôïi cho quaù trình bieán ñoåi, caàn laøm quen vôùi khaùi nieäm
“quan heä vuõ truï” (universal relation), coù theå hieåu moät caùch ñôn giaûn
ñoù laø pheùp keát töï nhieân cuûa taát caû caùc quan heä trong CSDL thaønh moät
quan heä chung.

Caâu hoûi hoäi vaø baûng

Moät caâu hoûi hoäi (conjunctive query) laø caâu hoûi coù daïng:
a1 ... an ( b1) ... (bm) ( p1  ...  pk) 
trong ñoù pi, i =1, ..., k laø moät trong caùc daïng:
1. R(c1, c2, ..., cr), nghóa laø caùc boä c1, c2, ..., cr thuoäc quan heä R; cj hoaëc
laø caùc giaù trò a, hoaëc caùc giaù trò b hoaëc laø moät tröïc haèng (literal);
2. c  d trong ñoù c vaø d laø caùc giaù trò a hoaëc b hoaëc laø tröïc haèng;  laø
moät trong caùc pheùp so saùnh <,  , >,  . Chuù yù raèng caùc pheùp = vaø
 laø khoâng ñöôïc tính trong danh saùch.

Thoâng thöôøng, caâu hoûi ñöôïc bieåu dieãn ñöôùi daïng baûng
(tableau). Ñeå moâ taû khoái löôïng baûng, tröôùc heát caàn giaû thieát raèng taäp
caùc thuoäc tính cuûa caùc quan heä ñang quan saùt laø nhö nhau. Caùc thuoäc
tính coù cuøng teân ôû caùc quan heä khaùc nhau ñeàu coù cuøng moät yù nghóa vaø
caùc thuoäc tính coù yù nghóa khaùc nhau thì phaûi mang teân khaùc nhau.

Ñònh nghóa baûng

Baûng coù theå ñöôïc xem nhö moät maûng hai chieàu vaø theâm moät soá
ñieàu kieän raøng buoäc. Haøng thöù nhaát cuûa baûng laø danh saùch taát caû caùc
thuoäc tính. Moãi thuoäc tính töông öùng vôùi moät coät cuûa baûng. Haøng thöù
hai goïi laø haøng ñích (summary) bao goàm caùc giaù trò roãng (blank), caùc
kyù hieäu phaân bieät (distinguished symbols) vaø haèng. Kyù hieäu phaân bieät
thöôøng ñöôïc kyù hieäu baèng chöõ caùi a (thöôøng) bieåu dieãn trong caâu hoûi
hoäi. Caùc haøng coøn laïi nhaän caùc kyù hieäu a hoaëc troáng hoaëc b, vôùi b laø

216
bieán khoâng phaân bieät (nondistinguished variable) hoaëc kyù hieäu khoâng
phaân bieät (nondisguished symbols). Caùc haøng naøy bieåu dieãn caùc haïng
thöùc cuûa caâu hoûi hoäi döôùi daïng R(c1, c2, ..., ck) töùc laø xaùc ñònh caùc boä
trong töøng quan heä. Taïi vò trí ci trong coät laø töông öùng vôùi thuoäc tính
thöù i cuûa quan heä, vaø seõ laø giaù trò troáng trong coät cuûa baûng neáu khoâng
töông öùng vôùi thuoäc tính naøo cuûa löôïc ñoà quan heä R. Caùc taân töø c  d
cuûa caâu hoûi hoäi ñöôïc xem laø caùc raøng buoäc cuûa baûng.
Chuù yù baûng ñoøi hoûi raèng cuøng moät bieán khoâng ñöôïc pheùp xuaát
hieän ñoàng thôøi treân hai coät khaùc nhau cuûa baûng, coøn bieán phaân bieät
khoâng xuaát hieän ôû haøng ñích cuûa coät ñoù.
Nhö vaäy baûng coù theå ñöôïc dieãn giaûi nhö moät caâu hoûi hoäi, töùc laø
moät aùnh xaï töø caùc giaù trò cuûa caùc bieán quan heä leân quan heä. Quan heä
keát quaû laø quan heä treân taäp thuoäc tính vôùi caùc kyù hieäu phaân bieät vaø
haèng treân haøng ñích.
Goïi T laø moät baûng vaø S laø taäp taát caû caùc kyù hieäu xuaát hieän
trong T (töùc laø caùc bieán vaø haèng). Moät ñaùnh giaù  cho T lieân quan vôùi
moãi kyù hieäu cuûa S laø moät haèng, sao cho neáu moät haèng c  S thì  (c)
= c. ñoái vôùi haøng ñích vaø caùc haøng khaùc cuûa T coù theå môû roäng nhö
sau:
Goïi w0 laø haøng ñích cuûa T, w1...wn laø caùc haøng coøn laïi thì  (wi)
laø boä nhaän ñöôïc nhôø thay theá  (v) cho moãi bieán v xuaát hieän trong wi.
Baûng ñöôïc ñònh nghóa laø aùnh xaï töø caùc traïng thaùi vaøo caùc quan heä
treân moät taäp caùc thuoäc tính. Vaäy, neáu T laø moät baûng, I laø moät traïng
thaùi thì T(I) laø moät quan heä treân taäp caùc thuoäc tính maø caùc thuoäc tính
ñoù laø nhöõng coät coù giaù trò khaùc troáng treân haøng ñích, sao cho
T(I) =  (w0) vôùi ñaùnh giaù  (wi)  I, 1  i  n .

Chuù yù: Quy ñònh raèng  laø baûng roãng. Baûng naøy bieåu dieãn aùnh xaï
moãi traïng thaùi vaøo quan heä roãng.

Tính töông ñöông cuûa baûng

217
Hai baûng T1 vaø T2 laø töông ñöông, kyù hieäu T1  T2 neáu vôùi moïi tình
traïng I, T1(I) = T2(I). Noùi raèng T1 chöùa trong T2, vieát taét laø T1  T2
neáu vôùi moïi I, T1(I)  T2(I). Löu yù raèng ñieàu kieän caàn nhöng khoâng
ñuû ñeå cho T1  T2 vaø T1  T2 laø caùc quan heä ñöôïc xaùc ñònh bôûi T1 vaø
T2 phaûi coù cuøng löôïc ñoà ñích (löôïc ñoà ñích laø taäp hôïp caùc thuoäc tính
bieãu dieãn haøng ñaàu tieân cuûa baûng).

8.4.1 Bieåu dieãn moät bieåu thöùc nhôø baûng

Trong phaàn naøy trình baøy caùch thöùc caáu truùc moät baûng ñeå bieåu
dieãn moät bieåu thöùc quan heä baèng caùc pheùp Chieáu, Choïn vaø Keát töï
nhieân. Vieäc caáu truùc baûng tröôùc heát tieán haønh cho töøng haïng thöùc cuûa
bieåu thöùc, sau ñoù toå hôïp caùc baûng laïi thaønh moät baûng chung. Caùc quy
taéc thieát laäp baûng T cho bieåu thöùc E ñöôïc theå hieän ñeä quy nhö sau:
(1) Neáu E laø löôïc ñoà quan heä R thì baûng T ñoái vôùi E chæ coù moät
haøng vaø haøng ñích, trong ñoù:
(i) Neáu A  R thì taïi coät cho thuoäc tính A cuûa T seõ coù cuøng
giaù trò bieán phaân bieät cho caû haøng ñích vaø haøng ñoù:
(ii) Neáu A  R thì giaù trò cuûa coät taïi haøng ñích laø troáng vaø taïi
haøng laø bieán khoâng phaân bieät.
(2a) Giaû söû bieåu thöùc choïn E coù daïng E1 : (A = C) vaø ñaõ caáu truùc
baûng T1 cho bieåu thöùc E1.
(i) Neáu haøng ñích cuûa T1 coù kyù hieäu troáng taïi coät A thò T = 
(ii) Neáu coù moät haèng c  c’ taïi A cuûa haøng ñích, thì T =  neá
c = c’ thì T = T1.
(iii) Neáu T1 coù bieán phaân bieät a ôû coät A cuûa haøng ñích thò
baûng T ñoái vôùi E ñöôïc caáu truùc nhôø vieäc thay a baèng c taïi
moïi choã maø a xuaát hieän trong T1 (töùc laø caùc giaù trò a xuaát
hieän trong coät a cuûa baûng T1).

(2b) Giaû söû E laø pheùp chieáu coù daïng E1 [X] vaø T1 laø baûng cuûa E1. Caáu
truùc baûng T cho E baèng caùch xoùa taát caû caùc kyù hieäu xuaát hieän taïi
218
haøng ñích cuûa taát caû caùc coät khoâng xuaát hieän trong T. Caùc bieán
phaân bieät trong nhöõng coät naøy ñöôïc thay baèng bieán khoâng phaân
bieät.
(2c) Giaû söû E laø bieåu thöùc ñaïi soá quan heä chöùa pheùp keát töï nhieân coù
daïng E1 * E2 vaø T1, T2 laø caùc baûng töông öùng cuûa E1 vaø E2. Goïi
S1 vaø S2 laø caùc kyù hieäu cuûa T1 vaø T2. S1 vaø S2 coù caùc taäp hôïp cuûa
bieán khoâng phaân bieät rôøi nhau nhöng caùc bieán phaân bieät laø truøng
nhau treân caùc coät töông öùng cuûa pheùp keát noái.
(i) Neáu T1 vaø T2 coù moät soá coät truøng nhau nhöng giaù trò cuûa
chuùng taïi haøng ñích laø nhöõng haèng soá khaùc nhau T = 
(ii) Neáu caùc vò trí töông öùng trong caùc haøng ñích khoâng coù
caùc haèng phaân bieät thì caùc haøng cuûa baûng T cho E ñöôïc
bao goàm töø hôïp cuûa caùc haøng thuoäc baûng T1 vaø T2.
Haøng ñích cuûa T coù caùc coät cuûa hai baûng, caùc coät chung nhaän caùc
giaù trò:
(a) laø haèng c neáu moät trong hai baûng T1, T2 coù haèng c taïi coät
töông öùng cuûa haøng ñích. Trong tröôøng hôïp naøy chuùng ta
seõ thay theá moïi giaù trò cuûa caùc bieán phaân bieät trong coät
baèng giaù trò haèng c.
(b) laø bieán phaân bieät a neáu khoâng aùp duïng ñöôïc quy taéc (a)
nhöng moät trong hai giaù trò cuûa T1 vaø T2 taïi coät töông öùng
coù giaù trò laø a ôû haøng ñích.
(c) laø kyù hieäu troáng trong nhöõng tröôøng hôïp coøn laïi.

Chuù yù: Trong tröôøng hôïp bieåu thöùc E chöùa pheùp choïn coù daïng E1 : (A
= B) vôùi A vaø B teân hai thuoäc tính, khi ñoù ñoàng nhaát caùc giaù trò bieán
phaân bieät trong haøng ñích cuûa T cho caû hai coät A vaø B. Trong taøi lieäu
naøy chæ trình baøy tröôøng hôïp pheùp choïn E1 : (A = c) vôùi c laø moät haèng
soá.

Xeùt ví duï: Cho A, B vaø C laø caùc thuoäc tính vaø giaû söû raèng coù bieåu thöùc
quan heä:
( ( R(AB) * S(BC) ) : (B = 0) ) [AC]
219
Theo quy taéc (1) thieát bò laäp baûng cho löôïc ñoà R(AB) vaø löôïc ñoà
S(BC) nhö sau:

R A B S B C
a1 a2 Vaø a2 a3
a1 a2 a2 a3

Theo quy taéc (2c) baûng cho pheùp keát töï nhieân R(AB) * S(BC) töø hai
baûng treân:
A B C
a1 a2 a3
a1 a2 b1
b2 a2 a3

Vaø cuoái cuøng, theo quy taéc (2b), baûng cho pheùp choïn roài chieáu
((R(AB) * S(BC)) : (B=0)) [AC] laø:
A B C
a1 a3
a1 0 b1
b2 0 a3

8.4.2 Kieåm tra tính töông ñöông cuûa baûng


Vaán ñeà ñaët ra laøm theá naøo ñeå toái thieåu hoùa soá haøng cuûa moät
baûng maø vaån töông ñöông vôùi baûng xuaát phaùt. Nhö treân ñaõ neâu, caàn
thieát phaûi aùnh xaï caùc haøng cuûa baûng xuaát phaùt leân moät baûng khaùc coù
soá haøng ít hôn (ví duï T1  T2) sao cho T2  T1 vôùi ñieàu kieän:
- Caùc baûng phaûi coù cuøng löôïc ñoà ñích (xaùc ñònh treân cuøng moät
taäp thuoäc tính) vaø coù cuøng bieán phaânbieät treân cuøng moät vò trí cuûa
baûng.

220
- Vôùi moãi pheùp gaùn quan heä cho bieán quan heä taïi caùc haøng cuûa
baûng, quan heä sinh ra nhôø T1 phaûi laø taäp con cuûa quan heä sinh ra nhôø
T2.
Ñeå kieåm tra caùc baûng trong quaù trình bieán ñoåi lieäu coù töông
ñöông vôùi nhau khoâng, tröôùc heát caàn theâm khaùi nieäm aùnh xaï haøng -
haøng (Row - Row Mapping) ñöôïc goïi laø aùnh xaï cuoán (Contaiment
Mapping).
Goïi T1 vaø T2 laø hai baûng vôùi caùc taäp kyù hieäu töông öùng laø S1 vaø
S2. Moät ñoàng caáu (Homomorphism) laø moät aùnh xaï  : S1  S2 sao
cho:
(i) Neáu c laø moät haøng soá thì  (c) = c.
(ii) Neáu a laø moät bieán phaân bieät thì  (a) hoaëc laø bieán phaânbieät
hoaëc laø moät haèng soá xuaát hieän trong coät töông öùng cuûa haøng ñích cuûa
T2.
(iii) Neáu w laø moät haøng cuûa T1 thì  (W) laø moät haøng cuûa T2.
Nhö vaäy coù theå aùnh xaï caùc haøng cuûa T2 leân caùc phaàn töû cuûa
moät traïng thaùi I vaø vì theá ñoàng caáu  seõ cho moät aùnh xaï töø caùc haøng
cuûa T1 leân I. Do ñoù T2 (I)  T1(I) vôùi moïi I, töø ñoù coù T2  T1.
Ngöôïc laïi cuõng hoaøn toaøn ñuùng, neáu T2  T1 suy ra ñöôïc:
T2(I)  T1(I).
Coù theå hình thöùc hoùa döôùi ñònh lyù sau ñaây:

Ñònh lyù 8.1:

Goïi T1 vaø T2 laø hai baûng vôùi taäp caùc kyù hieäu töông öùng laø S1 vaø
S2. T2  T1 khi vaø chæ khi chuùng coù cuøng löôïc ñoà ñích vaø coù moät ñoàng
caáu  : S1  S2.

221
AÙnh xaï cuoán

AÙnh xaï cuoán laø aùnh xaï töø caùc haøng cuûa baûng naøy leân caùc haøng
cuûa baûng khaùc maø baûo toaøn bieán phaân bieät vaø caùc haèng soá nhöng
khoâng aùnh xaï moät kyù hieäu leân hai kyù hieäu phaân bieät. Moät caùch hình
thöùc coù theå noùi raèng, neáu T1, T2 laø hai baûng,  laø aùnh xaï töø caùc haøng
cuûa T1 leân caùc haøng cuûa T2,  ñöôïc goïi laø aùnh xaï cuoán neáu:
(a) Vôùi moãi haøng i cuûa T1, neáu haøng i coù bieán phaân bieät ôû coät A
thì haøng  (i) cuûa T2 cuõng coù bieán phaân bieät hoaëc haèng soá ôû
coät A.
(b) Neáu haøng i cuûa T1 coù haèng soá c ôû coät A thì haøng  (i) coù c ôû
coät A.
(c) Neáu haøng i vaø j cuûa T1 coù cuøng moät bieán khoâng phaân bieät ôû
coät A thì haøng  (i) vaø  (j) coù cuøng moät kyù hieäu ôû coät ñoù.
Kyù hieäu coù theå laø haèng soá, bieán phaân bieät hoaëc bieán khoâng
phaân bieät. ( Chuù yù raèng, vaãn coù theå  (i) = (j)). Töø ñoù coù
ñònh lyù sau:

Ñònh lyù 8.2:

T2  T1 neáu vaø chæ neáu chuùng xaùc ñònh treân cuøng moät löôïc ñoà
ñích vaø toàn taïi moät aùnh xaï cuoán  töø T1 leân T2.
Chöùng minh: (Neáu) Goïi  : S1  S2 laø aùnh xaï kyù hieäu - kyù hieäu sao
cho neáu kyù hieäu d xuaát hieän ôû coät A cuûa haøng r cuûa T1 vaø kyù hieäu d’
xuaát hieän ôû coät A cuûa haøng (r) cuûa haøng T2 thì  (d) = d’. AÙnh xaï 
laø phuø hôïp nhôø ñieàu kieän (c). Ñieàu kieän (i) - (iii) cho  deã daøng suy
tröïc tieáp. Thaät vaäy, (a) keùo theo (ii), (b) keùo theo (i) vaø (iii) ñöôïc suy
ra töø ñònh nghóa cuûa  vaø  . Do vaäy  laø moät ñoàng caáu. Theo ñònh lyù
8.1 thì T2  T1.
(Chæ neáu): Töø ñònh lyù 8.1, coù moät ñoàng caáu  : S1  S2 thoûa (i)
- (iii). Toàn taïi aùnh xaï töø caùc haøng cuûa T2 thoûa (c) suy ra töø (iii), (i) vaø
(ii). Töø keùo theo (a) vaø (b).

222
Ví duï: Cho bieåu thöùc (AB * BC) [AB], coù baûng:
A B C
a1 a2
T1 = w1 a1 a2 b1
w2 b2 a2 a3

Bieåu thöùc AB treân caùc thuoäc tính A, B vaø C coù baûng:


A B C
T2= a1 a2
w3 a1 a2 b1

Theo chieàu xuoâi, aùnh xaï caû hai haøng w1 vaø w2 leân w3 laø aùnh xaï
cuoán. Ñoàng caáu laø:

Trong T1 Trong T2
a1 a1
a2 a2
b1 b1
b2 a1
b3 b1

Theo chieàu ngöôïc laïi, aùnh xaï w3 leân w1 vaø chuùnh ta nhaän thaáy
roõ raøng raèng aùnh xaï laø ñuùng.
Do vaäy AB vaø (AB*AB) [ AB ] laø töông ñöông.
Ví duï:
E1 = AB * BC vaø E2 = (ABC) * ((BC) : (C=0 ))
Baûng töông öùng cuûa E1, E2 laø:

223
A B C A B C
a1 a2 a3 a1 a2 0
T1 = w1 a1 a2 b1 T2 = w4 a1 a2 0
w2 a1 b2 a3 W5 b1 a2 0
w3 b3 a2 a3

Do vaäy T2  T1 vì coù theå taïo moät aùnh xaï cuoán chuyeån w1, w2
vaø w3 leân w4. Coù theå choïn aùnh xaï w3 leân w5 neáu muoán. Chieàu ngöôïc
laïi khoâng toàn taïi aùnh xaï cuoán vì haèng soá 0 khoâng theå aùnh xaï leân bieán.
Do ñoù T1  T2.
Töø ñoù coù ñònh lyù sau ñaây.

Ñònh lyù 8.3:

Neáu T1 vaø T2 laø hai baûng töông ñöông vaø khoâng baûng naøo trong hai
baûng ñoù laø töông ñöông vôùi moät baûng khaùc coù soá doøng ít hôn thì toàn
taïi moät töông öùng 1-1 cuûa caùc haøng thuoäc T1 ñoái vôùi caùc haøng thuoäc
T2. Ñoù laø aùnh xaï cuoán caû hai chieàu.

Toái thieåu hoùa baûng

Cho T0 laø baûng xuaát phaùt. Tm laø baûng töông ñöông vôùi soá haøng toái
thieåu nhö coù theå. Caùc haøng cuûa baûng töông ñöông Tm phaûi laø moät taäp
con cuûa caùc haøng thuoäc T0 (keå caû vieäc ñaët teân laïi caùc kyù hieäu). Coù
ñònh lyù sau ñaây:

Ñònh lyù 8.4:

Neáu T0 laø moät baûng, luoân coù theå thieát laäp ñöôïc moät baûng khaùc töông
ñöông vaø coù soá haøng laø toái thieåu ñöôïc bieán ñoåi töø T0 nhôø xoùa ñi khoâng
hoaëc moät soá haøng.

224
Heä quaû:

Moïi baûng vôùi soá haøng toái thieåu töông ñöông vôùi baûng cho tröôùc ñeàu laø
moät (keå caû vieäc ñaët teân laïi caùc kyù hieäu)

Töø ñònh lyù 8.4 gôïi yù moät thuû tuïc toång quaùt ñeå tìm baûng toái
thieåu. Tröôùc heát tìm aùnh xaï coù theå ñeå aùnh xaï taát caû caùc haøng leân moät
taäp con cuûa caùc haøng. Caàn chuù yù xaùc ñònh caùc aùnh xaï haøng ñích leân
haøng ñích (töùc laø ñoàng nhaát treân caùc bieán phaân bieät) vaø baûo toaøn caùc
raøng buoäc.
Vaán ñeà tìm aùnh xaï ñeå coù soá haøng ít nhaát laø moät baøi toaùn NP -
ñaày ñuû nhöng soá löôïng haøng moät baûng trong thöïc teá laø nhoû cho neán
khoâng phaûi luoân luoân laø vaán ñeà thaät khoù khaên.

225
TAØI LIEÄU THAM KHAÛO

1. M. Adiba, C.Delobel. Systeøms Relationnels de Bases de Donneùes.


Paris, Dunod, 1982.
2. E.F.Codd, A relational model for large shared data banks,
Comm.ACM 13:6 pp.337-387.
3. C.J.Date. An Introduction to DataBase Systems.
Addison Wesley - 2nd edition 1982.
4. D. Maier. The Theory of Relational DataBases.
Computer Science Press, Rockville, 1983.
5. J. Ullman. DataBase and Knowledge Base Systems.
Vol.1,2,3 Computer Science Press, 1983.
(Baûn dòch tieáng Vieät cuûa Traàn Ñöùc Quang. NXB Thoáng keâ Haø noäi
1999)
6. Introdution to Oracle SQL and PL/SQL Using Procedure Builder.
Vol 1,2,3,4. ORACLE V7.3. 1996.
7. Introdution to Oracle: SQL, SQL*PLUS and PL/SQL
Education Services. Vol 1,2,3,4,5,6,7. ORACLE 1992.
8. Nguyeãn An Teá. Giaùo trình Nhaäp moân cô sôû döõ lieäu.
Khoa Coâng ngheä Thoâng tin, Ñaïi hoïc KHTN, Ñaïi hoïc quoác gia
TP.HCM 1996.
9. Traàn Thaønh Trai, Nhaäp moân Cô sôû döõ lieäu.
NXB Giaùo duïc, TP.Hoà Chí Minh 1996.
10. Ñoã Trung Tuaán, Cô sôû döõ lieäu (DataBase),
NXB Giaùo duïc Haø noäi, 1998.
11. Leâ Tieán Vöông. Nhaäp moân cô sôû döõ lieäu.
NXB Thoáng keâ Haø noäi, 2000. Taùi baûn laàn 5.

226