You are on page 1of 146

TRNG I HC KHOA HC HU KHOA CNG NGH THNG TIN

GIO TRNH SQL


(Lu hnh ni b)

Bin son: Trn Nguyn Phong

Hu, 2004

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

CHNG 2: NGN NG THAO TC D LIU......................................................18


2.1 Truy xut d liu vi cu lnh SELECT ........................................................................ 18 2.1.1 Mnh FROM ....................................................................................................... 19 2.1.2 Danh sch chn trong cu lnh SELECT ................................................................ 20 2.1.3 Ch nh iu kin truy vn d liu ......................................................................... 25 2.1.4 To mi bng d liu t kt qu ca cu lnh SELECT ......................................... 29 2.1.5 Sp xp kt qu truy vn.......................................................................................... 29 2.1.6 Php hp .................................................................................................................. 31 2.1.7 Php ni ................................................................................................................... 33 2.1.7.1 S dng php ni .............................................................................................. 34 2.1.7.2 Cc loi php ni .............................................................................................. 36 2.1.7.4 S dng php ni trong SQL2 .......................................................................... 40 2.1.8 Thng k d liu vi GROUP BY........................................................................... 43 2.1.9 Thng k d liu vi COMPUTE............................................................................ 46 2.1.10 Truy vn con (Subquery) ....................................................................................... 49 2.2 B sung, cp nht v xo d liu .................................................................................... 53 2.2.1 B sung d liu ........................................................................................................ 53 2.2.2 Cp nht d liu....................................................................................................... 54 2.2.3 Xo d liu............................................................................................................... 56 Bi tp chng 2 ............................................................................................................. 58

CHNG 3: NGN NG NH NGHA D LIU ..................................................69

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

3.1 To bng d liu ............................................................................................................. 69 3.1.1 Rng buc CHECK.................................................................................................. 72 3.1.2 Rng buc PRIMARY KEY.................................................................................... 74 3.1.3 Rng buc UNIQUE................................................................................................ 76 3.1.4 Rng buc FOREIGN KEY..................................................................................... 76 3.2 Sa i nh ngha bng ................................................................................................. 79 3.3 Xo bng ......................................................................................................................... 81 3.4 Khung nhn ..................................................................................................................... 82 3.4.1 To khung nhn ........................................................................................................ 84 3.4.2 Cp nht, b sung v xo d liu thng qua khung nhn......................................... 86 3.4.3 Sa i khung nhn .................................................................................................. 89 3.4.4 Xo khung nhn........................................................................................................ 90 Bi tp chng 3 ............................................................................................................. 90

CHNG 4: BO MT TRONG SQL........................................................................96


4.1 Cc khi nim ................................................................................................................. 96 4.2 Cp pht quyn ............................................................................................................... 97 4.2.1 Cp pht quyn cho ngi dng trn cc i tng c s d liu .......................... 97 4.2.2 Cp pht quyn thc thi cc cu lnh ...................................................................... 99 4.3 Thu hi quyn ............................................................................................................... 100 4.3.1 Thu hi quyn trn i tng c s d liu:.......................................................... 100 4.3.2 Thu hi quyn thc thi cc cu lnh:..................................................................... 103

CHNG 5: TH TC LU TR, HM V TRIGGER .......................................104


5.1 Th tc lu tr (stored procedure)................................................................................ 104 5.1.1 Cc khi nim ........................................................................................................ 104 5.1.2 To th tc lu tr ................................................................................................. 105 5.1.3 Li gi th tc lu tr ............................................................................................ 107 5.1.4 S dng bin trong th tc..................................................................................... 107 5.1.5 Gi tr tr v ca tham s trong th tc lu tr ...................................................... 108 5.1.6 Tham s vi gi tr mc nh ................................................................................. 109 5.1.7 Sa i th tc ....................................................................................................... 110 5.2 Hm do ngi dng nh ngha .................................................................................... 111 5.2.1 nh ngha v s dng hm ................................................................................... 111 5.2.2 Hm vi gi tr tr v l d liu kiu bng......................................................... 112 5.3 Trigger .......................................................................................................................... 116 5.3.1 nh ngha trigger.................................................................................................. 117 5.3.2 S dng mnh IF UPDATE trong trigger......................................................... 119 5.3.3 ROLLBACK TRANSACTION v trigger ............................................................ 121 5.3.4 S dng trigger trong trng hp cu lnh INSERT, UPDATE v DELETE c tc ng n nhiu dng d liu........................................................................................... 122 5.3.4.1 S dng truy vn con ..................................................................................... 122 5.3.4.2 S dng bin con tr ....................................................................................... 125 Bi tp chng 5 ........................................................................................................... 127

CHNG 6: GIAO TC SQL ....................................................................................132


6.1 Giao tc v cc tnh cht ca giao tc........................................................................... 132 6.2 M hnh giao tc trong SQL ........................................................................................ 133 3

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

6.3 Giao tc lng nhau ........................................................................................................ 136

PH LC.....................................................................................................................138
A. C s d liu mu s dng trong gio trnh .................................................................. 138 B. Mt s hm thng s dng .......................................................................................... 141 B.1 Cc hm trn d liu kiu chui .............................................................................. 141 B.2 Cc hm trn d liu kiu ngy gi ......................................................................... 143 B.3 Hm chuyn i kiu ............................................................................................... 144

TI LIU THAM KHO............................................................................................146

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

liu SQL Server 2000 ca hng Microsoft s dng cho cc v d minh ho cng nh li gii ca cc bi tp. Chng ti hi vng rng gio trnh ny s thc s c ch i vi bn c. Chng ti rt mong nhn c s c v v nhng kin ng gp thng thn ca cc bn. Cui cng, xin gi li cm n n cc thy c, ng nghip v cc bn sinh vin ng vin v gip chng ti hon thnh gio trnh ny. Hu, 2003 Trn Nguyn Phong

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 1: TNG QUAN V SQL


Ngn ng hi c cu trc (SQL) v cc h qun tr c s d liu quan h l mt trong nhng nn tng k thut quan trng trong cng nghip my tnh. Cho n nay, c th ni rng SQL c xem l ngn ng chun trong c s d liu. Cc h qun tr c s d liu quan h thng mi hin c nh Oracle, SQL Server, Informix, DB2,... u chn SQL lm ngn ng cho sn phm ca mnh Vy thc s SQL l g? Ti sao n li quan trng trong cc h qun tr c s d liu? SQL c th lm c nhng g v nh th no? N c s dng ra sao trong cc h qun tr c s d liu quan h? Ni dung ca chng ny s cung cp cho chng ta ci nhn tng quan v SQL v mt s vn lin quan.

1.1 SQL l ngn ng c s d liu quan h


SQL, vit tt ca Structured Query Language (ngn ng hi c cu trc), l cng c s dng t chc, qun l v truy xut d liu uc lu tr trong cc c s d liu. SQL l mt h thng ngn ng bao gm tp cc cu lnh s dng tng tc vi c s d liu quan h. Tn gi ngn ng hi c cu trc phn no lm chng ta lin tng n mt cng c (ngn ng) dng truy xut d liu trong cc c s d liu. Thc s m ni, kh nng ca SQL vt xa so vi mt cng c truy xut d liu, mc d y l mc ch ban u khi SQL c xy dng nn v truy xut d liu vn cn l mt trong nhng chc nng quan trng ca n. SQL c s dng iu khin tt c cc chc nng m mt h qun tr c s d liu cung cp cho ngi dng bao gm: nh ngha d liu: SQL cung cp kh nng nh ngha cc c s d liu, cc cu trc lu tr v t chc d liu cng nh mi quan h gia cc thnh phn d liu. Truy xut v thao tc d liu: Vi SQL, ngi dng c th d dng thc hin cc thao tc truy xut, b sung, cp nht v loi b d liu trong cc c s d liu. iu khin truy cp: SQL c th c s dng cp pht v kim sot cc thao tc ca ngi s dng trn d liu, m bo s an ton cho c s d liu

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

m bo ton vn d liu: SQL nh ngha cc rng buc ton vn trong c s d liu nh m bo tnh hp l v chnh xc ca d liu trc cc thao tc cp nht cng nh cc li ca h thng. Nh vy, c th ni rng SQL l mt ngn ng hon thin c s dng trong cc h thng c s d liu v l mt thnh phn khng th thiu trong cc h qun tr c s d liu. Mc d SQL khng phi l mt ngn ng lp trnh nh C, C++, Java,... song cc cu lnh m SQL cung cp c th c nhng vo trong cc ngn ng lp trnh nhm xy dng cc ng dng tng tc vi c s d liu. Khc vi cc ngn ng lp trnh quen thuc nh C, C++, Java,... SQL l ngn ng c tnh khai bo. Vi SQL, ngi dng ch cn m t cc yu cu cn phi thc hin trn c s d liu m khng cn phi ch ra cch thc thc hin cc yu cu nh th no. Chnh v vy, SQL l ngn ng d tip cn v d s dng.

1.2 Vai tr ca SQL


Bn thn SQL khng phi l mt h qun tr c s d liu, n khng th tn ti c lp. SQL thc s l mt phn ca h qun tr c s d liu, n xut hin trong cc h qun tr c s d liu vi vai tr ngn ng v l cng c giao tip gia ngi s dng v h qun tr c s d liu. Trong hu ht cc h qun tr c s d liu quan h, SQL c nhng vai tr nh sau: SQL l ngn ng hi c tnh tng tc: Ngi s dng c th d dng thng qua cc trnh tin ch gi cc yu cu di dng cc cu lnh SQL n c s d liu v nhn kt qu tr v t c s d liu SQL l ngn ng lp trnh c s d liu: Cc lp trnh vin c th nhng cc cu lnh SQL vo trong cc ngn ng lp trnh xy dng nn cc chng trnh ng dng giao tip vi c s d liu SQL l ngn ng qun tr c s d liu: Thng qua SQL, ngi qun tr c s d liu c th qun l c c s d liu, nh ngha cc cu trc lu tr d liu, iu khin truy cp c s d liu,... SQL l ngn ng cho cc h thng khch/ch (client/server): Trong cc h thng c s d liu khch/ch, SQL c s dng nh l cng c giao tip gia cc trnh ng dng pha my khch vi my ch c s d liu. SQL l ngn ng truy cp d liu trn Internet: Cho n nay, hu ht cc my ch Web cng nh cc my ch trn Internet s dng SQL vi vai tr l ngn ng tng tc vi d liu trong cc c s d liu. SQL l ngn ng c s d liu phn tn: i vi cc h qun tr c s d liu phn tn, mi mt h thng s dng SQL giao tip vi cc h thng khc trn mng, gi v nhn cc yu cu truy xut d liu vi nhau.
8

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

SQL l ngn ng s dng cho cc cng giao tip c s d liu: Trong mt h thng mng my tnh vi nhiu h qun tr c s d liu khc nhau, SQL thng c s dng nh l mt chun ngn ng giao tip gia cc h qun tr c s d liu.

1.3 Tng quan v c s d liu quan h


1.3.1 M hnh d liu quan h
M hnh d liu quan h c Codd xut nm 1970 v n nay tr thnh m hnh c s dng ph bin trong cc h qun tr c s d liu thng mi. Ni mt cch n gin, mt c s d liu quan h l mt c s d liu trong tt c d liu c t chc trong cc bng c mi quan h vi nhau. Mi mt bng bao gm cc dng v cc ct: mi mt dng c gi l mt bn ghi (b) v mi mt ct l mt trng (thuc tnh). Hnh 1.1 minh ho cho ta thy c 3 bng trong mt c s d liu

Hnh 1.1: Cc bng trong mt c s d liu

1.3.2 Bng (Table)


Nh ni trn, trong c s d liu quan h, bng l i tng c s dng t chc v lu tr d liu. Mt c s d liu bao gm nhiu bng v mi bng c xc nh duy nht bi tn bng. Mt bng bao gm mt tp cc dng v cc ct: mi
9

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

mt dng trong bng biu din cho mt thc th (trong hnh 1.1, mi mt dng trong bng SINHVIEN tng ng vi mt sinh vin); v mi mt ct biu din cho mt tnh cht ca thc th (chng hn ct NGAYSINH trong bng SINHVIEN biu din cho ngy sinh ca cc sinh vin c lu tr trong bng). Nh vy, lin quan n mi mt bng bao gm cc yu t sau: 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.

1.3.3 Kho ca bng


Trong mt c s d liu c thit k tt, mi mt bng phi c mt hoc mt tp cc ct m gi tr d liu ca n xc nh duy nht mt dng trong mt tp cc dng ca bng. Tp mt hoc nhiu ct c tnh cht ny c gi l kho ca bng. Vic chn kho ca bng c vai tr quan trng trong vic thit k v ci t cc c s d liu quan h. Cc dng d liu trong mt bng phi c gi tr khc nhau trn kho. Bng MONHOC trong hnh di y c kho l ct MAMONHOC

Hnh 1.2: Bng MONHOC vi kho chnh l MAMONHOC

Mt bng c th 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

1.3.4 Mi quan h v kho ngoi


Cc bng trong mt c s d liu khng tn ti c lp m c mi quan h mt thit vi nhau v mt d liu. Mi quan h ny c th hin thng qua rng buc gi tr d liu xut hin bng ny phi c xut hin trc trong mt bng khc. Mi quan h gia cc bng trong c s d liu nhm m bo c tnh ng n v hp l ca d liu trong c s d liu. Trong hnh 1.3, hai bng LOP v KHOA c mi quan h vi nhau. Mi quan h ny i hi gi tr ct MAKHOA ca mt dng (tc l mt lp) trong bng LOP phi c xc nh t ct MAKHOA ca bng KHOA.

Bng LOP Hnh 1.3: Mi quan h gia hai bng LOP v KHOA trong c s d liu

Mi quan h gia cc bng trong mt c s d liu th hin ng mi quan h 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

To hm (do ngi s dng nh ngha) Sa i hm Xo hm To trigger Sa i trigger Xo trigger

Cp pht quyn cho ngi s dng Thu hi quyn t ngi s dng

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

dng truy xut d liu trong bng SINHVIEN c bt u bi t lnh SELECT, trong cu lnh bao gm hai mnh : mnh FROM ch nh tn ca bng cn truy xut d liu v mnh WHERE ch nh iu kin truy vn d liu.

1.4.2 Qui tc s dng tn trong SQL


Cc i tng trong c s d liu da trn SQL c xc nh thng qua tn ca i tng. Tn ca cc i tng l duy nht trong mi c s d liu. Tn c s dng nhiu nht trong cc truy vn SQL v c xem l nn tng trong c s d liu quan h l tn bng v tn ct. Trong cc c s d liu ln vi nhiu ngi s dng, khi ta ch nh tn ca mt bng no trong cu lnh SQL, h qun tr c s d liu hiu l tn ca bng do ta s hu (tc l bng do ta to ra). Thng thng, trong cc h qun tr c s d liu ny cho php nhng ngi dng khc nhau to ra nhng bng trng tn vi nhau m khng gy ra xung t v tn. Nu trong mt cu lnh SQL ta cn ch n mt bng do mt ngi dng khc s hu (hin nhin l phi c php) th tn ca bng phi c vit sau tn ca ngi s hu v phn cch vi tn ngi s hu bi du chm:
tn_ngi_s_hu.tn_bng

Mt s i tng c s d liu khc (nh khung nhn, th tc, hm), vic s dng tn cng tng t nh i vi bng. Ta c th s dng tn ct mt cch bnh thng trong cc cu lnh SQL bng cch ch cn ch nh tn ca ct trong bng. Tuy nhin, nu trong cu lnh c lin quan n hai ct tr ln c cng tn trong cc bng khc nhau th bt buc phi ch nh thm tn bng trc tn ct; tn bng v tn ct c phn cch nhau bi du chm. V d: V d di y minh ho cho ta thy vic s dng tn bng v tn ct trong cu lnh SQL
SELECT masv,hodem,ten,sinhvien.malop,tenlop FROM dbo.sinhvien,dbo.lop WHERE sinhvien.malop = lop.malop

1.4.3 Kiu d liu


