Professional Documents
Culture Documents
GiaoTrinhSQL-Dai Hoc Hue
GiaoTrinhSQL-Dai Hoc Hue
GiaoTrinhSQL-Dai Hoc Hue
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