Professional Documents
Culture Documents
Hu, 2004
MC LC
MC LC........................................................................................................................2 LI NI U .................................................................................................................5 CHNG 1: TNG QUAN V SQL .............................................................................7
1.1 SQL l ngn ng c s d liu quan h ........................................................................... 7 1.2 Vai tr ca SQL ................................................................................................................ 8 1.3 Tng quan v c s d liu quan h ................................................................................. 9 1.3.1 M hnh d liu quan h ............................................................................................ 9 1.3.2 Bng (Table) .............................................................................................................. 9 1.3.3 Kho ca bng ......................................................................................................... 10 1.3.4 Mi quan h v kho ngoi...................................................................................... 11 1.4 S lc v SQL............................................................................................................... 12 1.4.1 Cu lnh SQL........................................................................................................... 12 1.4.2 Qui tc s dng tn trong SQL ............................................................................... 14 1.4.3 Kiu d liu ............................................................................................................. 14 1.4.4 Gi tr NULL ........................................................................................................... 16 1.5 Kt chng...................................................................................................................... 16
3.1 To bng d liu ............................................................................................................. 69 3.1.1 Rng buc CHECK.................................................................................................. 72 3.1.2 Rng buc PRIMARY KEY.................................................................................... 74 3.1.3 Rng buc UNIQUE................................................................................................ 76 3.1.4 Rng buc FOREIGN KEY..................................................................................... 76 3.2 Sa i nh ngha bng ................................................................................................. 79 3.3 Xo bng ......................................................................................................................... 81 3.4 Khung nhn ..................................................................................................................... 82 3.4.1 To khung nhn ........................................................................................................ 84 3.4.2 Cp nht, b sung v xo d liu thng qua khung nhn......................................... 86 3.4.3 Sa i khung nhn .................................................................................................. 89 3.4.4 Xo khung nhn........................................................................................................ 90 Bi tp chng 3 ............................................................................................................. 90
PH LC.....................................................................................................................138
A. C s d liu mu s dng trong gio trnh .................................................................. 138 B. Mt s hm thng s dng .......................................................................................... 141 B.1 Cc hm trn d liu kiu chui .............................................................................. 141 B.2 Cc hm trn d liu kiu ngy gi ......................................................................... 143 B.3 Hm chuyn i kiu ............................................................................................... 144
LI NI U
Ngn ng hi c cu trc (SQL), c tin thn l SEQUEL, l mt ngn ng c IBM pht trin v s dng trong h c s d liu th nghim c tn l System/R vo nm 1974, chnh thc c ANSI/ISO cng nhn l mt chun ngn ng s dng trong c s d liu quan h vo nm 1986. Cho n hin nay, SQL c s dng ph bin trong cc h qun tr c s d liu thng mi v c vai tr quan trng trong nhng h thng ny. c s ng vin ca cc ng nghip trong Khoa Cng ngh Thng tin (Trng i hc Khoa hc - i hc Hu), chng ti mnh dn vit v gii thiu Gio trnh SQL n bn c. Trong gio trnh ny, chng ti khng c tham vng cp n mi kha cnh ca SQL m ch mong mun rng y s l ti liu tham kho tng i y v cc cu lnh thng c s dng trong SQL. Gio trnh c chia thnh su chng vi ni dung nh sau: Chng 1 gii thiu tng quan v SQL v mt s khi c bn lin quan n c s d liu quan h. Chng 2 c dnh bn lun n cc cu lnh thao tc d liu bao gm SELECT, INSERT, UPDATE v DELETE, trong tp trung nhiu vo cu lnh SELECT. Chng 3 trnh by mt s cu lnh c bn c s dng trong nh ngha cc i tng c s d liu. Mt s vn lin quan n bo mt d liu trong SQL c cp n trong chng 4. Ni dung ca chng 5 lin quan n vic s dng th tc lu tr, hm v trigger trong c s d liu. Trong chng cui cng, chng 6, chng ti gii thiu n bn c mt s vn lin quan n x l giao tc trong SQL Ngoi su chng trn, phn ph lc cui gio trnh cp n c s d liu mu c s dng trong hu ht cc v d v mt s hm thng c s dng trong h qun tr SQL Server 2000 bn c tin trong vic tra cu. So vi chun SQL do ANSI/ISO xut, bn thn cc h qun tr c s d liu quan h thng mi li c th c mt s thay i no ; iu ny i khi dn n s khc bit, mc d khng ng k, gia SQL chun v SQL c s dng trong cc h qun tr c s d liu c th. Trong gio trnh ny, chng ti chn h qun tr c s d
5
liu SQL Server 2000 ca hng Microsoft s dng cho cc v d minh ho cng nh li gii ca cc bi tp. Chng ti hi vng rng gio trnh ny s thc s c ch i vi bn c. Chng ti rt mong nhn c s c v v nhng kin ng gp thng thn ca cc bn. Cui cng, xin gi li cm n n cc thy c, ng nghip v cc bn sinh vin ng vin v gip chng ti hon thnh gio trnh ny. Hu, 2003 Trn Nguyn Phong
m bo ton vn d liu: SQL nh ngha cc rng buc ton vn trong c s d liu nh m bo tnh hp l v chnh xc ca d liu trc cc thao tc cp nht cng nh cc li ca h thng. Nh vy, c th ni rng SQL l mt ngn ng hon thin c s dng trong cc h thng c s d liu v l mt thnh phn khng th thiu trong cc h qun tr c s d liu. Mc d SQL khng phi l mt ngn ng lp trnh nh C, C++, Java,... song cc cu lnh m SQL cung cp c th c nhng vo trong cc ngn ng lp trnh nhm xy dng cc ng dng tng tc vi c s d liu. Khc vi cc ngn ng lp trnh quen thuc nh C, C++, Java,... SQL l ngn ng c tnh khai bo. Vi SQL, ngi dng ch cn m t cc yu cu cn phi thc hin trn c s d liu m khng cn phi ch ra cch thc thc hin cc yu cu nh th no. Chnh v vy, SQL l ngn ng d tip cn v d s dng.
SQL l ngn ng s dng cho cc cng giao tip c s d liu: Trong mt h thng mng my tnh vi nhiu h qun tr c s d liu khc nhau, SQL thng c s dng nh l mt chun ngn ng giao tip gia cc h qun tr c s d liu.
mt dng trong bng biu din cho mt thc th (trong hnh 1.1, mi mt dng trong bng SINHVIEN tng ng vi mt sinh vin); v mi mt ct biu din cho mt tnh cht ca thc th (chng hn ct NGAYSINH trong bng SINHVIEN biu din cho ngy sinh ca cc sinh vin c lu tr trong bng). Nh vy, lin quan n mi mt bng bao gm cc yu t sau: Tn ca bng: c s dng xc nh duy nht mi bng trong c s d liu. Cu trc ca bng: Tp cc ct trong bng. Mi mt ct trong bng c xc nh bi mt tn ct v phi c mt kiu d liu no (chng hn ct NGAYSINH trong bng SINHVIEN hnh 1.1 c kiu l DATETIME). Kiu d liu ca mi ct qui nh gi tr d liu c th c chp nhn trn ct . D liu ca bng: Tp cc dng (bn ghi) hin c trong bng.
Mt bng c th c nhiu tp cc ct khc nhau c tnh cht ca kho (tc l gi tr ca n xc nh duy nht mt dng d liu trong bng). Trong trng hp ny, kho c chn cho bng c gi l kho chnh (primary key) v nhng kho cn li c gi l kho ph hay l kho d tuyn (candidate key/unique key).
10
Bng LOP Hnh 1.3: Mi quan h gia hai bng LOP v KHOA trong c s d liu
Mi quan h gia cc bng trong mt c s d liu th hin ng mi quan h gia cc thc th trong th gii thc. Trong hnh 1.3, mi quan h gia hai bng LOP v KHOA khng cho php mt lp no tn ti m li thuc vo mt khoa khng c tht. Khi nim kho ngoi (Foreign Key) trong c s d liu quan h c s dng biu din mi quan h gia cc bng d liu. Mt hay mt tp cc ct trong mt bng m gi tr ca n c xc nh t kha chnh ca mt bng khc c gi l kho ngoi. Trong hnh 1.3, ct MAKHOA ca bng LOP c gi l kho ngoi ca bng ny, kho ngoi ny tham chiu n kho chnh ca bng KHOA l ct MAKHOA.
11
1.4 S lc v SQL
1.4.1 Cu lnh SQL
SQL chun bao gm khong 40 cu lnh. Bng 1.1 lit k danh sch cc cu lnh thng c s dng nht trong s cc cu lnh ca SQL. Trong cc h qun tr c s d liu khc nhau, mc d cc cu lnh u c cng dng v cng mc ch s dng song mi mt h qun tr c s d liu c th c mt s thay i no . iu ny i khi dn n c php chi tit ca cc cu lnh c th s khc nhau trong cc h qun tr c c s d liu khc nhau. Cu lnh Thao tc d liu SELECT INSERT UPDATE DELETE TRUNCATE nh ngha d liu CREATE TABLE DROP TABLE ALTER TABLE CREATE VIEW ALTER VIEW DROP VIEW CREATE INDEX DROP INDEX CREATE SCHEMA DROP SCHEMA CREATE PROCEDURE ALTER PROCEDURE DROP PROCEDURE To bng Xoa bng Sa i bng To khung nhn Sa i khung nhn Xo khung nhn To ch mc Xo ch mc To lc c s d liu Xo lc c s d liu To th tc lu tr Sa i th tc l tr Xo th tc lu tr
12
Chc nng
Truy xut d liu B sung d liu Cp nht d liu Xo d liu Xo ton b d liu trong bng
CREATE FUNCTION ALTER FUNCTION DROP FUNCTION CREATE TRIGGER ALTER TRIGGER DROP TRIGGER iu khin truy cp GRANT REVOKE Qun l giao tc COMMIT ROLLBACK SAVE TRANSACTION Lp trnh DECLARE OPEN FETCH CLOSE EXECUTE
U thc (kt thc thnh cng) giao tc Quay lui giao tc nh du mt im trong giao tc
Khai bo bin hoc nh ngha con tr M mt con tr truy xut kt qu truy vn c mt dng trong kt qu truy vn (s dng con tr) ng mt con tr Thc thi mt cu lnh SQL Bng 1.1: Mt s cu lnh thng dng trong SQL
Cc cu lnh ca SQL u c bt u bi cc t lnh, l mt t kho cho bit chc nng ca cu lnh (chng hn SELECT, DELETE, COMMIT). Sau t lnh l cc mnh ca cu lnh. Mi mt mnh trong cu lnh cng c bt u bi mt t kho (chng hn FROM, WHERE,...). V d 1.1: Cu lnh:
SELECT masv,hodem,ten FROM sinhvien WHERE malop=C24102
13
dng truy xut d liu trong bng SINHVIEN c bt u bi t lnh SELECT, trong cu lnh bao gm hai mnh : mnh FROM ch nh tn ca bng cn truy xut d liu v mnh WHERE ch nh iu kin truy vn d liu.
Mt s i tng c s d liu khc (nh khung nhn, th tc, hm), vic s dng tn cng tng t nh i vi bng. Ta c th s dng tn ct mt cch bnh thng trong cc cu lnh SQL bng cch ch cn ch nh tn ca ct trong bng. Tuy nhin, nu trong cu lnh c lin quan n hai ct tr ln c cng tn trong cc bng khc nhau th bt buc phi ch nh thm tn bng trc tn ct; tn bng v tn ct c phn cch nhau bi du chm. V d: V d di y minh ho cho ta thy vic s dng tn bng v tn ct trong cu lnh SQL
SELECT masv,hodem,ten,sinhvien.malop,tenlop FROM dbo.sinhvien,dbo.lop WHERE sinhvien.malop = lop.malop
14
NCHAR (n) VARCHAR (n) NVARCHAR (n) INTEGER INT TINYTINT SMALLINT BIGINT NUMERIC (p,s) DECIMAL (p,s) FLOAT REAL MONEY BIT DATETIME SMALLDATETIME TIMESTAMP BINARY VARBINARY IMAGE TEXT NTEXT
Kiu chui vi di c nh h tr UNICODE Kiu chui vi di chnh xc Kiu chui vi di chnh xc h tr UNICODE S nguyn c gi tr t -231 n 231 - 1 Nh kiu Integer S nguyn c gi tr t 0 n 255. S nguyn c gi tr t -215 n 215 1 S nguyn c gi tr t -263 n 263-1 Kiu s vi chnh xc c nh. Tng t kiu Numeric S thc c gi tr t -1.79E+308 n 1.79E+308 S thc c gi tr t -3.40E + 38 n 3.40E + 38 Kiu tin t Kiu bit (c gi tr 0 hoc 1) Kiu ngy gi (chnh xc n phn trm ca giy) Kiu ngy gi (chnh xc n pht)
D liu nh phn vi di c nh (ti a 8000 bytes) D liu nh phn vi di chnh xc (ti a 8000 bytes) D liu nh phn vi di chnh xc (ti a 2,147,483,647 bytes) D liu kiu chui vi di ln (ti a 2,147,483,647 k t) D liu kiu chui vi di ln v h tr UNICODE (ti a 1,073,741,823 k t) Bng 1.2: Mt s kiu d liu thng dng trong SQL
V d 1.2: Cu lnh di y nh ngha bng vi kiu d liu c qui nh cho cc ct trong bng
CREATE TABLE NHANVIEN 15
( MANV HOTEN GIOITINH NGAYSINH NOISINH HSLUONG MADV ) NVARCHAR(10) NOT NULL, NVARCHAR(30) NOT NULL, BIT, SMALLDATETIME, NCHAR(50), DECIMAL(4,2), INT
1.4.4 Gi tr NULL
Mt c s d liu l s phn nh ca mt h thng trong th gii thc, do cc gi tr d liu tn ti trong c s d liu c th khng xc nh c. Mt gi tr khng xc nh c xut hin trong c s d liu c th do mt s nguyn nhn sau: Gi tr c tn ti nhng khng bit. Khng xc nh c gi tr c tn ti hay khng. Ti mt thi im no gi tr cha c nhng ri c th s c. Gi tr b li do tnh ton (trn s, chia cho khng,...) Nhng gi tr khng xc nh c biu din trong c s d liu quan h bi cc gi tr NULL. y l gi tr c bit v khng nn nhm ln vi chui rng (i vi d liu kiu chui) hay gi tr khng (i vi gi tr kiu s). Gi tr NULL ng mt vai tr quan trng trong cc c s d liu v hu ht cc h qun tr c s d liu quan h hin nay u h tr vic s dng gi tr ny.
1.5 Kt chng
Nh vy, SQL (vit tt ca Structured Query Language) l h thng ngn ng c s dng cho cc h qun tr c s d liu quan h. Thng qua SQL c th thc hin c cc thao tc trn c s d liu nh nh ngha d liu, thao tc d liu, iu khin truy cp, qun l ton vn d liu... SQL l mt thnh phn quan trng v khng th thiu trong h qun tr c s d liu quan h. SQL ra i nhm s dng cho cc c s d liu theo m hnh quan h. Trong mt c s d liu quan h, d liu c t chc v lu tr trong cc bng. Mi mt bng l mt tp hp bao gm cc dng v cc ct; mi mt dng l mt bn ghi v mi mt ct tng ng vi mt trng, tp cc tn ct cng vi kiu d liu v cc tnh cht khc to nn cu trc ca bng, tp cc dng trong bng chnh l d liu ca bng.
16
Cc bng trong mt c s d liu c mi quan h vi nhau. Cc mi quan h c biu din thng qua kho chnh v kho ngoi ca cc bng. Kho chnh ca bng l tp mt hoc nhiu ct c gi tr duy nht trong bng v do gi tr ca n xc nh duy nht mt dng d liu trong bng. Mt kho ngoi l mt tp mt hoc nhiu ct c gi tr c xc nh t kho chnh ca cc bng khc. _______________________________________
17
Chng 2
iu cn lu u tin i vi cu lnh ny l cc thnh phn trong cu lnh SELECT nu c s dng phi tun theo ng th t nh trong c php. Nu khng, cu lnh s c xem l khng hp l. Cu lnh SELECT c s dng tc ng ln cc bng d liu v kt qu ca cu lnh cng c hin th di dng bng, tc l mt tp hp cc dng v cc ct (ngoi tr trng hp s dng cu lnh SELECT vi mnh COMPUTE). V d 2.1: Kt qu ca cu lnh sau y cho bit m lp, tn lp v h o to ca cc lp hin c
SELECT malop,tenlop,hedaotao FROM lop
kt qu cu lnh nh sau:
19
Ta c th s dng cc b danh cho cc bng hay khung nhn trong cu lnh SELECT. B danh c gn trong mnh FROM bng cch ch nh b danh ngay sau tn bng. V d 2.3: cu lnh sau gn b danh l a cho bng khoa
SELECT * FROM khoa a
20
b. Tn ct trong danh sch chn Trong trng hp cn ch nh c th cc ct cn hin th trong kt qu truy vn, ta ch nh danh sch cc tn ct trong danh sch chn. Th t ca cc ct trong kt qu truy vn tun theo th t ca cc trng trong danh sch chn. V d 2.5: Cu lnh
SELECT malop,tenlop,namnhaphoc,khoa FROM lop
Lu : Nu truy vn c thc hin trn nhiu bng/khung nhn v trong cc bng/khung nhn c cc trng trng tn th tn ca nhng trng ny nu xut hin trong danh sch chn phi c vit di dng:
tn_bng.tn_trng
V d 2.6:
SELECT malop, tenlop, lop.makhoa, tenkhoa FROM lop, khoa WHERE lop.malop = khoa.makhoa
21
c. Thay i tiu cc ct Trong kt qu truy vn, tiu ca cc ct mc nh s l tn ca cc trng tng ng trong bng. Tuy nhin, cc tiu tr nn thn thin hn, ta c th i tn cc tiu ca cc ct. t tiu cho mt ct no , ta s dng cch vit:
tiu__ct = tn_trng
hoc hoc
V d 2.7: Cu lnh di y:
SELECT 'M lp'= malop,tenlop 'Tn lp',khoa AS 'Kho' FROM lop
d. S dng cu trc CASE trong danh sch chn Cu trc CASE c s dng trong danh sch chn nhm thay i kt qu ca truy vn tu thuc vo cc trng hp khc nhau. Cu trc ny c c php nh sau:
CASE biu_thc WHEN biu_thc_kim_tra THEN kt_qu [ ... ] [ELSE kt_qu_ca_else] END
hoc:
CASE WHEN iu_kin THEN kt_qu [ ... ] [ELSE kt_qu_ca_else] END
22
V d 2.8: hin th m, h tn v gii tnh (nam hoc n) ca cc sinh vin, ta s dng cu lnh
SELECT masv,hodem,ten, CASE gioitinh WHEN 1 THEN 'Nam' ELSE 'N' END AS gioitinh FROM sinhvien
hoc:
SELECT masv,hodem,ten, CASE WHEN gioitinh=1 THEN 'Nam' ELSE 'N' END AS gioitinh FROM sinhvien
e. Hng v biu thc trong danh sch chn Ngoi danh sch trng, trong danh sch chn ca cu lnh SELECT cn c th s dng cc biu thc. Mi mt biu thc trong danh sch chn tr thnh mt ct trong kt qu truy vn. V d 2.9: cu lnh di y cho bit tn v s tit ca cc mn hc
SELECT tenmonhoc,sodvht*15 AS sotiet FROM monhoc 23
Nu trong danh sch chn c s xut hin ca gi tr hng th gi tr ny s xut hin trong mt ct ca kt qu truy vn tt c cc dng V d 2.10: Cu lnh
SELECT tenmonhoc,'S tit: ',sodvht*15 AS sotiet FROM monhoc
cho kt qu nh sau:
f. Loi b cc dng d liu trng nhau trong kt qu truy vn Trong kt qu ca truy vn c th xut hin cc dng d liu trng nhau. loi b bt cc dng ny, ta ch nh thm t kha DISTINCT ngay sau t kho SELECT. V d 2.11: Hai cu lnh di y
SELECT khoa FROM lop
v:
SELECT DISTINCT khoa FROM lop
c kt qu ln lt nh sau:
24
g. Gii hn s lng dng trong kt qu truy vn Kt qu ca truy vn c hin th thng s l tt c cc dng d liu truy vn c. Trong trng hp cn hn ch s lng cc dng xut hin trong kt qu truy vn, ta ch nh thm mnh TOP ngay trc danh sch chn ca cu lnh SELECT. V d 2.12: Cu lnh di y hin th h tn v ngy sinh ca 5 sinh vin u tin trong danh sch
SELECT TOP 5 hodem,ten,ngaysinh FROM sinhvien
Ngoi cch ch nh c s lng dng cn hin th trong kt qu truy vn, ta c th ch nh s lng cc dng cn hin th theo t l phn trm bng cch s dng thm t kho PERCENT nh v d di y. V d 2.13: Cu lnh di y hin th h tn v ngy sinh ca 10% s lng sinh vin hin c trong bng SINHVIEN
SELECT TOP 10 PERCENT hodem,ten,ngaysinh FROM sinhvien
Kt qu ca cu lnh ny nh sau:
Trong mnh WHERE thng s dng: Cc ton t kt hp iu kin (AND, OR) Cc ton t so snh Kim tra gii hn ca d liu (BETWEEN/ NOT BETWEEN) Danh sch Kim tra khun dng d liu. Cc gi tr NULL a. Cc ton t so snh Ton t = > < >= <= <> !> !< V d 2.15: Cu lnh:
SELECT masv,hodem,ten,ngaysinh FROM sinhvien WHERE (ten='Anh') AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)
cho bit m, h tn v ngy sinh ca cc sinh vin c tn l Anh v c tui nh hn hoc bng 20.
26
b. Kim tra gii hn ca d liu kim tra xem gi tr d liu nm trong (ngoi) mt khong no , ta s dng ton t BETWEEN (NOT BETWEEN) nh sau: Cch s dng gi_tr BETWEEN a AND b gi_tr NOT BETWEEN a AND b ngha a gi_tr b (gi_tr < a) AND (gi_tr>b)
V d 2.16: Cu lnh di y cho bit h tn v tui ca cc sinh vin c tn l Bnh v c tui nm trong khong t 20 n 22
SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bnh' AND YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22
c. Danh sch (IN v NOT IN) T kho IN c s dng khi ta cn ch nh iu kin tm kim d liu cho cu lnh SELECT l mt danh sch cc gi tr. Sau IN (hoc NOT IN) c th l mt danh sch cc gi tr hoc l mt cu lnh SELECT khc. V d 2.17: bit danh sch cc mn hc c s n v hc trnh l 2, 4 hoc 5, thay v s dng cu lnh
SELECT * FROM monhoc WHERE sodvht=2 OR sodvht=4 OR sodvht=5
ta c th s dng cu lnh
SELECT * FROM monhoc WHERE sodvht IN (2,4,5)
d. Ton t LIKE v cc k t i din T kho LIKE (NOT LIKE) s dng trong cu lnh SELECT nhm m t khun dng ca d liu cn tm kim. Chng thng c kt hp vi cc k t i din sau y:
27
K t i din ngha % _ [] [^] Chui k t bt k gm khng hoc nhiu k t K t n bt k K t n bt k trong gii hn c ch nh (v d [a-f]) hay mt tp (v d [abcdef]) K t n bt k khng nm trong gii hn c ch nh ( v d [^a-f] hay mt tp (v d [^abcdef]).
V d 2.18: Cu lnh di y
SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'L%'
Cu lnh:
SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'L%' AND ten LIKE '[AB]%'
C kt qu l:
e. Gi tr NULL D liu trong mt ct cho php NULL s nhn gi tr NULL trong cc trng hp sau:
28
Nu khng c d liu c nhp cho ct v khng c mc nh cho ct hay kiu d liu trn ct . Ngi s dng trc tip a gi tr NULL vo cho ct . Mt ct c kiu d liu l kiu s s cha gi tr NULL nu gi tr c ch nh gy trn s. Trong mnh WHERE, kim tra gi tr ca mt ct c gi tr NULL hay khng, ta s dng cch vit:
WHERE tn_ct IS NULL
hoc:
WHERE tn_ct IS NOT NULL
Lu : Nu trong danh sch chn c cc biu thc th nhng biu thc ny phi c t tiu .
2.1.5 Sp xp kt qu truy vn
Mc nh, cc dng d liu trong kt qu ca cu truy vn tun theo th t ca chng trong bng d liu hoc c sp xp theo ch mc (nu trn bng c ch mc). Trong trng hp mun d liu c sp xp theo chiu tng hoc gim ca gi tr ca mt hoc nhiu trng, ta s dng thm mnh ORDER BY trong cu lnh SELECT; Sau ORDER BY l danh sch cc ct cn sp xp (ti a l 16 ct). D liu c sp xp c th theo chiu tng (ASC) hoc gim (DESC), mc nh l sp xp theo chiu tng. V d 2.20: Cu lnh di y hin th danh sch cc mn hc v sp xp theo chiu gim dn ca s n v hc trnh
SELECT * FROM monhoc ORDER BY sodvht DESC
29
Nu sau ORDER BY c nhiu ct th vic sp xp d liu s c u tin theo th t t tri qua phi. V d 2.21: Cu lnh
SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bnh' ORDER BY gioitinh,tuoi
c kt qu l:
30
2.1.6 Php hp
Php hp c s dng trong trng hp ta cn gp kt qu ca hai hay nhiu truy vn thnh mt tp kt qu duy nht. SQL cung cp ton t UNION thc hin php hp. C php nh sau
Cu_lnh_1 UNION [ALL] Cu_lnh_2 [UNION [ALL] Cu_lnh_3] ... [UNION [ALL] Cu_lnh_n] [ORDER BY ct_sp_xp] [COMPUTE danh_sch_hm_gp [BY danh_sch_ct]]
cu lnh
SELECT A,B FROM Table1 UNION SELECT D,E FROM table2
Cho kt qu nh sau:
31
Mc nh, nu trong cc truy vn thnh phn ca php hp xut hin nhng dng d liu ging nhau th trong kt qu truy vn ch gi li mt dng. Nu mun gi li cc dng ny, ta phi s dng thm t kho ALL trong truy vn thnh phn. V d 2.23: Cu lnh
SELECT A,B FROM Table1 UNION ALL SELECT D,E FROM table2
Cho kt qu nh sau
Khi s dng ton t UNION thc hin php hp, ta cn ch cc nguyn tc sau: Danh sch ct trong cc truy vn thnh phn phi c cng s lng. Cc ct tng ng trong tt c cc bng, hoc tp con bt k cc ct c s dng trong bn thn mi truy vn thnh phn phi cng kiu d liu. Cc ct tng ng trong bn thn tng truy vn thnh phn ca mt cu lnh UNION phi xut hin theo th t nh nhau. Nguyn nhn l do php hp so snh cc ct tng ct mt theo th t c cho trong mi truy vn. Khi cc kiu d liu khc nhau c kt hp vi nhau trong cu lnh UNION, chng s c chuyn sang kiu d liu cao hn (nu c th c). Tiu ct trong kt qu ca php hp s l tiu ct c ch nh trong truy vn u tin.
32
Truy vn thnh phn u tin c th c INTO to mi mt bng t kt qu ca chnh php hp. Mnh ORDER BY v COMPUTE dng sp xp kt qu truy vn hoc tnh ton cc gi tr thng k ch c s dng cui cu lnh UNION. Chng khng c s dng trong bt k truy vn thnh phn no. Mnh GROUP BY v HAVING ch c th c s dng trong bn thn tng truy vn thnh phn. Chng khng c php s dng tc ng ln kt qu chung ca php hp. Php ton UNION c th c s dng bn trong cu lnh INSERT. Php ton UNION khng c s dng trong cu lnh CREATE VIEW.
2.1.7 Php ni
Khi cn thc hin mt yu cu truy vn d liu t hai hay nhiu bng, ta phi s dng n php ni. Mt cu lnh ni kt hp cc dng d liu trong cc bng khc nhau li theo mt hoc nhiu iu kin no v hin th chng trong kt qu truy vn. Xt hai bng sau y: Bng KHOA
Bng LOP
33
Chn ra dng trong bng KHOA c tn khoa l Khoa Cng ngh Thng tin, t xc nh c m khoa (MAKHOA) l DHT02. Tm kim trong bng LOP nhng dng c gi tr trng MAKHOA l DHT02 (tc l bng MAKHOA tng ng trong bng KHOA) v a nhng dng ny vo kt qu truy vn
Nh vy, thc hin c yu cu truy vn d liu trn, ta phi thc hin php ni gia hai bng KHOA v LOP vi iu kin ni l MAKHOA ca KHOA bng vi MAKHOA ca LOP. Cu lnh s c vit nh sau:
SELECT malop,tenlop FROM khoa,lop WHERE khoa.makhoa = lop.makhoa AND tenkhoa='Khoa Cng ngh Thng tin'
2.1.7.1 S dng php ni Php ni l c s thc hin cc yu cu truy vn d liu lin quan n nhiu bng. Mt cu lnh ni thc hin ly cc dng d liu trong cc bng tham gia truy vn, so snh gi tr ca cc dng ny trn mt hoc nhiu ct c ch nh trong iu kin ni v kt hp cc dng tho mn iu kin thnh nhng dng trong kt qu truy vn. thc hin c mt php ni, cn phi xc nh c nhng yu t sau: Nhng ct no cn hin th trong kt qu truy vn Nhng bng no c tham gia vo truy vn. iu kin thc hin php ni gia cc bng d liu l g
34
Trong cc yu t k trn, vic xc nh chnh xc iu kin thc hin php ni gia cc bng ng vai tr quan trng nht. Trong a s cc trng hp, iu kin ca php ni c xc nh nh vo mi quan h gia cc bng cn phi truy xut d liu. Thng thng, l iu kin bng nhau gia kho chnh v kho ngoi ca hai bng c mi quan h vi nhau. Nh vy, c th a ra mt cu lnh ni thc hin chnh xc yu cu truy vn d liu i hi phi hiu c mi quan h cng nh ngha ca chng gia cc bng d liu. Danh sch chn trong php ni Mt cu lnh ni cng c bt u vi t kha SELECT. Cc ct c ch nh tn sau t kho SELECT l cc ct c hin th trong kt qu truy vn. Vic s dng tn cc ct trong danh sch chn c th l: Tn ca mt s ct no trong cc bng c tham gia vo truy vn. Nu tn ct trong cc bng trng tn nhau th tn ct phi c vit di dng
tn_bng.tn_ct
Du sao (*) c s dng trong danh sch chn khi cn hin th tt c cc ct ca cc bng tham gia truy vn. Trong trng hp cn hin th tt c cc ct ca mt bng no , ta s dng cch vit:
tn_bng.*
Mnh FROM trong php ni Sau mnh FROM ca cu lnh ni l danh sch tn cc bng (hay khung nhn) tham gia vo truy vn. Nu ta s dng du * trong danh sch chn th th t ca cc bng lit k sau FROM s nh hng n th t cc ct c hin th trong kt qu truy vn. Mnh WHERE trong php ni Khi hai hay nhiu bng c ni vi nhau, ta phi ch nh iu kin thc hin php ni ngay sau mnh WHERE. iu kin ni c biu din di dng biu thc logic so snh gi tr d liu gia cc ct ca cc bng tham gia truy vn. Cc ton t so snh di y c s dng xc nh iu kin ni Php ton = > >= < ngha Bng Ln hn Ln hn hoc bng Nh hn
35
V d 2.24: Cu lnh di y hin th danh sch cc sinh vin vi cc thng tin: m sinh vin, h v tn, m lp, tn lp v tn khoa
SELECT masv,hodem,ten,sinhvien.malop,tenlop,tenkhoa FROM sinhvien,lop,khoa WHERE sinhvien.malop = lop.malop AND lop.makhoa=khoa.makhoa
Trong cu lnh trn, cc bng tham gia vo truy vn bao gm SINHVIEN, LOP v KHOA. iu kin thc hin php ni gia cc bng bao gm hai iu kin:
sinhvien.malop = lop.malop
lop.malop = khoa.malop
iu kin ni gia cc bng trong cu lnh trn l iu kin bng gia kho ngoi v kho chnh ca cc bng c mi quan h vi nhau. Hay ni cch khc, iu kin ca php ni c xc nh da vo mi quan h gia cc bng trong c s d liu. 2.1.7.2 Cc loi php ni Php ni bng v php ni t nhin Mt php ni bng (equi-join) l mt php ni trong gi tr ca cc ct c s dng ni c so snh vi nhau da trn tiu chun bng v tt c cc ct trong cc bng tham gia ni u c a ra trong kt qu. V d 2.25: Cu lnh di y thc hin php ni bng gia hai bng LOP v KHOA
SELECT * FROM lop,khoa WHERE lop.makhoa=khoa.makhoa
Trong kt qu ca cu lnh trn, ct makhoa (m khoa) xut hin hai ln trong kt qu php ni (ct makhoa ca bng khoa v ct makhoa ca bng lop) v nh vy l khng cn thit. Ta c th loi b bt i nhng ct trng tn trong kt qu truy vn bng cch ch nh danh sch ct cn c hin th trong danh sch chn ca cu lnh. Mt dng c bit ca php ni bng c s dng nhiu l php ni t nhin (natural-join). Trong php ni t nhin, iu kin ni gia hai bng chnh l iu kin bng gia kho ngoi v kho chnh ca hai bng; V trong danh sch chn ca cu lnh ch gi li mt ct trong hai ct tham gia vo iu kin ca php ni
36
V d 2.26: thc hin php ni t nhin, cu lnh trong v d 2.25 c vit li nh sau
SELECT malop,tenlop,khoa,hedaotao,namnhaphoc, siso,lop.makhoa,tenkhoa,dienthoai FROM lop,khoa WHERE lop.makhoa=khoa.makhoa
Php ni vi cc iu kin b sung Trong cc cu lnh ni, ngoi iu kin ca php ni c ch nh trong mnh WHERE cn c th ch nh cc iu kin tm kim d liu khc (iu kin chn). Thng thng, cc iu kin ny c kt hp vi iu kin ni thng qua ton t AND. V d 2.27: Cu lnh di y hin th h tn v ngy sinh ca cc sinh vin Khoa Cng ngh Thng tin
SELECT hodem,ten,ngaysinh FROM sinhvien,lop,khoa WHERE tenkhoa='Khoa Cng ngh Thng tin' AND sinhvien.malop = lop.malop AND lop.makhoa = khoa.makhoa
Php t ni v cc b danh Php t ni l php ni m trong iu kin ni c ch nh lin quan n cc ct ca cng mt bng. Trong trng hp ny, s c s xut hin tn ca cng mt bng nhiu ln trong mnh FROM v do cc bng cn phi c t b danh. V d 2.28: bit c h tn v ngy sinh ca cc sinh vin c cng ngy sinh vi sinh vin Trn Th Kim Anh, ta phi thc hin php t ni ngay trn chnh bng sinhvien. Trong cu lnh ni, bng sinhvien xut hin trong mnh FROM vi b danh l a v b. Bng sinhvien vi b danh l a s dng chn ra sinh vin c h tn l Trn Th Kim Anh v bng sinhvien vi b danh l b s dng xc nh cc sinh vin trng ngy sinh vi sinh vin Trn Th Kim Anh. Cu lnh c vit nh sau:
SELECT b.hodem,b.ten,b.ngaysinh FROM sinhvien a, sinhvien b WHERE a.hodem='Trn Th Kim' AND a.ten='Anh' AND a.ngaysinh=b.ngaysinh AND a.masv<>b.masv 37
Php ni khng da trn tiu chun bng Trong php ni ny, iu kin thc hin php ni gia cc bng d liu khng phi l iu kin so snh bng gia cc ct. Loi php ni ny trong thc t thng t c s dng. Php ni ngoi (outer-join) Trong cc php ni cp trn, ch nhng dng c gi tr trong cc ct c ch nh tho mn iu kin kt ni mi c hin th trong kt qu truy vn, v c gi l php ni trong (inner join) Theo mt ngha no , nhng php ni ny loi b thng tin cha trong nhng dng khng tho mn iu kin ni. Tuy nhin, i khi ta cng cn gi li nhng thng tin ny bng cch cho php nhng dng khng tho mn iu kin ni c mt trong kt qu ca php ni. lm iu ny, ta c th s dng php ni ngoi. SQL cung cp cc loi php ni ngoi sau y: Php ni ngoi tri (k hiu: *=): Php ni ny hin th trong kt qu truy vn tt c cc dng d liu ca bng nm bn tri trong iu kin ni cho d nhng dng ny khng tho mn iu kin ca php ni Php ni ngoi phi (k hiu: =*): Php ni ny hin th trong kt qu truy vn tt c cc dng d liu ca bng nm bn phi trong iu kin ni cho d nhng dng ny khng tho iu kin ca php ni. V d 2.29: Gi s ta c hai bng DONVI v NHANVIEN nh sau: Bng DONVI Bng NHANVIEN
Cu lnh:
SELECT * FROM nhanvien,donvi WHERE nhanvien.madv=donvi.madv
c kt qu l:
38
Nu thc hin php ni ngoi tri gia bng NHANVIEN v bng DONVI:
SELECT * FROM nhanvien,donvi WHERE nhanvien.madv*=donvi.madv
kt qu ca cu lnh s l:
nh sau:
Php ni v cc gi tr NULL Nu trong cc ct ca cc bng tham gia vo iu kin ca php ni c cc gi tr NULL th cc gi tr NULL c xem nh l khng bng nhau. V d 2.30: Gi s ta c hai bng TABLE1 v TABLE2 nh sau:
A 1 NULL 4 TABLE1 B b1 b2 b3 C NULL 4 TABLE2 D d1 d2
39
Cu lnh:
SELECT * FROM table1, table2 WHERE A *= C
C kt qu l:
A 1 NULL 4 B b1 b2 b3 C NULL NULL 4 D NULL NULL d2
2.1.7.4 S dng php ni trong SQL2 phn trc cp n phng php s dng php ni trong v php ni ngoi trong truy vn SQL. Nh trnh by, iu kin ca php ni trong cu lnh c ch nh trong mnh WHERE thng qua cc biu thc so snh gia cc bng tham gia truy vn. Chun SQL2 (SQL-92) a ra mt cch khc biu din cho php ni, trong cch biu din ny, iu kin ca php ni khng c ch nh trong mnh WHERE m c ch nh ngay trong mnh FROM ca cu lnh. Cch s dng php ni ny cho php ta biu din php ni cng nh iu kin ni c r rng, c bit l trong trng hp php ni c thc hin trn ba bng tr ln. Php ni trong iu kin thc hin php ni trong c ch nh trong mnh FROM theo c php nh sau:
tn_bng_1 [INNER] JOIN tn_bng_2 ON iu_kin_ni
V d 2.31: hin th h tn v ngy sinh ca cc sinh vin lp Tin K24, thay v s dng cu lnh:
SELECT hodem,ten,ngaysinh FROM sinhvien,lop WHERE tenlop='Tin K24' AND sinhvien.malop=lop.malop
Php ni ngoi SQL2 cung cp cc php ni ngoi sau y: Php ni ngoi tri (LEFT OUTER JOIN) Php ni ngoi phi (RIGHT OUTER JOIN) Php ni ngoi y (FULL OUTER JOIN) Cng tng t nh php ni trong, iu kin ca php ni ngoi cng c ch nh ngay trong mnh FROM theo c php:
tn_bng_1 LEFT|RIGHT|FULL [OUTER] JOIN tn_bng_2 ON iu_kin_ni
Php ni ngoi tri gia hai bng NHANVIEN v DONVI c biu din bi cu lnh:
SELECT * FROM nhanvien LEFT OUTER JOIN donvi ON nhanvien.madv=donvi.madv
c kt qu l:
Cu lnh:
SELECT * FROM nhanvien RIGHT OUTER JOIN donvi ON nhanvien.madv=donvi.madv
41
thc hin php ni ngoi phi gia hai bng NHANVIEN v DONVI, v c kt qu l:
Nu php ni ngoi tri (tng ng phi) hin th trong kt qu truy vn c nhng dng d liu khng tho iu kin ni ca bng bn tri (tng ng phi) trong php ni th php ni ngoi y hin th trong kt qu truy vn c nhng dng d liu khng tho iu kin ni ca c hai bng tham gia vo php ni. V d 2.33: Vi hai bng NHANVIEN v DONVI nh trn, cu lnh
SELECT * FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv
cho kt qu l:
Thc hin php ni trn nhiu bng Mt c im ni bt ca SQL2 l cho php biu din php ni trn nhiu bng d liu mt cch r rng. Th t thc hin php ni gia cc bng c xc nh theo ngha kt qu ca php ni ny c s dng trong mt php ni khc. V d 2.34: Cu lnh di y hin th h tn v ngy sinh ca cc sinh vin thuc Khoa Cng ngh Thng tin
SELECT hodem,ten,ngaysinh FROM (sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop) INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa=N'Khoa cng ngh thng tin'
42
Trong cu lnh trn, th t thc hin php ni gia cc bng c ch nh r rng: php ni gia hai bng sinhvien v lop c thc hin trc v kt qu ca php ni ny li tip tc c ni vi bng khoa.
43
Thng k trn ton b d liu Khi cn tnh ton gi tr thng k trn ton b d liu, ta s dng cc hm gp trong danh sch chn ca cu lnh SELECT. Trong trng hp ny, trong danh sch chn khng c s dng bt k mt tn ct hay biu thc no ngoi cc hm gp. V d 2.35: thng k trung bnh im ln 1 ca tt c cc mn hc, ta s dng cu lnh nh sau:
SELECT AVG(diemlan1) FROM diemthi
cn cu lnh di y cho bit tui ln nht, tui nh nht v tui trung bnh ca tt c cc sinh vin sinh ti Hu:
SELECT MAX(YEAR(GETDATE())-YEAR(ngaysinh)), MIN(YEAR(GETDATE())-YEAR(ngaysinh)), AVG(YEAR(GETDATE())-YEAR(ngaysinh)) FROM sinhvien WHERE noisinh=Hu
Thng k d liu trn cc nhm Trong trng hp cn thc hin tnh ton cc gi tr thng k trn cc nhm d liu, ta s dng mnh GROUP BY phn hoch d liu vo trong cc nhm. Cc hm gp c s dng s thc hin thao tc tnh ton trn mi nhm v cho bit gi tr thng k theo cc nhm d liu. V d 2.36: Cu lnh di y cho bit s s (s lng sinh vin) ca mi lp
SELECT lop.malop,tenlop,COUNT(masv) AS siso FROM lop,sinhvien WHERE lop.malop=sinhvien.malop GROUP BY lop.malop,tenlop
v c kt qu l
cn cu lnh:
44
SELECT sinhvien.masv,hodem,ten, sum(diemlan1*sodvht)/sum(sodvht) FROM sinhvien,diemthi,monhoc WHERE sinhvien.masv=diemthi.masv AND diemthi.mamonhoc=monhoc.mamonhoc GROUP BY sinhvien.masv,hodem,ten
cho bit trung bnh im thi ln 1 cc mn hc ca cc sinh vin Lu : Trong trng hp danh sch chn ca cu lnh SELECT c c cc hm gp v nhng biu thc khng phi l hm gp th nhng biu thc ny phi c mt y trong mnh GROUP BY, nu khng cu lnh s khng hp l. V d 2.37: Di y l mt cu lnh sai
SELECT lop.malop,tenlop,COUNT(masv) FROM lop,sinhvien WHERE lop.malop=sinhvien.malop GROUP BY lop.malop
do thiu trng TENLOP sau mnh GROUP BY. Ch nh iu kin i vi hm gp Mnh HAVING c s dng nhm ch nh iu kin i vi cc gi tr thng k c sn sinh t cc hm gp tng t nh cch thc mnh WHERE thit lp cc iu kin cho cu lnh SELECT. Mnh HAVING thng khng thc s c ngha nu nh khng s dng kt hp vi mnh GROUP BY. Mt im khc bit gia HAVING v WHERE l trong iu kin ca WHERE khng c c cc hm gp trong khi HAVING li cho php s dng cc hm gp trong iu kin ca mnh. V d 2.38: bit trung bnh im thi ln 1 ca cc sinh vin c im trung bnh ln hn hoc bng 5, ta s dng cu lnh nh sau:
SELECT sinhvien.masv,hodem,ten, SUM(diemlan1*sodvht)/sum(sodvht) FROM sinhvien,diemthi,monhoc WHERE sinhvien.masv=diemthi.masv AND diemthi.mamonhoc=monhoc.mamonhoc GROUP BY sinhvien.masv,hodem,ten HAVING sum(diemlan1*sodvht)/sum(sodvht)>=5
45
nhng c th mi khoa bao gm nhng lp no th chng ta khng th bit c trong kt qu truy vn trn. Mnh COMPUTE s dng kt hp vi cc hm gp (dng) v ORDER BY trong cu lnh SELECT cng cho chng ta cc kt qu thng k (ca hm gp) trn cc nhm d liu. im khc bit gia COMPUTE v GROUP BY l kt qu thng k xut hin di dng mt dng trong kt qu truy vn v cn cho chng ta c chi tit v d liu trong mi nhm. Nh vy, cu lnh SELECT vi COMPUTE cho chng ta c chi tit d liu v gi tr thng k trn mi nhm. Mnh COMPUTE BY c c php nh sau:
COMPUTE hm_gp(tn_ct) [,, hm_gp (tn_ct)] BY danh_sch_ct
Trong : Cc hm gp c th s dng bao gm SUM, AVG, MIN, MAX v COUNT. danh_sch_ct: l danh sch ct s dng phn nhm d liu V d 2.40: Cu lnh di y cho bit danh sch cc lp ca mi khoa v tng s cc lp ca mi khoa:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa ORDER BY khoa.makhoa COMPUTE COUNT(malop) BY khoa.makhoa 46
kt qu ca cu lnh nh sau:
MAKHOA DHT01 DHT01 DHT01 TENKHOA Khoa Ton c - Tin hc Khoa Ton c - Tin hc Khoa Ton c - Tin hc MALOP C24101 C25101 C26101 CNT 3 MALOP C26102 C25102 C24102 CNT 3 MALOP C24103 C25103 CNT 2 MALOP C25301 C24301 CNT 2 TENLOP Ton K24 Ton K25 Ton K26
TENKHOA Khoa Cng ngh thng tin Khoa Cng ngh thng tin Khoa Cng ngh thng tin
Khi s dng mnh COMPUTE ... BY cn tun theo cc qui tc di y: T kha DISTINCT khng cho php s dng vi cc hm gp dng Hm COUNT(*) khng c s dng trong COMPUTE. Sau COMPUTE c th s dng nhiu hm gp, khi cc hm phi phn cch nhau bi du phy. Cc ct s dng trong cc hm gp xut hin trong mnh COMPUTE phi c mt trong danh sch chn. Khng s dng SELECT INTO trong mt cu lnh SELECT c s dng COMPUTE. Nu s dng mnh COMPUTE ... BY th cng phi s dng mnh ORDER BY. Cc ct lit k trong COMPUTE BY phi ging ht hay l mt tp con ca nhng g c lit k sau ORDER BY. Chng phi c cng th t t tri qua phi, bt u vi cng mt biu thc v khng b qua bt k mt biu thc no.
47
Phi s dng mt tn ct hoc mt biu thc trong mnh ORDER BY, vic sp xp khng c thc hin da trn tiu ct. Trong trng hp s dng COMPUTE m khng c BY th c th khng cn s dng ORDER BY, khi phm vi tnh ton ca hm gp l trn ton b d liu. V d 2.41: Cu lnh di y hin th danh sch cc lp v tng s lp hin c:
SELECT malop,tenlop,hedaotao FROM lop ORDER BY makhoa COMPUTE COUNT(malop)
kt qu ca cu lnh nh sau:
MALOP C24101 C25101 C26101 C26102 C25102 C24102 C24103 C25103 C25301 C24301 CNT 10 TENLOP Ton K24 Ton K25 Ton K26 Tin K26 Tin K25 Tin K24 L K24 L K25 Sinh K25 Sinh K24 HEDAOTAO Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy Chnh quy
C th thc hin vic tnh ton hm gp dng trn cc nhm lng nhau bng cch s dng nhiu mnh COMPUTE BY trong cng mt cu lnh SELECT
48
V d 2.42: Cu lnh:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa ORDER BY khoa.makhoa COMPUTE COUNT(malop) BY khoa.makhoa COMPUTE COUNT(malop)
Cho bit danh sch cc lp ca mi khoa, tng s lp theo mi khoa v tng s lp hin c vi kt qu nh sau:
MAKHOA DHT01 DHT01 DHT01 TENKHOA Khoa Ton c - Tin hc Khoa Ton c - Tin hc Khoa Ton c - Tin hc MALOP C24101 C25101 C26101 CNT 3 MALOP C26102 C25102 C24102 CNT 3 MALOP C24103 C25103 CNT 2 MALOP C25301 C24301 CNT 2 CNT 10 TENLOP Ton K24 Ton K25 Ton K26
TENKHOA Khoa Cng ngh thng tin Khoa Cng ngh thng tin Khoa Cng ngh thng tin
49
truy vn ny c s dng biu din cho nhng truy vn trong iu kin truy vn d liu cn phi s dng n kt qu ca mt truy vn khc. C php ca truy vn con nh sau:
(SELECT [ALL | DISTINCT] danh_sch_chn FROM danh_sch_bng [WHERE iu_kin] [GROUP BY danh_sch_ct] [HAVING iu_kin])
Khi s dng truy vn con cn lu mt s quy tc sau: Mt truy vn con phi c vit trong cp du ngoc. Trong hu ht cc trng hp, mt truy vn con thng phi c kt qu l mt ct (tc l ch c duy nht mt ct trong danh sch chn). Mnh COMPUTE v ORDER BY khng c php s dng trong truy vn con. Cc tn ct xut hin trong truy vn con c th l cc ct ca cc bng trong truy vn ngoi. Mt truy vn con thng c s dng lm iu kin trong mnh WHERE hoc HAVING ca mt truy vn khc. Nu truy vn con tr v ng mt gi tr, n c th s dng nh l mt thnh phn bn trong mt biu thc (chng hn xut hin trong mt php so snh bng) Php so snh i vi vi kt qu truy vn con Kt qu ca truy vn con c th c s dng thc hin php so snh s hc vi mt biu thc ca truy vn cha. Trong trng hp ny, truy vn con c s dng di dng:
WHERE biu_thc php_ton_s_hc [ANY|ALL] (truy_vn_con)
Trong php ton s hc c th s dng bao gm: =, <>, >, <, >=, <=; V truy vn con phi c kt qu bao gm ng mt ct. V d 2.43: Cu lnh di y cho bit danh sch cc mn hc c s n v hc trnh ln hn hoc bng s n v hc trnh ca mn hc c m l TI-001
SELECT * FROM monhoc WHERE sodvht>=(SELECT sodvht FROM monhoc 50
WHERE mamonhoc='TI-001')
Nu truy vn con tr v nhiu hn mt gi tr, vic s dng php so snh nh trn s khng hp l. Trong trng hp ny, sau php ton so snh phi s dng thm lng t ALL hoc ANY. Lng t ALL c s dng khi cn so snh gi tr ca biu thc vi tt c cc gi tr tr v trong kt qu ca truy vn con; ngc lai, php so snh vi lng t ANY c kt qu ng khi ch cn mt gi tr bt k no trong kt qu ca truy vn con tho mn iu kin. V d 2.44: Cu lnh di y cho bit h tn ca nhng sinh vin lp Tin K25 sinh trc tt c cc sinh vin ca lp Ton K25
SELECT hodem,ten FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND ngaysinh<ALL(SELECT ngaysinh FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')
v cu lnh:
SELECT hodem,ten FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND year(ngaysinh)= ANY(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')
cho bit h tn ca nhng sinh vin lp Tin K25 c nm sinh trng vi nm sinh ca bt k mt sinh vin no ca lp Ton K25. S dng truy vn con vi ton t IN Khi cn thc hin php kim tra gi tr ca mt biu thc c xut hin (khng xut hin) trong tp cc gi tr ca truy vn con hay khng, ta c th s dng ton t IN (NOT IN) nh sau:
WHERE biu_thc [NOT] IN (truy_vn_con)
V d 2.45: hin th h tn ca nhng sinh vin lp Tin K25 c nm sinh bng vi nm sinh ca mt sinh vin no ca lp Ton K25, thay v s dng cu lnh nh v d trn, ta c th s dng cu lnh nh sau:
SELECT hodem,ten 51
FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND year(ngaysinh)IN(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')
S dng lng t EXISTS vi truy vn con Lng t EXISTS c s dng kt hp vi truy vn con di dng:
WHERE [NOT] EXISTS (truy_vn_con)
kim tra xem mt truy vn con c tr v dng kt qu no hay khng. Lng t EXISTS (tng ng NOT EXISTS) tr v gi tr True (tng ng False) nu kt qu ca truy vn con c t nht mt dng (tng ng khng c dng no). iu khc bit ca vic s dng EXISTS vi hai cch nu trn l trong danh sch chn ca truy vn con c th c nhiu hn hai ct. V d 2.46: Cu lnh di y cho bit h tn ca nhng sinh vin hin cha c im thi ca bt k mt mn hc no
SELECT hodem,ten FROM sinhvien WHERE NOT EXISTS(SELECT masv FROM diemthi WHERE diemthi.masv=sinhvien.masv)
S dng truy vn con vi mnh HAVING Mt truy vn con c th c s dng trong mnh HAVING ca mt truy vn khc. Trong trng hp ny, kt qu ca truy vn con c s dng to nn iu kin i vi cc hm gp. V d 2.47: Cu lnh di y cho bit m, tn v trung bnh im ln 1 ca cc mn hc c trung bnh ln hn trung bnh im ln 1 ca tt c cc mn hc
SELECT diemthi.mamonhoc,tenmonhoc,AVG(diemlan1) FROM diemthi,monhoc WHERE diemthi.mamonhoc=monhoc.mamonhoc GROUP BY diemthi.mamonhoc,tenmonhoc HAVING AVG(diemlan1)> (SELECT AVG(diemlan1) FROM diemthi)
52
Trong cu lnh INSERT, danh sch ct ngay sau tn bng khng cn thit phi ch nh nu gi tr cc trng ca bn ghi mi c ch nh y trong danh sch tr. Trong trng hp ny, th t cc gi tr trong danh sch tr phi bng vi s lng cc trng ca bng cn b sung d liu cng nh phi tun theo ng th t ca cc trng nh khi bng c nh ngha. V d 2.48: Cu lnh di y b sung thm mt dng d liu vo bng KHOA
INSERT INTO khoa VALUES(DHT10,Khoa Lut,054821135)
Trong trng hp ch nhp gi tr cho mt s ct trong bng, ta phi ch nh danh sch cc ct cn nhp d liu ngay sau tn bng. Khi , cc ct khng c nhp d liu s nhn gi tr mc nh (nu c) hoc nhn gi tr NULL (nu ct cho
53
php chp nhn gi tr NULL). Nu mt ct khng c gi tr mc nh v khng chp nhn gi tr NULL m khng uc nhp d liu, cu lnh s b li. V d 2.49: Cu lnh di y b sung mt bn ghi mi cho bng SINHVIEN
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES(0241020008,Nguyn Cng,Chnh,1,C24102)
B sung nhiu dng d liu t bng khc Mt cch s dng khc ca cu lnh INSERT c s dng b sung nhiu dng d liu vo mt bng, cc dng d liu ny c ly t mt bng khc thng qua cu lnh SELECT. cch ny, cc gi tr d liu c b sung vo bng khng c ch nh tng minh m thay vo l mt cu lnh SELECT truy vn d liu t bng khc. C php cu lnh INSERT c dng nh sau:
INSERT INTO tn_bng[(danh_sch_ct)] cu_lnh_SELECT
V d 2.50: Gi s ta c bng LUUSINHVIEN bao gm cc trng HODEM, TEN, NGAYSINH. Cu lnh di y b sung vo bng LUUSINHVIEN cc dng d liu c c t cu truy vn SELECT:
INSERT INTO luusinhvien SELECT hodem,ten,ngaysinh FROM sinhvien WHERE noisinh like %Hu%
Khi b sung d liu theo cch ny cn lu mt s im sau: Kt qu ca cu lnh SELECT phi c s ct bng vi s ct c ch nh trong bng ch v phi tng thch v kiu d liu. Trong cu lnh SELECT c s dng mnh COMPUTE ... BY
54
SET
Sau UPDATE l tn ca bng cn cp nht d liu. Mt cu lnh UPDATE c th cp nht d liu cho nhiu ct bng cch ch nh cc danh sch tn ct v biu thc tng ng sau t kho SET. Mnh WHERE trong cu lnh UPDATE thng c s dng ch nh cc dng d liu chu tc ng ca cu lnh (nu khng ch nh, phm vi tc ng ca cu lnh c hiu l ton b cc dng trong bng) V d 2.51: Cu lnh di y cp nht li s n v hc trnh ca cc mn hc c s n v hc trnh nh hn 2
UPDATE monhoc SET sodvht = 3 WHERE sodvht = 2
S dng cu trc CASE trong cu lnh UPDATE Cu trc CASE c th c s dng trong biu thc khi cn phi a ra cc quyt nh khc nhau v gi tr ca biu thc V d 2.52: Gi s ta c bng NHATKYPHONG sau y
55
iu kin cp nht d liu lin quan n nhiu bng Mnh FROM trong cu lnh UPDATE c s dng khi cn ch nh cc iu kin lin quan n cc bng khc vi bng cn cp nht d liu. Trong trung hp ny, trong mnh WHERE thng c iu kin ni gia cc bng. V d 2.53: Gi s ta c hai bng MATHANG v NHATKYBANHANG nh sau:
Cu lnh di y s cp nht gi tr trng THANHTIEN ca bng NHATKYBANHANG theo cng thc THANHTIEN = SOLUONG GIA
UPDATE nhatkybanhang SET thanhtien = soluong*gia FROM mathang WHERE nhatkybanhang.mahang = mathang.mahang
Cu lnh UPDATE vi truy vn con Tng t nh trong cu lnh SELECT, truy vn con c th c s dng trong mnh WHERE ca cu lnh UPDATE nhm ch nh iu kin i vi cc dng d liu cn cp nht d liu. V d 2.54: Cu lnh trn c th c vit nh sau:
UPDATE nhatkybanhang SET thanhtien = soluong*gia FROM mathang WHERE mathang.mahang =(SELECT mathang.mahang FROM mathang WHERE mathang.mahang=nhatkybanhang.mahang)
2.2.3 Xo d liu
xo d liu trong mt bng, ta s dng cu lnh DELETE. C php ca cu lnh ny nh sau:
DELETE FROM tn_bng [FROM danh_sch_bng] [WHERE iu_kin]
56
Trong cu lnh ny, tn ca bng cn xo d liu c ch nh sau DELETE FROM. Mnh WHERE trong cu lnh c s dng ch nh iu kin i vi cc dng d liu cn xo. Nu cu lnh DELETE khng c mnh WHERE th ton b cc dng d liu trong bng u b xo. V d 2.55: Cu lnh di y xo khi bng SINHVIEN nhng sinh vin sinh ti Hu
DELETE FROM sinhvien WHERE noisinh LIKE %Hu%
Xo d liu khi iu kin lin quan n nhiu bng Nu iu kin trong cu lnh DELETE lin quan n cc bng khng phi l bng cn xa d liu, ta phi s dng thm mnh FROM v sau l danh sch tn cc bng . Trong trng hp ny, trong mnh WHERE ta ch nh thm iu kin ni gia cc bng V d 2.56: Cu lnh di y xo ra khi bng SINHVIEN nhng sinh vin lp Tin K24
DELETE FROM sinhvien FROM lop WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24'
S dng truy vn con trong cu lnh DELETE Mt cu lnh SELECT c th c lng vo trong mnh WHERE trong cu lnh DELETE lm iu kin cho cu lnh tng t nh cu lnh UPDATE. V d 2.57: Cu lnh di y xo khi bng LOP nhng lp khng c sinh vin no hc
DELETE FROM lop WHERE malop NOT IN (SELECT DISTINCT malop FROM sinhvien)
Xo ton b d liu trong bng Cu lnh DELETE khng ch nh iu kin i vi cc dng d liu cn xo trong mnh WHERE s xo ton b d liu trong bng. Thay v s dng cu lnh DELETE trong trng hp ny, ta c th s dng cu lnh TRUNCATE c c php nh sau:
TRUNCATE TABLE tn_bng
Bi tp chng 2
C s d liu di y c s dng qun l cng tc giao hng trong mt cng ty kinh doanh. Cc bng trong c s d liu ny c biu din trong s di y:
Trong : Bng NHACUNGCAP lu tr d liu v cc i tc cung cp hng cho cng ty. Bng MATHANG lu tr d liu v cc mt hng hin c trong cng ty. Bng LOAIHANG phn loi cc mt hng hin c. Bng NHANVIEN c d liu l thng tin v cc nhn vin lm vic trong cng ty. Bng KHACHHANG c s dng lu gi thng tin v cc khch hng ca cng ty.
58
Khch hng t hng cho cng ty thng qua cc n t hng. Thng tin chung v cc n t hng c lu tr trong bng DONDATHANG (Mi mt n t hng phi do mt nhn vin ca cng ty lp v do bng ny c quan h vi bng NHANVIEN) Thng tin chi tit ca cc n t hng (t mua mt hng g, s lng, gi c,...) c lu tr trong bng CHITIETDATHANG. Bng ny c quan h vi hai bng DONDATHANG v MATHANG. S dng cu lnh SELECT vit cc yu cu truy vn d liu sau y: 2. 1 2. 2 2. 3 2. 4 2. 5 2. 6 2. 7 2. 8 2. 9 Cho bit danh sch cc i tc cung cp hng cho cng ty. M hng, tn hng v s lng ca cc mt hng hin c trong cng ty. H tn v a ch v nm bt u lm vic ca cc nhn vin trong cng ty. a ch v in thoi ca nh cung cp c tn giao dch VINAMILK l g? Cho bit m v tn ca cc mt hng c gi ln hn 100000 v s lng hin c t hn 50. Cho bit mi mt hng trong cng ty do ai cung cp. Cng ty Vit Tin cung cp nhng mt hng no? Loi hng thc phm do nhng cng ty no cung cp v a ch ca cc cng ty l g? Nhng khch hng no (tn giao dch) t mua mt hng Sa hp XYZ ca cng ty?
2. 10 n t hng s 1 do ai t v do nhn vin no lp, thi gian v a im giao hng l u? 2. 11 Hy cho bit s tin lng m cng ty phi tr cho mi nhn vin l bao nhiu (lng = lng c bn + ph cp). 2. 12 Trong n t hng s 3 t mua nhng mt hng no v s tin m khch hng phi tr cho mi mt hng l bao nhiu (s tin phi tr c tnh theo cng thc SOLUONGGIABAN SOLUONGGIABANMUCGIAMGIA/100) 2. 13 Hy cho bit c nhng khch hng no li chnh l i tc cung cp hng ca cng ty (tc l c cng tn giao dch). 2. 14 Trong cng ty c nhng nhn vin no c cng ngy sinh? 2. 15 Nhng n t hng no yu cu giao hng ngay ti cng ty t hng v nhng n l ca cng ty no? 2. 16 Cho bit tn cng ty, tn giao dch, a ch v in thoi ca cc khch hng v cc nh cung cp hng cho cng ty. 2. 17 Nhng mt hng no cha tng c khch hng t mua?
59
2. 18 Nhng nhn vin no ca cng ty cha tng lp bt k mt ho n t hng no? 2. 19 Nhng nhn vin no ca cng ty c lng c bn cao nht? 2. 20 Tng s tin m khch hng phi tr cho mi n t hng l bao nhiu? 2. 21 Trong nm 2003, nhng mt hng no ch c t mua ng mt ln. 2. 22 Hy cho bit mi mt khch hng phi b ra bao nhiu tin t mua hng ca cng ty? 2. 23 Mi mt nhn vin ca cng ty lp bao nhiu n t hng (nu nhn vin cha h lp mt ho n no th cho kt qu l 0) 2. 24 Cho bit tng s tin hng m ca hng thu c trong mi thng ca nm 2003 (thi c gian tnh theo ngy t hng). 2. 25 Hy cho bit tng s tin li m cng ty thu c t mi mt hng trong nm 2003. 2. 26 Hy cho bit tng s lng hng ca mi mt hng m cng ty c (tng s lng hng hin c v bn). 2. 27 Nhn vin no ca cng ty bn c s lng hng nhiu nht v s lng hng bn c ca nhng nhn vin ny l bao nhiu? 2. 28 n t hng no c s lng hng c t mua t nht? 2. 29 S tin nhiu nht m mi khch hng tng b ra t hng trong cc n t hng l bao nhiu? 2. 30 Mi mt n t hng t mua nhng mt hng no v tng s tin m mi n t hng phi tr l bao nhiu? 2. 31 Hy cho bit mi mt loi hng bao gm nhng mt hng no, tng s lng hng ca mi loi v tng s lng ca tt c cc mt hng hin c trong cng ty l bao nhiu? 2. 32 Thng k xem trong nm 2003, mi mt mt hng trong mi thng v trong c nm bn c vi s lng bao nhiu Yu cu: Kt qu c hin th di dng bng, hai ct ct u l m hng v tn hng, cc ct cn li tng ng vi cc thng t 1 n 12 v c nm. Nh vy mi dng trong kt qu cho bit s lng hng bn c mi thng v trong c nm ca mi mt hng. S dng cu lnh UPDATE thc hin cc yu cu sau: 2. 33 Cp nht li gi tr trng NGAYCHUYENHANG ca nhng bn ghi c NGAYCHUYENHANG cha xc nh (NULL) trong bng DONDATHANG bng vi gi tr ca trng NGAYDATHANG.
60
2. 34 Tng s lng hng ca nhng mt hng do cng ty VINAMILK cung cp ln gp i. 2. 35 Cp nht gi tr ca trng NOIGIAOHANG trong bng DONDATHANG bng a ch ca khch hng i vi nhng n t hng cha xc nh c ni giao hng (gi tr trng NOIGIAOHANG bng NULL). 2. 36 Cp nht li d liu trong bng KHACHHANG sao cho nu tn cng ty v tn giao dch ca khch hng trng vi tn cng ty v tn giao dch ca mt nh cung cp no th a ch, in thoi, fax v e-mail phi ging nhau. 2. 37 Tng lng ln gp ri cho nhng nhn vin bn c s lng hng nhiu hn 100 trong nm 2003. 2. 38 Tng ph cp ln bng 50% lng cho nhng nhn vin bn c hng nhiu nht. 2. 39 Gim 25% lng ca nhng nhn vin trong nm 2003 khng lp c bt k n t hng no. 2. 40 Gi s trong bng DONDATHANG c thm trng SOTIEN cho bit s tin m khch hng phi tr trong mi n t hng. Hy tnh gi tr cho trng ny. Thc hin cc yu cu di y bng cu lnh DELETE. 2. 41 Xo khi bng NHANVIEN nhng nhn vin lm vic trong cng ty qu 40 nm. 2. 42 Xo nhng n t hng trc nm 2000 ra khi c s d liu. 2. 43 Xo khi bng LOAIHANG nhng loi hng hin khng c mt hng. 2. 44 Xo khi bng KHACHHANG nhng khch hng hin khng c bt k n t hng no cho cng ty. 2. 45 Xo khi bng MATHANG nhng mt hng c s lng bng 0 v khng c t mua trong bt k n t hng no.
Li gii:
Cc php ni c s dng trong cc truy vn di y s dng c php ca SQL2.
2.1 2.2 2.3 SELECT macongty,tencongty,tengiaodich FROM nhacungcap SELECT mahang,tenhang,soluong FROM mathang SELECT ho,ten,year(ngaylamviec) AS namlamviec FROM nhanvien
61
2.4
SELECT diachi,dienthoai FROM nhacungcap WHERE tengiaodich='VINAMILK' 2.5 SELECT mahang,tenhang FROM mathang WHERE giahang>100000 AND soluong<50 2.6 SELECT mahang,tenhang, nhacungcap.macongty,tencongty,tengiaodich FROM mathang INNER JOIN nhacungcap ON mathang.macongty=nhacungcap.macongty 2.7 SELECT mahang,tenhang FROM mathang INNER JOIN nhacungcap ON mathang.macongty=nhacungcap.macongty WHERE tencongty='Vit Tin' 2.8 SELECT DISTINCT nhacungcap.macongty,tencongty,diachi FROM (loaihang INNER JOIN mathang ON loaihang.maloaihang=mathang.maloaihang) INNER JOIN nhacungcap ON mathang.macongty=nhacungcap.macongty WHERE tenloaihang='Thc phm' 2.9 SELECT DISTINCT tengiaodich FROM ((mathang INNER JOIN chitietdathang ON mathang.mahang=chitietdathang.mahang) INNER JOIN dondathang ON chitietdathang.sohoadon=dondathang.sohoadon) INNER JOIN khachhang ON dondathang.makhachhang=khachhang.makhachhang WHERE tenhang='Sa hp' 2.10 SELECT dondathang.manhanvien,ho,ten, ngaygiaohang,noigiaohang FROM nhanvien INNER JOIN dondathang ON nhanvien.manhanvien=dondathang.manhanvien WHERE sohoadon=1 2.11 SELECT manhanvien,ho,ten, luongcoban + CASE WHEN phucap IS NULL THEN 0 ELSE phucap END AS luong FROM nhanvien 2.12 SELECT a.mahang,tenhang, 62
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
a.soluong*giaban*(1-mucgiamgia/100) AS sotien FROM chitietdathang AS a INNER JOIN mathang AS b ON a.mahang=b.mahang SELECT makhachhang,khachhang.tencongty, khachhang.tengiaodich FROM khachhang INNER JOIN nhacungcap ON khachhang.tengiaodich=nhacungcap.tengiaodich SELECT a.ho,a.ten,b.ho,b.ten,b.ngaysinh FROM nhanvien a INNER JOIN nhanvien b ON a.ngaysinh=b.ngaysinh AND a.manhanvien<>b.manhanvien SELECT sohoadon,tencongty,tengiaodich, ngaydathang,noigiaohang FROM dondathang INNER JOIN khachhang ON dondathang.noigiaohang=khachhang.diachi SELECT tencongty,tengiaodich,diachi,dienthoai FROM khachhang UNION ALL SELECT tencongty,tengiaodich,diachi,dienthoai FROM nhacungcap SELECT mahang,tenhang FROM mathang WHERE NOT EXISTS (SELECT mahang FROM chitietdathang WHERE mahang=mathang.mahang) SELECT manhanvien,ho,ten FROM nhanvien WHERE NOT EXISTS (SELECT manhanvien FROM dondathang WHERE manhanvien=nhanvien.manhanvien) SELECT manhanvien,ho,ten,luongcoban FROM nhanvien WHERE luongcoban=(SELECT MAX(luongcoban) FROM nhanvien) SELECT dondathang.sohoadon,dondathang.makhachhang, tencongty,tengiaodich, SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FROM (khachhang INNER JOIN dondathang ON khachhang.makhachhang=dondathang.makhachhang) INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY dondathang.makhachhang,tencongty, tengiaodich,dondathang.sohoadon 63
2.21 SELECT mathang.mahang,tenhang FROM (mathang INNER JOIN chitietdathang ON mathang.mahang=chitietdathang.mahang) iNNER JOIN dondathang ON chitietdathang.sohoadon=dondathang.sohoadon WHERE YEAR(ngaydathang)=2003 GROUP BY mathang.mahang,tenhang HAVING COUNT(chitietdathang.mahang)=1 2.22 SELECT khachhang.makhachhang,tencongty,tengiaodich, SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FROM (khachhang INNER JOIN dondathang ON khachhang.makhachhang = dondathang.makhachhang) INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY khachhang.makhachhang,tencongty,tengiaodich 2.23 SELECT nhanvien.manhanvien,ho,ten,COUNT(sohoadon) FROM nhanvien LEFT OUTER JOIN dondathang ON nhanvien.manhanvien=dondathang.manhanvien GROUP BY nhanvien.manhanvien,ho,ten 2.24 SELECT MONTH(ngaydathang) AS thang, SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon WHERE year(ngaydathang)=2003 GROUP BY month(ngaydathang) 2.25 SELECT c.mahang,tenhang, SUM(b.soluong*giaban-b.soluong*giaban*mucgiamgia/100)SUM(b.soluong*giahang) FROM (dondathang AS a INNER JOIN chitietdathang AS b ON a.sohoadon=b.sohoadon) INNER JOIN mathang AS c ON b.mahang=c.mahang WHERE YEAR(ngaydathang)=2003 GROUP BY c.mahang,tenhang 2.26 SELECT mathang.mahang,tenhang, mathang.soluong + CASE WHEN SUM(chitietdathang.soluong) IS NULL THEN 0 ELSE SUM(chitietdathang.soluong) END AS tongsoluong 64
2.27
2.28
2.29
2.30
2.31
FROM mathang LEFT OUTER JOIN chitietdathang ON mathang.mahang=chitietdathang.mahang GROUP BY mathang.mahang,tenhang,mathang.soluong SELECT nhanvien.manhanvien,ho,ten,sum(soluong) FROM (nhanvien INNER JOIN dondathang ON nhanvien.manhanvien=dondathang.manhanvien) INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY nhanvien.manhanvien,ho,ten HAVING sum(soluong)>=ALL(SELECT sum(soluong) FROM (nhanvien INNER JOIN dondathang ON nhanvien.manhanvien=dondathang.manhanvien) INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY nhanvien.manhanvien,ho,ten) SELECT dondathang.sohoadon,SUM(soluong) FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY dondathang.sohoadon HAVING sum(soluong)<=ALL(SELECT sum(soluong) FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY dondathang.sohoadon) SELECT TOP 1 SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon ORDER BY 1 DESC SELECT a.sohoadon,b.mahang,tenhang, b.soluong*giaban-b.soluong*giaban*mucgiamgia/100 FROM (dondathang AS a INNER JOIN chitietdathang AS b ON a.sohoadon = b.sohoadon) INNER JOIN mathang AS c ON b.mahang = c.mahang ORDER BY a.sohoadon COMPUTE SUM(b.soluong*giabanb.soluong*giaban*mucgiamgia/100) BY a.sohoadon SELECT loaihang.maloaihang,tenloaihang, mahang,tenhang,soluong FROM loaihang INNER JOIN mathang ON loaihang.maloaihang=mathang.maloaihang 65
ORDER BY loaihang.maloaihang COMPUTE SUM(soluong) BY loaihang.maloaihang COMPUTE SUM(soluong) 2.32 SELECT b.mahang,tenhang, SUM(CASE MONTH(ngaydathang) WHEN 1 THEN b.soluong ELSE 0 END) AS Thang1, SUM(CASE MONTH(ngaydathang) WHEN 2 THEN b.soluong ELSE 0 END) AS Thang2, SUM(CASE MONTH(ngaydathang) WHEN 3 THEN b.soluong ELSE 0 END) AS Thang3, SUM(CASE MONTH(ngaydathang) WHEN 4 THEN b.soluong ELSE 0 END) AS Thang4, SUM(CASE MONTH(ngaydathang) WHEN 5 THEN b.soluong ELSE 0 END) AS Thang5, SUM(CASE MONTH(ngaydathang) WHEN 6 THEN b.soluong ELSE 0 END) AS Thang6, SUM(CASE MONTH(ngaydathang) WHEN 7 THEN b.soluong ELSE 0 END) AS Thang7, SUM(CASE MONTH(ngaydathang) WHEN 8 THEN b.soluong ELSE 0 END) AS Thang8, SUM(CASE MONTH(ngaydathang) WHEN 9 THEN b.soluong ELSE 0 END) AS Thang9, SUM(CASE MONTH(ngaydathang) WHEN 10 THEN b.soluong ELSE 0 END) AS Thang10, SUM(CASE MONTH(ngaydathang) WHEN 11 THEN b.soluong ELSE 0 END) AS Thang11, SUM(CASE MONTH(ngaydathang) WHEN 12 THEN b.soluong ELSE 0 END) AS Thang12, SUM(b.soluong) AS CaNam FROM (dondathang AS a INNER JOIN chitietdathang AS b ON a.sohoadon=b.sohoadon) INNER JOIN mathang AS c ON b.mahang=c.mahang WHERE YEAR(ngaydathang)=1996 GROUP BY b.mahang,tenhang 2.33 UPDATE dondathang SET ngaychuyenhang = ngaydathang WHERE ngaychuyenhang IS NULL 2.34 UPDATE mathang SET soluong=soluong*2 66
2.35
2.36
2.37
2.38
2.39
FROM nhacungcap WHERE nhacungcap.macongty=mathang.macongty AND tencongty='VINAMILK' UPDATE dondathang SET noigiaohang=diachi FROM khachhang WHERE dondathang.makhachhang=khachhang.makhachang AND noigiaohang IS NULL UPDATE khachhang SET khachhang.diachi = nhacungcap.diachi, khachhang.dienthoai = nhacungcap.dienthoai, khachhang.fax = nhacungcap.fax, khachhang.email = nhacungcap.email FROM nhacungcap WHERE khachhang.tencongty = nhacungcap.tencongty AND khachhang.tengiaodich = nhacungcap.tengiaodich UPDATE nhanvien SET luongcoban=luongcoban*1.5 WHERE manhanvien = (SELECT manhanvien FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon WHERE manhanvien=nhanvien.manhanvien GROUP BY manhanvien HAVING SUM(soluong)>100) UPDATE nhanvien SET phucap=luongcoban/2 WHERE manhanvien IN (SELECT manhanvien FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY manhanvien HAVING SUM(soluong)>=ALL (SELECT SUM(soluong) FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon=chitietdathang.sohoadon GROUP BY manhanvien)) UPDATE nhanvien SET luongcoban=luongcoban*0.85 WHERE NOT EXISTS (SELECT manhanvien 67
FROM dondathang WHERE manhanvien=nhanvien.manhanvien) 2.40 UPDATE dondathang SET sotien = (SELECT SUM(soluong*giaban+soluong*giaban*mucgiamgia) FROM chitietdathang WHERE sohoadon=dondathang.sohoadon GROUP BY sohoadon) 2.41 DELETE FROM nhanvien WHERE DATEDIFF(YY,ngaylamviec,GETDATE())>40 2.42 DELETE FROM dondathang WHERE ngaydathang<'1/1/2000' 2.43 DELETE FROM loaihang WHERE NOT EXISTS (SELECT mahang FROM mathang WHERE maloaihang=loaihang.maloaihang) 2.44 DELETE FROM khachhang WHERE NOT EXISTS (SELECT sohoadon FROM dondathang WHERE makhachhang=khachhang.makhachhang) 2.45 DELETE FROM mathang WHERE soluong=0 AND NOT EXISTS (SELECT sohoadon FROM chitietdathang WHERE mahang=mathang.mahang)
_______________________________________
68
Chng 3
Hnh 3.1 Bng trong c s d liu quan h Trong cc bng, d liu c t chc di dng cc dng v ct. Mi mt dng l mt bn ghi duy nht trong bng v mi mt ct l mt trng. Cc bng trong c s
69
d liu c s dng biu din thng tin, lu gi d liu v cc i tng trong th gii thc v/hoc mi quan h gia cc i tng. Bng trong hnh 3.1 bao gm 10 bn ghi v 4 trng l MAKHOA, TENKHOA, DIENTHOAI v TRUONGKHOA. Cu lnh CREATE TABLE c s dng nh ngha mt bng d liu mi trong c s d liu. Khi nh ngha mt bng d liu mi, ta cn phi xc nh c cc yu cu sau y: Bng mi c to ra s dng vi mc ch g v c vai tr nh th no trong c s d liu. Cu trc ca bng bao gm nhng trng (ct) no, mi mt trng c ngha nh th no trong vic biu din d liu, kiu d liu ca mi trng l g v trng c cho php nhn gi tr NULL hay khng. Nhng trng no s tham gia vo kha chnh ca bng. Bng c quan h vi nhng bng khc hay khng v nu c th quan h nh th no. Trn cc trng ca bng c tn ti nhng rng buc v khun dng, iu kin hp l ca d liu hay khng; nu c th s dng u v nh th no. Cu lnh CREATE TABLE c c php nh sau
CREATE TABLE tn_bng ( tn_ct thuc_tnh_ct cc_rng_buc [,... ,tn_ct_n thuc_tnh_ct_n cc_rng_buc_ct_n] [,cc_rng_buc_trn_bng] )
Trong :
tn_bng tn_ct
Tn ca bng cn to. Tn phi tun theo qui tc nh danh v khng c vt qu 128 k t. L tn ca ct (trng) cn nh ngha, tn ct phi tun theo qui tc nh danh v khng c trng nhau trong mi mt bng. Mi mt bng phi c t nht mt ct. Nu bng c nhiu ct th nh ngha ca cc ct (tn ct, thuc tnh v cc rng buc) phi phn cch nhau bi du phy. Mi mt ct trong mt bng ngoi tn ct cn c cc thuc tnh bao gm: Kiu d liu ca ct. y l thuc tnh bt buc phi c i vi mi ct. Gi tr mc nh ca ct: l gi tr c t ng gn cho ct nu nh ngi s dng khng nhp d liu
70
thuc_tnh_ct
cho ct mt cch tng minh. Mi mt ct ch c th c nhiu nht mt gi tr mc nh. Ct c tnh cht IDENTITY hay khng? tc l gi tr ca ct c c t ng tng mi khi c bn ghi mi c b sung hay khng. Tnh cht ny ch c th s dng i vi cc trng kiu s. Ct c chp nhn gi tr NULL hay khng V d 3.1: Khai bo di y nh ngha ct STT c kiu d liu l int v ct c tnh cht IDENTITY:
stt INT IDENTITY
hay nh ngha ct NGAY c kiu datetime v khng cho php chp nhn gi tr NULL:
ngay DATETIME NOT NULL
Cc rng buc c s dng trn mi ct hoc trn bng nhm cc mc ch sau: Quy nh khun dng hay gi tr d liu c cho php trn ct (chng hn qui nh tui ca mt hc sinh phi ln hn 6 v nh hn 20, s in thoi phi l mt chui bao gm 6 ch s,...). Nhng rng buc kiu ny c gi l rng buc CHECK m bo tnh ton vn d liu trong mt bng v ton vn tham chiu gia cc bng trong c s d liu. Nhng loi rng buc ny nhm m bo tnh ng ca d liu nh: s chng minh nhn dn ca mi mt ngi phi duy nht, nu sinh vin hc mt lp no th lp phi tn ti,... Lin quan n nhng loi rng buc ny bao gm cc rng buc PRIMARY KEY (kho chnh), UNIQUE (kha d tuyn) v FOREIGN KEY (kho ngoi) Cc loi rng buc ny s c trnh by chi tit hn phn sau.
71
V d 3.2: Cu lnh di y nh ngha bng NHANVIEN vi cc trng MANV (m nhn vin), HOTEN (h v tn), NGAYSINH (ngy sinh ca nhn vin), DIENTHOAI (in thoi) v HSLUONG (h s lng)
CREATE TABLE nhanvien ( manv NVARCHAR(10) hoten NVARCHAR(50) ngaysinh DATETIME dienthoai NVARCHAR(10) hsluong DECIMAL(3,2) )
Trong cu lnh trn, trng MANV v HOTEN ca bng NHANVIEN khng c NULL (tc l bt buc phi c d liu), trng NGAYSINH v DIENTHOAI s nhn gi tr NULL nu ta khng nhp d liu cho chng cn trng HSLUONG s nhn gi tr mc nh l 1.92 nu khng c nhp d liu. Nu ta thc hin cc cu lnh di y sau khi thc hin cu lnh trn b sung d liu cho bng NHANVIEN
INSERT INTO nhanvien VALUES('NV01','Le Van A','2/4/75','886963',2.14) INSERT INTO nhanvien(manv,hoten) VALUES('NV02','Mai Thi B') INSERT INTO nhanvien(manv,hoten,dienthoai) VALUES('NV03','Tran Thi C','849290')
72
Trong , iu_kin l mt biu thc logic tc ng ln ct nhm qui nh gi tr hoc khun dng d liu c cho php. Trn mi mt bng cng nh trn mi mt ct c th c nhiu rng buc CHECK. V d 3.3: Cu lnh di y to bng DIEMTOTNGHIEP trong qui nh gi tr ca ct DIEMVAN v DIEMTOAN phi ln hn hoc bng 0 v nh hn hoc bng 10.
CREATE TABLE diemtotnghiep ( hoten NVARCHAR(30) NOT NULL, ngaysinh DATETIME, diemvan DECIMAL(4,2) CONSTRAINT chk_diemvan CHECK(diemvan>=0 AND diemvan<=10), diemtoan DECIMAL(4,2) CONSTRAINT chk_diemtoan CHECK(diemtoan>=0 AND diemtoan<=10), )
cn cu lnh di y l khng hp l:
INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan) VALUES('Tran Van Hanh',6,10.5)
do ct DIEMTOAN nhn gi tr 10.5 khng tho mn iu kin ca rng buc Trong v d trn, cc rng buc c ch nh phn khai bo ca mi ct. Thay v ch nh rng buc trn mi ct, ta c th ch nh cc rng buc mc bng bng cch khai bo cc rng buc sau khi khai bo xong cc ct trong bng. V d 3.4: Cu lnh
CREATE TABLE lop ( malop NVARCHAR(10) tenlop NVARCHAR(30) khoa SMALLINT hedaotao NVARCHAR(25)
namnhaphoc
makhoa )
CONSTRAINT chk_lop_hedaotao CHECK (hedaotao IN ('chnh quy','ti chc')), INT NULL CONSTRAINT chk_lop_namnhaphoc CHECK (namnhaphoc<=YEAR(GETDATE())), NVARCHAR(5)
c th c vit li nh sau:
CREATE TABLE lop ( malop NVARCHAR(10) NOT NULL , tenlop NVARCHAR(30) NOT NULL , khoa SMALLINT NULL , hedaotao NVARCHAR(25) NULL, namnhaphoc INT NULL , makhoa NVARCHAR(5), CONSTRAINT chk_lop CHECK (namnhaphoc<=YEAR(GETDATE()) AND hedaotao IN ('chnh quy','ti chc')) )
Nu kho chnh ca bng ch bao gm ng mt ct v rng buc PRIMARY KEY c ch nh mc ct, ta khng cn thit phi ch nh danh sch ct sau t kho PRIMARY KEY. Tuy nhin, nu vic khai bo kho chnh c tin hnh mc bng (s dng khi s lng cc ct tham gia vo kho l t hai tr ln) th bt buc phi ch nh danh sch ct ngay sau t kha PRIMARY KEY v tn cc ct c phn cch nhau bi du phy.
74
th cu lnh ny s b li do trng gi tr kho vi bn ghi c. V d 3.6: Cu lnh di y to bng DIEMTHI vi kho chnh l tp bao gm hai ct MAMONHOC v MASV
CREATE TABLE diemthi ( mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2), diemlan2 NUMERIC(4, 2), CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv) )
Lu : Mi mt bng ch c th c nhiu nht mt rng buc PRIMARY KEY. Mt kho chnh c th bao gm nhiu ct nhng khng vt qu 16 ct.
75
V d 3.7: Gi s ta cn nh ngha bng LOP vi kho chnh l ct MALOP nhng ng thi li khng cho php cc lp khc nhau c trng tn lp vi nhau, ta s dng cu lnh nh sau:
CREATE TABLE lop ( malop NVARCHAR(10) NOT NULL, tenlop NVARCHAR(30) NOT NULL, khoa SMALLINT NULL, hedaotao NVARCHAR(25) NULL, namnhaphoc INT NULL, makhoa NVARCHAR(5), CONSTRAINT pk_lop PRIMARY KEY (malop), CONSTRAINT unique_lop_tenlop UNIQUE(tenlop) )
76
Hnh di y cho ta thy c mi quan h gia 3 bng DIEMTHI, SINHVIEN v MONHOC. Trong bng DIEMTHI, MASV l kho ngoi tham chiu n ct MASV ca bng SINHVIEN v MAMONHOC l kho ngoi tham chiu n ct MAMONHOC ca bng MONHOC.
Hnh 3.2 Mi quan h gia cc bng Vi mi quan h c to ra nh hnh trn, h qun tr c s d liu s kim tra tnh hp l ca mi bn ghi trong bng DIEMTHI mi khi c b sung hay cp nht. Mt bn ghi bt k trong bng DIEMTHI ch hp l (m bo rng buc FOREIGN KEY) nu gi tr ca ct MASV phi tn ti trong mt bn ghi no ca bng SINHVIEN v gi tr ca ct MAMONHOC phi tn ti trong mt bn ghi no ca bng MONHOC. Rng buc FOREIGN KEY c nh ngha theo c php di y:
[CONSTRAINT tn_rng_buc] FOREIGN KEY [(danh_sch_ct)] REFERENCES tn_bng_tham_chiu(danh_sch_ct_tham_chiu) [ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT] [ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT]
77
Tn ct hoc danh sch ct ca bng c nh ngha tham gia vo kho ngoi. Tn ca bng c tham chiu bi kho ngoi v danh sch cc ct c tham chiu n trong bng tham chiu. Cch thc x l i vi cc bn ghi trong bng c nh ngha trong trng hp cc bn ghi c tham chiu trong bng tham chiu b xo (ON DELETE) hay cp nht (ON UPDATE). SQL chun a ra 4 cch x l: CASCADE: T ng xo (cp nht) nu bn ghi c tham chiu b xo (cp nht). NO ACTION: (Mc nh) Nu bn ghi trong bng tham chiu ang c tham chiu bi mt bn ghi bt k trong bng c nh ngha th bn ghi khng c php xo hoc cp nht (i vi ct c tham chiu). SET NULL: Cp nht li kho ngoi ca bn ghi thnh gi tr NULL (nu ct cho php nhn gi tr NULL). SET DEFAULT: Cp nht li kho ngoi ca bn ghi nhn gi tr mc nh (nu ct c qui nh gi tr mc nh). V d 3.8: Cu lnh di y nh ngha bng DIEMTHI vi hai kho ngoi trn ct MASV v ct MAMONHOC (gi s hai bng SINHVIEN v MONHOC c nh ngha)
CREATE TABLE diemthi ( mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2), diemlan2 NUMERIC(4, 2), CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv), CONSTRAINT fk_diemthi_mamonhoc FOREIGN KEY(mamonhoc) REFERENCES monhoc(mamonhoc) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_diemthi_masv FOREIGN KEY(masv) REFERENCES sinhvien(masv) ON DELETE CASCADE ON UPDATE CASCADE 78
Lu : Ct c tham chiu trong bng tham chiu phi l kho chnh (hoc l kho ph). Ct c tham chiu phi c cng kiu d liu v di vi ct tng ng trong kha ngoi. Bng tham chiu phi c nh ngha trc. Do , nu cc bng c mi quan h vng, ta c th khng th nh ngha rng buc FOREIGN KEY ngay trong cu lnh CREATE TABLE m phi nh ngha thng qua lnh ALTER TABLE.
V d 3.9: Cc v d di y minh ho cho ta cch s dng cu lnh ALTER TABLE trong cc trng hp. Gi s ta c hai bng DONVI v NHANVIEN vi nh ngha nh sau:
CREATE TABLE donvi ( madv INT tendv NVARCHAR(30)
PRIMARY KEY,
79
) CREATE TABLE nhanvien ( manv NVARCHAR(10) hoten NVARCHAR(30) ngaysinh DATETIME, diachi CHAR(30) )
B sung vo bng NHANVIEN ct DIENTHOAI vi rng buc CHECK nhm qui nh in thoi ca nhn vin l mt chui 6 ch s:
ALTER TABLE nhanvien ADD dienthoai NVARCHAR(6) CONSTRAINT chk_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]')
nh ngha li kiu d liu ca ct DIACHI trong bng NHANVIEN v cho php ct ny chp nhn gi tr NULL:
ALTER TABLE nhanvien ALTER COLUMN diachi NVARCHAR(100) NULL
nh ngha kho chnh (rng buc PRIMARY KEY) cho bng NHANVIEN l ct MANV:
ALTER TABLE nhanvien ADD CONSTRAINT pk_nhanvien PRIMARY KEY(manv)
nh ngha kho ngoi cho bng NHANVIEN trn ct MADV tham chiu n ct MADV ca bng DONVI:
ALTER TABLE nhanvien ADD CONSTRAINT fk_nhanvien_madv FOREIGN KEY(madv) REFERENCES donvi(madv) 80
Lu : Nu b sung thm mt ct vo bng v trong bng c t nht mt bn ghi th ct mi cn b sung phi cho php chp nhn gi tr NULL hoc phi c gi tr mc nh. Mun xo mt ct ang c rng buc bi mt rng buc hoc ang c tham chiu bi mt kho ngoi, ta phi xo rng buc hoc kho ngoi trc sao cho trn ct khng cn bt k mt rng buc v khng cn c tham chiu bi bt k kho ngoi no. Nu b sung thm rng buc cho mt bng c d liu v rng buc cn b sung khng c tho mn bi cc bn ghi c trong bng th cu lnh ALTER TABLE khng thc hin c.
3.3 Xo bng
Khi mt bng khng cn cn thit , ta c th xo n ra khi c s d liu bng cu lnh DROP TABLE. Cu lnh ny cng ng thi xo tt c nhng rng buc, ch mc, trigger lin quan n bng . Cu lnh c c php nh sau:
DROP TABLE tn_bng
Trong cc h qun tr c s d liu, khi xo mt bng bng lnh DROP TABLE, ta khng th khi phc li bng cng nh d liu ca n. Do , cn phi cn thn khi s dng cu lnh ny. Cu lnh DROP TABLE khng th thc hin c nu bng cn xo ang c tham chiu bi mt rng buc FOREIGN KEY. Trong trng hp ny, rng buc FOREIGN KEY ang tham chiu hoc bng ang tham chiu n bng cn xo phi c xo trc. Khi mt bng b xo, tt c cc rng buc, ch mc v trigger lin quan n bng cng ng thi b xa theo. Do , nu ta to li bng th cng phi to li cc i tng ny.
81
V d 3.10: Gi s ct MADV trong bng DONVI ang c tham chiu bi kho ngoi fk_nhanvien_madv trong bng NHANVIEN. xo bng DONVI ra khi c s d liu, ta thc hin hai cu lnh sau: Xo b rng buc fk_nhanvien_madv khi bng NHANVIEN:
ALTER TABLE nhanvien DROP CONSTRAINT fk_nhanvien_madv
Xo bng DONVI:
DROP TABLE donvi
Khi khung nhn DSSV c nh ngha, ta c th s dng cu lnh SELECT truy vn d liu t khung nhn nh i vi cc bng. Khi trong cu truy vn xut hin khung nhn, h qun tr c s d liu s da vo inh ngha ca khung nhn chuyn yu cu truy vn d liu lin quan n khung nhn thnh yu cu tng t trn cc bng c s v vic truy vn d liu c thc hin bi yu cu tng ng trn cc bng. Vic s dng khung nhn trong c s d liu em li cc li ch sau y: Bo mt d liu: Ngi s dng c cp pht quyn trn cc khung nhn vi nhng phn d liu m ngi s dng c php. iu ny hn ch c phn no vic ngi s dng truy cp trc tip d liu.
82
n gin ho cc thao tc truy vn d liu: Mt khung nhn ng vai tr nh l mt i tng tp hp d liu t nhiu bng khc nhau vo trong mt bng. Nh vo , ngi s dng c th thc hin cc yu cu truy vn d liu mt cch n gin t khung nhn thay v phi a ra nhng cu truy vn phc tp. Tp trung v n gin ho d liu: Thng qua khung nhn ta c th cung cp cho ngi s dng nhng cu trc n gin, d hiu hn v d liu trong c s d liu ng thi gip cho ngi s dng tp trung hn trn nhng phn d liu cn thit. c lp d liu: Mt khung nhn c th cho php ngi s dng c c ci nhn v d liu c lp vi cu trc ca cc bng trong c s d liu cho d cc bng c s c b thay i phn no v cu trc.
Table SINHVIEN
Table LOP
view DSSV
Hnh 3.3 Khung nhn DSSV vi d liu c ly t bng SINHVIEN v LOP Tuy nhin, vic s dng khung nhn cng tn ti mt s nhc im sau: Do h qun tr c s d liu thc hin vic chuyn i cc truy vn trn khung nhn thnh nhng truy vn trn cc bng c s nn nu mt khung
83
nhn c nh ngha bi mt truy vn phc tp th s dn n chi ph v mt thi gian khi thc hin truy vn lin quan n khung nhn s ln. Mc d thng qua khung nhn c th thc hin c thao tc b sung v cp nht d liu cho bng c s nhng ch hn ch i vi nhng khung nhn n gin. i vi nhng khung nhn phc tp th thng khng thc hin c; hay ni cch khc l d liu trong khung nhn l ch c.
V d 3.11: Cu lnh di y to khung nhn c tn DSSV t cu lnh SELECT truy vn d liu t hai bng SINHVIEN v LOP
CREATE VIEW dssv AS SELECT masv,hodem,ten, DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop FROM sinhvien,lop WHERE sinhvien.malop=lop.malop
ta c c kt qu nh sau:
84
Nu trong cu lnh CREATE VIEW, ta khng ch nh danh sch cc tn ct cho khung nhn, tn cc ct trong khung nhn s chnh l tiu cc ct trong kt qu ca cu lnh SELECT. Trong trng hp tn cc ct ca khung nhn c ch nh, chng phi c cng s lng vi s lng ct trong kt qu ca cu truy vn. V d 3.12: Cu lnh di y to khung nhn t cu truy vn tng t nh v d trn nhng c t tn cho cc ct trong khung nhn:
CREATE VIEW dssv(ma,ho,ten,tuoi,lop) AS SELECT masv,hodem,ten, DATEDIFF(YY,ngaysinh,GETDATE()),tenlop FROM sinhvien,lop WHERE sinhvien.malop=lop.malop
v cu lnh:
SELECT * FROM dssv
Khi to khung nhn vi cu lnh CREATE VIEW, ta cn phi lu mt s nguyn tc sau: Tn khung nhn v tn ct trong khung nhn, cng ging nh bng, phi tun theo qui tc nh danh. Khng th qui nh rng buc v to ch mc cho khung nhn. Cu lnh SELECT vi mnh COMPUTE ... BY khng c s dng nh ngha khung nhn. Phi t tn cho cc ct ca khung nhn trong cc trng hp sau y:
85
Trong kt qu ca cu lnh SELECT c t nht mt ct c sinh ra bi mt biu thc (tc l khng phi l mt tn ct trong bng c s) v ct khng c t tiu . Tn ti hai ct trong kt qu ca cu lnh SELECT c cng tiu ct. V d 3.13: Cu lnh di y l cu lnh sai do ct th 4 khng xc nh c tn ct
CREATE VIEW tuoisinhvien AS SELECT masv,hodem,ten,DATEDIFF(YY,ngaysinh,GETDATE()) FROM sinhvien
86
PRIMARY KEY, NOT NULL, NULL, NULL, FOREIGN KEY REFERENCES donvi(madv) ON DELETE CASCADE ON UPDATE CASCADE
Bng DONVI
Bng NHANVIEN Cu lnh di y nh ngha khung nhn NV1 cung cp cc thng tin v m nhn vin, h tn v m n v nhn vin lm vic:
CREATE VIEW nv1 AS SELECT manv,hoten,madv FROM nhanvien
87
Thng qua khung nhn ny, ta cng c th thc hin thao tc cp nht v xo d liu. Chng hn, nu ta thc hin cu lnh:
DELETE FROM nv1 WHERE manv='NV04'
Th bn ghi tng ng vi nhn vin c m NV04 s b xo khi bng NHANVIEN Nu trong danh sch chn ca cu lnh SELECT c s xut hin ca biu thc tnh ton n gin, thao tc b sung d liu thng qua khung nhn khng th thc hin c. Tuy nhin, trong trng hp ny thao tc cp nht v xo d liu vn c th c kh nng thc hin c (hin nhin khng th cp nht d liu i vi mt ct c c t mt biu thc tnh ton). V d 3.15: Xt khung nhn NV2 c nh ngha nh sau:
CREATE VIEW nv2 AS SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,madv FROM nhanvien
i vi khung nhn NV2, ta khng th thc hin thao tc b sung d liu nhng c th cp nht hoc xo d liu trn bng thng qua khung nhn ny. Cu lnh di y l khng th thc hin c trn khung nhn NV2
INSERT INTO nv2(manv,hoten,madv) VALUES('NV05','Le Van E',1)
Nhng cu lnh:
UPDATE nv2 SET hoten='Le Thi X' WHERE manv='NV04'
hoc cu lnh
DELETE FROM nv2 WHERE manv='NV04'
li c th thc hin c v c tc ng i vi d liu trong bng NHANVIEN. Trong trng hp khung nhn c to ra t mt php ni (trong hoc ngoi) trn nhiu bng, ta c th thc hin c thao tc b sung hoc cp nht d liu nu thao tc ny ch c tc ng n ng mt bng c s (cu lnh DELETE khng th thc hin c trong trng hp ny). V d 3.16: Vi khung nhn c nh ngha nh sau:
CREATE VIEW nv3 AS SELECT manv,hoten,ngaysinh, diachi,nhanvien.madv AS noilamviec, donvi.madv,tendv,dienthoai 88
Cu lnh:
INSERT INTO nv3(manv,hoten,noilamviec) VALUES('NV05','Le Van E',1)
b sung thm vo bng DONVI mt bn ghi do c hai cu lnh ny ch c tc ng n ng mt bng c s. Cu lnh di y khng th thc hin c do c tc ng mt lc n hai bng c s.
INSERT INTO nv3(manv,hoten,noilamviec,madv,tendv) VALUES('NV05','Le Van E',1,3,'P. Ke toan')
89
Nu mt khung nhn b xo, ton b nhng quyn cp pht cho ngi s dng trn khung nhn cng ng thi b xo. Do , nu ta to li khung nhn th phi tin hnh cp pht li quyn cho ngi s dng. V d 3.18: Cu lnh di y xo khung nhn VIEW_LOP ra khi c s d liu
DROP VIEW view_lop
Bi tp chng 3
3.1 S dng cu lnh CREATE TABLE to cc bng trong c s d liu nh s di y (bn t la chn kiu d liu cho ph hp)
90
B sung rng buc thit lp gi tr mc nh bng 1 cho ct SOLUONG v bng 0 cho ct MUCGIAMGIA trong bng CHITIETDATHANG B sung cho bng DONDATHANG rng buc kim tra ngy giao hng v ngy chuyn hng phi sau hoc bng vi ngy t hng. B sung rng buc cho bng NHANVIEN m bo rng mt nhn vin ch c th lm vic trong cng ty khi 18 tui v khng qu 60 tui. Vi cc bng to c, cu lnh:
DROP TABLE nhacungcap
c th thc hin c khng? Ti sao? 3.6 Cho khung nhn c nh ngha nh sau:
CREATE VIEW view_donhang AS SELECT dondathang.sohoadon,makhachhang,manhanvien, ngaydathang,ngaygiaohang,ngaychuyenhang, noigiaohang,mahang, giaban,soluong,mucgiamgia FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon = chitietdathang.sohoadon
a. C th thng qua khung nhn ny b sung d liu cho bng DONDATHANG c khng? b. C th thng qua khung nhn ny b sung d liu cho bng CHITIETDATHANG c khng? 3.7 Vi khung nhn c nh ngha nh sau:
CREATE VIEW view_donhang AS SELECT dondathang.sohoadon,makhachhang,manhanvien, ngaydathang,ngaygiaohang,ngaychuyenhang, noigiaohang,mahang, giaban*soluong as thanhtien, mucgiamgia FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoadon = chitietdathang.sohoadon
a. C th thng qua khung nhn ny xo hay cp nht d liu trong bng DONDATHANG c khng? b. C th thng qua khung nhn ny cp nht d liu trong bng CHITIETDATHANG c khng?
91
Li gii
3.1 To cc bng d liu:
CREATE TABLE nhacungcap ( macongty NVARCHAR(10) NOT NULL CONSTRAINT pk_nhacungcap PRIMARY KEY(macongty), tencongty NVARCHAR(40) NOT NULL, tengiaodich NVARCHAR(30) NULL, diachi NVARCHAR(60) NULL, dienthoai NVARCHAR(20) NULL, fax NVARCHAR(20) NULL, email NVARCHAR(50) NULL ) CREATE TABLE loaihang ( maloaihang INT NOT NULL CONSTRAINT pk_loaihang PRIMARY KEY(maloaihang), tenloaihang NVARCHAR(15) NOT NULL ) CREATE TABLE mathang ( mahang NVARCHAR(10) NOT NULL CONSTRAINT pk_mathang PRIMARY KEY(mahang), tenhang NVARCHAR(50) NOT NULL, macongty NVARCHAR(10) NULL , maloaihang INT NULL , soluong INT NULL, donvitinh NVARCHAR(20) NULL , giahang MONEY NULL ) CREATE TABLE nhanvien ( manhanvien NVARCHAR(10)
NOT NULL 92
CONSTRAINT pk_nhanvien PRIMARY KEY(manhanvien), NVARCHAR(20) NOT NULL , NVARCHAR(10) NOT NULL , DATETIME NULL , DATETIME NULL , NVARCHAR(50) NULL , NVARCHAR(15) NULL , MONEY NULL , MONEY NULL
CREATE TABLE khachhang ( makhachhang NVARCHAR(10) NOT NULL CONSTRAINT pk_khachhang PRIMARY KEY(makhachhang), tencongty NVARCHAR(50) NOT NULL , tengiaodich NVARCHAR(30) NOT NULL , diachi NVARCHAR(50) NULL , email NVARCHAR(30) NULL , dienthoai NVARCHAR(15) NULL , fax NVARCHAR(15) NULL ) CREATE TABLE dondathang ( sohoadon INT NOT NULL CONSTRAINT pk_dondathang PRIMARY KEY(sohoadon), makhachhang NVARCHAR(10) NULL , manhanvien NVARCHAR(10) NULL , ngaydathang SMALLDATETIME NULL , ngaygiaohang SMALLDATETIME NULL , ngaychuyenhang SMALLDATETIME NULL , noigiaohang NVARCHAR(50) NULL ) CREATE TABLE chitietdathang ( 93
sohoadon INT mahang NVARCHAR(10) giaban MONEY soluong SMALLINT mucgiamgia REAL CONSTRAINT pk_chitietdathang PRIMARY KEY(sohoadon,mahang) )
3.2
ALTER TABLE chitietdathang ADD CONSTRAINT df_chitietdathang_soluong DEFAULT(1) FOR soluong, CONSTRAINT df_chitietdathang_mucgiamgia DEFAULT(0) FOR Mucgiamgia ALTER TABLE dondathang ADD CONSTRAINT chk_dondathang_ngay CHECK (ngaygiaohang>=ngaydathang AND ngaychuyenhang>=ngaydathang) ALTER TABLE nhanvien ADD CONSTRAINT chk_nhanvien_ngaylamviec CHECK (datediff(yy,ngaysinh,ngaylamviec) BETWEEN 18 AND 60)
3.3
3.4
3.5 Cu lnh khng thc hin c do bng cn xo ang c tham chiu bi bng MATHANG 3.6 3.7 a. Khng. a.C th cp nht nhng khng th xo b. Khng b. C th c
_______________________________________
95
Chng 4
BO MT TRONG SQL
96
Lnh GRANT: S dng cp pht quyn cho ngi s dng trn cc i tng c s d liu hoc quyn s dng cc cu lnh SQL trong c s d liu. Lnh REVOKE: c s dng thu hi quyn i vi ngi s dng.
Trong :
ALL [PRIVILEGES]
Cp pht tt c cc quyn cho ngi dng trn i tng c s d liu c ch nh. Cc quyn c th cp pht cho ngi dng bao gm: i vi bng, khung nhn, v hm tr v d liu kiu bng: SELECT, INSERT, DELETE, UPDATE v REFERENCES. i vi ct trong bng, khung nhn: SELECT v UPDATE. i vi th tc lu tr v hm v hng:
97
EXECUTE. Trong cc quyn c cp n trn, quyn REFERENCES c s dng nhm cho php to kha ngoi tham chiu n bng cp pht.
cc_quyn_cp_pht
Danh sch cc quyn cn cp pht cho ngi dng trn i tng c s d liu c ch nh. Cc quyn c phn cch nhau bi du phy Tn ca bng hoc khung nhn cn cp pht quyn. Danh sch cc ct ca bng hoc khung nhn cn cp pht quyn. Tn ca th tc c cp pht cho ngi dng. Tn hm (do ngi dng nh ngha) c cp pht quyn. Danh sch tn ngi dng nhn quyn c cp pht. Tn ca cc ngi dng c phn cch nhau bi du phy. Cho php ngi dng chuyn tip quyn cho ngi dng khc.
Cc v d di y s minh ho cho ta cch s dng cu lnh GRANT cp pht quyn cho ngi dng trn cc i tng c s d liu. V d 4.1: Cp pht cho ngi dng c tn thuchanh quyn thc thi cc cu lnh SELECT, INSERT v UPDATE trn bng LOP
GRANT SELECT,INSERT,UPDATE ON lop TO thuchanh
Cho php ngi dng thuchanh quyn xem h tn v ngy sinh ca cc sinh vin (ct HODEM,TEN v NGAYSINH ca bng SINHVIEN)
GRANT SELECT (hodem,ten,ngaysinh) ON sinhvien TO thuchanh
hoc:
GRANT SELECT ON sinhvien(hodem,ten,ngaysinh) TO thuchanh
98
Vi quyn c cp pht nh trn, ngi dng thuchanh c th thc hin cu lnh sau trn bng SINHVIEN
SELECT hoden,ten,ngaysinh FROM sinhvien
Trong trng hp cn cp pht tt c cc quyn c th thc hin c trn i tng c s d liu cho ngi dng, thay v lit k cc cu lnh, ta ch cn s dng t kho ALL PRIVILEGES (t kha PRIVILEGES c th khng cn ch nh). Cu lnh di y cp pht cho ngi dng thuchanh cc quyn SELECT, INSERT, UPDATE, DELETE V REFERENCES trn bng DIEMTHI
GRANT ALL ON DIEMTHI TO thuchanh
Khi ta cp pht quyn no cho mt ngi dng trn mt i tng c s d liu, ngi dng c th thc thi cu lnh c cho php trn i tng cp pht. Tuy nhin, ngi dng khng c quyn cp pht nhng quyn m mnh c php cho nhng ngi s dng khc.Trong mt s trng hp, khi ta cp pht quyn cho mt ngi dng no , ta c th cho php ngi chuyn tip quyn cho ngi dng khc bng cch ch nh tu chn WITH GRANT OPTION trong cu lnh GRANT. V d 4.2: Cho php ngi dng thuchanh quyn xem d liu trn bng SINHVIEN ng thi c th chuyn tip quyn ny cho ngi dng khc
GRANT SELECT ON sinhvien TO thuchanh WITH GRANT OPTION
To th tc lu tr: CREATE PROCEDURE To hm: CREATE FUNCTION Sao lu c s d liu: BACKUP DATABASE Cu lnh GRANT s dng trong trng hp ny c c php nh sau:
GRANT ALL | danh_sch_cu_lnh TO danh_sch_ngi_dng
V d 4.3: cp pht quyn to bng v khung nhn cho ngi dng c tn l thuchanh, ta s dng cu lnh nh sau:
GRANT CREATE TABLE,CREATE VIEW TO thuchanh
Vi cu lnh GRANT, ta c th cho php ngi s dng to cc i tng c s d liu trong c s d liu. i tng c s d liu do ngi dng no to ra s do ngi s hu v do ngi ny c quyn cho ngi dng khc s dng i tng v cng c th xa b (DROP) i tng do mnh to ra. Khc vi trng hp s dng cu lnh GRANT cp pht quyn trn i tng c s d liu, cu lnh GRANT trong trng hp ny khng th s dng tu chn WITH GRANT OPTION, tc l ngi dng khng th chuyn tip c cc quyn thc thi cc cu lnh c cp pht.
Cu lnh REVOKE c th s dng thu hi mt s quyn cp pht cho ngi dng hoc l thu hi tt c cc quyn (ALL PRIVILEGES). V d 4.4: Thu hi quyn thc thi lnh INSERT trn bng LOP i vi ngi dng thuchanh.
REVOKE INSERT ON lop FROM thuchanh
Gi s ngi dng thuchanh c cp pht quyn xem d liu trn cc ct HODEM, TEN v NGAYSINH ca bng SINHVIEN, cu lnh di y s thu hi quyn cp pht trn ct NGAYSINH (ch cho php xem d liu trn ct HODEM v TEN)
REVOKE SELECT ON sinhvien(ngaysinh) FROM thuchanh
Khi ta s dng cu lnh REVOKE thu hi quyn trn mt i tng c s d liu t mt ngi dng no , ch nhng quyn m ta cp pht trc mi c thu hi, nhng quyn m ngi dng ny c cho php bi nhng ngi dng khc vn cn c hiu lc. Ni cch khc, nu hai ngi dng khc nhau cp pht cng cc quyn trn cng mt i tng c s d liu cho mt ngi dng khc, sau ngi thu nht thu hi li quyn cp pht th nhng quyn m ngi dng th hai cp pht vn c hiu lc. V d 4.5: Gi s trong c s d liu ta c 3 ngi dng l A, B v C. A v B u c quyn s dng v cp pht quyn trn bng R. A thc hin lnh sau cp pht quyn xem d liu trn bng R cho C:
GRANT SELECT ON R TO C
v B cp pht quyn xem v b sung d liu trn bng R cho C bng cu lnh:
GRANT SELECT, INSERT ON R TO C
Nh vy, C c quyn xem v b sung d liu trn bng R. By gi, nu B thc hin lnh:
101
Ngi dng C s khng cn quyn b sung d liu trn bng R nhng vn c th xem c d liu ca bng ny (quyn ny do A cp cho C v vn cn hiu lc). Nu ta cp pht quyn cho ngi dng no bng cu lnh GRANT vi tu chn WITH GRANT OPTION th khi thu hi quyn bng cu lnh REVOKE phi ch nh tu chn CASCADE. Trong trng hp ny, cc quyn c chuyn tip cho nhng ngi dng khc cng ng thi c thu hi. V d 4.6: Ta cp pht cho ngi dng A trn bng R vi cu lnh GRANT nh sau:
GRANT SELECT ON R TO A WITH GRANT OPTION
sau ngi dng A li cp pht cho ngi dng B quyn xem d liu trn R vi cu lnh:
GRANT SELECT ON R TO B
Nu mun thu hi quyn cp pht cho ngi dng A, ta s dng cu lnh REVOKE nh sau:
REVOKE SELECT ON NHANVIEN FROM A CASCADE
Cu lnh trn s ng thi thu hi quyn m A cp cho B v nh vy c A v B u khng th xem c d liu trn bng R. Trong trng hp cn thu hi cc quyn c chuyn tip v kh nng chuyn tip cc quyn i vi nhng ngi c cp pht quyn vi tu chn WITH GRANT OPTION, trong cu lnh REVOKE ta ch nh mnh GRANT OPTION FOR. V d 4.7: Trong v d trn, nu ta thay cu lnh:
REVOKE SELECT ON NHANVIEN FROM A CASCADE
bi cu lnh:
REVOKE GRANT OPTION FOR SELECT ON NHANVIEN FROM A CASCADE 102
Th B s khng cn quyn xem d liu trn bng R ng thi A khng th chuyn tip quyn m ta cp pht cho nhng ngi dng khc (tuy nhin A vn cn quyn xem d liu trn bng R).
V d 4.8: khng cho php ngi dng thuchanh thc hin lnh CREATE TABLE trn c s d liu, ta s dng cu lnh:
REVOKE CREATE TABLE FROM thuchanh
_______________________________________
103
Chng 5
TH TC LU TR, HM V TRIGGER
Th tc lu tr c phn tch, ti u khi to ra nn vic thc thi chng nhanh hn nhiu so vi vic phi thc hin mt tp ri rc cc cu lnh SQL tng ng theo cch thng thng. Th tc lu tr cho php chng ta thc hin cng mt yu cu bng mt cu lnh n gin thay v phi s dng nhiu dng lnh SQL. iu ny s lm gim thiu s lu thng trn mng. Thay v cp pht quyn trc tip cho ngi s dng trn cc cu lnh SQL v trn cc i tng c s d liu, ta c th cp pht quyn cho ngi s dng thng qua cc th tc lu tr, nh tng kh nng bo mt i vi h thng.
5.1.2 To th tc lu tr
Th tc lu tr c to bi cu lnh CREATE PROCEDURE vi c php nh sau:
CREATE PROCEDURE tn_th_tc [(danh_sch_tham_s)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Cc_cu_lnh_ca_th_tc
Trong :
tn_th_tc danh_sch_tham_s
Tn ca th tc cn to. Tn phi tun theo qui tc nh danh v khng c vt qu 128 k t. Cc tham s ca th tc c khai bo ngay sau tn th tc v nu th tc c nhiu tham s th cc khai bo phn cch nhau bi du phy. Khai bo ca mi mt tham s ti thiu phi bao gm hai phn: tn tham s c bt u bi du @. kiu d liu ca tham s V d:
@mamonhoc nvarchar(10)
RECOMPILE
Thng thng, th tc s c phn tch, ti u v dch sn ln gi u tin. Nu tu chn WITH RECOMPILE c ch nh, th tc s c dch li mi khi c gi.
105
ENCRYPTION
Th tc s c m ho nu tu chn WITH ENCRYPTION c ch nh. Nu th tc c m ho, ta khng th xem c ni dung ca th tc. tc. Cc cu lnh ny c th t trong cp t kho BEGIN...END hoc c th khng.
V d 5.1: Gi s ta cn thc hin mt chui cc thao tc nh sau trn c s d liu 1. B sung thm mn hc c s d liu c m TI-005 v s n v hc trnh l 5 vo bng MONHOC 2. Ln danh sch nhp im thi mn c s d liu cho cc sinh vin hc lp c m C24102 (tc l b sung thm vo bng DIEMTHI cc bn ghi vi ct MAMONHOC nhn gi tr TI-005, ct MASV nhn gi tr ln lt l m cc sinh vin hc lp c m C24105 v cc ct im l NULL). Nu thc hin yu cu trn thng qua cc cu lnh SQL nh thng thng, ta phi thc thi hai cu lnh nh sau:
INSERT INTO MONHOC VALUES('TI-005','C s d liu',5) INSERT INTO DIEMTHI(MAMONHOC,MASV) SELECT TI-005,MASV FROM SINHVIEN WHERE MALOP='C24102'
Thay v phi s dng hai cu lnh nh trn, ta c th nh ngha mt th tc lu tr vi cc tham s vo l @mamonhoc, @tenmonhoc, @sodvht v @malop nh sau:
CREATE PROC sp_LenDanhSachDiem( @mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS BEGIN INSERT INTO monhoc VALUES(@mamonhoc,@tenmonhoc,@sodvht) INSERT INTO diemthi(mamonhoc,masv) 106
Khi th tc trn c to ra, ta c th thc hin c hai yu cu t ra trn mt cch n gin thng qua li gi th tc:
sp_LenDanhSachDiem 'TI-005','C s d liu',5,'C24102'
5.1.3 Li gi th tc lu tr
Nh thy v d trn, khi mt th tc lu tr c to ra, ta c th yu cu h qun tr c s d liu thc thi th tc bng li gi th tc c dng:
tn_th_tc [danh_sch_cc_i_s]
S lng cc i s cng nh th t ca chng phi ph hp vi s lng v th t ca cc tham s khi nh ngha th tc. Trong trng hp li gi th tc c thc hin bn trong mt th tc khc, bn trong mt trigger hay kt hp vi cc cu lnh SQL khc, ta s dng c php nh sau:
EXECUTE tn_th_tc [danh_sch_cc_i_s]
Th t ca cc i s c truyn cho th tc c th khng cn phi tun theo th t ca cc tham s nh khi nh ngha th tc nu tt c cc i s c vit di dng:
@tn_tham_s = gi_tr
Tn bin phi bt u bi k t @ v tun theo qui tc v nh danh. V d di y minh ho vic s dng bin trong th tc
107
Cu lnh SELECT @tong cui cng trong lot cc cu lnh trn s cho kt qu l: 0 Trong trng hp cn phi gi li gi tr ca i s sau khi kt thc th tc, ta phi khai bo tham s ca th tc theo c php nh sau:
@tn_tham_s kiu_d_liu kiu_d_liu OUTPUT OUT
hoc:
@tn_tham_s
v trong li gi th tc, sau i s c truyn cho th tc, ta cng phi ch nh thm t kho OUTPUT (hoc OUT) V d 5.5: Ta nh ngha li th tc v d 5.4 nh sau:
CREATE PROCEDURE sp_Conghaiso( @a @b @c AS SELECT @c=@a+@b INT, INT, INT OUTPUT)
5.1.6 Tham s vi gi tr mc nh
Cc tham s c khai bo trong th tc c th nhn cc gi tr mc nh. Gi tr mc nh s c gn cho tham s trong trng hp khng truyn i s cho tham s khi c li gi n th tc. Tham s vi gi tr mc nh c khai bo theo c php nh sau:
@tn_tham_s kiu_d_liu = gi_tr_mc_nh
@tenlop NVARCHAR(30)=NULL, @noisinh NVARCHAR(100)='Hu') AS BEGIN IF @tenlop IS NULL SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh ELSE SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh AND tenlop=@tenlop END
th tc sp_TestDefault c nh ngha vi tham s @tenlop c gi tr mc nh l NULL v tham s @noisinh c gi tr mc nh l Hu. Vi th tc c nh ngha nh trn, ta c th thc hin cc li gi vi cc mc ch khc nhau nh sau: Cho bit h tn ca cc sinh vin sinh ti Hu:
sp_testdefault
5.1.7 Sa i th tc
Khi mt th tc c to ra, ta c th tin hnh nh ngha li th tc bng cu lnh ALTER PROCEDURE c c php nh sau:
ALTER PROCEDURE tn_th_tc [(danh_sch_tham_s)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Cc_cu_lnh_Ca_th_tc
110
Cu lnh ny s dng tng t nh cu lnh CREATE PROCEDURE. Vic sa i li mt th tc c khng lm thay i n cc quyn cp pht trn th tc cng nh khng tc ng n cc th tc khc hay trigger ph thuc vo th tc ny. 5.1.8 Xo th tc xo mt th tc c, ta s dng cu lnh DROP PROCEDURE vi c php nh sau:
DROP PROCEDURE tn_th_tc
Khi xo mt th tc, tt c cc quyn cp cho ngi s dng trn th tc cng ng thi b xo b. Do , nu to li th tc, ta phi tin hnh cp pht li cc quyn trn th tc .
V d 5.7: Cu lnh di y nh ngha hm tnh ngy trong tun (th trong tun) ca mt gi tr kiu ngy
CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10) AS BEGIN 111
DECLARE @st NVARCHAR(10) SELECT @st=CASE DATEPART(DW,@ngay) WHEN 1 THEN 'Chu nht' WHEN 2 THEN 'Th hai' WHEN 3 THEN 'Th ba' WHEN 4 THEN 'Th t' WHEN 5 THEN 'Th nm' WHEN 6 THEN 'Th su' ELSE 'Th by' END RETURN (@st) /* Tr tr v ca hm */ END
Mt hm khi c nh ngha c th c s dng nh cc hm do h qun tr c s d liu cung cp (thng thng trc tn hm ta phi ch nh thm tn ca ngi s hu hm) V d 5.8: Cu lnh SELECT di y s dng hm c nh ngha v d trc:
SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh FROM sinhvien WHERE malop=C24102
c kt qu l:
ta c th bit c danh sch cc sinh vin kho 25 mt cch d dng nhng r rng khng th thng qua khung nhn ny bit c danh sch sinh vin cc kho khc do khng th s dng iu kin c dng KHOA = @thamso trong mnh WHERE ca cu lnh SELECT c. Nhc im trn ca khung nhn c th khc phc bng cch s dng hm vi gi tr tr v di dng bng v c gi l hm ni tuyn (inline function). Vic s dng hm loi ny cung cp kh nng nh khung nhn nhng cho php chng ta s dng c cc tham s v nh tnh linh hot s cao hn. Mt hm ni tuyn c nh ngha bi cu lnh CREATE TABLE vi c php nh sau:
CREATE FUNCTION tn_hm ([danh_sch_tham_s]) RETURNS TABLE AS RETURN (cu_lnh_select)
C php ca hm ni tuyn phi tun theo cc qui tc sau: Kiu tr v ca hm phi c ch nh bi mnh RETURNS TABLE. Trong phn thn ca hm ch c duy nht mt cu lnh RETURN xc nh gi tr tr v ca hm thng qua duy nht mt cu lnh SELECT. Ngoi ra, khng s dng bt k cu lnh no khc trong phn thn ca hm. V d 5.10: Ta nh ngha hm func_XemSV nh sau:
CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLE AS 113
RETURN(SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE khoa=@khoa)
hm trn nhn tham s u vo l kha ca sinh vin cn xem v gi tr tr v ca hm l tp cc dng d liu cho bit thng tin v cc sinh vin ca kho . Cc hm tr v gi tr di dng bng c s dng nh l cc bng hay khung nhn trong cc cu lnh SQL. Vi hm c nh ngha nh trn, bit danh sch cc sinh vin kho 25, ta s dng cu lnh nh sau:
SELECT * FROM dbo.func_XemSV(25)
i vi hm ni tuyn, phn thn ca hm ch cho php s xut hin duy nht ca cu lnh RETURN. Trong trng hp cn phi s dng n nhiu cu lnh trong phn thn ca hm, ta s dng c php nh sau nh ngha hm:
CREATE FUNCTION tn_hm([danh_sch_tham_s]) RETURNS @bin_bng TABLE nh_ngha_bng AS BEGIN cc_cu_lnh_trong_thn_hm RETURN END
Khi nh ngha hm dng ny cn lu mt s im sau: Cu trc ca bng tr v bi hm c xc nh da vo nh ngha ca bng trong mnh RETURNS. Bin @bin_bng trong mnh RETURNS c phm vi s dng trong hm v c s dng nh l mt tn bng. Cu lnh RETURN trong thn hm khng ch nh gi tr tr v. Gi tr tr v ca hm chnh l cc dng d liu trong bng c tn l @binbng c nh ngha trong mnh RETURNS Cng tng t nh hm ni tuyn, dng hm ny cng c s dng trong cc cu lnh SQL vi vai tr nh bng hay khung nhn. V d di y minh ho cch s dng dng hm ny trong SQL.
114
115
Cn cu lnh:
SELECT * FROM dbo.func_TongSV(0)
5.3 Trigger
Trong chng 4, ta bit cc rng buc c s dng m bo tnh ton vn d liu trong c s d liu. Mt i tng khc cng thng c s dng trong cc c s d liu cng vi mc ch ny l cc trigger. Cng tng t nh th tc lu tr, mt trigger l mt i tng cha mt tp cc cu lnh SQL v tp cc cu lnh ny s c thc thi khi trigger c gi. im khc bit gia th tc lu tr v trigger l: cc th tc lu tr c thc thi khi ngi s dng c li gi n chng cn cc trigger li c gi t ng khi xy ra nhng giao tc lm thay i d liu trong cc bng. Mi mt trigger c to ra v gn lin vi mt bng no trong c s d liu. Khi d liu trong bng b thay i (tc l khi bng chu tc ng ca cc cu lnh INSERT, UPDATE hay DELETE) th trigger s c t ng kch hot. S dng trigger mt cch hp l trong c s d liu s c tc ng rt ln trong vic tng hiu nng ca c s d liu. Cc trigger thc s hu dng vi nhng kh nng sau: Mt trigger c th nhn bit, ngn chn v hu b c nhng thao tc lm thay i tri php d liu trong c s d liu. Cc thao tc trn d liu (xo, cp nht v b sung) c th c trigger pht hin ra v t ng thc hin mt lot cc thao tc khc trn c s d liu nhm m bo tnh hp l ca d liu.
116
Thng qua trigger, ta c th to v kim tra c nhng mi quan h phc tp hn gia cc bng trong c s d liu m bn thn cc rng buc khng th thc hin c.
NVARCHAR(30), /*tn ngi mua hng*/ NVARCHAR(5) /*m mt hng c bn*/ FOREIGN KEY REFERENCES mathang(mahang), INT, /*gi bn hng*/ MONEY /*s lng hng c bn*/
Cu lnh di y nh ngha trigger trg_nhatkybanhang_insert. Trigger ny c chc nng t ng gim s lng hng hin c khi mt mt hng no c bn (tc l khi cu lnh INSERT c thc thi trn bng NHATKYBANHANG).
CREATE TRIGGER trg_nhatkybanhang_insert ON nhatkybanhang FOR INSERT AS UPDATE mathang SET mathang.soluong=mathang.soluong-inserted.soluong FROM mathang INNER JOIN inserted ON mathang.mahang=inserted.mahang
Vi trigger va to trn, nu d liu trong bng MATHANG l: th sau khi ta thc hin cu lnh:
INSERT INTO nhatkybanhang (ngay,nguoimua,mahang,soluong,giaban) VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200)
Trong cu lnh CREATE TRIGGER v d trn, sau mnh ON l tn ca bng m trigger cn to s tc ng n. Mnh tip theo ch nh cu lnh s kch hot trigger (FOR INSERT). Ngoi INSERT, ta cn c th ch nh UPDATE hoc DELETE cho mnh ny, hoc c th kt hp chng li vi nhau. Phn thn ca
trigger nm sau t kho AS bao gm cc cu lnh m trigger s thc thi khi c kch hot.
118
Chun SQL nh ngha hai bng logic INSERTED v DELETED s dng trong cc trigger. Cu trc ca hai bng ny tng t nh cu trc ca bng m trigger tc ng. D liu trong hai bng ny tu thuc vo cu lnh tc ng ln bng lm kch hot trigger; c th trong cc trng hp sau: Khi cu lnh DELETE c thc thi trn bng, cc dng d liu b xo s c sao chp vo trong bng DELETED. Bng INSERTED trong trng hp ny khng c d liu. D liu trong bng INSERTED s l dng d liu c b sung vo bng gy nn s kch hot i vi trigger bng cu lnh INSERT. Bng DELETED trong trng hp ny khng c d liu. Khi cu lnh UPDATE c thc thi trn bng, cc dng d liu c chu s tc ng ca cu lnh s c sao chp vo bng DELETED, cn trong bng INSERTED s l cc dng sau khi c cp nht.
s kch hot trigger ng vi mnh IF UPDATE (soluong) v cu lnh UPDATE trong trigger s c thc thi. Tuy nhin cu lnh:
UPDATE nhatkybanhang SET nguoimua='Mai Hu Ton' WHERE stt=3
li khng kch hot trigger ny. Mnh IF UPDATE c th xut hin nhiu ln trong phn thn ca trigger. Khi , mnh IF UPDATE no ng th phn cu lnh ca mnh s c thc thi khi trigger c kch hot. V d 5.14: Gi s ta nh ngha bng R nh sau:
CREATE TABLE R ( A INT, B INT, C INT )
Cu lnh:
UPDATE R SET A=100 WHERE A=1
v cu lnh:
UPDATE R SET C=100 WHERE C=2
cn cu lnh:
UPDATE R SET B=100 WHERE B=3
Th cu lnh DELETE s khng th c tc dng i vi bng MATHANG. Hay ni cch khc, ta khng th xo c d liu trong bng. V d 5.16: Trigger di y c kch hot khi cu lnh INSERT c s dng b sung mt bn ghi mi cho bng NHATKYBANHANG. Trong trigger ny kim tra iu kin hp l ca d liu l s lng hng bn ra phi nh hn hoc bng s lng hng hin c. Nu iu kin ny khng tho mn th hu b thao tc b sung d liu.
CREATE TRIGGER trg_nhatkybanhang_insert ON NHATKYBANHANG FOR INSERT AS DECLARE @sl_co int /* S lng hng hin c */ DECLARE @sl_ban int /* S lng hng c bn */ DECLARE @mahang nvarchar(5) /* M hng c bn */ SELECT @mahang=mahang,@sl_ban=soluong FROM inserted SELECT @sl_co = soluong FROM mathang where mahang=@mahang /*Nu s lng hng hin c nh hn s lng bn th hu b thao tc b sung d liu */
(1)
Cch s dng v ngha ca cu lnh ROLLBACK TRANSACTION c bn lun chi tit chng 6.
121
IF @sl_co<@sl_ban ROLLBACK TRANSACTION /* Nu d liu hp l th gim s lng hng hin c */ ELSE UPDATE mathang SET soluong=soluong-@sl_ban WHERE mahang=@mahang
5.3.4 S dng trigger trong trng hp cu lnh INSERT, UPDATE v DELETE c tc ng n nhiu dng d liu
Trong cc v d trc, cc trigger ch thc s hot ng ng mc ch khi cc cu lnh kch hot trigger ch c tc dng i vi ng mt dng d liu. Ta c th nhn thy l cu lnh UPDATE v DELETE thng c tc dng trn nhiu dng, cu lnh INSERT mc d t ri vo trng hp ny nhng khng phi l khng gp; l khi ta s dng cu lnh c dng INSERT INTO ... SELECT ... Vy lm th no trigger hot ng ng trong trng hp nhng cu lnh c tc ng ln nhiu dng d liu? C hai gii php c th s dng i vi vn ny: S dng truy vn con. S dng bin con tr. 5.3.4.1 S dng truy vn con Ta hnh dung vn ny v cch khc phc qua v d di y: V d 5.17: Ta xt li trng hp ca hai bng MATHANG v NHATKYBANHANG nh s di y:
122
Trigger di y cp nht li s lng hng ca bng MATHANG khi cu lnh UPDATE c s dng cp nht ct SOLUONG ca bng NHATKYBANHANG.
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang
Bng MATHANG
Bng NHATKYBANHANG
d liu trong hai bng sau khi cu lnh thc hin xong s nh sau:
123
Bng MATHANG
Bng NHATKYBANHANG
Ta c th nhn thy s lng ca mt hng c m H2 cn li 40 (gim i 5) trong khi ng ra phi l 35 (tc l phi gim 10). Nh vy, trigger trn khng hot ng ng trong trng hp ny. khc phc li gp phi nh trn, ta nh ngha li trigger nh sau:
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong (SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang FROM inserted)
hoc:
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) /* Nu s lng dng c cp nht bng 1 */ IF @@ROWCOUNT = 1 BEGIN UPDATE mathang SET mathang.soluong = mathang.soluong (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang 124
END ELSE BEGIN UPDATE mathang SET mathang.soluong = mathang.soluong (SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang FROM inserted) END
5.3.4.2 S dng bin con tr Mt cch khc khc phc li xy ra nh trong v d 5.17 l s dng con tr duyt qua cc dng d liu v kim tra trn tng dng. Tuy nhin, s dng bin con tr trong trigger l gii php nn chn trong trng hp thc s cn thit. Mt bin con tr c s dng duyt qua cc dng d liu trong kt qu ca mt truy vn v c khai bo theo c php nh sau:
DECLARE tn_con_tr FOR cu_lnh_SELECT CURSOR
Trong cu lnh SELECT phi c kt qu di dng bng. Tc l trong cu lnh khng s dng mnh COMPUTE v INTO. m mt bin con tr ta s dng cu lnh:
OPEN tn_con_tr
s dng bin con tr duyt qua cc dng d liu ca truy vn, ta s dng cu lnh FETCH. Gi tr ca bin trng thi @@FETCH_STATUS bng khng nu cha duyt ht cc dng trong kt qu truy vn. Cu lnh FETCH c c php nh sau:
FETCH [[NEXT|PRIOR|FIST|LAST] FROM] tn_con_tr [INTO danh_sch_bin ]
Trong cc bin trong danh sch bin c s dng cha cc gi tr ca cc trng ng vi dng d liu m con tr tr n. S lng cc bin phi bng vi s lng cc ct ca kt qu truy vn trong cu lnh DECLARE CURSOR. V d 5.18: Tp cc cu lnh trong v d di y minh ho cch s dng bin con tr duyt qua cc dng trong kt qu ca cu lnh SELECT
125
DECLARE contro CURSOR FOR SELECT mahang,tenhang,soluong FROM mathang OPEN contro DECLARE @mahang NVARCHAR(10) DECLARE @tenhang NVARCHAR(10) DECLARE @soluong INT /*Bt u duyt qua cc dng trong kt qu truy vn*/ FETCH NEXT FROM contro INTO @mahang,@tenhang,@soluong WHILE @@FETCH_STATUS=0 BEGIN PRINT 'Ma hang:'+@mahang PRINT 'Ten hang:'+@tenhang PRINT 'So luong:'+STR(@soluong) FETCH NEXT FROM contro INTO @mahang,@tenhang,@soluong END /*ng con tr v gii phng vng nh*/ CLOSE contro DEALLOCATE contro
FETCH NEXT FROM contro INTO @mahang,@soluong WHILE @@FETCH_STATUS=0 BEGIN UPDATE mathang SET soluong=soluong-@soluong WHERE mahang=@mahang FETCH NEXT FROM contro INTO @mahang,@soluong END CLOSE contro DEALLOCATE contro END END
Bi tp chng 5
Da trn c s d liu bi tp chng 2, thc hin cc yu cu sau: 5.1 To th tc lu tr thng qua th tc ny c th b sung thm mt bn ghi mi cho bng MATHANG (th tc phi thc hin kim tra tnh hp l ca d liu cn b sung: khng trng kho chnh v m bo ton vn tham chiu) 5.2 To th tc lu tr c chc nng thng k tng s lng hng bn c ca mt mt hng c m bt k (m mt hng cn thng k l tham s ca th tc). 5.3 Vit hm tr v mt bng trong cho bit tng s lng hng bn c ca mi mt hng. S dng hm ny thng k xem tng s lng hng (hin c v bn) ca mi mt hng l bao nhiu. 5.4 Vit trigger cho bng CHITIETDATHANG theo yu cu sau: Khi mt bn ghi mi c b sung vo bng ny th gim s lng hng hin c nu s lng hng hin c ln hn hoc bng s lng hng c bn ra. Ngc li th hu b thao tc b sung. Khi cp nht li s lng hng c bn, kim tra s lng hng c cp nht li c ph hp hay khng (s lng hng bn ra khng c vt qu s lng hng hin c v khng c nh hn 1). Nu d liu hp l th gim (hoc tng) s lng hng hin c trong cng ty, ngc li th hu b thao tc cp nht. 5.5 Vit trigger cho bng CHITIETDATHANG sao cho ch chp nhn gi hng bn ra phi nh hn hoc bng gi gc (gi ca mt hng trong bng MATHANG)
127
5.6 qun l cc bn tin trong mt Website, ngi ta s dng hai bng sau: Bng LOAIBANTIN (loi bn tin)
CREATE TABLE loaibantin ( maphanloai INT PRIMARY KEY, tenphanloai NVARCHAR(100) bantinmoinhat INT )
Trong bng LOAIBANTIN, gi tr ct BANTINMOINHAT cho bit m s ca bn tin thuc loi tng ng mi nht (c b sung sau cng). Hy vit cc trigger cho bng BANTIN sao cho: Khi mt bn tin mi c b sung, cp nht li ct BANTINMOINHAT ca dng tng ng vi loi bn tin va b sung. Khi mt bn tin b xo, cp nht li gi tr ca ct BANTINMOINHAT trong bng LOAIBANTIN ca dng ng vi loi bn tin va xa l m s ca bn tin trc (da vo ngy a tin). Nu khng cn bn tin no cng loi th gi tr ca ct ny bng 0. Khi cp nht li m s ca mt bn tin v nu l bn tin mi nht th cp nht li gi tr ct BANTINMOINHAT l m s mi.
Li gii:
5.1 CREATE PROCEDURE sp_insert_mathang( @mahang NVARCHAR(10), 128
@tenhang NVARCHAR(50), @macongty NVARCHAR(10) = NULL, @maloaihang INT = NULL, @soluong INT = 0, @donvitinh NVARCHAR(20) = NULL, @giahang money = 0) AS IF NOT EXISTS(SELECT mahang FROM mathang WHERE mahang=@mahang) IF (@macongty IS NULL OR EXISTS(SELECT macongty FROM nhacungcap WHERE macongty=@macongty)) AND (@maloaihang IS NULL OR EXISTS(SELECT maloaihang FROM loaihang WHERE maloaihang=@maloaihang)) INSERT INTO mathang VALUES(@mahang,@tenhang, @macongty,@maloaihang, @soluong,@donvitinh,@giahang) CREATE PROCEDURE sp_thongkebanhang(@mahang NVARCHAR(10)) AS SELECT mathang.mahang,tenhang, SUM(chitietdathang.soluong) AS tongsoluong FROM mathang LEFT OUTER JOIN chitietdathang ON mathang.mahang=chitietdathang.mahang WHERE mathang.mahang=@mahang GROUP BY mathang.mahang,tenhang
5.2
5.3
nh ngha hm:
CREATE FUNCTION func_banhang() RETURNS TABLE AS RETURN (SELECT mathang.mahang,tenhang, CASE WHEN sum(chitietdathang.soluong) IS NULL THEN 0 ELSE sum(chitietdathang.soluong) END AS tongsl FROM mathang LEFT OUTER JOIN chitietdathang ON mathang.mahang = chitietdathang.mahang 129
GROUP BY mathang.mahang,tenhang)
S dng hm nh ngha:
SELECT a.mahang,a.tenhang,soluong+tongsl FROM mathang AS a INNER JOIN dbo.func_banhang() AS b ON a.mahang=b.mahang CREATE TRIGGER trg_chitietdathang_insert ON chitietdathang FOR INSERT AS BEGIN DECLARE @mahang NVARCHAR(100) DECLARE @soluongban INT DECLARE @soluongcon INT SELECT @mahang=mahang,@soluongban=soluong FROM inserted SELECT @soluongcon=soluong FROM mathang WHERE mahang=@mahang IF @soluongcon>=@soluongban UPDATE mathang SET soluong=soluong-@soluongban WHERE mahang=@mahang ELSE ROLLBACK TRANSACTION END CREATE TRIGGER trg_chitietdathang_update_soluong ON chitietdathang FOR UPDATE AS IF UPDATE(soluong) BEGIN IF EXISTS(SELECT sohoadon FROM inserted WHERE soluong<0) ROLLBACK TRANSACTION ELSE BEGIN UPDATE mathang SET soluong=soluong(SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted ON inserted.sohoadon=deleted.sohoadon AND 130
5.4
inserted.mahang=deleted.mahang WHERE inserted.mahang=mathang.mahang GROUP BY inserted.mahang) WHERE mahang IN (SELECT DISTINCT mahang FROM inserted) IF EXISTS(SELECT mahang FROM mathang WHERE soluong<0) ROLLBACK TRANSACTION END 5.5 END CREATE TRIGGER trg_chitietdathang_giaban ON chitietdathang FOR INSERT,UPDATE AS IF UPDATE(giaban) IF EXISTS(SELECT inserted.mahang FROM mathang INNER JOIN inserted ON mathang.mahang=inserted.mahang WHERE mathang.giahang>inserted.giaban) ROLLBACK TRANSACTION
_______________________________________
131
Chng 6
GIAO TC SQL
132
SELECT
ROLLBACK
SELECT
INSERT
INSERT
INSERT
Giao tc
UPDATE
UPDATE
UPDATE
DELETE
Li phn cng!
133
Cu lnh COMMIT TRANSACTION (hoc COMMIT WORK) c thc thi. Cu lnh ny bo hiu s kt thc thnh cng ca mt giao tc. Sau cu lnh ny, mt giao tc mi s c bt u. Khi cu lnh ROLLBACK TRANSACTION (hoc ROLLBACK WORK) c thc thi hu b mt giao tc v a c s d liu v trng thi nh trc khi giao tc bt u. Mt giao tc mi s bt u sau khi cu lnh ROLLBACK c thc thi. Mt giao tc cng s kt thc nu trong qu trnh thc hin gp li (chng hn h thng gp li, kt ni mng b t,...). Trong trng hp ny, h thng s t ng phc hi li trng thi c s d liu nh trc khi giao tc bt u (tng t nh khi cu lnh ROLLBACK c thc thi hu b mt giao tc). Tuy nhin, trong trng hp ny s khng c giao tc mi c bt u. V d 6.1: Giao tc di y kt thc do lnh ROLLBACK TRANSACTION v mi thay i v mt d liu m giao tc thc hin (UPDATE) u khng c tc dng.
BEGIN TRANSACTION giaotac1 UPDATE monhoc SET sodvht=4 WHERE sodvht=3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL ROLLBACK TRANSACTION giaotac1
cn giao tc di y kt thc bi lnh COMMIT v thc hin thnh cng vic cp nht d liu trn cc bng MONHOC v DIEMTHI.
BEGIN TRANSACTION giaotac2 UPDATE monhoc SET sodvht=4 WHERE sodvht=3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL COMMIT TRANSACTION giaotac2
Cu lnh:
SAVE TRANSACTION tn_im_dnh_du
c s dng nh du mt v tr trong giao tc. Khi cu lnh ny c thc thi, trng thi ca c s d liu ti thi im s c ghi li trong nht k giao tc. Trong qu trnh thc thi giao tc c th quay tr li mt im nh du bng cch s dng cu lnh:
ROLLBACK TRANSACTION tn_im_nh_du
Trong trng hp ny, nhng thay i v mt d liu m giao tc thc hin t im nh du n trc khi cu lnh ROLLBACK c triu gi s b hu b. Giao tc s c tip tc vi trng thi c s d liu c c ti im nh du . Hnh 6.2 m t cho ta thy hot ng ca mt giao tc c s dng cc im nh du:
134
Trng thi CSDL trc khi giao tc tin hnh BEGIN TRANSACTION trans_example INSERT UPDATE SAVE TRANSACTION a Giao tc: Bt u bi lnh BEGIN TRANSACTION v kt thc bi lnh COMMIT TRANSACTION UPDATE SAVE TRANSACTION b INSERT UPDATE ROLLBACK TRANSACTION b Trng thi CSDL ti im nh du b Trng thi CSDL ti im nh du a
UPDATE SELECT COMMIT TRANSACTION Trng thi CSDL sau khi giao tc tin hnh
Sau khi cu lnh ROLLBACK TRANSACTION c s dng quay lui li mt im nh du trong giao tc, giao tc vn c tip tc vi cc cu lnh sau . Nhng nu cu lnh ny c s dng quay lui li u giao tc (tc l hu b giao tc), giao tc s kt thc v do cu lnh COMMIT TRANSACTION trong trng hp ny s gp li. V d 6.2: Cu lnh COMMIT TRANSACTION trong giao tc di y kt thc thnh cng mt giao tc
BEGIN TRANSACTION giaotac3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL 135
SAVE TRANSACTION a UPDATE monhoc SET sodvht=4 WHERE sodvht=3 ROLLBACK TRANSACTION a UPDATE monhoc SET sodvht=2 WHERE sodvht=3 COMMIT TRANSACTION giaotac3
v th tc sp_TransEx:
CREATE PROC sp_TranEx(@a INT,@b INT) AS BEGIN BEGIN TRANSACTION T1 IF NOT EXISTS (SELECT * FROM T WHERE A=@A ) INSERT INTO T VALUES(@A,@B) IF NOT EXISTS (SELECT * FROM T WHERE A=@A+1) INSERT INTO T VALUES(@A+1,@B+1) COMMIT TRANSACTION T1 END
Trong giao tc trn, cu lnh ROLLBACK TRANSACTION T3 hu b giao tc v do tc dng ca li gi th tc trong giao tc khng cn tc dng, tc l khng c dng d liu no mi c b sung vo bng T (cho d giao tc T1 trong th tc sp_tranex thc hin thnh cng vi lnh COMMIT TRANSACTION T1). Ta xt tip mt trng hp ca mt giao tc khc trong c li gi n th tc sp_tranex nh sau:
BEGIN TRANSACTION EXECUTE sp_tranex 20,40 SAVE TRANSACTION a EXECUTE sp_tranex 30,60 ROLLBACK TRANSACTION a EXECUTE sp_tranex 40,80 COMMIT TRANSACTION
sau khi giao tc trn thc hin xong, d liu trong bng T s l:
A 20 21 40 41 B 40 41 80 81
Nh vy, tc dng ca li gi th tc sp_tranex 30,60 trong giao tc b hu b bi cu lnh ROLLBACK TRANSACTION trong giao tc. Nh thy trong v d trn, khi cc giao tc SQL c lng vo nhau, giao tc ngoi cng nht l giao tc c vai tr quyt nh. Nu giao tc ngoi cng nht c u thc (commit) th cc giao tc c lng bn trong cng ng thi u thc; V nu giao tc ngoi cng nht thc hin lnh ROLLBACK th nhng giao tc lng bn trong cng chu tc ng ca cu lnh ny (cho d nhng giao tc lng bn trong thc hin lnh COMMIT TRANSACTION). _______________________________________
137
PH LC
138
sodvht )
SMALLINT
NOT NULL
CREATE TABLE diemthi ( mamonhoc NVARCHAR(10) masv NVARCHAR(10) diemlan1 NUMERIC(5, 2) diemlan2 NUMERIC(5, 2) CONSTRAINT pk_diemthi PRIMARY ) ALTER TABLE lop ADD CONSTRAINT fk_lop_khoa FOREIGN KEY(makhoa) REFERENCES khoa(makhoa) ON DELETE CASCADE ON UPDATE CASCADE
ALTER TABLE sinhvien ADD CONSTRAINT fk_sinhvien_lop FOREIGN KEY (malop) REFERENCES lop(malop) ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE diemthi ADD CONSTRAINT fk_diemthi_monhoc FOREIGN KEY (mamonhoc) REFERENCES monhoc(mamonhoc) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_diemthi_sinhvien FOREIGN KEY (masv) REFERENCES sinhvien(masv) ON DELETE CASCADE 140
ON UPDATE CASCADE ALTER TABLE monhoc ADD CONSTRAINT chk_monhoc_sodht CHECK(sodvht>0 and sodvht<=5) ALTER TABLE diemthi ADD CONSTRAINT chk_diemthi_diemlan1 CHECK (diemlan1>=0 and diemlan1<=10), CONSTRAINT chk_diemthi_diemlan2 CHECK (diemlan2>=0 and diemlan2<=10)
B. Mt s hm thng s dng
Mc d trong SQL chun khng cung cp c th cc nhng trong cc h qun tr c s d liu lun cung cp cho ngi s dng cc hm ci sn (hay cn gi l cc hm ca h thng). Trong phn ny, chng ti cung cp mt s hm thng c s dng trong SQL Server tin cho vic tra cu v s dng trong thc hnh
Hm tr v v tr u tin tnh t v tr start ti chui string1 xut hin trong chui string2. Hm LEFT
LEFT(string,number)
Hm tr v k t UNICODE c m c ch nh Hm REPLACE
REPLACE(string1,string2,string3)
Hm tr v mt chui c c bng cch thay th cc chui string2 trong chui string1 bi chui string3. Hm REVERSE
REVERSE(string)
142
UNICODE(UnicodeString)
Hm tr v mt gi tr kiu DateTime bng cch cng thm mt khong gi tr l number vo ngy date c ch nh. Trong , datepart l tham s ch nh thnh phn s c cng i vi gi tr date bao gm: Datepart
year quarter month dayofyear day week hour minute second millisecond
Vit tt
yy, qq, mm, dy, dd, wk, hh mi, ss, ms yyyy q m y d ww n s
Hm DATEDIFF
DATEDIFF(datepart, startdate, enddate)
Hm tr v khong thi gian gia hai gi tr kiu ny c ch nh tu thuc vo tham s datepart Hm DATEPART
DATEPART(datepart, date)
Hm tr v mt s nguyn c trch ra t thnh phn (c ch nh bi tham s partdate) trong gi tr kiu ngy c ch nh. Hm GETDATE
GETDATE()
Hm c chc nng chuyn i gi tr ca biu thc sang kiu d liu c ch nh. Tham s kiu_chuyn_i l mt gi tr s thng c s dng khi chuyn i gi tr kiu ngy sang kiu chui nhm qui nh khun dng d liu c hin th v c qui nh nh sau: Nm 2 ch s Nm 4 ch s
0 hoc 100 1 2 3 4 5 6 7 8 101 102 103 104 105 106 107 108 9 hoc 109 10 11 12 110 111 112
144
20 hoc 120 yyyy-mm-dd hh:mi:ss(24h) 21 hoc 121 yyyy-mm-dd hh:mi:ss.mmm(24h) 126 130 131 yyyy-mm-dd Thh:mm:ss:mmm(no spaces) dd mon yyyy hh:mi:ss:mmmAM dd/mm/yy hh:mi:ss:mmmAM
V d: Cu lnh:
SELECT hodem,ten, CONVERT(NVARCHAR(20),ngaysinh,101) AS ngaysinh FROM sinhvien
cho kt qu l:
_______________________________________
145
146