Chun ANSI/ISO SQL cung cp cc kiu d liu khc nhau s dng trong cc c s d liu da trn SQL v trong ngn ng SQL. Da trn c s cc kiu d liu do chun ANSI/ISO SQL cung cp, cc h qun tr c s d liu thng mi hin nay c th s dng cc dng d liu khc nhau trong sn phm ca mnh. Bng 1.2 di y lit k mt s kiu d liu thng dng c s dng trong SQL. Tn kiu CHAR (n) M t Kiu chui vi di c nh

14

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

( 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Cc bng trong mt c s d liu c mi quan h vi nhau. Cc mi quan h c biu din thng qua kho chnh v kho ngoi ca cc bng. Kho chnh ca bng l tp mt hoc nhiu ct c gi tr duy nht trong bng v do gi tr ca n xc nh duy nht mt dng d liu trong bng. Mt kho ngoi l mt tp mt hoc nhiu ct c gi tr c xc nh t kho chnh ca cc bng khc. _______________________________________

17

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 2

NGN NG THAO TC D LIU


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

2.1 Truy xut d liu vi cu lnh SELECT


Cu lnh SELECT c s dng truy xut d liu t cc dng v cc ct ca mt hay nhiu bng, khung nhn. Cu lnh ny c th dng thc hin php chn (tc l truy xut mt tp con cc dng trong mt hay nhiu bng), php chiu (tc l truy xut mt tp con cc ct trong mt hay nhiu bng) v php ni (tc l lin kt cc dng trong hai hay nhiu bng truy xut d liu). Ngoi ra, cu lnh ny cn cung cp kh nng thc hin cc thao tc truy vn v thng k d liu phc tp khc. C php chung ca cu lnh SELECT c dng:
SELECT [ALL | DISTINCT][TOP n] danh_sch_chn [INTO tn_bng_mi] FROM danh_sch_bng/khung_nhn [WHERE iu_kin] [GROUP BY danh_sch_ct] [HAVING iu_kin] 18

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

[ORDER BY ct_sp_xp] [COMPUTE danh_sch_hm_gp [BY danh_sch_ct]]

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

2.1.1 Mnh FROM


Mnh FROM trong cu lnh SELECT c s dung nhm ch nh cc bng v khung nhn cn truy xut d liu. Sau FROM l danh sch tn ca cc bng v khung nhn tham gia vo truy vn, tn ca cc bng v khung nhn c phn cch nhau bi du phy. V d 2.2: Cu lnh di y hin th danh sch cc khoa trong trng
SELECT * FROM khoa

kt qu cu lnh nh sau:

19

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Ta c th s dng cc b danh cho cc bng hay khung nhn trong cu lnh SELECT. B danh c gn trong mnh FROM bng cch ch nh b danh ngay sau tn bng. V d 2.3: cu lnh sau gn b danh l a cho bng khoa
SELECT * FROM khoa a

2.1.2 Danh sch chn trong cu lnh SELECT


Danh sch chn trong cu lnh SELECT c s dng ch nh cc trng, cc biu thc cn hin th trong cc ct ca kt qu truy vn. Cc trng, cc biu thc c ch nh ngay sau t kho SELECT v phn cch nhau bi du phy. S dng danh sch chn trong cu lnh SELECT bao gm cc trng hp sau: a. Chn tt c cc ct trong bng Khi cn hin th tt c cc trng trong cc bng, s dng k t * trong danh sch chn thay v phi lit k danh sch tt c cc ct. Trong trng hp ny, cc ct c hin th trong kt qu truy vn s tun theo th t m chng c to ra khi bng c nh ngha. V d 2.4: Cu lnh
SELECT * FROM lop

cho kt qu bao nh sau:

20

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

cho bit m lp, tn lp, nm nhp hc v kho ca cc lp v c kt qu nh sau:

Lu : Nu truy vn c thc hin trn nhiu bng/khung nhn v trong cc bng/khung nhn c cc trng trng tn th tn ca nhng trng ny nu xut hin trong danh sch chn phi c vit di dng:
tn_bng.tn_trng

V d 2.6:
SELECT malop, tenlop, lop.makhoa, tenkhoa FROM lop, khoa WHERE lop.malop = khoa.makhoa

21

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

c. Thay i tiu cc ct Trong kt qu truy vn, tiu ca cc ct mc nh s l tn ca cc trng tng ng trong bng. Tuy nhin, cc tiu tr nn thn thin hn, ta c th i tn cc tiu ca cc ct. t tiu cho mt ct no , ta s dng cch vit:
tiu__ct = tn_trng

hoc hoc

tn_trng AS tiu__ct tn_trng tiu__ct

V d 2.7: Cu lnh di y:
SELECT 'M lp'= malop,tenlop 'Tn lp',khoa AS 'Kho' FROM lop

cho bit m lp, tn lp v kho hc ca cc lp trong trng. Kt qu ca cu lnh nh sau:

d. S dng cu trc CASE trong danh sch chn Cu trc CASE c s dng trong danh sch chn nhm thay i kt qu ca truy vn tu thuc vo cc trng hp khc nhau. Cu trc ny c c php nh sau:
CASE biu_thc WHEN biu_thc_kim_tra THEN kt_qu [ ... ] [ELSE kt_qu_ca_else] END

hoc:
CASE WHEN iu_kin THEN kt_qu [ ... ] [ELSE kt_qu_ca_else] END

22

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 2.8: hin th m, h tn v gii tnh (nam hoc n) ca cc sinh vin, ta s dng cu lnh
SELECT masv,hodem,ten, CASE gioitinh WHEN 1 THEN 'Nam' ELSE 'N' END AS gioitinh FROM sinhvien

hoc:
SELECT masv,hodem,ten, CASE WHEN gioitinh=1 THEN 'Nam' ELSE 'N' END AS gioitinh FROM sinhvien

Kt qu ca hai cu lnh trn u c dng nh sau

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

cho kt qu nh sau:

f. Loi b cc dng d liu trng nhau trong kt qu truy vn Trong kt qu ca truy vn c th xut hin cc dng d liu trng nhau. loi b bt cc dng ny, ta ch nh thm t kha DISTINCT ngay sau t kho SELECT. V d 2.11: Hai cu lnh di y
SELECT khoa FROM lop

v:
SELECT DISTINCT khoa FROM lop

c kt qu ln lt nh sau:

24

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

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

2.1.3 Ch nh iu kin truy vn d liu


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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Kt qu ca cu lnh ny nh sau:

Trong mnh WHERE thng s dng: Cc ton t kt hp iu kin (AND, OR) Cc ton t so snh Kim tra gii hn ca d liu (BETWEEN/ NOT BETWEEN) Danh sch Kim tra khun dng d liu. Cc gi tr NULL a. Cc ton t so snh Ton t = > < >= <= <> !> !< V d 2.15: Cu lnh:
SELECT masv,hodem,ten,ngaysinh FROM sinhvien WHERE (ten='Anh') AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)

ngha Bng Ln hn Nh hn Ln hn hoc bng Nh hn hoc bng Khc Khng ln hn Khng nh hn

cho bit m, h tn v ngy sinh ca cc sinh vin c tn l Anh v c tui nh hn hoc bng 20.
26

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

b. Kim tra gii hn ca d liu kim tra xem gi tr d liu nm trong (ngoi) mt khong no , ta s dng ton t BETWEEN (NOT BETWEEN) nh sau: Cch s dng 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

