Hệ quản trị cơ sở dữ liệu - Chương V: Ngôn ngữ đại số quan hệ
Bạn đang xem 20 trang mẫu của tài liệu "Hệ quản trị cơ sở dữ liệu - Chương V: Ngôn ngữ đại số quan hệ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- he_quan_tri_co_so_du_lieu_chuong_v_ngon_ngu_dai_so_quan_he.pdf
Nội dung text: Hệ quản trị cơ sở dữ liệu - Chương V: Ngôn ngữ đại số quan hệ
- 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ø RS, laø moät quan heä Q coù n - m ngoâi ñöôïc ñònh nghóa nhö sau: Q = RS = { 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: RS = 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) RS= (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 X R 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 ( ), 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: Q Ñ R 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: AB R S = v = (t, u) t R, u S vaø t.A u.B 104
- Hoaëc: AB R S=(RxS):(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 AB 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: RS = 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 f2 a2 b2 c2 a2 d2 e2 f2 a3 b3 c3 a4 d4 e4 f4 a7 b7 c7 a7 d7 e7 f7 a5 b5 c5 a6 d6 e6 f6 a7 b7 c7 a7 d7 e7 f7 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 ( , , ); 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 SET = , = , [ WHERE ]; 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 * , , FROM [ORDER BY [ 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 , , FROM , , [WHERE ] [GROUP BY , , ] [ORDER BY [ASC DESC ], ] [HAVING ]; 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 { * [AS ], [AS ], } FROM ; 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: , >=, =, ), BETWEEN AND , LIKE . 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 cho pheùp thöïc hieän ñieàu ñoù. ÔÛ ñaây 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 [ASC DESC], [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 . 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: [ ] (SELECT - caâu hoûi con) ÔÛ ñaây : 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
- 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 ( 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 (* ) - ñeám soá baûn ghi coù giaù trò xaùc ñònh taïi coät ñöôïc cho bôûi , SUM ( ) - tính toång giaù trò caùc bieåu thöùc, MIN ( ) - tìm giaù trò nhoû nhaát, MAX ( ) - tìm giaù trò lôùn nhaát vaø AVG ( ) - 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 ( [, m [, n] ]) thöïc hieän vieäc ñoåi moät giaù trò cuûa bieåu thöùc soá 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) 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 [ ( , )] VALUES ( , , ); 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 ñöôïc gaùn cho , ñöôïc gaùn cho 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 [ ( , )] SELECT , , 141
- FROM [WHERE ] [GROUP BY ] [ORDER BY [ASC DESC], [ASC DESC], ] [HAVING ]; 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 , , FROM INTO TABLE [WHERE ] [GROUP BY ] [ORDER BY [ASC DESC], [ASC DESC], ] [HAVING ]; Ghi chuù: Trong Oracle, caâu leänh naøy laø CREATE TABLE coù cuù phaùp nhö sau: CREATE TABLE AS SELECT , , FROM INTO TABLE [WHERE ] [GROUP BY ] [ORDER BY [ASC DESC], [ASC DESC], ] [HAVING ]; 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 SET = , = , = [WHERE ]; Ngöõ nghóa: Giaù trò cuûa caùc field coù teân trong danh saùch , 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 , 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 SET = , = , = [WHERE ]; 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 SET Salary = Salary * 1.1 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 [WHERE ]; 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 ( ( ), ( ), ( ) ); 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 ] CHECK ( ) 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 . 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. 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 ] FOREIGN KEY ( ) REFERENCES ( ) Vaø ñònh nghóa cho moät coät khoùa ngoaïi cuûa baûng: [CONSTRAINT ] REFERENCES ( ) 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 : 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 ( ( ) [ CONSTRAINT clause 1], ( ) [ CONSTRAINT clause 2], ( ) [ 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 ] NULL NOT NULL UNIQUE [ ( , ) ] PRIMARY KEY( , ) ] FOREIGN KEY ( , ) ]] REFERENCES ( , ) CHECK ( ) 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 ADD ( [ ]) [ meänh ñeà ENABLE DISABLE ]; ÔÛ ñaây: :: = [ ( ) ] 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 MODIFY ( ( ) [ 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 DROP [ CONSTRAINT PRIMARY KEY UNIQUE ( , ) ][ 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 ENABLE UNIQUE PRIMARY KEY CONSTRAINT [ 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 DISABLE UNIQUE PRIMARY KEY CONSTRAINT [ 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 [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 | TO | ; 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 ; 162
- Ngöõ nghóa: Khaùc vôùi DELETE FROM ñöôï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 [ ( , , ) ] AS SELECT [AS ], [AS ], FROM [ ], [ ] [ WHERE ] [ GROUP BY , , ] 163
- [ HAVING ] [ ORDER BY [ ASCDESC ], [ ASC DESC ], [ WITH CHECK OPTION [CONSTRAINT ]] [ 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 ; 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 ON ( , , ) 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 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 IDENTIFIED BY ; 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 IDENTIFIED BY ; Baõi mieãn moät ngöôøi söû duïng quyeàn truy nhaäp CSDL bôûi leänh: DROP USER ; 6.6.8 Caáp quyeàn haïn heä thoáng treân CSDL: GRANT , , TO , , ; 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 [ ( , , ) ALL [ ( ) ] ON TO , , 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 , , ALL ON FROM , , 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