K t i din ngha % _ [] [^] Chui k t bt k gm khng hoc nhiu k t K t n bt k K t n bt k trong gii hn c ch nh (v d [a-f]) hay mt tp (v d [abcdef]) K t n bt k khng nm trong gii hn c ch nh ( v d [^a-f] hay mt tp (v d [^abcdef]).

V d 2.18: Cu lnh di y
SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'L%'

cho bit h tn ca cc sinh vin c h l L v c kt qu nh sau

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

C kt qu l:

e. Gi tr NULL D liu trong mt ct cho php NULL s nhn gi tr NULL trong cc trng hp sau:
28

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Nu khng c d liu c nhp cho ct v khng c mc nh cho ct hay kiu d liu trn ct . Ngi s dng trc tip a gi tr NULL vo cho ct . Mt ct c kiu d liu l kiu s s cha gi tr NULL nu gi tr c ch nh gy trn s. Trong mnh WHERE, kim tra gi tr ca mt ct c gi tr NULL hay khng, ta s dng cch vit:
WHERE tn_ct IS NULL

hoc:
WHERE tn_ct IS NOT NULL

2.1.4 To mi bng d liu t kt qu ca cu lnh SELECT


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

Lu : Nu trong danh sch chn c cc biu thc th nhng biu thc ny phi c t tiu .

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

29

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

c kt qu l:

Thay v ch nh tn ct sau ORDER BY, ta c th ch nh s th t ca ct cn c sp xp. Cu lnh v d trn c th c vit li nh sau:


SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bnh' ORDER BY 3, 4

30

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

2.1.6 Php hp
Php hp c s dng trong trng hp ta cn gp kt qu ca hai hay nhiu truy vn thnh mt tp kt qu duy nht. SQL cung cp ton t UNION thc hin php hp. C php nh sau
Cu_lnh_1 UNION [ALL] Cu_lnh_2 [UNION [ALL] Cu_lnh_3] ... [UNION [ALL] Cu_lnh_n] [ORDER BY ct_sp_xp] [COMPUTE danh_sch_hm_gp [BY danh_sch_ct]]

Trong Cu_lnh_1 c dng


SELECT danh_sch_ct [INTO tn_bng_mi] [FROM danh_sch_bng|khung_nhn] [WHERE iu_kin] [GROUP BY danh_sch_ct] [HAVING iu_kin]

v Cu_lnh_i (i = 2,..,n) c dng


SELECT danh_sch_ct [FROM danh_sch_bng|khung_nhn] [WHERE iu_kin] [GROUP BY danh_sch_ct] [HAVING iu_kin]

V d 2.22: Gi s ta c hai bng Table1 v Table2 ln lt nh sau:

cu lnh
SELECT A,B FROM Table1 UNION SELECT D,E FROM table2

Cho kt qu nh sau:
31

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Cho kt qu nh sau

Khi s dng ton t UNION thc hin php hp, ta cn ch cc nguyn tc sau: Danh sch ct trong cc truy vn thnh phn phi c cng s lng. Cc ct tng ng trong tt c cc bng, hoc tp con bt k cc ct c s dng trong bn thn mi truy vn thnh phn phi cng kiu d liu. Cc ct tng ng trong bn thn tng truy vn thnh phn ca mt cu lnh UNION phi xut hin theo th t nh nhau. Nguyn nhn l do php hp so snh cc ct tng ct mt theo th t c cho trong mi truy vn. Khi cc kiu d liu khc nhau c kt hp vi nhau trong cu lnh UNION, chng s c chuyn sang kiu d liu cao hn (nu c th c). Tiu ct trong kt qu ca php hp s l tiu ct c ch nh trong truy vn u tin.

32

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Truy vn thnh phn u tin c th c INTO to mi mt bng t kt qu ca chnh php hp. Mnh ORDER BY v COMPUTE dng sp xp kt qu truy vn hoc tnh ton cc gi tr thng k ch c s dng cui cu lnh UNION. Chng khng c s dng trong bt k truy vn thnh phn no. Mnh GROUP BY v HAVING ch c th c s dng trong bn thn tng truy vn thnh phn. Chng khng c php s dng tc ng ln kt qu chung ca php hp. Php ton UNION c th c s dng bn trong cu lnh INSERT. Php ton UNION khng c s dng trong cu lnh CREATE VIEW.

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

Bng LOP

Gi s ta cn bit m lp v tn lp ca cc lp thuc Khoa Cng ngh Thng tin, ta phi lm nh sau:

33

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chn ra dng trong bng KHOA c tn khoa l Khoa Cng ngh Thng tin, t xc nh c m khoa (MAKHOA) l DHT02. Tm kim trong bng LOP nhng dng c gi tr trng MAKHOA l DHT02 (tc l bng MAKHOA tng ng trong bng KHOA) v a nhng dng ny vo kt qu truy vn

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

2.1.7.1 S dng php ni Php ni l c s thc hin cc yu cu truy vn d liu lin quan n nhiu bng. Mt cu lnh ni thc hin ly cc dng d liu trong cc bng tham gia truy vn, so snh gi tr ca cc dng ny trn mt hoc nhiu ct c ch nh trong iu kin ni v kt hp cc dng tho mn iu kin thnh nhng dng trong kt qu truy vn. thc hin c mt php ni, cn phi xc nh c nhng yu t sau: Nhng ct no cn hin th trong kt qu truy vn Nhng bng no c tham gia vo truy vn. iu kin thc hin php ni gia cc bng d liu l g
34

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trong cc yu t k trn, vic xc nh chnh xc iu kin thc hin php ni gia cc bng ng vai tr quan trng nht. Trong a s cc trng hp, iu kin ca php ni c xc nh nh vo mi quan h gia cc bng cn phi truy xut d liu. Thng thng, l iu kin bng nhau gia kho chnh v kho ngoi ca hai bng c mi quan h vi nhau. Nh vy, c th a ra mt cu lnh ni thc hin chnh xc yu cu truy vn d liu i hi phi hiu c mi quan h cng nh ngha ca chng gia cc bng d liu. Danh sch chn trong php ni Mt cu lnh ni cng c bt u vi t kha SELECT. Cc ct c ch nh tn sau t kho SELECT l cc ct c hin th trong kt qu truy vn. Vic s dng tn cc ct trong danh sch chn c th l: Tn ca mt s ct no trong cc bng c tham gia vo truy vn. Nu tn ct trong cc bng trng tn nhau th tn ct phi c vit di dng
tn_bng.tn_ct

Du sao (*) c s dng trong danh sch chn khi cn hin th tt c cc ct ca cc bng tham gia truy vn. Trong trng hp cn hin th tt c cc ct ca mt bng no , ta s dng cch vit:
tn_bng.*

Mnh FROM trong php ni Sau mnh FROM ca cu lnh ni l danh sch tn cc bng (hay khung nhn) tham gia vo truy vn. Nu ta s dng du * trong danh sch chn th th t ca cc bng lit k sau FROM s nh hng n th t cc ct c hin th trong kt qu truy vn. Mnh WHERE trong php ni Khi hai hay nhiu bng c ni vi nhau, ta phi ch nh iu kin thc hin php ni ngay sau mnh WHERE. iu kin ni c biu din di dng biu thc logic so snh gi tr d liu gia cc ct ca cc bng tham gia truy vn. Cc ton t so snh di y c s dng xc nh iu kin ni Php ton = > >= < ngha Bng Ln hn Ln hn hoc bng Nh hn

35

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

<= <> !> !<

Nh hn hoc bng Khc Khng ln hn Khng nh hn

V d 2.24: Cu lnh di y hin th danh sch cc sinh vin vi cc thng tin: m sinh vin, h v tn, m lp, tn lp v tn khoa
SELECT masv,hodem,ten,sinhvien.malop,tenlop,tenkhoa FROM sinhvien,lop,khoa WHERE sinhvien.malop = lop.malop AND lop.makhoa=khoa.makhoa

Trong cu lnh trn, cc bng tham gia vo truy vn bao gm SINHVIEN, LOP v KHOA. iu kin thc hin php ni gia cc bng bao gm hai iu kin:
sinhvien.malop = lop.malop

lop.malop = khoa.malop

iu kin ni gia cc bng trong cu lnh trn l iu kin bng gia kho ngoi v kho chnh ca cc bng c mi quan h vi nhau. Hay ni cch khc, iu kin ca php ni c xc nh da vo mi quan h gia cc bng trong c s d liu. 2.1.7.2 Cc loi php ni Php ni bng v php ni t nhin Mt php ni bng (equi-join) l mt php ni trong gi tr ca cc ct c s dng ni c so snh vi nhau da trn tiu chun bng v tt c cc ct trong cc bng tham gia ni u c a ra trong kt qu. V d 2.25: Cu lnh di y thc hin php ni bng gia hai bng LOP v KHOA
SELECT * FROM lop,khoa WHERE lop.makhoa=khoa.makhoa

Trong kt qu ca cu lnh trn, ct makhoa (m khoa) xut hin hai ln trong kt qu php ni (ct makhoa ca bng khoa v ct makhoa ca bng lop) v nh vy l khng cn thit. Ta c th loi b bt i nhng ct trng tn trong kt qu truy vn bng cch ch nh danh sch ct cn c hin th trong danh sch chn ca cu lnh. Mt dng c bit ca php ni bng c s dng nhiu l php ni t nhin (natural-join). Trong php ni t nhin, iu kin ni gia hai bng chnh l iu kin bng gia kho ngoi v kho chnh ca hai bng; V trong danh sch chn ca cu lnh ch gi li mt ct trong hai ct tham gia vo iu kin ca php ni

36

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 2.26: thc hin php ni t nhin, cu lnh trong v d 2.25 c vit li nh sau
SELECT malop,tenlop,khoa,hedaotao,namnhaphoc, siso,lop.makhoa,tenkhoa,dienthoai FROM lop,khoa WHERE lop.makhoa=khoa.makhoa

hoc vit di dng ngn gn hn:


SELECT lop.*,tenkhoa,dienthoai FROM lop,khoa WHERE lop.makhoa=khoa.makhoa

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

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Cu lnh:
SELECT * FROM nhanvien,donvi WHERE nhanvien.madv=donvi.madv

c kt qu l:

38

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Nu thc hin php ni ngoi tri gia bng NHANVIEN v bng DONVI:
SELECT * FROM nhanvien,donvi WHERE nhanvien.madv*=donvi.madv

kt qu ca cu lnh s l:

V kt qu ca php ni ngoi phi:


select * from nhanvien,donvi where nhanvien.madv=*donvi.madv

nh sau:

Php ni v cc gi tr NULL Nu trong cc ct ca cc bng tham gia vo iu kin ca php ni c cc gi tr NULL th cc gi tr NULL c xem nh l khng bng nhau. V d 2.30: Gi s ta c hai bng TABLE1 v TABLE2 nh sau:
A 1 NULL 4 TABLE1 B b1 b2 b3 C NULL 4 TABLE2 D d1 d2

39

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

ta c th s dng cu lnh nh sau:


SELECT hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K24' 40

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

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


Bng DONVI Bng NHANVIEN

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

c kt qu l:

Cu lnh:
SELECT * FROM nhanvien RIGHT OUTER JOIN donvi ON nhanvien.madv=donvi.madv

41

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

thc hin php ni ngoi phi gia hai bng NHANVIEN v DONVI, v c kt qu l:

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

cho kt qu l:

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

42

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trong cu lnh trn, th t thc hin php ni gia cc bng c ch nh r rng: php ni gia hai bng sinhvien v lop c thc hin trc v kt qu ca php ni ny li tip tc c ni vi bng khoa.

2.1.8 Thng k d liu vi GROUP BY


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

43

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Thng k trn ton b d liu Khi cn tnh ton gi tr thng k trn ton b d liu, ta s dng cc hm gp trong danh sch chn ca cu lnh SELECT. Trong trng hp ny, trong danh sch chn khng c s dng bt k mt tn ct hay biu thc no ngoi cc hm gp. V d 2.35: thng k trung bnh im ln 1 ca tt c cc mn hc, ta s dng cu lnh nh sau:
SELECT AVG(diemlan1) FROM diemthi

cn cu lnh di y cho bit tui ln nht, tui nh nht v tui trung bnh ca tt c cc sinh vin sinh ti Hu:
SELECT MAX(YEAR(GETDATE())-YEAR(ngaysinh)), MIN(YEAR(GETDATE())-YEAR(ngaysinh)), AVG(YEAR(GETDATE())-YEAR(ngaysinh)) FROM sinhvien WHERE noisinh=Hu

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

v c kt qu l

cn cu lnh:
44

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

SELECT sinhvien.masv,hodem,ten, sum(diemlan1*sodvht)/sum(sodvht) FROM sinhvien,diemthi,monhoc WHERE sinhvien.masv=diemthi.masv AND diemthi.mamonhoc=monhoc.mamonhoc GROUP BY sinhvien.masv,hodem,ten

cho bit trung bnh im thi ln 1 cc mn hc ca cc sinh vin Lu : Trong trng hp danh sch chn ca cu lnh SELECT c c cc hm gp v nhng biu thc khng phi l hm gp th nhng biu thc ny phi c mt y trong mnh GROUP BY, nu khng cu lnh s khng hp l. V d 2.37: Di y l mt cu lnh sai
SELECT lop.malop,tenlop,COUNT(masv) FROM lop,sinhvien WHERE lop.malop=sinhvien.malop GROUP BY lop.malop

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

45

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

2.1.9 Thng k d liu vi COMPUTE


Khi thc hin thao tc thng k vi GROUP BY, kt qu thng k (c sn sinh bi hm gp) xut hin di mt ct trong kt qu truy vn. Thng qua dng truy vn ny, ta bit c gi tr thng k trn mi nhm d liu nhng khng bit c chi tit d liu trn mi nhm V d 2.39: Cu lnh:
SELECT khoa.makhoa,tenkhoa,COUNT(malop) AS solop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa GROUP BY khoa.makhoa,tenkhoa

cho ta bit c s lng lp ca mi khoa vi kt qu nh sau:

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

Trong : Cc hm gp c th s dng bao gm SUM, AVG, MIN, MAX v COUNT. danh_sch_ct: l danh sch ct s dng phn nhm d liu V d 2.40: Cu lnh di y cho bit danh sch cc lp ca mi khoa v tng s cc lp ca mi khoa:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa ORDER BY khoa.makhoa COMPUTE COUNT(malop) BY khoa.makhoa 46

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

kt qu ca cu lnh nh sau:
MAKHOA 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

MAKHOA DHT02 DHT02 DHT02

TENKHOA Khoa Cng ngh thng tin Khoa Cng ngh thng tin Khoa Cng ngh thng tin

TENLOP Tin K26 Tin K25 Tin K24

MAKHOA DHT03 DHT03

TENKHOA Khoa Vt l Khoa Vt l

TENLOP L K24 L K25

MAKHOA DHT05 DHT05

TENKHOA Khoa Sinh hc Khoa Sinh hc

TENLOP Sinh K25 Sinh K24

Khi s dng mnh COMPUTE ... BY cn tun theo cc qui tc di y: T kha DISTINCT khng cho php s dng vi cc hm gp dng Hm COUNT(*) khng c s dng trong COMPUTE. Sau COMPUTE c th s dng nhiu hm gp, khi cc hm phi phn cch nhau bi du phy. Cc ct s dng trong cc hm gp xut hin trong mnh COMPUTE phi c mt trong danh sch chn. Khng s dng SELECT INTO trong mt cu lnh SELECT c s dng COMPUTE. Nu s dng mnh COMPUTE ... BY th cng phi s dng mnh ORDER BY. Cc ct lit k trong COMPUTE BY phi ging ht hay l mt tp con ca nhng g c lit k sau ORDER BY. Chng phi c cng th t t tri qua phi, bt u vi cng mt biu thc v khng b qua bt k mt biu thc no.
47

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng hn nu mnh ORDER BY c dng:


ORDER BY a, b, c

Th mnh COMPUTE BY vi hm gp F trn ct X theo mt trong cc cch di y l hp l:


COMPUTE F(X) BY a, b, c COMPUTE F(X) BY a, b COMPUTE F(X) BY a

V cc cch s dng di y l sai:


COMPUTE F(X) BY b, c COMPUTE F(X) BY a, c COMPUTE F(X) BY c

Phi s dng mt tn ct hoc mt biu thc trong mnh ORDER BY, vic sp xp khng c thc hin da trn tiu ct. Trong trng hp s dng COMPUTE m khng c BY th c th khng cn s dng ORDER BY, khi phm vi tnh ton ca hm gp l trn ton b d liu. V d 2.41: Cu lnh di y hin th danh sch cc lp v tng s lp hin c:
SELECT malop,tenlop,hedaotao FROM lop ORDER BY makhoa COMPUTE COUNT(malop)

kt qu ca cu lnh nh sau:
MALOP 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 2.42: Cu lnh:
SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa ORDER BY khoa.makhoa COMPUTE COUNT(malop) BY khoa.makhoa COMPUTE COUNT(malop)

Cho bit danh sch cc lp ca mi khoa, tng s lp theo mi khoa v tng s lp hin c vi kt qu nh sau:
MAKHOA 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

MAKHOA DHT02 DHT02 DHT02

TENKHOA Khoa Cng ngh thng tin Khoa Cng ngh thng tin Khoa Cng ngh thng tin

TENLOP Tin K26 Tin K25 Tin K24

MAKHOA DHT03 DHT03

TENKHOA Khoa Vt l Khoa Vt l

TENLOP L K24 L K25

MAKHOA DHT05 DHT05

TENKHOA Khoa Sinh hc Khoa Sinh hc

TENLOP Sinh K25 Sinh K24

2.1.10 Truy vn con (Subquery)


Truy vn con l mt cu lnh SELECT c lng vo bn trong mt cu lnh SELECT, INSERT, UPDATE, DELETE hoc bn trong mt truy vn con khc. Loi

49

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

truy vn ny c s dng biu din cho nhng truy vn trong iu kin truy vn d liu cn phi s dng n kt qu ca mt truy vn khc. C php ca truy vn con nh sau:
(SELECT [ALL | DISTINCT] danh_sch_chn FROM danh_sch_bng [WHERE iu_kin] [GROUP BY danh_sch_ct] [HAVING iu_kin])

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

Trong php ton s hc c th s dng bao gm: =, <>, >, <, >=, <=; V truy vn con phi c kt qu bao gm ng mt ct. V d 2.43: Cu lnh di y cho bit danh sch cc mn hc c s n v hc trnh ln hn hoc bng s n v hc trnh ca mn hc c m l TI-001
SELECT * FROM monhoc WHERE sodvht>=(SELECT sodvht FROM monhoc 50

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

WHERE mamonhoc='TI-001')

Nu truy vn con tr v nhiu hn mt gi tr, vic s dng php so snh nh trn s khng hp l. Trong trng hp ny, sau php ton so snh phi s dng thm lng t ALL hoc ANY. Lng t ALL c s dng khi cn so snh gi tr ca biu thc vi tt c cc gi tr tr v trong kt qu ca truy vn con; ngc lai, php so snh vi lng t ANY c kt qu ng khi ch cn mt gi tr bt k no trong kt qu ca truy vn con tho mn iu kin. V d 2.44: Cu lnh di y cho bit h tn ca nhng sinh vin lp Tin K25 sinh trc tt c cc sinh vin ca lp Ton K25
SELECT hodem,ten FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND ngaysinh<ALL(SELECT ngaysinh FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')

v cu lnh:
SELECT hodem,ten FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND year(ngaysinh)= ANY(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')

cho bit h tn ca nhng sinh vin lp Tin K25 c nm sinh trng vi nm sinh ca bt k mt sinh vin no ca lp Ton K25. S dng truy vn con vi ton t IN Khi cn thc hin php kim tra gi tr ca mt biu thc c xut hin (khng xut hin) trong tp cc gi tr ca truy vn con hay khng, ta c th s dng ton t IN (NOT IN) nh sau:
WHERE biu_thc [NOT] IN (truy_vn_con)

V d 2.45: hin th h tn ca nhng sinh vin lp Tin K25 c nm sinh bng vi nm sinh ca mt sinh vin no ca lp Ton K25, thay v s dng cu lnh nh v d trn, ta c th s dng cu lnh nh sau:
SELECT hodem,ten 51

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND year(ngaysinh)IN(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Ton K25')

S dng lng t EXISTS vi truy vn con Lng t EXISTS c s dng kt hp vi truy vn con di dng:
WHERE [NOT] EXISTS (truy_vn_con)

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

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

52

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

2.2 B sung, cp nht v xo d liu


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

2.2.1 B sung d liu


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

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

Trong trng hp ch nhp gi tr cho mt s ct trong bng, ta phi ch nh danh sch cc ct cn nhp d liu ngay sau tn bng. Khi , cc ct khng c nhp d liu s nhn gi tr mc nh (nu c) hoc nhn gi tr NULL (nu ct cho
53

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

php chp nhn gi tr NULL). Nu mt ct khng c gi tr mc nh v khng chp nhn gi tr NULL m khng uc nhp d liu, cu lnh s b li. V d 2.49: Cu lnh di y b sung mt bn ghi mi cho bng SINHVIEN
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES(0241020008,Nguyn Cng,Chnh,1,C24102)

cu lnh trn cn c th c vit nh sau:


INSERT INTO sinhvien VALUES(0241020008,Nguyn Cng,Chnh, NULL,1,NULL,C24102)

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

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

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

2.2.2 Cp nht d liu


Cu lnh UPDATE trong SQL c s dng cp nht d liu trong cc bng. Cu lnh ny c c php nh sau:
UPDATE tn_bng

54

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

tn_ct = biu_thc [, ..., tn_ct_k = biu_thc_k] [FROM danh_sch_bng] [WHERE iu_kin]

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

Sau khi thc hin cu lnh:


UPDATE nhatkyphong SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100 WHEN loaiphong='B' THEN 70 ELSE 50 END

D liu trong bng s l:

55

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

iu kin cp nht d liu lin quan n nhiu bng Mnh FROM trong cu lnh UPDATE c s dng khi cn ch nh cc iu kin lin quan n cc bng khc vi bng cn cp nht d liu. Trong trung hp ny, trong mnh WHERE thng c iu kin ni gia cc bng. V d 2.53: Gi s ta c hai bng MATHANG v NHATKYBANHANG nh sau:

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

Cu lnh UPDATE vi truy vn con Tng t nh trong cu lnh SELECT, truy vn con c th c s dng trong mnh WHERE ca cu lnh UPDATE nhm ch nh iu kin i vi cc dng d liu cn cp nht d liu. V d 2.54: Cu lnh trn c th c vit nh sau:
UPDATE nhatkybanhang SET thanhtien = soluong*gia FROM mathang WHERE mathang.mahang =(SELECT mathang.mahang FROM mathang WHERE mathang.mahang=nhatkybanhang.mahang)

2.2.3 Xo d liu
xo d liu trong mt bng, ta s dng cu lnh DELETE. C php ca cu lnh ny nh sau:
DELETE FROM tn_bng [FROM danh_sch_bng] [WHERE iu_kin]

56

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trong cu lnh ny, tn ca bng cn xo d liu c ch nh sau DELETE FROM. Mnh WHERE trong cu lnh c s dng ch nh iu kin i vi cc dng d liu cn xo. Nu cu lnh DELETE khng c mnh WHERE th ton b cc dng d liu trong bng u b xo. V d 2.55: Cu lnh di y xo khi bng SINHVIEN nhng sinh vin sinh ti Hu
DELETE FROM sinhvien WHERE noisinh LIKE %Hu%

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

S dng truy vn con trong cu lnh DELETE Mt cu lnh SELECT c th c lng vo trong mnh WHERE trong cu lnh DELETE lm iu kin cho cu lnh tng t nh cu lnh UPDATE. V d 2.57: Cu lnh di y xo khi bng LOP nhng lp khng c sinh vin no hc
DELETE FROM lop WHERE malop NOT IN (SELECT DISTINCT malop FROM sinhvien)

Xo ton b d liu trong bng Cu lnh DELETE khng ch nh iu kin i vi cc dng d liu cn xo trong mnh WHERE s xo ton b d liu trong bng. Thay v s dng cu lnh DELETE trong trng hp ny, ta c th s dng cu lnh TRUNCATE c c php nh sau:
TRUNCATE TABLE tn_bng

V d 2.58: Cu lnh sau xo ton b d liu trong bng diemthi:


DELETE FROM diemthi

c tc dng tng t vi cu lnh


TRUNCATE TABLE diemthi 57

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Khch hng t hng cho cng ty thng qua cc n t hng. Thng tin chung v cc n t hng c lu tr trong bng DONDATHANG (Mi 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

2. 18 Nhng nhn vin no ca cng ty cha tng lp bt k mt ho n t hng no? 2. 19 Nhng nhn vin no ca cng ty c lng c bn cao nht? 2. 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

2. 34 Tng s lng hng ca nhng mt hng do cng ty VINAMILK cung cp ln gp i. 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 3

NGN NG NH NGHA D LIU


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

3.1 To bng d liu


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

Hnh 3.1 Bng trong c s d liu quan h Trong cc bng, d liu c t chc di dng cc dng v ct. Mi mt dng l mt bn ghi duy nht trong bng v mi mt ct l mt trng. Cc bng trong c s
69

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

d liu c s dng biu din thng tin, lu gi d liu v cc i tng trong th gii thc v/hoc mi quan h gia cc i tng. Bng trong hnh 3.1 bao gm 10 bn ghi v 4 trng l MAKHOA, TENKHOA, DIENTHOAI v TRUONGKHOA. Cu lnh CREATE TABLE c s dng nh ngha mt bng d liu mi trong c s d liu. Khi nh ngha mt bng d liu mi, ta cn phi xc nh c cc yu cu sau y: Bng mi c to ra s dng vi mc ch g v c vai tr nh th no trong c s d liu. Cu trc ca bng bao gm nhng trng (ct) no, mi mt trng c ngha nh th no trong vic biu din d liu, kiu d liu ca mi trng l g v trng c cho php nhn gi tr NULL hay khng. Nhng trng no s tham gia vo kha chnh ca bng. Bng c quan h vi nhng bng khc hay khng v nu c th quan h nh th no. Trn cc trng ca bng c tn ti nhng rng buc v khun dng, iu kin hp l ca d liu hay khng; nu c th s dng u v nh th no. Cu lnh CREATE TABLE c c php nh sau
CREATE TABLE tn_bng ( tn_ct thuc_tnh_ct cc_rng_buc [,... ,tn_ct_n thuc_tnh_ct_n cc_rng_buc_ct_n] [,cc_rng_buc_trn_bng] )

Trong :
tn_bng tn_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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

cho ct mt cch tng minh. Mi mt ct ch c th c nhiu nht mt gi tr mc nh. Ct c tnh cht IDENTITY hay khng? tc l gi tr ca ct c c t ng tng mi khi c bn ghi mi c b sung hay khng. Tnh cht ny ch c th s dng i vi cc trng kiu s. Ct c chp nhn gi tr NULL hay khng V d 3.1: Khai bo di y nh ngha ct STT c kiu d liu l int v ct c tnh cht IDENTITY:
stt INT IDENTITY

hay nh ngha ct NGAY c kiu datetime v khng cho php chp nhn gi tr NULL:
ngay DATETIME NOT NULL

v nh ngha ct SOLUONG kiu int v c gi tr mc nh l 0:


soluong INT DEFAULT (0) cc_rng_buc

Cc rng buc c s dng trn mi ct hoc trn bng nhm cc mc ch sau: Quy nh khun dng hay gi tr d liu c cho php trn ct (chng hn qui nh tui ca mt hc sinh phi ln hn 6 v nh hn 20, s in thoi phi l mt chui bao gm 6 ch s,...). Nhng rng buc kiu ny c gi l rng buc CHECK m bo tnh ton vn d liu trong mt bng v ton vn tham chiu gia cc bng trong c s d liu. Nhng loi rng buc ny nhm m bo tnh ng ca d liu nh: s chng minh nhn dn ca mi mt ngi phi duy nht, nu sinh vin hc mt lp no th lp phi tn ti,... Lin quan n nhng loi rng buc ny bao gm cc rng buc PRIMARY KEY (kho chnh), UNIQUE (kha d tuyn) v FOREIGN KEY (kho ngoi) Cc loi rng buc ny s c trnh by chi tit hn phn sau.

71

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 3.2: Cu lnh di y nh ngha bng NHANVIEN vi cc trng MANV (m nhn vin), HOTEN (h v tn), NGAYSINH (ngy sinh ca nhn vin), DIENTHOAI (in thoi) v HSLUONG (h s lng)
CREATE TABLE nhanvien ( manv NVARCHAR(10) hoten NVARCHAR(50) ngaysinh DATETIME dienthoai NVARCHAR(10) hsluong DECIMAL(3,2) )

NOT NULL, NOT NULL, NULL, NULL, DEFAULT (1.92)

Trong cu lnh trn, trng MANV v HOTEN ca bng NHANVIEN khng c NULL (tc l bt buc phi c d liu), trng NGAYSINH v DIENTHOAI s nhn gi tr NULL nu ta khng nhp d liu cho chng cn trng HSLUONG s nhn gi tr mc nh l 1.92 nu khng c nhp d liu. Nu ta thc hin cc cu lnh di y sau khi thc hin cu lnh trn b sung d liu cho bng NHANVIEN
INSERT INTO nhanvien VALUES('NV01','Le Van A','2/4/75','886963',2.14) INSERT INTO nhanvien(manv,hoten) VALUES('NV02','Mai Thi B') INSERT INTO nhanvien(manv,hoten,dienthoai) VALUES('NV03','Tran Thi C','849290')

Ta s c c d liu trong bng NHANVIEN nh sau:

3.1.1 Rng buc CHECK


Rng buc CHECK c s dng nhm ch nh iu kin hp l i vi d liu. Mi khi c s thay i d liu trn bng (INSERT, UPDATE), nhng rng buc ny s c s dng nhm kim tra xem d liu mi c hp l hay khng. Rng buc CHECK c khai bo theo c php nh sau:
[CONSTRAINT tn_rng_buc] CHECK (iu_kin)

72

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trong , iu_kin l mt biu thc logic tc ng ln ct nhm qui nh gi tr hoc khun dng d liu c cho php. Trn mi mt bng cng nh trn mi mt ct c th c nhiu rng buc CHECK. V d 3.3: Cu lnh di y to bng DIEMTOTNGHIEP trong qui nh gi tr ca ct DIEMVAN v DIEMTOAN phi ln hn hoc bng 0 v nh hn hoc bng 10.
CREATE TABLE diemtotnghiep ( hoten NVARCHAR(30) NOT NULL, ngaysinh DATETIME, diemvan DECIMAL(4,2) CONSTRAINT chk_diemvan CHECK(diemvan>=0 AND diemvan<=10), diemtoan DECIMAL(4,2) CONSTRAINT chk_diemtoan CHECK(diemtoan>=0 AND diemtoan<=10), )

Nh vy, vi nh ngha nh trn ca bng DIEMTOTNGHIEP, cc cu lnh di y l hp l:


INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan) VALUES('Le Thanh Hoang',9.5,2.5) INSERT INTO diemtotnghiep(hoten,diemvan) VALUES('Hoang Thi Mai',2.5)

cn cu lnh di y l khng hp l:
INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan) VALUES('Tran Van Hanh',6,10.5)

do ct DIEMTOAN nhn gi tr 10.5 khng tho mn iu kin ca rng buc Trong v d trn, cc rng buc c ch nh phn khai bo ca mi ct. Thay v ch nh rng buc trn mi ct, ta c th ch nh cc rng buc mc bng bng cch khai bo cc rng buc sau khi khai bo xong cc ct trong bng. V d 3.4: Cu lnh
CREATE TABLE lop ( malop NVARCHAR(10) tenlop NVARCHAR(30) khoa SMALLINT hedaotao NVARCHAR(25)

NOT NULL , NOT NULL , NULL , NULL 73

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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')) )

3.1.2 Rng buc PRIMARY KEY


Rng buc PRIMARY KEY c s dng nh ngha kho chnh ca bng. Kho chnh ca mt bng l mt hoc mt tp nhiu ct m gi tr ca chng l duy nht trong bng. Hay ni cch khc, gi tr ca kho chnh s gip cho ta xc nh c duy nht mt dng (bn ghi) trong bng d liu. Mi mt bng ch c th c duy nht mt kho chnh v bn thn kho chnh khng chp nhn gi tr NULL. Rng buc PRIMARY KEY l c s cho vic m bo tnh ton vn thc th cng nh ton vn tham chiu. khai bo mt rng buc PRIMARY KEY, ta s dng c php nh sau:
[CONSTRAINT tn_rng_buc] PRIMARY KEY [(danh_sch_ct)]

Nu kho chnh ca bng ch bao gm ng mt ct v rng buc PRIMARY KEY c ch nh mc ct, ta khng cn thit phi ch nh danh sch ct sau t kho PRIMARY KEY. Tuy nhin, nu vic khai bo kho chnh c tin hnh mc bng (s dng khi s lng cc ct tham gia vo kho l t hai tr ln) th bt buc phi ch nh danh sch ct ngay sau t kha PRIMARY KEY v tn cc ct c phn cch nhau bi du phy.
74

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 3.5: Cu lnh di y nh ngha bng SINHVIEN vi kho chnh l MASV


CREATE TABLE sinhvien ( masv NVARCHAR(10) CONSTRAINT pk_sinhvien_masv PRIMARY KEY, hodem NVARCHAR(25) NOT NULL , ten NVARCHAR(10) NOT NULL , ngaysinh DATETIME, gioitinh BIT, noisinh NVARCHAR(255), malop NVARCHAR(10) )

Vi bng va c to bi cu lnh trn, nu ta thc hin cu lnh:


INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES('0261010001','L Hong Phng','Anh',0,'C26101')

mt bn ghi mi s c b sung vo bng ny. Nhng nu ta thc hin tip cu lnh:


INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES('0261010001','L Huy','an',1,'C26101')

th cu lnh ny s b li do trng gi tr kho vi bn ghi c. V d 3.6: Cu lnh di y to bng DIEMTHI vi kho chnh l tp bao gm hai ct MAMONHOC v MASV
CREATE TABLE diemthi ( mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2), diemlan2 NUMERIC(4, 2), CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv) )

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

75

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

3.1.3 Rng buc UNIQUE


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

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

3.1.4 Rng buc FOREIGN KEY


Cc bng trong mt c s d liu c mi quan h vi nhau. Nhng mi quan h ny biu din cho s quan h gia cc i tng trong th gii thc. V mt d liu, nhng mi quan h c m bo thng qua vic i hi s c mt ca mt gi tr d liu trong bng ny phi ph thuc vo s tn ti ca gi tr d liu trong mt bng khc. Rng buc FOREIGN KEY c s dng trong nh ngha bng d liu nhm to nn mi quan h gia cc bng trong mt c s d liu. Mt hay mt tp cc ct trong mt bng c gi l kho ngoi, tc l c rng buc FOREIGN KEY, nu gi tr ca n c xc nh t kho chnh (PRIMARY KEY) hoc kho ph (UNIQUE) ca mt bng d liu khc.

76

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Hnh di y cho ta thy c mi quan h gia 3 bng DIEMTHI, SINHVIEN v MONHOC. Trong bng DIEMTHI, MASV l kho ngoi tham chiu n ct MASV ca bng SINHVIEN v MAMONHOC l kho ngoi tham chiu n ct MAMONHOC ca bng MONHOC.

Hnh 3.2 Mi quan h gia cc bng Vi mi quan h c to ra nh hnh trn, h qun tr c s d liu s kim tra tnh hp l ca mi bn ghi trong bng DIEMTHI mi khi c b sung hay cp nht. Mt bn ghi bt k trong bng DIEMTHI ch hp l (m bo rng buc FOREIGN KEY) nu gi tr ca ct MASV phi tn ti trong mt bn ghi no ca bng SINHVIEN v gi tr ca ct MAMONHOC phi tn ti trong mt bn ghi no ca bng MONHOC. Rng buc FOREIGN KEY c nh ngha theo c php di y:
[CONSTRAINT tn_rng_buc] FOREIGN KEY [(danh_sch_ct)] REFERENCES tn_bng_tham_chiu(danh_sch_ct_tham_chiu) [ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT] [ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT]

Vic nh ngha mt rng buc FOREIGN KEY bao gm cc yu t sau:

77

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Tn ct hoc danh sch ct ca bng c nh ngha tham gia vo kho ngoi. Tn ca bng c tham chiu bi kho ngoi v danh sch cc ct c tham chiu n trong bng tham chiu. Cch thc x l i vi cc bn ghi trong bng c nh ngha trong trng hp cc bn ghi c tham chiu trong bng tham chiu b xo (ON DELETE) hay cp nht (ON UPDATE). SQL chun a ra 4 cch x l: CASCADE: T ng xo (cp nht) nu bn ghi c tham chiu b xo (cp nht). NO ACTION: (Mc nh) Nu bn ghi trong bng tham chiu ang c tham chiu bi mt bn ghi bt k trong bng c nh ngha th bn ghi khng c php xo hoc cp nht (i vi ct c tham chiu). SET NULL: Cp nht li kho ngoi ca bn ghi thnh gi tr NULL (nu ct cho php nhn gi tr NULL). SET DEFAULT: Cp nht li kho ngoi ca bn ghi nhn gi tr mc nh (nu ct c qui nh gi tr mc nh). V d 3.8: Cu lnh di y nh ngha bng DIEMTHI vi hai kho ngoi trn ct MASV v ct MAMONHOC (gi s hai bng SINHVIEN v MONHOC c nh ngha)
CREATE TABLE diemthi ( mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2), diemlan2 NUMERIC(4, 2), CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv), CONSTRAINT fk_diemthi_mamonhoc FOREIGN KEY(mamonhoc) REFERENCES monhoc(mamonhoc) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_diemthi_masv FOREIGN KEY(masv) REFERENCES sinhvien(masv) ON DELETE CASCADE ON UPDATE CASCADE 78

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Lu : Ct c tham chiu trong bng tham chiu phi l kho chnh (hoc l kho ph). Ct c tham chiu phi c cng kiu d liu v di vi ct tng ng trong kha ngoi. Bng tham chiu phi c nh ngha trc. Do , nu cc bng c mi quan h vng, ta c th khng th nh ngha rng buc FOREIGN KEY ngay trong cu lnh CREATE TABLE m phi nh ngha thng qua lnh ALTER TABLE.

3.2 Sa i nh ngha bng


Mt bng sau khi c nh ngha bng cu lnh CREATE TABLE c th c sa i thng qua cu lnh ALTER TABLE. Cu lnh ny cho php chng ta thc hin c cc thao tc sau: B sung mt ct vo bng. Xo mt ct khi bng. Thay i nh ngha ca mt ct trong bng. Xo b hoc b sung cc rng buc cho bng C php ca cu lnh ALTER TABLE nh sau:
ALTER TABLE tn_bng ADD nh_ngha_ct | ALTER COLUMN tn_ct kiu_d_liu [NULL | NOT NULL] | DROP COLUMN tn_ct | ADD CONSTRAINT tn_rng_buc nh_ngha_rng_buc | DROP CONSTRAINT tn_rng_buc

V d 3.9: Cc v d di y minh ho cho ta cch s dng cu lnh ALTER TABLE trong cc trng hp. Gi s ta c hai bng DONVI v NHANVIEN vi nh ngha nh sau:
CREATE TABLE donvi ( madv INT tendv NVARCHAR(30)

NOT NULL NOT NULL

PRIMARY KEY,

79

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

) CREATE TABLE nhanvien ( manv NVARCHAR(10) hoten NVARCHAR(30) ngaysinh DATETIME, diachi CHAR(30) )

NOT NULL, NOT NULL, NOT NULL

B sung vo bng NHANVIEN ct DIENTHOAI vi rng buc CHECK nhm qui nh in thoi ca nhn vin l mt chui 6 ch s:
ALTER TABLE nhanvien ADD dienthoai NVARCHAR(6) CONSTRAINT chk_nhanvien_dienthoai CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]')

B sung thm ct MADV vo bng NHANVIEN:


ALTER TABLE nhanvien ADD madv INT NULL

nh ngha li kiu d liu ca ct DIACHI trong bng NHANVIEN v cho php ct ny chp nhn gi tr NULL:
ALTER TABLE nhanvien ALTER COLUMN diachi NVARCHAR(100) NULL

Xo ct ngy sinh khi bng NHANVIEN:


ALTER TABLE nhanvien DROP COLUMN ngaysinh

nh ngha kho chnh (rng buc PRIMARY KEY) cho bng NHANVIEN l ct MANV:
ALTER TABLE nhanvien ADD CONSTRAINT pk_nhanvien PRIMARY KEY(manv)

nh ngha kho ngoi cho bng NHANVIEN trn ct MADV tham chiu n ct MADV ca bng DONVI:
ALTER TABLE nhanvien ADD CONSTRAINT fk_nhanvien_madv FOREIGN KEY(madv) REFERENCES donvi(madv) 80

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

ON DELETE CASCADE ON UPDATE CASCADE

Xo b rng buc kim tra s in thoi ca nhn vin


ALTER TABLE nhanvien DROP CONSTRAINT CHK_NHANVIEN_DIENTHOAI

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

3.3 Xo bng
Khi mt bng khng cn cn thit , ta c th xo n ra khi c s d liu bng cu lnh DROP TABLE. Cu lnh ny cng ng thi xo tt c nhng rng buc, ch mc, trigger lin quan n bng . Cu lnh c c php nh sau:
DROP TABLE tn_bng

Trong cc h qun tr c s d liu, khi xo mt bng bng lnh DROP TABLE, ta khng th khi phc li bng cng nh d liu ca n. Do , cn phi cn thn khi s dng cu lnh ny. Cu lnh DROP TABLE khng th thc hin c nu bng cn xo ang c tham chiu bi mt rng buc FOREIGN KEY. Trong trng hp ny, rng buc FOREIGN KEY ang tham chiu hoc bng ang tham chiu n bng cn xo phi c xo trc. Khi mt bng b xo, tt c cc rng buc, ch mc v trigger lin quan n bng cng ng thi b xa theo. Do , nu ta to li bng th cng phi to li cc i tng ny.

81

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 3.10: Gi s ct MADV trong bng DONVI ang c tham chiu bi kho ngoi fk_nhanvien_madv trong bng NHANVIEN. xo bng DONVI ra khi c s d liu, ta thc hin hai cu lnh sau: Xo b rng buc fk_nhanvien_madv khi bng NHANVIEN:
ALTER TABLE nhanvien DROP CONSTRAINT fk_nhanvien_madv

Xo bng DONVI:
DROP TABLE donvi

3.4 Khung nhn


Cc bng trong c s d liu ng vai tr l cc i tng t chc v lu tr d liu. Nh vy, ta c th quan st c d liu trong c s d liu bng cch thc hin cc truy vn trn bng d liu. Ngoi ra, SQL cn cho php chng ta quan st c d liu thng qua vic nh ngha cc khung nhn. Mt khung nhn (view) c th c xem nh l mt bng o trong c s d liu c ni dung c nh ngha thng qua mt truy vn (cu lnh SELECT). Nh vy, mt khung nhn trng ging nh mt bng vi mt tn khung nhn v l mt tp bao gm cc dng v cc ct. im khc bit gia khung nhn v bng l khung nhn khng c xem l mt cu trc lu tr d liu tn ti trong c s d liu. Thc cht d liu quan st c trong khung nhn c ly t cc bng thng qua cu lnh truy vn d liu. Hnh 3.3 di y minh ho cho ta thy khung nhn c tn DSSV c nh ngha thng qua cu lnh SELECT truy vn d liu trn hai bng SINHVIEN v LOP:
SELECT masv,hodem,ten, DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop FROM sinhvien,lop WHERE sinhvien.malop=lop.malop

Khi khung nhn DSSV c nh ngha, ta c th s dng cu lnh SELECT truy vn d liu t khung nhn nh i vi cc bng. Khi trong cu truy vn xut hin khung nhn, h qun tr c s d liu s da vo inh ngha ca khung nhn chuyn yu cu truy vn d liu lin quan n khung nhn thnh yu cu tng t trn cc bng c s v vic truy vn d liu c thc hin bi yu cu tng ng trn cc bng. Vic s dng khung nhn trong c s d liu em li cc li ch sau y: Bo mt d liu: Ngi s dng c cp pht quyn trn cc khung nhn vi nhng phn d liu m ngi s dng c php. iu ny hn ch c phn no vic ngi s dng truy cp trc tip d liu.

82

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

n gin ho cc thao tc truy vn d liu: Mt khung nhn ng vai tr nh l mt i tng tp hp d liu t nhiu bng khc nhau vo trong mt bng. Nh vo , ngi s dng c th thc hin cc yu cu truy vn d liu mt cch n gin t khung nhn thay v phi a ra nhng cu truy vn phc tp. Tp trung v n gin ho d liu: Thng qua khung nhn ta c th cung cp cho ngi s dng nhng cu trc n gin, d hiu hn v d liu trong c s d liu ng thi gip cho ngi s dng tp trung hn trn nhng phn d liu cn thit. c lp d liu: Mt khung nhn c th cho php ngi s dng c c ci nhn v d liu c lp vi cu trc ca cc bng trong c s d liu cho d cc bng c s c b thay i phn no v cu trc.

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

nhn c nh ngha bi mt truy vn phc tp th s dn n chi ph v mt thi gian khi thc hin truy vn lin quan n khung nhn s ln. Mc d thng qua khung nhn c th thc hin c thao tc b sung v cp nht d liu cho bng c s nhng ch hn ch i vi nhng 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.

3.4.1 To khung nhn


Cu lnh CREATE VIEW c s dng to ra khung nhn v c c php nh sau:
CREATE VIEW tn_khung_nhn[(danh_sch_tn_ct)] AS cu_lnh_SELECT

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

v nu thc hin cu lnh:


SELECT * FROM dssv

ta c c kt qu nh sau:

84

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Nu trong cu lnh CREATE VIEW, ta khng ch nh danh sch cc tn ct 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

trong trng hp ny c kt qu nh sau:

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trong kt qu ca cu lnh SELECT c t nht mt ct c sinh ra bi mt biu thc (tc l khng phi l mt tn ct trong bng c s) v ct khng c t tiu . Tn ti hai ct trong kt qu ca cu lnh SELECT c cng tiu ct. V d 3.13: Cu lnh di y l cu lnh sai do ct th 4 khng xc nh c tn ct
CREATE VIEW tuoisinhvien AS SELECT masv,hodem,ten,DATEDIFF(YY,ngaysinh,GETDATE()) FROM sinhvien

3.4.2 Cp nht, b sung v xo d liu thng qua khung nhn


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

PRIMARY KEY, NOT NULL, NULL,

86

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

manv hoten ngaysinh diachi madv

NVARCHAR(10) NVARCHAR(30) DATETIME NVARCHAR(50) INT

PRIMARY KEY, NOT NULL, NULL, NULL, FOREIGN KEY REFERENCES donvi(madv) ON DELETE CASCADE ON UPDATE CASCADE

Gi s trong hai bng ny c d liu nh sau:

Bng DONVI

Bng NHANVIEN Cu lnh di y nh ngha khung nhn NV1 cung cp cc thng tin v m nhn vin, h tn v m n v nhn vin lm vic:
CREATE VIEW nv1 AS SELECT manv,hoten,madv FROM nhanvien

Nu ta thc hin cu lnh


INSERT INTO nv1 VALUES('NV04','Le Thi D',1)

Mt bn ghi mi s c b sung vo bng NHANVIEN v d liu trong bng ny s l:


Bn ghi mi

87

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Thng qua khung nhn ny, ta cng c th thc hin thao tc cp nht v xo d liu. Chng hn, nu ta thc hin cu lnh:
DELETE FROM nv1 WHERE manv='NV04'

Th bn ghi tng ng vi nhn vin c m NV04 s b xo khi bng NHANVIEN Nu trong danh sch chn ca cu lnh SELECT c s xut hin ca biu thc tnh ton n gin, thao tc b sung d liu thng qua khung nhn khng th thc hin c. Tuy nhin, trong trng hp ny thao tc cp nht v xo d liu vn c th c kh nng thc hin c (hin nhin khng th cp nht d liu i vi mt ct c c t mt biu thc tnh ton). V d 3.15: Xt khung nhn NV2 c nh ngha nh sau:
CREATE VIEW nv2 AS SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,madv FROM nhanvien

i vi khung nhn NV2, ta khng th thc hin thao tc b sung d liu nhng c th cp nht hoc xo d liu trn bng thng qua khung nhn ny. Cu lnh di y l khng th thc hin c trn khung nhn NV2
INSERT INTO nv2(manv,hoten,madv) VALUES('NV05','Le Van E',1)

Nhng cu lnh:
UPDATE nv2 SET hoten='Le Thi X' WHERE manv='NV04'

hoc cu lnh
DELETE FROM nv2 WHERE manv='NV04'

li c th thc hin c v c tc ng i vi d liu trong bng NHANVIEN. Trong trng hp khung nhn c to ra t mt php ni (trong hoc ngoi) trn nhiu bng, ta c th thc hin c thao tc b sung hoc cp nht d liu nu thao tc ny ch c tc ng n ng mt bng c s (cu lnh DELETE khng th thc hin c trong trng hp ny). V d 3.16: Vi khung nhn c nh ngha nh sau:
CREATE VIEW nv3 AS SELECT manv,hoten,ngaysinh, diachi,nhanvien.madv AS noilamviec, donvi.madv,tendv,dienthoai 88

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv

Cu lnh:
INSERT INTO nv3(manv,hoten,noilamviec) VALUES('NV05','Le Van E',1)

s b sung thm vo bng NHANVIEN mt bn ghi mi. Hoc cu lnh:


INSERT INTO nv3(madv,tendv) VALUES(3,'P. Ke toan')

b sung thm vo bng DONVI mt bn ghi do c hai cu lnh ny ch c tc ng n ng mt bng c s. Cu lnh di y khng th thc hin c do c tc ng mt lc n hai bng c s.
INSERT INTO nv3(manv,hoten,noilamviec,madv,tendv) VALUES('NV05','Le Van E',1,3,'P. Ke toan')

3.4.3 Sa i khung nhn


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

V d 3.17: Ta nh ngha khung nhn nh sau:


CREATE VIEW viewlop AS SELECT malop,tenlop,tenkhoa FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa='Khoa Vt l

v c th nh ngha li khung nhn trn bng cu lnh:


ALTER VIEW view_lop AS SELECT malop,tenlop,hedaotao FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa='Khoa Cng ngh thng tin'

89

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

3.4.4 Xo khung nhn


Khi mt khung nhn khng cn s dng, ta c th xo n ra khi c s d liu thng qua cu lnh:
DROP VIEW tn_khung_nhn

Nu mt khung nhn b xo, ton b nhng quyn cp pht cho ngi s dng trn khung nhn cng ng thi b xo. Do , nu ta to li khung nhn th phi tin hnh cp pht li quyn cho ngi s dng. V d 3.18: Cu lnh di y xo khung nhn VIEW_LOP ra khi c s d liu
DROP VIEW view_lop

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

90

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

3.2 3.3 3.4 3.5

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Li gii
3.1 To cc bng d liu:
CREATE TABLE nhacungcap ( macongty NVARCHAR(10) NOT NULL CONSTRAINT pk_nhacungcap PRIMARY KEY(macongty), tencongty NVARCHAR(40) NOT NULL, tengiaodich NVARCHAR(30) NULL, diachi NVARCHAR(60) NULL, dienthoai NVARCHAR(20) NULL, fax NVARCHAR(20) NULL, email NVARCHAR(50) NULL ) CREATE TABLE loaihang ( maloaihang INT NOT NULL CONSTRAINT pk_loaihang PRIMARY KEY(maloaihang), tenloaihang NVARCHAR(15) NOT NULL ) CREATE TABLE mathang ( mahang NVARCHAR(10) NOT NULL CONSTRAINT pk_mathang PRIMARY KEY(mahang), tenhang NVARCHAR(50) NOT NULL, macongty NVARCHAR(10) NULL , maloaihang INT NULL , soluong INT NULL, donvitinh NVARCHAR(20) NULL , giahang MONEY NULL ) CREATE TABLE nhanvien ( manhanvien NVARCHAR(10)

NOT NULL 92

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

ho ten ngaysinh ngaylamviec diachi dienthoai luongcoban phucap )

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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

sohoadon INT mahang NVARCHAR(10) giaban MONEY soluong SMALLINT mucgiamgia REAL CONSTRAINT pk_chitietdathang PRIMARY KEY(sohoadon,mahang) )

NOT NOT NOT NOT NOT

NULL , NULL , NULL , NULL , NULL,

Thit lp mi quan h gia cc bng


ALTER TABLE mathang ADD CONSTRAINT fk_mathang_loaihang FOREIGN KEY (maloaihang) REFERENCES loaihang(maloaihang) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT fk_mathang_nhacungcap FOREIGN KEY (macongty) REFERENCES nhacungcap(macongty) ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE dondathang ADD CONSTRAINT fk_dondathang_khachhang FOREIGN KEY (makhachhang) REFERENCES khachhang(makhachhang) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT fk_dondathang_nhanvien FOREIGN KEY (manhanvien) REFERENCES nhanvien(manhanvien) ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE chitietdathang ADD CONSTRAINT fk_chitiet_dondathang FOREIGN KEY (sohoadon) REFERENCES dondathang(sohoadon) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT fk_chitiet_mathang 94

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

FOREIGN KEY (mahang) REFERENCES mathang(mahang) ON DELETE CASCADE ON UPDATE CASCADE

3.2

ALTER TABLE chitietdathang ADD CONSTRAINT df_chitietdathang_soluong DEFAULT(1) FOR soluong, CONSTRAINT df_chitietdathang_mucgiamgia DEFAULT(0) FOR Mucgiamgia 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 4

BO MT TRONG SQL

4.1 Cc khi nim


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

96

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Lnh GRANT: S dng cp pht quyn cho ngi s dng trn cc i tng c s d liu hoc quyn s dng cc cu lnh SQL trong c s d liu. Lnh REVOKE: c s dng thu hi quyn i vi ngi s dng.

4.2 Cp pht quyn


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

4.2.1 Cp pht quyn cho ngi dng trn cc i tng c s d liu


Ch c ngi s hu c s d liu hoc ngi s hu i tng c s d liu mi c th cp pht quyn cho ngi dng trn cc i tng c s d liu. Cu lnh GRANT trong trng hp ny c c php nh sau:
GRANT ALL [PRIVILEGES]| cc_quyn_cp_pht [(danh_sch_ct)] ON tn_bng | tn_khung_nhn |ON tn_bng | tn_khung_nhn [(danh_sch_ct)] |ON tn_th_tc |ON tn_hm TO danh_sch_ngi_dng | nhm_ngi_dng [WITH GRANT OPTION ]

Trong :
ALL [PRIVILEGES]

Cp pht tt c cc quyn cho ngi dng trn i tng c s d liu c ch nh. Cc quyn c th cp pht cho ngi dng bao gm: i vi bng, khung nhn, v hm tr v d liu kiu bng: SELECT, INSERT, DELETE, UPDATE v REFERENCES. i vi ct trong bng, khung nhn: SELECT v UPDATE. i vi th tc lu tr v hm v hng:
97

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

EXECUTE. Trong cc quyn c cp n trn, quyn REFERENCES c s dng nhm cho php to kha ngoi tham chiu n bng cp pht.
cc_quyn_cp_pht

Danh sch cc quyn cn cp pht cho ngi dng trn i tng c s d liu c ch nh. Cc quyn c phn cch nhau bi du phy Tn 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.

tn_bng|tn_khung_nhn danh_sch_ct tn_th_tc tn_hm danh_sch_ngi_dng

WITH GRANT OPTION

Cc v d di y s minh ho cho ta cch s dng cu lnh GRANT cp pht quyn cho ngi dng trn cc i tng c s d liu. V d 4.1: Cp pht cho ngi dng c tn thuchanh quyn thc thi cc cu lnh SELECT, INSERT v UPDATE trn bng LOP
GRANT SELECT,INSERT,UPDATE ON lop TO thuchanh

Cho php ngi dng thuchanh quyn xem h tn v ngy sinh ca cc sinh vin (ct HODEM,TEN v NGAYSINH ca bng SINHVIEN)
GRANT SELECT (hodem,ten,ngaysinh) ON sinhvien TO thuchanh

hoc:
GRANT SELECT ON sinhvien(hodem,ten,ngaysinh) TO thuchanh

98

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Vi quyn c cp pht nh trn, ngi dng thuchanh c th thc hin cu lnh sau trn bng SINHVIEN
SELECT hoden,ten,ngaysinh FROM sinhvien

Nhng cu lnh di y li khng th thc hin c


SELECT * FROM sinhvien

Trong trng hp cn cp pht tt c cc quyn c th thc hin c trn i tng c s d liu cho ngi dng, thay v lit k cc cu lnh, ta ch cn s dng t kho ALL PRIVILEGES (t kha PRIVILEGES c th khng cn ch nh). Cu lnh di y cp pht cho ngi dng thuchanh cc quyn SELECT, INSERT, UPDATE, DELETE V REFERENCES trn bng DIEMTHI
GRANT ALL ON DIEMTHI TO thuchanh

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

4.2.2 Cp pht quyn thc thi cc cu lnh


Ngoi chc nng cp pht quyn cho ngi s dng trn cc i tng c s d liu, cu lnh GRANT cn c th s dng cp pht cho ngi s dng mt s quyn trn h qun tr c s d liu hoc c s d liu. Nhng quyn c th cp pht trong trng hp ny bao gm: To c s d liu: CREATE DATEBASE. To bng: CREATE RULE To khung nhn: CREATE VIEW
99

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

To th tc lu tr: CREATE PROCEDURE To hm: CREATE FUNCTION Sao lu c s d liu: BACKUP DATABASE Cu lnh GRANT s dng trong trng hp ny c c php nh sau:
GRANT ALL | danh_sch_cu_lnh TO danh_sch_ngi_dng

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

Vi cu lnh GRANT, ta c th cho php ngi s dng to cc i tng c s d liu trong c s d liu. i tng c s d liu do ngi dng no to ra s do ngi s hu v do ngi ny c quyn cho ngi dng khc s dng i tng v cng c th xa b (DROP) i tng do mnh to ra. Khc vi trng hp s dng cu lnh GRANT cp pht quyn trn i tng c s d liu, cu lnh GRANT trong trng hp ny khng th s dng tu chn WITH GRANT OPTION, tc l ngi dng khng th chuyn tip c cc quyn thc thi cc cu lnh c cp pht.

4.3 Thu hi quyn


Cu lnh REVOKE c s dng thu hi quyn c cp pht cho ngi dng. Tng ng vi cu lnh GRANT, cu lnh REVOKE c s dng trong hai trng hp: Thu hi quyn cp pht cho ngi dng trn cc i tng c s d liu. Thu hi quyn thc thi cc cu lnh trn c s d liu cp pht cho ngi dng.

4.3.1 Thu hi quyn trn i tng c s d liu:


C php cu lnh REVOKE s dng thu hi quyn cp pht trn i tng c s d liu c c php nh sau:
REVOKE [GRANT OPTION FOR] ALL [PRIVILEGES]| cc_quyn_cn_thu_hi [(danh_sch_ct)] ON tn_bng | tn_khung_nhn |ON tn_bng | tn_khung_nhn [(danh_sch_ct)] 100

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

|ON tn_th_tc |ON tn_hm FROM danh_sch_ngi_dng [CASCADE]

Cu lnh REVOKE c th s dng thu hi mt s quyn cp pht cho ngi dng hoc l thu hi tt c cc quyn (ALL PRIVILEGES). V d 4.4: Thu hi quyn thc thi lnh INSERT trn bng LOP i vi ngi dng thuchanh.
REVOKE INSERT ON lop FROM thuchanh

Gi s ngi dng thuchanh c cp pht quyn xem d liu trn cc ct HODEM, TEN v NGAYSINH ca bng SINHVIEN, cu lnh di y s thu hi quyn cp pht trn ct NGAYSINH (ch cho php xem d liu trn ct HODEM v TEN)
REVOKE SELECT ON sinhvien(ngaysinh) FROM thuchanh

Khi ta s dng cu lnh REVOKE thu hi quyn trn mt i tng c s d liu t mt ngi dng no , ch nhng quyn m ta cp pht trc mi c thu hi, nhng quyn m ngi dng ny c cho php bi nhng ngi dng khc vn cn c hiu lc. Ni cch khc, nu hai ngi dng khc nhau cp pht cng cc quyn trn cng mt i tng c s d liu cho mt ngi dng khc, sau ngi thu nht thu hi li quyn cp pht th nhng quyn m ngi dng th hai cp pht vn c hiu lc. V d 4.5: Gi s trong c s d liu ta c 3 ngi dng l A, B v C. A v B u c quyn s dng v cp pht quyn trn bng R. A thc hin lnh sau cp pht quyn xem d liu trn bng R cho C:
GRANT SELECT ON R TO C

v B cp pht quyn xem v b sung d liu trn bng R cho C bng cu lnh:
GRANT SELECT, INSERT ON R TO C

Nh vy, C c quyn xem v b sung d liu trn bng R. By gi, nu B thc hin lnh:
101

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

REVOKE SELECT, INSERT ON R FROM C

Ngi dng C s khng cn quyn b sung d liu trn bng R nhng vn c th xem c d liu ca bng ny (quyn ny do A cp cho C v vn cn hiu lc). Nu ta cp pht quyn cho ngi dng no bng cu lnh GRANT vi tu chn WITH GRANT OPTION th khi thu hi quyn bng cu lnh REVOKE phi ch nh tu chn CASCADE. Trong trng hp ny, cc quyn c chuyn tip cho nhng ngi dng khc cng ng thi c thu hi. V d 4.6: Ta cp pht cho ngi dng A trn bng R vi cu lnh GRANT nh sau:
GRANT SELECT ON R TO A WITH GRANT OPTION

sau ngi dng A li cp pht cho ngi dng B quyn xem d liu trn R vi cu lnh:
GRANT SELECT ON R TO B

Nu mun thu hi quyn cp pht cho ngi dng A, ta s dng cu lnh REVOKE nh sau:
REVOKE SELECT ON NHANVIEN FROM A CASCADE

Cu lnh trn s ng thi thu hi quyn m A cp cho B v nh vy c A v B u khng th xem c d liu trn bng R. Trong trng hp cn thu hi cc quyn c chuyn tip v kh nng chuyn tip cc quyn i vi nhng ngi c cp pht quyn vi tu chn WITH GRANT OPTION, trong cu lnh REVOKE ta ch nh mnh GRANT OPTION FOR. V d 4.7: Trong v d trn, nu ta thay cu lnh:
REVOKE SELECT ON NHANVIEN FROM A CASCADE

bi cu lnh:
REVOKE GRANT OPTION FOR SELECT ON NHANVIEN FROM A CASCADE 102

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Th B s khng cn quyn xem d liu trn bng R ng thi A khng th chuyn tip quyn m ta cp pht cho nhng ngi dng khc (tuy nhin A vn cn quyn xem d liu trn bng R).

4.3.2 Thu hi quyn thc thi cc cu lnh:


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

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

_______________________________________

103

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 5

TH TC LU TR, HM V TRIGGER

5.1 Th tc lu tr (stored procedure)


5.1.1 Cc khi nim
Nh cp cc chng trc, SQL c thit k v ci t nh l mt ngn ng thc hin cc thao tc trn c s d liu nh to lp cc cu trc trong c s d liu, b sung, cp nht, xo v truy vn d liu trong c s d liu. Cc cu lnh SQL c ngi s dng vit v yu cu h qun tr c s d liu thc hin theo ch tng tc. Cc cu lnh SQL c th c nhng vo trong cc ngn ng lp trnh, thng qua chui cc thao tc trn c s d liu c xc nh v thc thi nh vo cc cu lnh, cc cu trc iu khin ca bn thn ngn ng lp trnh c s dng. Vi th tc lu tr, mt phn no kh nng ca ngn ng lp trnh c a vo trong ngn ng SQL. Mt th tc l mt i tng trong c s d liu bao gm mt tp nhiu cu lnh SQL c nhm li vi nhau thnh mt nhm vi nhng kh nng sau: Cc cu trc iu khin (IF, WHILE, FOR) c th c s dng trong th tc. Bn trong th tc lu tr c th s dng cc bin nh trong ngn ng lp trnh nhm lu gi cc gi tr tnh ton c, cc gi tr c truy xut c t c s d liu. Mt tp cc cu lnh SQL c kt hp li vi nhau thnh mt khi lnh bn trong mt th tc. Mt th tc c th nhn cc tham s truyn vo cng nh c th tr v cc gi tr thng qua cc tham s (nh trong cc ngn ng lp trnh). Khi mt th tc lu tr c nh ngha, n c th c gi thng qua tn th tc, nhn cc tham s truyn vo, thc thi cc cu lnh SQL bn trong th tc v c th tr v cc gi tr sau khi thc hin xong. S dng cc th tc lu tr trong c s d liu s gip tng hiu nng ca c s d liu, mang li cc li ch sau: n gin ho cc thao tc trn c s d liu nh vo kh nng module ho cc thao tc ny.
104

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Th tc lu tr c phn tch, ti u khi to ra nn vic thc thi chng nhanh hn nhiu so vi vic phi thc hin mt tp ri rc cc cu lnh SQL tng ng theo cch thng thng. Th tc lu tr cho php chng ta thc hin cng mt yu cu bng mt cu lnh n gin thay v phi s dng nhiu dng lnh SQL. iu ny s lm gim thiu s lu thng trn mng. Thay v cp pht quyn trc tip cho ngi s dng trn cc cu lnh SQL v trn cc i tng c s d liu, ta c th cp pht quyn cho ngi s dng thng qua cc th tc lu tr, nh tng kh nng bo mt i vi h thng.

5.1.2 To th tc lu tr
Th tc lu tr c to bi cu lnh CREATE PROCEDURE vi c php nh sau:
CREATE PROCEDURE tn_th_tc [(danh_sch_tham_s)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Cc_cu_lnh_ca_th_tc

Trong :
tn_th_tc 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

ENCRYPTION

Th tc s c m ho nu tu chn WITH ENCRYPTION c ch nh. Nu th tc c m ho, ta khng th xem c ni dung ca th tc. tc. Cc cu lnh ny c th t trong cp t kho BEGIN...END hoc c th khng.

cc_cu_lnh_ca_th_tc Tp hp cc cu lnh s dng trong ni dung th

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

Thay v phi s dng hai cu lnh nh trn, ta c th nh ngha mt th tc lu tr vi cc tham s vo l @mamonhoc, @tenmonhoc, @sodvht v @malop nh sau:
CREATE PROC sp_LenDanhSachDiem( @mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS BEGIN INSERT INTO monhoc VALUES(@mamonhoc,@tenmonhoc,@sodvht) INSERT INTO diemthi(mamonhoc,masv) 106

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

SELECT @mamonhoc,masv FROM sinhvien WHERE malop=@malop END

Khi th tc trn c to ra, ta c th thc hin c hai yu cu t ra trn mt cch n gin thng qua li gi th tc:
sp_LenDanhSachDiem 'TI-005','C s d liu',5,'C24102'

5.1.3 Li gi th tc lu tr
Nh thy v d trn, khi mt th tc lu tr c to ra, ta c th yu cu h qun tr c s d liu thc thi th tc bng li gi th tc c dng:
tn_th_tc [danh_sch_cc_i_s]

S lng cc i s cng nh th t ca chng phi ph hp vi s lng v th t ca cc tham s khi nh ngha th tc. Trong trng hp li gi th tc c thc hin bn trong mt th tc khc, bn trong mt trigger hay kt hp vi cc cu lnh SQL khc, ta s dng c php nh sau:
EXECUTE tn_th_tc [danh_sch_cc_i_s]

Th t ca cc i s c truyn cho th tc c th khng cn phi tun theo th t ca cc tham s nh khi nh ngha th tc nu tt c cc i s c vit di dng:
@tn_tham_s = gi_tr

V d 5.2: Li gi th tc v d trn c th vit nh sau:


sp_LenDanhSachDiem @malop='C24102', @tenmonhoc='C s d liu', @mamonhoc='TI-005', @sodvht=5

5.1.4 S dng bin trong th tc


Ngoi nhng tham s c truyn cho th tc, bn trong th tc cn c th s dng cc bin nhm lu gi cc gi tr tnh ton c hoc truy xut c t c s d liu. Cc bin trong th tc c khai bo bng t kho DECLARE theo c php nh sau:
DECLARE @tn_bin kiu_d_liu

Tn bin phi bt u bi k t @ v tun theo qui tc v nh danh. V d di y minh ho vic s dng bin trong th tc

107

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 5.3: Trong nh ngha ca th tc di y s dung cc bin cha cc gi tr truy xut c t c s d liu.


CREATE PROCEDURE sp_Vidu( @malop1 NVARCHAR(10), @malop2 NVARCHAR(10)) AS DECLARE @tenlop1 NVARCHAR(30) DECLARE @namnhaphoc1 INT DECLARE @tenlop2 NVARCHAR(30) DECLARE @namnhaphoc2 INT SELECT @tenlop1=tenlop, @namnhaphoc1=namnhaphoc FROM lop WHERE malop=@malop1 SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphoc FROM lop WHERE malop=@malop2 PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1) print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2) IF @namnhaphoc1=@namnhaphoc2 PRINT 'Hai lp nhp hc cng nm' ELSE PRINT 'Hai lp nhp hc khc nm'

5.1.5 Gi tr tr v ca tham s trong th tc lu tr


Trong cc v d trc, nu i s truyn cho th tc khi c li gi n th tc l bin, nhng thay i gi tr ca bin trong th tc s khng c gi li khi kt thc qu trnh thc hin th tc. V d 5.4: Xt cu lnh sau y
CREATE PROCEDURE sp_Conghaiso(@a AS SELECT @c=@a+@b DECLARE @tong INT 108 INT,@b INT, @c INT)

Nu sau khi to th tc vi cu lnh trn, ta thc thi mt tp cc cu lnh nh sau:

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong

Cu lnh SELECT @tong cui cng trong lot cc cu lnh trn s cho kt qu l: 0 Trong trng hp cn phi gi li gi tr ca i s sau khi kt thc th tc, ta phi khai bo tham s ca th tc theo c php nh sau:
@tn_tham_s kiu_d_liu 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)

v thc hin li gi th tc trong mt tp cc cu lnh nh sau:


DECLARE @tong INT SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong OUTPUT SELECT @tong

th cu lnh SELECT @tong s cho kt qu l: 300

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

V d 5.6: Trong cu lnh di y:


CREATE PROC sp_TestDefault( 109

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

@tenlop NVARCHAR(30)=NULL, @noisinh NVARCHAR(100)='Hu') AS BEGIN IF @tenlop IS NULL SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh ELSE SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh AND tenlop=@tenlop END

th tc sp_TestDefault c nh ngha vi tham s @tenlop c gi tr mc nh l NULL v tham s @noisinh c gi tr mc nh l Hu. Vi th tc c nh ngha nh trn, ta c th thc hin cc li gi vi cc mc ch khc nhau nh sau: Cho bit h tn ca cc sinh vin sinh ti Hu:
sp_testdefault

Cho bit h tn ca cc sinh vin lp Tin K24 sinh ti Hu:


sp_testdefault @tenlop='Tin K24'

Cho bit h tn ca cc sinh vin sinh ti Ngh An:


sp_testDefault @noisinh=N'Ngh An'

Cho bit h tn ca cc sinh vin lp Tin K26 sinh ti Nng:


sp_testdefault @tenlop='Tin K26',@noisinh=' Nng'

5.1.7 Sa i th tc
Khi mt th tc c to ra, ta c th tin hnh nh ngha li th tc bng cu lnh ALTER PROCEDURE c c php nh sau:
ALTER PROCEDURE tn_th_tc [(danh_sch_tham_s)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Cc_cu_lnh_Ca_th_tc

110

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Cu lnh ny s dng tng t nh cu lnh CREATE PROCEDURE. Vic sa i li mt th tc c khng lm thay i n cc quyn cp pht trn th tc cng nh khng tc ng n cc th tc khc hay trigger ph thuc vo th tc ny. 5.1.8 Xo th tc xo mt th tc c, ta s dng cu lnh DROP PROCEDURE vi c php nh sau:
DROP PROCEDURE tn_th_tc

Khi xo mt th tc, tt c cc quyn cp cho ngi s dng trn th tc cng ng thi b xo b. Do , nu to li th tc, ta phi tin hnh cp pht li cc quyn trn th tc .

5.2 Hm do ngi dng nh ngha


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

5.2.1 nh ngha v s dng hm


Hm c nh ngha thng qua cu lnh CREATE FUNCTION vi c php nh sau:
CREATE FUNCTION tn_hm ([danh_sch_tham_s]) RETURNS (kiu_tr_v_ca_hm) AS BEGIN cc_cu_lnh_ca_hm END

V d 5.7: Cu lnh di y nh ngha hm tnh ngy trong tun (th trong tun) ca mt gi tr kiu ngy
CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10) AS BEGIN 111

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

DECLARE @st NVARCHAR(10) SELECT @st=CASE DATEPART(DW,@ngay) WHEN 1 THEN 'Chu nht' WHEN 2 THEN 'Th hai' WHEN 3 THEN 'Th ba' WHEN 4 THEN 'Th t' WHEN 5 THEN 'Th nm' WHEN 6 THEN 'Th su' ELSE 'Th by' END RETURN (@st) /* Tr tr v ca hm */ END

Mt hm khi c nh ngha c th c s dng nh cc hm do h qun tr c s d liu cung cp (thng thng trc tn hm ta phi ch nh thm tn ca ngi s hu hm) V d 5.8: Cu lnh SELECT di y s dng hm c nh ngha v d trc:
SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh FROM sinhvien WHERE malop=C24102

c kt qu l:

5.2.2 Hm vi gi tr tr v l d liu kiu bng


Ta bit c chc nng cng nh s tin li ca vic s dng cc khung nhn trong c s d liu. Tuy nhin, nu cn phi s dng cc tham s trong khung nhn (chng hn cc tham s trong mnh WHERE ca cu lnh SELECT) th ta li khng th thc hin c. iu ny phn no lm gim tnh linh hot trong vic s dng khung nhn.
112

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 5.9: Xt khung nhn c nh ngha nh sau:


CREATE VIEW sinhvien_k25 AS SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE khoa=25

vi khung nhn trn, thng qua cu lnh:


SELECT * FROM sinhvien_K25

ta c th bit c danh sch cc sinh vin kho 25 mt cch d dng nhng r rng khng th thng qua khung nhn ny bit c danh sch sinh vin cc kho khc do khng th s dng iu kin c dng KHOA = @thamso trong mnh WHERE ca cu lnh SELECT c. Nhc im trn ca khung nhn c th khc phc bng cch s dng hm vi gi tr tr v di dng bng v c gi l hm ni tuyn (inline function). Vic s dng hm loi ny cung cp kh nng nh khung nhn nhng cho php chng ta s dng c cc tham s v nh tnh linh hot s cao hn. Mt hm ni tuyn c nh ngha bi cu lnh CREATE TABLE vi c php nh sau:
CREATE FUNCTION tn_hm ([danh_sch_tham_s]) RETURNS TABLE AS RETURN (cu_lnh_select)

C php ca hm ni tuyn phi tun theo cc qui tc sau: Kiu tr v ca hm phi c ch nh bi mnh RETURNS TABLE. Trong phn thn ca hm ch c duy nht mt cu lnh RETURN xc nh gi tr tr v ca hm thng qua duy nht mt cu lnh SELECT. Ngoi ra, khng s dng bt k cu lnh no khc trong phn thn ca hm. V d 5.10: Ta nh ngha hm func_XemSV nh sau:
CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLE AS 113

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

RETURN(SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE khoa=@khoa)

hm trn nhn tham s u vo l kha ca sinh vin cn xem v gi tr tr v ca hm l tp cc dng d liu cho bit thng tin v cc sinh vin ca kho . Cc hm tr v gi tr di dng bng c s dng nh l cc bng hay khung nhn trong cc cu lnh SQL. Vi hm c nh ngha nh trn, bit danh sch cc sinh vin kho 25, ta s dng cu lnh nh sau:
SELECT * FROM dbo.func_XemSV(25)

cn cu lnh di y cho ta bit c danh sch sinh vin kho 26


SELECT * FROM dbo.func_XemSV(26)

i vi hm ni tuyn, phn thn ca hm ch cho php s xut hin duy nht ca cu lnh RETURN. Trong trng hp cn phi s dng n nhiu cu lnh trong phn thn ca hm, ta s dng c php nh sau nh ngha hm:
CREATE FUNCTION tn_hm([danh_sch_tham_s]) RETURNS @bin_bng TABLE nh_ngha_bng AS BEGIN cc_cu_lnh_trong_thn_hm RETURN END

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

114

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

V d 5.11: Ta nh ngha hm func_TongSV nh sau:


CREATE FUNCTION Func_Tongsv(@khoa SMALLINT) RETURNS @bangthongke TABLE ( makhoa NVARCHAR(5), tenkhoa NVARCHAR(50), tongsosv INT ) AS BEGIN IF @khoa=0 INSERT INTO @bangthongke SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien on lop.malop=sinhvien.malop GROUP BY khoa.makhoa,tenkhoa ELSE INSERT INTO @bangthongke SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien ON lop.malop=sinhvien.malop WHERE khoa=@khoa GROUP BY khoa.makhoa,tenkhoa RETURN /*Tr kt qu v cho hm*/ END

Vi hm c nh ngha nh trn, cu lnh:


SELECT * FROM dbo.func_TongSV(25)

S cho kt qu thng k tng s sinh vin kho 25 ca mi khoa:

115

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Cn cu lnh:
SELECT * FROM dbo.func_TongSV(0)

Cho ta bit tng s sinh vin hin c (tt c cc kho) ca mi khoa:

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

116

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Thng qua trigger, ta c th to v kim tra c nhng mi quan h phc tp hn gia cc bng trong c s d liu m bn thn cc rng buc khng th thc hin c.

5.3.1 nh ngha trigger


Mt trigger l mt i tng gn lin vi mt bng v c t ng kch hot khi xy ra nhng giao tc lm thay i d liu trong bng. nh ngha mt trigger bao gm cc yu t sau: Trigger s c p dng i vi bng no? Trigger c kch hot khi cu lnh no c thc thi trn bng: INSERT, UPDATE, DELETE? Trigger s lm g khi c kch hot? Cu lnh CREATE TRIGGER c s dng inh ngha trigger v c c php nh sau:
CREATE TRIGGER tn_trigger ON tn_bng FOR {[INSERT][,][UPDATE][,][DELETE]} AS [IF UPDATE(tn_ct) [AND UPDATE(tn_ct)|OR UPDATE(tn_ct)] ...] cc_cu_lnh_ca_trigger

V d 5.12: Ta nh ngha cc bng nh sau: Bng MATHANG lu tr d liu v cc mt hng:


CREATE TABLE mathang ( mahang NVARCHAR(5) PRIMARY KEY, /*m hng*/ tenhang NVARCHAR(50) NOT NULL, /*tn hng*/ soluong INT, /*s lng hng hin c*/ )

Bng NHATKYBANHANG lu tr thng tin v cc ln bn hng


CREATE TABLE nhatkybanhang ( stt INT IDENTITY PRIMARY KEY, ngay DATETIME, /*ngy bn hng*/ 117

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

nguoimua mahang soluong giaban )

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)

d liu trong bng MATHANG s nh sau:

Trong cu lnh CREATE TRIGGER v d trn, sau mnh ON l tn ca bng m trigger cn to s tc ng n. Mnh tip theo ch nh cu lnh s kch hot trigger (FOR INSERT). Ngoi INSERT, ta cn c th ch nh UPDATE hoc DELETE cho mnh ny, hoc c th kt hp chng li vi nhau. Phn thn ca

trigger nm sau t kho AS bao gm cc cu lnh m trigger s thc thi khi c kch hot.
118

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chun SQL nh ngha hai bng logic INSERTED v DELETED s dng trong cc trigger. Cu trc ca hai bng ny tng t nh cu trc ca bng m trigger tc ng. D liu trong hai bng ny tu thuc vo cu lnh tc ng ln bng lm kch hot trigger; c th trong cc trng hp sau: Khi cu lnh DELETE c thc thi trn bng, cc dng d liu b xo s c sao chp vo trong bng DELETED. Bng INSERTED trong trng hp ny khng c d liu. D liu trong bng INSERTED s l dng d liu c b sung vo bng gy nn s kch hot i vi trigger bng cu lnh INSERT. Bng DELETED trong trng hp ny khng c d liu. Khi cu lnh UPDATE c thc thi trn bng, cc dng d liu c chu s tc ng ca cu lnh s c sao chp vo bng DELETED, cn trong bng INSERTED s l cc dng sau khi c cp nht.

5.3.2 S dng mnh IF UPDATE trong trigger


Thay v ch nh mt trigger c kch hot trn mt bng, ta c th ch nh trigger c kch hot v thc hin nhng thao tc c th khi vic thay i d liu ch lin quan n mt s ct nht nh no ca ct. Trong trng hp ny, ta s dng mnh IF UPDATE trong trigger. IF UPDATE khng s dng c i vi cu lnh DELETE. V d 5.13: Xt li v d vi hai bng MATHANG v NHATKYBANHANG, trigger di y c kch hot khi ta tin hnh cp nht ct SOLUONG cho mt bn ghi ca bng NHATKYBANHANG (lu l ch cp nht ng mt bn ghi)
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang

Vi trigger v d trn, cu lnh:


UPDATE nhatkybanhang SET soluong=soluong+20 WHERE stt=1 119

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

s kch hot trigger ng vi mnh IF UPDATE (soluong) v cu lnh UPDATE trong trigger s c thc thi. Tuy nhin cu lnh:
UPDATE nhatkybanhang SET nguoimua='Mai Hu Ton' WHERE stt=3

li khng kch hot trigger ny. Mnh IF UPDATE c th xut hin nhiu ln trong phn thn ca trigger. Khi , mnh IF UPDATE no ng th phn cu lnh ca mnh s c thc thi khi trigger c kch hot. V d 5.14: Gi s ta nh ngha bng R nh sau:
CREATE TABLE R ( A INT, B INT, C INT )

v trigger trg_R_update cho bng R:


CREATE TRIGGER trg_R_test ON R FOR UPDATE AS IF UPDATE(A) Print 'A updated' IF UPDATE(C) Print 'C updated'

Cu lnh:
UPDATE R SET A=100 WHERE A=1

s kch hot trigger v cho kt qu l:


A updated

v cu lnh:
UPDATE R SET C=100 WHERE C=2

cng kch hot trigger v cho kt qu l:


C updated

cn cu lnh:
UPDATE R SET B=100 WHERE B=3

hin nhin s khng kch hot trigger


120

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

5.3.3 ROLLBACK TRANSACTION v trigger


Mt trigger c kh nng nhn bit c s thay i v mt d liu trn bng d liu, t c th pht hin v hu b nhng thao tc khng m bo tnh ton vn d liu. Trong mt trigger, hu b tc dng ca cu lnh lm kch hot trigger, ta s dng cu lnh(1):
ROLLBACK TRANSACTION

V d 5.15: Nu trn bng MATHANG, ta to mt trigger nh sau:


CREATE TRIGGER trg_mathang_delete ON mathang FOR DELETE AS ROLLBACK TRANSACTION

Th cu lnh DELETE s khng th c tc dng i vi bng MATHANG. Hay ni cch khc, ta khng th xo c d liu trong bng. V d 5.16: Trigger di y c kch hot khi cu lnh INSERT c s dng b sung mt bn ghi mi cho bng NHATKYBANHANG. Trong trigger ny kim tra iu kin hp l ca d liu l s lng hng bn ra phi nh hn hoc bng s lng hng hin c. Nu iu kin ny khng tho mn th hu b thao tc b sung d liu.
CREATE TRIGGER trg_nhatkybanhang_insert ON NHATKYBANHANG FOR INSERT AS DECLARE @sl_co int /* S lng hng hin c */ DECLARE @sl_ban int /* S lng hng c bn */ DECLARE @mahang nvarchar(5) /* M hng c bn */ SELECT @mahang=mahang,@sl_ban=soluong FROM inserted SELECT @sl_co = soluong FROM mathang where mahang=@mahang /*Nu s lng hng hin c nh hn s lng bn th hu b thao tc b sung d liu */
(1)

Cch s dng v ngha ca cu lnh ROLLBACK TRANSACTION c bn lun chi tit chng 6.

121

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

IF @sl_co<@sl_ban ROLLBACK TRANSACTION /* Nu d liu hp l th gim s lng hng hin c */ ELSE UPDATE mathang SET soluong=soluong-@sl_ban WHERE mahang=@mahang

5.3.4 S dng trigger trong trng hp cu lnh INSERT, UPDATE v DELETE c tc ng n nhiu dng d liu
Trong cc v d trc, cc trigger ch thc s hot ng ng mc ch khi cc cu lnh kch hot trigger ch c tc dng i vi ng mt dng d liu. Ta c th nhn thy l cu lnh UPDATE v DELETE thng c tc dng trn nhiu dng, cu lnh INSERT mc d t ri vo trng hp ny nhng khng phi l khng gp; l khi ta s dng cu lnh c dng INSERT INTO ... SELECT ... Vy lm th no trigger hot ng ng trong trng hp nhng cu lnh c tc ng ln nhiu dng d liu? C hai gii php c th s dng i vi vn ny: S dng truy vn con. S dng bin con tr. 5.3.4.1 S dng truy vn con Ta hnh dung vn ny v cch khc phc qua v d di y: V d 5.17: Ta xt li trng hp ca hai bng MATHANG v NHATKYBANHANG nh s di y:

122

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trigger di y cp nht li s lng hng ca bng MATHANG khi cu lnh UPDATE c s dng cp nht ct SOLUONG ca bng NHATKYBANHANG.
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang

Vi trigger c nh ngha nh trn, nu thc hin cu lnh:


UPDATE nhatkybanhang SET soluong = soluong + 10 WHERE stt = 1

th d liu trong hai bng MATHANG v NHATKYBANHANG s l:

Bng MATHANG

Bng NHATKYBANHANG

Tc l s lng ca mt hng c m H1 c gim i 10. Nhng nu thc hin tip cu lnh:


UPDATE nhatkybanhang SET soluong=soluong + 5 WHERE mahang='H2'

d liu trong hai bng sau khi cu lnh thc hin xong s nh sau:

123

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Bng MATHANG

Bng NHATKYBANHANG

Ta c th nhn thy s lng ca mt hng c m H2 cn li 40 (gim i 5) trong khi ng ra phi l 35 (tc l phi gim 10). Nh vy, trigger trn khng hot ng ng trong trng hp ny. khc phc li gp phi nh trn, ta nh ngha li trigger nh sau:
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong (SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang FROM inserted)

hoc:
CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) /* Nu s lng dng c cp nht bng 1 */ IF @@ROWCOUNT = 1 BEGIN UPDATE mathang SET mathang.soluong = mathang.soluong (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang 124

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

END ELSE BEGIN UPDATE mathang SET mathang.soluong = mathang.soluong (SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang FROM inserted) END

5.3.4.2 S dng bin con tr Mt cch khc khc phc li xy ra nh trong v d 5.17 l s dng con tr duyt qua cc dng d liu v kim tra trn tng dng. Tuy nhin, s dng bin con tr trong trigger l gii php nn chn trong trng hp thc s cn thit. Mt bin con tr c s dng duyt qua cc dng d liu trong kt qu ca mt truy vn v c khai bo theo c php nh sau:
DECLARE tn_con_tr 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

DECLARE contro CURSOR FOR SELECT mahang,tenhang,soluong FROM mathang OPEN contro DECLARE @mahang NVARCHAR(10) DECLARE @tenhang NVARCHAR(10) DECLARE @soluong INT /*Bt u duyt qua cc dng trong kt qu truy vn*/ FETCH NEXT FROM contro INTO @mahang,@tenhang,@soluong WHILE @@FETCH_STATUS=0 BEGIN PRINT 'Ma hang:'+@mahang PRINT 'Ten hang:'+@tenhang PRINT 'So luong:'+STR(@soluong) FETCH NEXT FROM contro INTO @mahang,@tenhang,@soluong END /*ng con tr v gii phng vng nh*/ CLOSE contro DEALLOCATE contro

V d 5.19: Trigger di y l mt cch gii quyt khc ca trng hp c cp v d 5.17


CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) BEGIN DECLARE @mahang NVARCHAR(10) DECLARE @soluong INT DECLARE contro CURSOR FOR SELECT inserted.mahang, inserted.soluong-deleted.soluong AS soluong FROM inserted INNER JOIN deleted ON inserted.stt=deleted.stt OPEN contro 126

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

FETCH NEXT FROM contro INTO @mahang,@soluong WHILE @@FETCH_STATUS=0 BEGIN UPDATE mathang SET soluong=soluong-@soluong WHERE mahang=@mahang FETCH NEXT FROM contro INTO @mahang,@soluong END CLOSE contro DEALLOCATE contro END END

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

127

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

5.6 qun l cc bn tin trong mt Website, ngi ta s dng hai bng sau: Bng LOAIBANTIN (loi bn tin)
CREATE TABLE loaibantin ( maphanloai INT PRIMARY KEY, tenphanloai NVARCHAR(100) bantinmoinhat INT )

NOT NULL NOT NULL , DEFAULT(0)

Bng BANTIN (bn tin)


CREATE TABLE bantin ( maso INT NOT NULL PRIMARY KEY, ngayduatin DATETIME NULL , tieude NVARCHAR(200) NULL , noidung NTEXT NULL , maphanloai INT NULL FOREIGN KEY REFERENCES loaibantin(maphanloai) )

Trong bng LOAIBANTIN, gi tr ct BANTINMOINHAT cho bit m s ca bn tin thuc loi tng ng mi nht (c b sung sau cng). Hy vit cc trigger cho bng BANTIN sao cho: Khi mt bn tin mi c b sung, cp nht li ct BANTINMOINHAT ca dng tng ng vi loi bn tin va b sung. Khi mt bn tin b xo, cp nht li gi tr ca ct BANTINMOINHAT trong bng LOAIBANTIN ca dng ng vi loi bn tin va xa l m s ca bn tin trc (da vo ngy a tin). Nu khng cn bn tin no cng loi th gi tr ca ct ny bng 0. Khi cp nht li m s ca mt bn tin v nu l bn tin mi nht th cp nht li gi tr ct BANTINMOINHAT l m s mi.

# Li gii:
5.1 CREATE PROCEDURE sp_insert_mathang( @mahang NVARCHAR(10), 128

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

@tenhang NVARCHAR(50), @macongty NVARCHAR(10) = NULL, @maloaihang INT = NULL, @soluong INT = 0, @donvitinh NVARCHAR(20) = NULL, @giahang money = 0) AS IF NOT EXISTS(SELECT mahang FROM mathang WHERE mahang=@mahang) IF (@macongty IS NULL OR EXISTS(SELECT macongty FROM nhacungcap WHERE macongty=@macongty)) AND (@maloaihang IS NULL OR EXISTS(SELECT maloaihang FROM loaihang WHERE maloaihang=@maloaihang)) INSERT INTO mathang VALUES(@mahang,@tenhang, @macongty,@maloaihang, @soluong,@donvitinh,@giahang) 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

GROUP BY mathang.mahang,tenhang)

S dng hm nh ngha:
SELECT a.mahang,a.tenhang,soluong+tongsl FROM mathang AS a INNER JOIN dbo.func_banhang() AS b ON a.mahang=b.mahang 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

inserted.mahang=deleted.mahang WHERE inserted.mahang=mathang.mahang GROUP BY inserted.mahang) WHERE mahang IN (SELECT DISTINCT mahang FROM inserted) IF EXISTS(SELECT mahang FROM mathang WHERE soluong<0) ROLLBACK TRANSACTION END 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Chng 6

GIAO TC SQL

6.1 Giao tc v cc tnh cht ca giao tc


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

132

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Trng thi CSDL trc khi giao tc tin hnh SELECT


ROLLBACK

SELECT
ROLLBACK

SELECT

INSERT

INSERT

INSERT

Giao tc

UPDATE

UPDATE

UPDATE

DELETE

DELETE Li chng trnh!

Li phn cng!

UPDATE Trng thi CSDL sau khi giao tc tin hnh

Hnh 6.1: Giao tc SQL

6.2 M hnh giao tc trong SQL


Giao tc SQL c nh ngha da trn cc cu lnh x l giao tc sau y: BEGIN TRANSACTION: Bt u mt giao tc SAVE TRANSACTION: nh du mt v tr trong giao tc (gi l im nh du). ROLLBACK TRANSACTION: Quay lui tr li u giao tc hoc mt im nh du trc trong giao tc. COMMIT TRANSACTION: nh du im kt thc mt giao tc. Khi cu lnh ny thc thi cng c ngha l giao tc thc hin thnh cng. ROLLBACK [WORK]: Quay lui tr li u giao tc. COMMIT [WORK]: nh du kt thc giao tc. Mt giao tc trong SQL c bt u bi cu lnh BEGIN TRANSACTION. Cu lnh ny nh du im bt u ca mt giao tc v c c php nh sau:
BEGIN TRANSACTION [tn_giao_tc]

Mt giao tc s kt thc trong cc trng hp sau:

133

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Cu lnh COMMIT TRANSACTION (hoc COMMIT WORK) c thc thi. Cu lnh ny bo hiu s kt thc thnh cng ca mt giao tc. Sau cu lnh ny, mt giao tc mi s c bt u. Khi cu lnh ROLLBACK TRANSACTION (hoc ROLLBACK WORK) c thc thi hu b mt giao tc v a c s d liu v trng thi nh trc khi giao tc bt u. Mt giao tc mi s bt u sau khi cu lnh ROLLBACK c thc thi. Mt giao tc cng s kt thc nu trong qu trnh thc hin gp li (chng hn h thng gp li, kt ni mng b t,...). Trong trng hp ny, h thng s t ng phc hi li trng thi c s d liu nh trc khi giao tc bt u (tng t nh khi cu lnh ROLLBACK c thc thi hu b mt giao tc). Tuy nhin, trong trng hp ny s khng c giao tc mi c bt u. V d 6.1: Giao tc di y kt thc do lnh ROLLBACK TRANSACTION v mi thay i v mt d liu m giao tc thc hin (UPDATE) u khng c tc dng.
BEGIN TRANSACTION giaotac1 UPDATE monhoc SET sodvht=4 WHERE sodvht=3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL ROLLBACK TRANSACTION giaotac1

cn giao tc di y kt thc bi lnh COMMIT v thc hin thnh cng vic cp nht d liu trn cc bng MONHOC v DIEMTHI.
BEGIN TRANSACTION giaotac2 UPDATE monhoc SET sodvht=4 WHERE sodvht=3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL COMMIT TRANSACTION giaotac2

Cu lnh:
SAVE TRANSACTION tn_im_dnh_du

c s dng nh du mt v tr trong giao tc. Khi cu lnh ny c thc thi, trng thi ca c s d liu ti thi im s c ghi li trong nht k giao tc. Trong qu trnh thc thi giao tc c th quay tr li mt im nh du bng cch s dng cu lnh:
ROLLBACK TRANSACTION tn_im_nh_du

Trong trng hp ny, nhng thay i v mt d liu m giao tc thc hin t im nh du n trc khi cu lnh ROLLBACK c triu gi s b hu b. Giao tc s c tip tc vi trng thi c s d liu c c ti im nh du . Hnh 6.2 m t cho ta thy hot ng ca mt giao tc c s dng cc im nh du:
134

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

Hnh 6.2: Hot ng ca mt giao tc

Sau khi cu lnh ROLLBACK TRANSACTION c s dng quay lui li mt im nh du trong giao tc, giao tc vn c tip tc vi cc cu lnh sau . Nhng nu cu lnh ny c s dng quay lui li u giao tc (tc l hu b giao tc), giao tc s kt thc v do cu lnh COMMIT TRANSACTION trong trng hp ny s gp li. V d 6.2: Cu lnh COMMIT TRANSACTION trong giao tc di y kt thc thnh cng mt giao tc
BEGIN TRANSACTION giaotac3 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL 135

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

SAVE TRANSACTION a UPDATE monhoc SET sodvht=4 WHERE sodvht=3 ROLLBACK TRANSACTION a UPDATE monhoc SET sodvht=2 WHERE sodvht=3 COMMIT TRANSACTION giaotac3

v trong v d di y, cu lnh COMMIT TRANSACTION gp li:


BEGIN TRANSACTION giaotac4 UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL SAVE TRANSACTION a UPDATE monhoc SET sodvht=4 WHERE sodvht=3 ROLLBACK TRANSACTION giaotac4 UPDATE monhoc SET sodvht=2 WHERE sodvht=3 COMMIT TRANSACTION giaotac4

6.3 Giao tc lng nhau


Cc giao tc trong SQL c th c lng vo nhau theo tng cp. iu ny thng gp i vi cc giao tc trong cc th tc lu tr c gi hoc t mt tin trnh trong mt giao tc khc. V d di y minh ho cho ta trng hp cc giao tc lng nhau. V d 6.3: Ta nh ngha bng T nh sau:
CREATE TABLE T ( A INT PRIMARY KEY, B INT )

v th tc sp_TransEx:
CREATE PROC sp_TranEx(@a INT,@b INT) AS BEGIN BEGIN TRANSACTION T1 IF NOT EXISTS (SELECT * FROM T WHERE A=@A ) INSERT INTO T VALUES(@A,@B) IF NOT EXISTS (SELECT * FROM T WHERE A=@A+1) INSERT INTO T VALUES(@A+1,@B+1) COMMIT TRANSACTION T1 END

Li gi n th tuch sp_TransEx c thc hin trong mt giao tc khc nh sau:


BEGIN TRANSACTION T3 136

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

EXECUTE sp_tranex 10,20 ROLLBACK TRANSACTION T3

Trong giao tc trn, cu lnh ROLLBACK TRANSACTION T3 hu b giao tc v do tc dng ca li gi th tc trong giao tc khng cn tc dng, tc l khng c dng d liu no mi c b sung vo bng T (cho d giao tc T1 trong th tc sp_tranex thc hin thnh cng vi lnh COMMIT TRANSACTION T1). Ta xt tip mt trng hp ca mt giao tc khc trong c li gi n th tc sp_tranex nh sau:
BEGIN TRANSACTION EXECUTE sp_tranex 20,40 SAVE TRANSACTION a EXECUTE sp_tranex 30,60 ROLLBACK TRANSACTION a EXECUTE sp_tranex 40,80 COMMIT TRANSACTION

sau khi giao tc trn thc hin xong, d liu trong bng T s l:
A 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

PH LC

A. C s d liu mu s dng trong gio trnh


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

138

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Cc bng trong c s d liu, mi quan h gia chng v mt s rng buc c ci t nh sau:


CREATE TABLE khoa ( makhoa NVARCHAR(5) NOT NULL CONSTRAINT pk_khoa PRIMARY KEY, tenkhoa NVARCHAR(50) NOT NULL , dienthoai NVARCHAR(15) NULL ) CREATE TABLE lop ( malop NVARCHAR(10) NOT NULL CONSTRAINT pk_lop PRIMARY KEY, tenlop NVARCHAR(30) NULL , khoa SMALLINT NULL , hedaotao NVARCHAR(25) NULL , namnhaphoc INT NULL , siso INT NULL , makhoa NVARCHAR(5) NULL ) CREATE TABLE sinhvien ( masv NVARCHAR(10) NOT NULL CONSTRAINT pk_sinhvien PRIMARY KEY, hodem NVARCHAR(25) NOT NULL , ten NVARCHAR(10) NOT NULL , ngaysinh SMALLDATETIME NULL , gioitinh BIT NULL , noisinh NVARCHAR(100) NULL , malop NVARCHAR(10) NULL ) CREATE TABLE ( mamonhoc tenmonhoc monhoc NVARCHAR(10) NOT NULL CONSTRAINT pk_monhoc PRIMARY KEY, NVARCHAR(50) NOT NULL , 139

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

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

NOT NULL , NOT NULL , NULL , NULL, KEY(mamonhoc,masv)

ALTER TABLE sinhvien ADD CONSTRAINT fk_sinhvien_lop FOREIGN KEY (malop) REFERENCES lop(malop) ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE diemthi ADD CONSTRAINT fk_diemthi_monhoc FOREIGN KEY (mamonhoc) REFERENCES monhoc(mamonhoc) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_diemthi_sinhvien FOREIGN KEY (masv) REFERENCES sinhvien(masv) ON DELETE CASCADE 140

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

ON UPDATE CASCADE ALTER TABLE monhoc ADD CONSTRAINT chk_monhoc_sodht CHECK(sodvht>0 and sodvht<=5) ALTER TABLE diemthi ADD CONSTRAINT chk_diemthi_diemlan1 CHECK (diemlan1>=0 and diemlan1<=10), CONSTRAINT chk_diemthi_diemlan2 CHECK (diemlan2>=0 and diemlan2<=10)

B. Mt s hm thng s dng
Mc d trong SQL chun khng cung cp c th cc nhng trong cc h qun tr c s d liu lun cung cp cho ngi s dng cc hm ci sn (hay cn gi l cc hm ca h thng). Trong phn ny, chng ti cung cp mt s hm thng c s dng trong SQL Server tin cho vic tra cu v s dng trong thc hnh

B.1 Cc hm trn d liu kiu chui


Hm ASCII
ASCII(string)

Hm tr v m ASCII ca k t u tin bn tri ca chui i s Hm CHAR


CHAR(ascii_code)

Hm tr v k t c m ASCII tng ng vi i s Hm CHARINDEX


CHARINDEX(string1,string2[,start])

Hm tr v v tr u tin tnh t v tr start ti chui string1 xut hin trong chui string2. Hm LEFT
LEFT(string,number)

Hm trch ra number k t t chui string tnh t pha bn tri Hm LEN


LEN(string) 141

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

Hm tr v di ca chui string. Hm LOWER


LOWER(string)

Hm c chc nng chuyn chui string thnh ch thng, kt qu c tr v cho hm Hm LTRIM


LTRIM(string)

Ct b cc khong trng tha bn tri chui string Hm NCHAR


NCHAR(code_number)

Hm tr v k t UNICODE c m c ch nh Hm REPLACE
REPLACE(string1,string2,string3)

Hm tr v mt chui c c bng cch thay th cc chui string2 trong chui string1 bi chui string3. Hm REVERSE
REVERSE(string)

Hm tr v chui o ngc ca chui string. Hm RIGHT


RIGHT(string, number)

Hm trch ra number k t t chui string tnh t pha bn phi. Hm RTRIM


RTRIM(string)

Ct b cc khong trng tha bn phi ca chui string. Hm SPACE


SPACE(number)

Hm tr v mt chui vi number khong trng. Hm STR


STR(number [,length [,decimal]])

Chuyn gi tr kiu s number thnh chui Hm SUBSTRING


SUBSTRING(string, m, n)

Trch ra t n k t t chui string bt u t k t th m. Hm UNICODE

142

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

UNICODE(UnicodeString)

Hm tr v m UNICODE ca k t u tin bn tri ca chui UnicodeString. Hm UPPER


UPPER(string)

Chuyn chui string thnh ch hoa

B.2 Cc hm trn d liu kiu ngy gi


Hm DATEADD
DATEADD(datepart, number, date)

Hm tr v mt gi tr kiu DateTime bng cch cng thm mt khong gi tr l number vo ngy date c ch nh. Trong , datepart l tham s ch nh thnh phn s c cng i vi gi tr date bao gm: Datepart
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 tr v ngy hin ti Hm DAY, MONTH, YEAR


143

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

DAY(date), MONTH(date), YEAR(date)

Hm tr v gi tr ngy (thng hoc nm) ca gi tr kiu ngy c ch nh.

B.3 Hm chuyn i kiu


Hm CAST
CAST (biu_thc AS kiu_d_liu)

Chuyn i gi tr ca biu thc sang kiu c ch nh Hm CONVERT


CONVERT(kiu_d_liu, biu_thc [,kiu_chuyn_i])

Hm c chc nng chuyn i gi tr ca biu thc sang kiu d liu c ch nh. Tham s kiu_chuyn_i l mt gi tr s thng c s dng khi chuyn i gi tr kiu ngy sang kiu chui nhm qui nh khun dng d liu c hin th v c qui nh nh sau: Nm 2 ch s Nm 4 ch s
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

Khun dng d liu


mon dd yyyy hh:mi AM (PM) mm/dd/yy yy.mm.dd dd/mm/yy dd.mm.yy dd-mm-yy dd mon yy Mon dd, yy hh:mm:ss mon dd yyyy hh:mi:ss:mmmAM (PM) mm-dd-yy yy/mm/dd yymmdd

13 hoc 113 dd mon yyyy hh:mm:ss:mmm(24h) 14 114 hh:mi:ss:mmm(24h)

144

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

20 hoc 120 yyyy-mm-dd hh:mi:ss(24h) 21 hoc 121 yyyy-mm-dd hh:mi:ss.mmm(24h) 126 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

Khoa CNTT - Trng HKH Hu

Gio trnh SQL

TI LIU THAM KHO


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

146

You might also like