際際滷

際際滷Share a Scribd company logo
Gia誰o tr巽nh th脱短c ha狸nh SQL
Tr叩旦n Nguy達n Phong
CChh脱脱奪奪nngg 11:: NNGGNN NNGGテ NNHH NNGGHHAA DDテ LLIIUU
Binary
Bit
Char
Datetime
Decimal
Float
Image
Int
Money
Nchar
Ntext
Nvarchar
Real
Smalldatetime
Smallint
Smallmoney
Text
Tinyint
Varbinary
Varchar
Gia誰o tr巽nh th脱短c ha狸nh SQL






CREATE TABLE table_name
(
{colname_1 col_1_properties [constraints_1 ]
[,{colname_2 col_2_properties [constraints_2 ]]
...
[,{colname_N col_N_properties [constraints_N ]]
[table_constraints]
)
- table_name:
- colname_i:
Tr叩旦n Nguy達n Phong
- col_i_properties:
- constraints_i:
- table_constraint:
CREATE TABLE nhanvien
(
manv char(10) not null,
hoten char(30) not null,
ngaysinh datetime null,
diachi char(50) null,
dienthoai char(6) null
)
[CONSTRAINT constraint_name]
CHECK (expression)
CREATE TABLE nhanvien
(
Gia誰o tr巽nh th脱短c ha狸nh SQL
manv char(10) not null,
hoten char(30) not null,
ngaysinh datetime null,
diachi char(50) null,
dienthoai char(6) null
constraint check_dienthoai
check (dienthoai like '[0-9][0-9][0-9]
[0-9][0-9] [0-9]')
)
[CONSTRAINT constraint_name]
DEFAULT {const_expression
錚 nonarguments_function
錚 NULL}
CREATE TABLE nhanvien
(
manv char(10) not null,
hoten char(30) not null,
ngaysinh datetime null,
diachi char(50) default 'kh辰ng bi達炭t',
dienthoai char(6) null
)
Tr叩旦n Nguy達n Phong
[CONSTRAINT constraint_name ]
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
[( colname [,colname2 [...,colname16]])]
CREATE TABLE nhanvien
(
manv char(10) primary key,
hoten char(30) not null,
ngaysinh datetime null,
diachi char(50) null,
dienthoai char(6) null
)
CREATE TABLE nhanvien
(
manv char(10) not null,
hoten char(30) not null,
ngaysinh datetime null,
diachi char(50) null,
dienthoai char(6) null
constraint pk_nv primary key(manv)
)
Gia誰o tr巽nh th脱短c ha狸nh SQL
[CONSTRAINT constraint_name]
UNIQUE [CLUSTERED | NONCLUSTERED]
[colname1 [,colname2 [...,colname16]])]
[CONSTRAINT constraint_name ]
[FOREIGN KEY (colname [,colname2 [...,colname16]])]
REFERENCES reference_table [(ref_colname
[,ref_colname2
[...,ref_colname 16]])]
CREATE TABLE donvi
(
Tr叩旦n Nguy達n Phong
madv char(2) primary key,
tendv char(20) not null
)
CREATE TABLE nhanvien
(
manv char(10) primary key,
hoten char(20) not null,
ngaysinh datetime null,
diachi char(50) default 'khong biet',
dienthoai char(6) check(dienthoai like '[0-9][0-9][0-9]
[0-9][0-9][0-9]'),
madv char(2) foreign key(madv)
references donvi(madv)
)
ALTER TABLE table_name
[ADD
{col_name column_properties [column_constraints]
錚 [[,]table_constraint ] }
[,{next_col_name|next_table_constraint}]...]
錚[DROP
[CONSTRAINT] constraint_name1
[, constraint_name2]...]
ALTER TABLE donvi
ADD CONSTRAINT check_madv
CHECK (madv LIKE [0-9][0-9])
Gia誰o tr巽nh th脱短c ha狸nh SQL


CREATE [CLUSTERED錚NONCLUSTERED] INDEX index_name
ON table_name(column_name [, column_name]...)
CREATE NONCLUSTERED INDEX idx_nhanvien_madv
ON nhanvien(madv)
Tr叩旦n Nguy達n Phong




CREATE VIEW view_name[(column_name [, column_name]...)]
AS select_statement








CREATE VIEW thongtin_nv
AS
SELECT manv,hoten,datediff(year,ngaysinh,getdate()),tendv
FROM nhanvien,donvi
WHERE nhanvien.madv=donvi.madv
CREATE VIEW thongtin_nv(manv,hoten,tuoi,donvi)
Gia誰o tr巽nh th脱短c ha狸nh SQL
AS
SELECT manv,hoten,datediff(year,ngaysinh,getdate()),tendv
FROM nhanvien,donvi
WHERE nhanvien.madv=donvi.madv
Tr叩旦n Nguy達n Phong
CChh脱脱奪奪nngg 22:: NNGGNN NNGGテ TTHHAAOO TTAACC DDテ LLIIUU
則 truy xut d歎 liu t探 c存c dng v袖 c存c c辿t c単a m辿t hay nhiu b其ng, khung nhn,
ta s旦 d担ng c息u lnh SELECT. C息u lnh n袖y c達 th d誰ng 速 th湛c hin php ch辰n (t淡c l袖
truy xut m辿t tp con c存c dng trong m辿t hay nhiu b其ng), php chiu (t淡c l袖 truy
xut m辿t tp con c存c c辿t trong m辿t hay nhiu b其ng) v袖 php n竪i (t淡c l袖 li捉n kt c存c
dng trong hai hay nhiu b其ng 速 truy xut d歎 liu).
C坦 ph存p chung c単a c息u lnh SELECT c達 d孫ng nh足 sau:
SELECT [ ALL | DISTINCT ] select_list
[ INTO [ newtable_name ]]
FROM { table_name | view_name }
................
[,{table_name | view_name }]
[WHERE clause ]
[GROUP BY clause ]
[HAVING BY clause ]
[ORDER BY clause ]
[COMPUTE clause ]
Ch坦 箪: C存c th袖nh phn trong m辿t c息u lnh SELECT ph其i 速足樽c s旦 d担ng theo th淡 t湛
速足樽c n捉u tr捉n.
1.1 X存c 速nh b其ng b損ng mnh 速 FROM
Mnh 速 FROM trong c息u lnh SELECT 速足樽c s旦 d担ng nh損m ch 速nh c存c b其ng
v袖 khung nhn cn truy xut d歎 liu. Sau mnh 速 FROM l袖 danh s存ch t捉n c存c b其ng
v袖 khung nhn tham gia v袖o truy vn (t捉n c単a c存c b其ng v袖 khung nhn 速足樽c ph息n c存ch
nhau b谷i du phy).
SELECT select_list
FROM {table_name錚view_name list}
Gia誰o tr巽nh th脱短c ha狸nh SQL
則 速測n gi其n ho存 c息u h叩i, ta c達 th s旦 d担ng c存c b danh (alias) cho c存c b其ng hay
khung nhn. B danh 速足樽c g存n trong mnh 速 FROM b損ng c存ch ch 速nh b danh sau
t捉n b其ng. V d担 c息u lnh sau g存n b danh n1 cho b其ng nhanvien.
SELECT ten, diachi FROM nhanvien n1
1.2 Mnh 速 WHERE
Mnh 速 WHERE trong c息u lnh SELECT x存c 速nh c存c 速iu kin 速竪i v鱈i vic truy
xut d歎 liu. Sau mnh 速 WHERE l袖 m辿t biu th淡c logic v袖 ch nh歎ng dng d歎 liu
n袖o tho其 mn biu th淡c sau WHERE m鱈i 速足樽c hin th trong kt qu其 truy vn. Trong
mnh 速 WHERE th足棚ng s旦 d担ng:
 C存c to存n t旦 so s存nh
 Gi鱈i h孫n ( BETWEEN v袖 NOT BETWEEN).
 Danh s存ch (IN, NOT IN)
 Khu束n d孫ng (LIKE v袖 NOT LIKE).
 C存c gi存 tr ch足a bit (IS NULL v袖 IS NOT NULL).
 Kt h樽p c存c 速iu kin (AND, OR).
C存c to存n t旦 so s存nh:
To存n t旦 箪 ngha
= B損ng
> L鱈n h測n
< Nh叩 h測n
>= L鱈n h測n hoc b損ng
<= Nh叩 h測n hoc b損ng
<> Kh存c
!> Kh束ng l鱈n h測n
!< Kh束ng nh叩 h測n
V d担 2.1: Truy vn sau 速息y cho bit t捉n, 速a ch v袖 速in tho孫i c単a nh歎ng nh息n vi捉n
c達 h s竪 l足測ng l鱈n h測n 1.92:
SELECT ten, diachi, dienthoai
FROM nhanvien
WHERE hsluong>1.92
Gi鱈i h孫n (BETWEEN v袖 NOT BETWEEN)
T探 kho存 BETWEEN v袖 NOT BETWEEN 速足樽c s旦 d担ng nh損m ch 速nh kho其ng
gi存 tr tm kim 速竪i v鱈i c息u lnh SELECT. C息u lnh d足鱈i 速息y cho bit t捉n v袖 速ia ch
c単a nh歎ng nh息n vi捉n c達 h s竪 l足測ng n損m trong kho其ng 1.92 速n 3.11
SELECT ten, tuoi, diachi
FROM nhanvien
WHERE hsluong BETWEEN 1.92 AND 3.11
Tr叩旦n Nguy達n Phong
Danh s存ch (IN v袖 NOT IN)
T探 kho存 IN 速足樽c s旦 d担ng khi ta cn ch 速nh 速iu kin tm kim d歎 liu cho c息u
lnh SELECT l袖 m辿t danh s存ch c存c gi存 tr. Sau IN (hoc NOT IN) c達 th l袖 m辿t danh
s存ch c存c gi存 tr hoc l袖 m辿t c息u lnh SELECT kh存c.
V d担 2.2: 則 hin th th束ng tin v c存c nh息n vi捉n c達 h s竪 l足測ng l袖 1.86, 1.92
hoc 2.11, thay v s旦 d担ng c息u lnh:
SELECT * FROM nhanvien
WHERE hsluong=1.86 OR hsluong=1.92 OR hsluong=2.11
Ta c達 th s旦 d担ng c息u lnh sau:
SELECT * FROM nhanvien
WHERE hsluong IN (1.86, 1.92, 2.11)
C存c k箪 t湛 速孫i din v袖 mnh 速 LIKE
T探 kho存 LIKE (NOT LIKE) s旦 d担ng trong c息u lnh SELECT nh損m m束 t其 khu束n
d孫ng c単a d歎 liu cn tm kim. Ch坦ng th足棚ng 速足樽c kt h樽p v鱈i c存c k箪 t湛 速孫i din sau
速息y:
K箪 t湛 速孫i din 箪 ngha
% Chu巽i k箪 t湛 bt k炭 g奪m kh束ng hoc nhiu k箪 t湛
- K箪 t湛 速測n bt k炭
[] K箪 t湛 速測n bt k炭 trong gi鱈i h孫n 速足樽c ch 速nh (v d担 [a-f])
hay m辿t tp (v d担 [abcdef])
[^] K箪 t湛 速測n bt k炭 kh束ng n損m trong gi鱈i h孫n 速足樽c ch 速nh (
v d担 [^a-f] hay m辿t tp (v d担 [^abcdef]).
V d担 2.3: C息u lnh d足鱈i 速息y hin th th束ng tin v c存c nh息n vi捉n c達 t捉n l袖 Nam
SELECT * FROM nhanvien
WHERE hoten LIKE '% Nam'
IS NULL v袖 NOT IS NULL
Gi存 tr NULL c達 th 速足樽c nhp v袖o m辿t c辿t cho php chp nhn gi存 tr NULL
theo m辿t trong ba c存ch sau:
 Nu kh束ng c達 d歎 liu 速足樽c 速足a v袖o v袖 kh束ng c達 mc 速nh cho c辿t hay kiu
d歎 liu tr捉n c辿t 速達.
 Ng足棚i s旦 d担ng tr湛c tip 速足a gi存 tr NULL v袖o cho c辿t 速達.
 M辿t c辿t c達 kiu d歎 liu l袖 kiu s竪 s ch淡a gi存 tr NULL nu gi存 tr 速足樽c ch
速nh g息y tr袖n s竪.
Trong mnh 速 WHERE, ta s旦 d担ng IS NULL hoc IS NOT NULL nh足 sau:
WHERE col_name IS [NOT] NULL
C存c to存n t旦 logic
C存c to存n t旦 logic s旦 d担ng trong mnh 速 WHERE bao g奪m AND, OR, NOT.
AND v袖 OR 速足樽c s旦 d担ng 速 kt h樽p nhiu 速iu kin trong WHERE.
1.3 Danh s存ch ch辰n trong c息u lnh SELECT
Gia誰o tr巽nh th脱短c ha狸nh SQL
辰n tt c其 c存c c辿t trong b其ng
Khi mu竪n truy xut tt c其 c存c c辿t trong b其ng, ta s旦 d担ng c息u lnh SELECT c達 c坦
ph存p sau:
SELECT * FROM table_name
Khi s旦 d担ng c息u lnh n袖y, c存c c辿t trong kt qu其 s 速足樽c hin th theo th淡 t湛 m袖
ch坦ng 速 速足樽c t孫o ra trong c息u lnh CREATE TABLE.
* Ch辰n c存c c辿t 速足樽c ch 速nh
則 ch辰n ra m辿t s竪 c辿t n袖o 速達 trong b其ng, ta s旦 d担ng c息u lnh SELECT c達 c坦
ph存p sau:
SELECT t捉n_c辿t [,...,t捉n_c辿t_n]
FROM t捉n_b其ng | khung_nhn
C存c t捉n c辿t trong c息u lnh ph其i 速足樽c ph息n c存ch nhau b損ng du phy.
Ch坦 箪: Trong c息u lnh SELECT, th淡 t湛 c単a c存c c辿t 速足樽c n捉u ra trong c息u lnh s
x存c 速nh th淡 t湛 c単a c存c c辿t 速足樽c hin th ra trong kt qu其.
* 則脱i t捉n c存c c辿t trong c存c kt qu其
Khi kt qu其 速足樽c hin th, ti捉u 速 c単a c存c c辿t mc 速nh s l袖 t捉n c単a c存c c辿t khi
n達 速足樽c t孫o ra trong c息u lnh CREATE TABLE. Tuy nhi捉n, 速 c存c ti捉u 速 tr谷 n捉n
th息n thin h測n, ta c達 th 速脱i t捉n c存c ti捉u 速 c単a c存c c辿t. 則 l袖m 速足樽c vic n袖y, ta c達
th s旦 d担ng m辿t trong hai c存ch vit sau:
ti捉u_速_c辿t = t捉n_c辿t
hoc t捉n_c辿t ti捉u_速_c辿t
V d担 2.4: Hai c息u lnh sau s 速t ti捉u 速 H辰 v袖 t捉n cho l袖 hoten v袖 則a ch
cho c辿t diachi khi kt qu其 速足樽c hin th cho ng足棚i s旦 d担ng:
SELECT 'H辰 v袖 t捉n'=hoten,
'則a ch '= diachi
FROM nhanvien
Hoc:
SELECT hoten 'H辰 v袖 t捉n',diachi '則ia ch '
FROM nhanvien
* S旦 d担ng cu tr坦c CASE 速 thay 速脱i d歎 liu trong kt qu其
Trong c息u lnh SELECT, ta c達 th s旦 d担ng cu tr坦c CASE 速 thay 速脱i c存ch hin
th kt qu其 ra m袖n hnh.
V d担 2.5: C息u lnh sau cho bit h辰 t捉n, h s竪 l足測ng v袖 xp lo孫i l足測ng c単a nh息n
vi捉n theo h s竪 l足測ng:
SELECT 'H辰 v袖 t捉n' = ten, 'H s竪 l足測ng' = hsluong,
'Xp lo孫i l足測ng' =
CASE
WHEN lsluong=NULL THEN 'Kh束ng x存c 速nh'
Tr叩旦n Nguy達n Phong
WHEN hsluong<=1.92 THEN 'Lu測ng thp'
WHEN hsluong<=3.1 THEN 'L足測ng TB'
WHEN hsluong<=5.2 THEN 'L足測ng cao'
ELSE 'L足測ng rt cao'
END
FROM Nhanvien
* C存c chu巽i k箪 t湛 trong kt qu其
Ta c達 th th捉m c存c chu巽i k箪 t湛 v袖o b捉n trong truy vn nh損m thay 速脱i c存ch th淡c
trnh b袖y d歎 liu.
V d担 2.6: C息u lnh sau s th捉m chu巽i k箪 t湛 H s竪 l足測ng l袖  v袖o tr足鱈c kt qu其
谷 c辿t m淡c l足測ng 谷 t探ng dng trong kt qu其:
SELECT 'H辰 v袖 t捉n' = hoten,
'H s竪 l足測ng l袖 : ','H s竪 l足測ng'=hsluong
FROM nhanvien
Truy vn tr捉n cho c達 kt qu其 c達 d孫ng nh足 sau:
H辰 v袖 t捉n H s竪 l足測ng
---------------- -------------- -------------
Trn Nguy捉n Phong H s竪 l足測ng l袖 : 1.92
L捉 Ho袖i Nam H s竪 l足測ng l袖 : 1.86
Nguyn H歎u Tnh H s竪 l足測ng l袖 : 1.92
Nguyn Trung Ki捉n H s竪 l足測ng l袖 : 1.86
Nguyn Th Hoa H s竪 l足測ng l袖 : 2.11
Ho袖ng Nam Phong H s竪 l足測ng l袖 : 3.21
1.4 Tnh to存n c存c gi存 tr trong c息u lnh SELECT
Danh s存ch ch辰n trong c息u lnh SELECT c達 th c達 c存c biu th淡c s竪 h辰c. Khi 速達
kt qu其 c単a biu th淡c s l袖 m辿t c辿t trong kt qu其 truy vn:
V d担 2.7: C息u lnh sau cho bit h辰 t捉n v袖 l足測ng c単a c存c nh息n vi捉n
SELECT 'H辰 v袖 t捉n'=ten, 'L足測ng'=hsluong*210000
FROM nhanvien
1.5 T探 kho存 DISTINCT
T探 kho存 DISTINCT 速足樽c s旦 d担ng trong c息u lnh SELECT nh損m lo孫i b叩 ra kh叩i
kt qu其 truy vn nh歎ng dng d歎 liu c達 gi存 tr gi竪ng nhau
V d担 2.8: nu ta s旦 d担ng c息u lnh:
SELECT hsluong FROM nhanvien
Ta s c達 kt qu其 nh足 sau:
Gia誰o tr巽nh th脱短c ha狸nh SQL
hsluong
-----------------
1.92
1.86
1.92
1.86
2.11
3.21
Nh足ng nu ta s旦 d担ng c息u lnh:
SELECT DISTINCT hsluong FROM nhanvien
kt qu其 c単a truy vn s l袖:
hsluong
----------
1.92
1.86
2.11
3.21
1.6 T孫o b其ng m鱈i b損ng c息u lnh SELECT ... INTO
C息u lnh SELECT ... INTO c達 t存c d担ng t孫o m辿t b其ng m鱈i c達 cu tr坦c v袖 d歎 liu
速足樽c x存c 速nh t探 kt qu其 c単a truy vn. B其ng m鱈i 速足樽c t孫o ra s c達 s竪 c辿t b損ng s竪 c辿t
速足樽c ch 速nh trong danh s存ch ch辰n v袖 s竪 dng s 袖 s竪 dng kt qu其 c単a truy vn
V d担 2.9: C息u lnh d足鱈i 速息y t孫o m鱈i m辿t b其ng c達 t捉n l袖 NHANVIEN_LUU bao
g奪m h辰 t捉n v袖 速a ch c単a nh歎ng nh息n vi捉n c達 h s竪 l足測ng l鱈n h測n 1.92:
SELECT hoten, diachi
INTO nhanvien_luu
FROM nhanvien
WHERE hsluong>1.92
1.7 S他p xp kt qu其 truy vn b損ng ORDER BY
Mnh 速 ORDER BY 速足樽c s旦 d担ng nh損m s他p xp kt qu其 truy vn theo m辿t hay
nhiu c辿t (t竪i 速a l袖 16 c辿t). Vic s他p xp c達 th theo th淡 t湛 t即ng t即ng (ASC) hoc gi其m
(DESC). Nu kh束ng ch 速nh r但 th mc 速nh l袖 t即ng.
V d担 2.10: C息u lnh sau s s他p xp c存c nh息n vi捉n theo th淡 t湛 gi其m dn c単a h
s竪 l足測ng v袖 nu h s竪 l足測ng b損ng nhau th s他p xp theo th淡 t湛 t即ng dn c単a ng袖y sinh:
SELECT hoten,ngaysinh,hsluong
FROM nhanvien
ORDER BY hsluong DESC, ngaysinh
Ta c達 th s旦 d担ng c存c s竪 thay v s旦 d担ng t捉n c辿t sau mnh 速 ORDER BY.
V d担 2.11: c息u lnh d足鱈i 速息y s他p xp c存c nh息n vi捉n theo th淡 t湛 t即ng dn c単a
ng袖y sinh:
Tr叩旦n Nguy達n Phong
SELECT hoten,ngaysinh,hsluong
FROM nhanvien
ORDER BY 3
1.8 Php h樽p v袖 to存n t旦 UNION
To存n t旦 UNION cho php ta h樽p c存c kt qu其 c単a hai hay nhiu truy vn th袖nh
m辿t tp kt qu其 duy nht. C坦 ph存p c単a php h樽p nh足 sau:
Query_1
[UNION [ALL] Query_2 ]
...
[UNION [ALL] Query_N ]
[ORDER BY clause]
[COMPUTE clause]
Trong 速達:
Query_1 c達 d孫ng:
SELECT select_list
[INTO clause]
[FROM clause]
[WHERE clause]
[GROUP BY clause]
[HAVING clause]
v袖 Query_i (i=2,..,N) c達 d孫ng:
SELECT select_list
[FROM clause]
[WHERE clause]
[GROUP BY clause]
[HAVING clause]
V d担 2.12: Gi其 s旦 ta c達 hai b其ng nh足 sau:
R S
A B C E F
abc 3 5 edf 15
jks 5 7 hht 1
bdg 10 5 abc 3
Hht 12 0 adf 2
Th php h樽p:
SELECT A,B FROM R
UNION
Gia誰o tr巽nh th脱短c ha狸nh SQL
SELECT * FROM S
C達 kt qu其 nh足 sau:
A B
---- -----------
abc 3
adf 2
bgd 10
edf 15
hht 1
hht 12
jks 5
Theo mc 速nh, php to存n UNION s lo孫i b叩 nh歎ng dng gi竪ng nhau trong kt
qu其. Nu ta s旦 d担ng t誰y ch辰n ALL th c存c dng gi竪ng nhau s kh束ng b lo孫i b叩. Ta c達
th s旦 d担ng c存c du ngoc 速 x存c 速nh th淡 t湛 tnh to存n trong php h樽p.
1.8.1 C存c nguy捉n t他c khi x息y d湛ng c息u lnh UNION
Khi x息y d湛ng c存c c息u lnh UNION, ta cn ch坦 箪 c存c nguy捉n t他c sau:
 Tt c其 c存c danh s存ch ch辰n trong c息u lnh UNION ph其i c達 c誰ng s竪 biu th淡c
(c存c t捉n c辿t, c存c biu th淡c s竪 h辰c, c存c h袖m g辿p,...)
 C存c c辿t t足測ng 淡ng trong tt c其 c存c b其ng, hoc tp con bt k炭 c存c c辿t 速足樽c s旦
d担ng trong b其n th息n m巽i truy vn ph其i c誰ng kiu d歎 liu.
 C存c c辿t t足測ng 淡ng trong b其n th息n t探ng truy vn c単a m辿t c息u lnh UNION
ph其i xut hin theo th淡 t湛 nh足 nhau. Nguy捉n nh息n l袖 do php h樽p so s存nh c存c
c辿t t探ng c辿t m辿t theo th淡 t湛 速足樽c cho trong m巽i truy vn.
 Khi c存c kiu d歎 liu kh存c nhau 速足樽c kt h樽p v鱈i nhau trong c息u lnh
UNION, ch坦ng s 速足樽c chuyn sang kiu d歎 liu cao h測n (nu c達 th 速足樽c).
 Ti捉u 速 c辿t trong kt qu其 c単a php h樽p s l袖 ti捉u 速 c辿t 速足樽c ch 速nh trong
truy vn 速u ti捉n.
1.8.2 S旦 d担ng UNION v鱈i c存c giao t存c SQL kh存c
C存c nguy捉n t他c sau ph其i 速足樽c tu息n theo khi s旦 d担ng php h樽p v鱈i c存c c息u lnh
giao t存c SQL kh存c:
 Truy vn 速u ti捉n trong c息u lnh UNION c達 th c達 INTO 速 t孫o m辿t b其ng t探
kt qu其 cu竪i c誰ng.
 Mnh 速 ORDER BY v袖 COMPUTE d誰ng 速 x存c 速nh th淡 t湛 kt qu其 cu竪i
c誰ng hoc tnh to存n c存c gi存 tr t達m t他t ch 速足樽c cho php s旦 d担ng 谷 cu竪i c単a
c息u lnh UNION. Ch坦ng kh束ng 速足樽c php s旦 d担ng trong bt k炭 b其n th息n
truy vn n袖o trong php h樽p.
 Mnh 速 GROUP BY v袖 HAVING ch c達 th 速足樽c s旦 d担ng trong b其n th息n
t探ng truy vn. Ch坦ng kh束ng th 速足樽c s旦 d担ng 速 t存c 速辿ng l捉n kt qu其 cu竪i
c誰ng.
Tr叩旦n Nguy達n Phong
 Php to存n UNION c嘆ng c達 th 速足樽c s旦 d担ng b捉n trong m辿t c息u lnh
INSERT.
 Php to存n UNION kh束ng th s旦 d担ng trong c息u lnh CREATE VIEW.
1.9 Php n竪i
Php n竪i 速足樽c s旦 d担ng 速 truy xut d歎 liu t探 hai hay nhiu b其ng hoc khung
nhn trong c誰ng CSDL hoc trong c存c CSDL kh存c nhau b谷i c誰ng m辿t php x旦 l箪.
1.9.1 Php to存n n竪i
M辿t c息u lnh n竪i (join statament) th湛c hin c存c c束ng vic sau 速息y:
 X存c 速nh m辿t c辿t t探 m巽i b其ng.
 So s存nh c存c gi存 tr trong nh歎ng c辿t n袖y theo t探ng dng.
 Kt h樽p c存c dng c達 nh歎ng gi存 tr tho其 mn 速iu kin th袖nh nh歎ng dng
m鱈i.
V d担 2.13: C息u lnh d足鱈i 速息y cho bit h辰 t捉n, 速a ch c単a c存c nh息n vi捉n v袖 t捉n
速測n v m袖 m巽i nh息n vi捉n th湛c thu辿c:
SELECT hoten, diachi, tendonvi
FROM nhanvien, donvi
WHERE nhanvien.madonvi = donvi.madonvi
Danh s存ch ch辰n trong php n竪i
Gi竪ng nh足 c存c c息u lnh ch辰n (selection statment), m辿t c息u lnh n竪i b他t 速u v鱈i
t探 kh達a SELECT. C存c c辿t 速足樽c ch 速nh t捉n sau t探 kho存 SELECT l袖 c存c c辿t 速足樽c d足a
ra trong kt qu其 truy vn. Trong danh s存ch ch辰n c単a php n竪i, ta c達 th ch 速nh m辿t
s竪 c辿t b損ng c存ch ch 速nh t捉n c単a c辿t 速達 hoc tt c其 c存c c辿t c単a nh歎ng b其ng tham gia
v袖o php n竪i b損ng c存ch s旦 d担ng du sao (*). Danh s存ch ch辰n kh束ng nht thit ph其i
bao g奪m c存c c辿t c単a nh歎ng b其ng tham gia php n竪i.
Mnh 速 FROM trong php n竪i
Mnh 速 FROM c単a c息u lnh n竪i x存c dnh c存c b其ng (hay khung nhn) tham gia
v袖o php n竪i. Nu ta s旦 d担ng du * trong danh s存ch ch辰n th th淡 t湛 c単a c存c b其ng lit
k捉 trong FROM s 其nh h足谷ng 速n kt qu其 速足樽c hin th.
Mnh 速 WHERE trong php n竪i
Mnh 速 WHERE x存c 速nh 速iu kin n竪i gi歎a c存c b其ng v袖 c存c khung nhn 速足樽c
ch 速nh. N達 x存c 速nh t捉n c単a c辿t 速足樽c s旦 d担ng 速 n竪i v袖 php to存n n竪i 速足樽c s旦 d担ng.
C存c to存n t旦 so s存nh d足鱈i 速息y 速足樽c s旦 d担ng 速 x存c 速nh 速iu kin n竪i
Php to存n 箪 ngha
= B損ng
> L鱈n h測n
>= L鱈n h測n hoc b損ng
< Nh叩 h測n
<= Nh叩 h測n hoc b損ng
<> Kh存c
Gia誰o tr巽nh th脱短c ha狸nh SQL
!> Kh束ng l鱈n h測n
!< Kh束ng nh叩 h測n.
1.9.2 C存c lo孫i php n竪i
* Php n竪i b損ng v袖 php n竪i t湛 nhi捉n
M辿t php n竪i b損ng (equijoin) l袖 m辿t php n竪i trong 速達 gi存 tr c単a c存c c辿t 速足樽c
s旦 d担ng 速 n竪i 速足樽c so s存nh v鱈i nhau d湛a tr捉n ti捉u chun b損ng v袖 tt c其 c存c c辿t trong
c存c b其ng tham gia n竪i 速u 速足樽c 速足a ra trong kt qu其.
V d担 2.14:
SELECT * FROM nhanvien, donvi
WHERE nhanvien.madonvi = donvi.madonvi
Trong kt qu其 c単a c息u lnh tr捉n, c辿t madonvi v袖 tendonvi xut hin hai ln trong
kt qu其 php n竪i v袖 nh足 vy l袖 kh束ng cn thit. 則 lo孫i b叩 速iu n袖y, ta c達 th s旦 d担ng
php n竪i t湛 nhi捉n (natural join) b損ng c存ch lo孫i b叩 速i c存c c辿t tr誰ng t捉n v鱈i nhau.
* Php n竪i v鱈i c存c 速iu kin b脱 sung
Trong mnh 速 WHERE c単a c息u lnh n竪i, ta c達 th b竪 sung c存c 速iu kin tm
kim kh存c.
V d担 2.15:
SELECT hoten, diachi, tendonvi
FROM nhanvien, donvi
WHERE nhanvien.madonvi = donvi.madonvi AND
Nhanvien.hsluong>=2.11
* Php t湛 n竪i v袖 c存c b danh
Php t湛 n竪i l袖 php n竪i m袖 trong 速達 ta so s存nh c存c gi存 tr b捉n trong m辿t c辿t c単a
c誰ng m辿t b其ng.
V d担 2.16: Tm nh歎ng nh息n vi捉n c達 c誰ng 速a ch v鱈i nh息n vi捉n 'Trn Nguy捉n
Phong'
SELECT n1.hoten
FROM nhanvien n1, nhanvien n2
WHERE n2.hoten='Trn Nguy捉n Phong' AND
n1.diachi = n2.diachi
* Php n竪i kh束ng d湛a tr捉n ti捉u chun b損ng
Trong php n竪i n袖y, c存c c辿t 速足樽c s旦 d担ng 速 kt n竪i 速足樽c so s存nh v鱈i nhau
kh束ng d湛a tr捉n 速iu kin b損ng.
* Php n竪i ngo袖i (outer join)
Trong c存c php n竪i 速 速 cp 谷 tr捉n, ch nh歎ng dng h樽p l (t淡c l袖 nh歎ng dng
c達 gi存 tr trong c存c c辿t 速足樽c ch 速nh tho其 m 速iu kin kt n竪i) m鱈i 速足樽c 速足a ra trong
kt qu其. Theo m辿t ngha n袖o 速達, nh歎ng php n竪i n袖y lo孫i b叩 th束ng tin ch淡a trong
nh歎ng dng kh束ng h樽p l. Tuy nhi捉n, 速束i khi ta c嘆ng cn gi歎 l孫i nh歎ng th束ng tin
kh束ng h樽p l b損ng c存ch cho php nh歎ng dng kh束ng h樽p l c達 mt trong kt qu其 c単a
Tr叩旦n Nguy達n Phong
php n竪i. 則 l袖m 速iu n袖y, ta c達 th s旦 d担ng php n竪i ngo袖i. Giao t存c SQL cung cp
hai php n竪i ngo袖i:
 Php n竪i ngo袖i tr存i (*=) : Php n竪i n袖y cho php ly tt c其 c存c t探 b其ng c達
t捉n 速u ti捉n.
 Php n竪i ngo袖i ph其i (=*) : Php n竪i n袖y cho php ly tt c其 c存c dng t探
b其ng c達 t捉n th淡 hai.
V d担 2.17: Gi其 s旦 ta c達 hai b其ng R v袖 S c達 n辿i dung nh足 sau
A B C D
----- ----------- ----------- -----
aaa 2 4 aaaa
fff 8 4 f2
ggg 2 7 g4
xxx 2 12 gdf
ggg 2 12 khf
sss 45 0 k3h
B其ng R
E F G
----- ----------- -----------
aaa 3 (null)
xxx 23 26
abc 3 6
(null)12 (null)
sss 20 3
B其ng S
Khi 速達 c息u lnh:
SELECT * FROM R,S
WHERE R.A = S.E
Cho kt qu其 l袖:
A B C D E F G
---- ----- ----- ----- ----- ------ --------
aaa 2 4 aaaa aaa 3 (null)
xxx 2 12 gdf xxx 23 26
sss 45 0 k3h sss 20 3
Cn c息u lnh:
Gia誰o tr巽nh th脱短c ha狸nh SQL
SELECT * FROM R,S
WHERE R.A *= S.E
Cho kt qu其 l袖:
A B C D E F G
--- ---- ---- ----- ----- ------ ------
aaa 2 4 aaaa aaa 3 (null)
fff 8 4 f2 (null) (null) (null)
ggg 2 7 g4 (null) (null) (null)
xxx 2 12 gdf xxx 23 26
ggg 2 12 khf (null) (null) (null)
sss 45 0 k3h sss 20 3
V袖 c息u lnh
SELECT * FROM R,S
WHERE R.A =* S.E
Cho kt qu其 l袖:
A B C D E F G
---- ----- ----- ----- ----- ------ ---------
aaa 2 4 aaaa aaa 3 (null)
xxx 2 12 gdf xxx 23 26
(null)(null) (null) (null) abc 3 6
(null)(null) (null) (null) (null)12 (null)
sss 45 0 k3h sss 20 3
C存c gi鱈i h孫n c単a php n竪i ngo袖i
Giao t存c SQL kh束ng cho php hai php n竪i ngo袖i l奪ng nhau v袖 php n竪i
trong l奪ng v袖o trong php n竪i ngo袖i. Tuy nhi捉n, m辿t b其ng c達 th tham gia trong m辿t
php n竪i trong v袖 l袖 b其ng ngo袖i (outer table) trong m辿t php n竪i ngo袖i.
B其ng d足鱈i 速息y cho bit c存c c存ch kt h樽p h樽p l v袖 kh束ng h樽p l c単a php
n竪i trong v袖 php n竪i ngo袖i:
H樽p l Kh束ng h樽p l
T1 =* T2 *= T3 T1 *= T2 *= T3
T1 = T2 *= T3 T1 *= T2 = T3
T1 *= T2 =* T3
T3 T3
Tr叩旦n Nguy達n Phong
||
*
T2 =* T1 *= T4
*
||
T5
||
*
T2 =* T1 =* T4
*
||
T5
T3
*
||
T2 *= T1 =* T4
||
*
T5
T3
||
*
T2 *= T1 *= T4
||
*
T5
* Php n竪i v袖 c存c gi存 tr NULL
Nu trong c存c c辿t c単a c存c b其ng tham gia php n竪i c達 c存c gi存 tr NULL th c存c
gi存 tr NULL 速足樽c xem nh足 l袖 kh束ng b損ng nhau. Ch村ng h孫n ta c達 hai b其ng:
A
------
B
---------
C
--------
D
--------
1 b1 Null d1
Null b2 4 d2
4 b3
B其ng R B其ng S
Th c息u lnh:
SELECT * FROM R, S
WHERE A *= C
S cho kt qu其 l袖:
A
------
B
------
C
------
D
------
1 b1 Null Null
Null b2 Null Null
4 b3 4 D2
1.10 T孫o c存c dng th竪ng k捉 d歎 liu v鱈i COMPUTE ... BY
Ta s旦 d担ng mnh 速 COMPUTE BY kt h樽p v鱈i c存c h袖m g辿p dng v袖 mnh 速
ORDER BY 速 s其n sinh ra c存c c存c b存o c存o (report) nh損m th竪ng k捉 c存c gi存 tr d歎 liu
Gia誰o tr巽nh th脱短c ha狸nh SQL
theo t探ng nh達m. Nh歎ng gi存 tr th竪ng k捉 n袖y xut hin nh足 l袖 nh歎ng dng b脱 sung
trong kt qu其 truy vn. M辿t mnh 速 COMPUTE BY cho php ta quan s存t c其 c存c chi
tit v d歎 liu ln c存c gi存 tr th竪ng k捉. Ta c達 th tnh c存c gi存 tr th竪ng k捉 cho c存c
nh達m con (subgroups) v袖 ta c嘆ng c達 th tnh to存n nhiu h袖m g辿p tr捉n c誰ng m辿t
nh達m.
Mnh 速 COMPUTE BY c達 c坦 ph存p nh足 sau:
COMPUTE row-aggregate(col_name)
[,...,row_aggregate(col_name)]
BY col_name [,...,col_name]
C存c h袖m g辿p c達 th s旦 d担ng 速足樽c v鱈i COMPUTE BY bao g奪m SUM, AVG,
MIN, MAX v袖 COUNT.
V d担 2.18: C息u lnh d足鱈i 速息y cho bit h辰 t捉n, t捉n 速測n v h s竪 l足測ng c単a nh息n
vi捉n 速奪ng th棚i cho bit l足測ng trung bnh c単a c存c nh息n vi捉n trong m巽i 速測n v
SELECT hoten,tendonvi,hsluong
FROM nhanvien,donvi
WHERE nhanvien.madonvi=donvi.madonvi
ORDER BY nhanvien.madonvi
COMPUTE AVG(hsluong) BY nhanvien.madonvi
Kt qu其 c単a truy vn n袖y s nh足 sau:
Hoten tendonvi hsluong
--------------- -------------- --------------
Nguyn Th Hoa Phng k to存n 2.11
avg
===========
2.11
L捉 Ho袖i Nam Phng T脱 ch淡c 1.86
Ho袖ng Nam Phong Phng T脱 ch淡c 3.21
avg
===========
2.535
Trn Nguy捉n Phong Phng 速iu h袖nh 1.92
Nguyn H歎u Tnh Phng 速iu h袖nh 1.92
avg
===========
1.92
Nguyn Trung Ki捉n Phng t袖i v担 1.86
Tr叩旦n Nguy達n Phong
avg
===========
1.86
Khi s旦 d担ng mnh 速 COMPUTE ... BY cn tu息n theo c存c qui t他c d足鱈i 速息y:
 T探 kh達a DISTINCT kh束ng cho php s旦 d担ng v鱈i c存c h袖m g辿p dng
 C存c c辿t s旦 d担ng trong mnh 速 COMPUTE ph其i xut hin trong danh s存ch
ch辰n.
 Kh束ng s旦 d担ng SELECT INTO trong m辿t c息u lnh SELECT c達 s旦 d担ng
COMPUTE.
 Nu s旦 d担ng mnh 速 COMPUTE ... BY th c嘆ng ph其i s旦 d担ng mnh 速
ORDER BY. C存c c辿t lit k捉 trong COMPUTE BY ph其i gi竪ng ht hay l袖 m辿t
tp con c単a nh歎ng g 速足樽c lit k捉 sau ORDER BY. Ch坦ng ph其i c達 c誰ng th淡
t湛 t探 tr存i qua ph其i, b他t 速u v鱈i c誰ng m辿t biu th淡c v袖 kh束ng b叩 qua bt k炭
m辿t biu th淡c n袖o.
Ch村ng h孫n nu mnh 速 ORDER BY c達 d孫ng:
ORDER BY a, b, c
Th mnh 速 COMPUTE BY c達 d孫ng d足鱈i 速息y l袖 h樽p l:
COMPUTE row_aggregate (column_name) BY a, b, c
COMPUTE row_aggregate (column_name) BY a, b
COMPUTE row_aggregate (column_name) BY a
V袖 c存c d孫ng d足鱈i 速息y l袖 sai
COMPUTE row_aggregate (column_name) BY b, c
COMPUTE row_aggregate (column_name) BY a, c
COMPUTE row_aggregate (column_name) BY c
 Ph其i s旦 d担ng m辿t t捉n c辿t hoc m辿t biu th淡c trong mnh 速 ORDER BY,
vic s他p xp (order) kh束ng 速足樽c th湛c hin d湛a tr捉n ti捉u 速 c辿t.
 T探 kho存 COMPUTE c達 th 速足樽c s旦 d担ng m袖 kh束ng c達 BY v袖 khi 速達
ORDER BY l袖 t誰y ch辰n.
1.11 Th竪ng k捉 d歎 liu v鱈i GROUP BY v袖 HAVING
Ta c達 th s旦 d担ng c存c mnh 速 GROUP BY v袖 HAVING 速 th竪ng k捉 d歎 liu.
GROUP BY t脱 ch淡c d歎 liu v袖o c存c nh達m, HAVING thit lp c存c 速iu kin l捉n c存c
nh達m trong kt qu其 truy vn. Nh歎ng mnh 速 n袖y th足棚ng 速足樽c s旦 d担ng kt h樽p v鱈i
nhau (HAVING 速足樽c s旦 d担ng kh束ng km v鱈i GROUP BY c達 th t孫o ra nh歎ng kt
qu其 nhm ln).
C存c h袖m g辿p tr其 v c存c gi存 tr t達m l足樽c cho c其 b其ng hoc cho c存c nh達m trong
b其ng. Do 速達, ch坦ng th足棚ng 速足樽c s旦 d担ng v鱈i GROUP BY. C存c h袖m g辿p c達 th xut
hin trong m辿t dang s存ch ch辰n hay trong mnh 速 HAVING, nh足ng kh束ng 速足樽c s旦
d担ng trong mnh 速 WHERE.
Ta c達 th s旦 d担ng c存c h袖m g辿p d足鱈i 速息y v鱈i GROUP BY (Trong 速達 expression
l袖 m辿t t捉n c辿t).
Gia誰o tr巽nh th脱短c ha狸nh SQL
H袖m g辿p Ch淡c n即ng
SUM([ALL | DISTINCT] expression) Tnh t脱ng c存c gi存 tr.
AVG([ALL | DISTINCT] expression) Tnh trung bnh c単a c存c gi存 tr
COUNT([ALL | DISTINCT] expression) S竪 c存c gi存 tr trong biu th淡c.
COUNT(*) S竪 c存c dng 速足樽c ch辰n.
MAX(expression) Tnh gi存 tr l鱈n nht
MIN(expression) Tnh gi存 tr nh叩 nht
Trong 速達, SUM v袖 AVG ch l袖m vic v鱈i nh歎ng gi存 tr kiu s竪. SUM, AVG,
COUNT, MAX v袖 MIN b叩 qua c存c gi存 tr null cn COUNT(*) th kh束ng.
V d担 2.19: C息u lnh d足鱈i 速息y cho bit h s竪 l足測ng trung bnh c単a c存c nh息n vi捉n
theo t探ng 速測n v:
SELECT donvi.madonvi,tendonvi, avg(hsluong)
FROM nhanvien,donvi
WHERE nhanvien.madonvi = donvi.madonvi
GROUP BY donvi.madonvi,tendonvi
Ch坦 箪: Danh s存ch c存c t捉n c辿t trong danh s存ch ch辰n c単a c息u lnh SELECT v袖 danh
s存ch c存c t捉n c辿t sau GROUP BY ph其i nh足 nhau, nu kh束ng c息u lnh s kh束ng h樽p l.
V d担 c息u lnh d足鱈i 速息y l袖 kh束ng 速坦ng:
SELECT donvi.madonvi,tendonvi, avg(hsluong)
FROM nhanvien,donvi
WHERE nhanvien.madonvi = donvi.madonvi
GROUP BY donvi.madonvi
Mnh 速 HAVING thit lp c存c 速iu kin 速竪i v鱈i mnh 速 GROUP BY t足測ng t湛
nh足 c存ch th淡c mnh 速 WHERE thit lp c存c 速iu kin cho c息u lnh SELECT. Mnh
速 HAVING s kh束ng c達 ngha nu nh足 kh束ng s旦 d担ng kt h樽p v鱈i mnh 速
WHERE. C達 m辿t 速im kh存c bit gi歎a HAVING v袖 WHERE l袖 trong 速iu kin tm
kim c単a WHERE kh束ng 速足樽c c達 c存c h袖m g辿p trong khi HAVING l孫i cho php s旦
d担ng c存c h袖m g辿p trong 速iu kin tm kim c単a mnh. Mnh 速 HAVING c達 th
tham chiu 速n bt k炭 m担c n袖o trong danh s存ch ch辰n v袖 mnh 速 HAVING c達 th
ch淡a t竪i 速a 128 速iu kin tm kim.
V d担 2.20: C息u lnh d足鱈i 速息y cho bit h s竪 l足測ng trung bnh c単a c存c nh息n vi捉n
theo t探ng 速測n v v袖 ch hin th nh歎ng 速測n v c達 h s竪 l足測ng trung bnh l鱈n h測n 1.92
SELECT donvi.madonvi,tendonvi, avg(hsluong)
FROM nhanvien,donvi
WHERE nhanvien.madonvi = donvi.madonvi
GROUP BY donvi.madonvi,tendonvi
HAVING avg(hsluong)>1.92
Tr叩旦n Nguy達n Phong
(SELECT [ALL|DISTINCT] subquery_select_list
[FROM {table_name|view_name} [optimizer_hints]
[[,table_name2|view_bame2} [optimizer_hints]
[...,table_name16|view_name16}[optimizer_hints]]]
[WHERE clause]
[GROUP BY clause]
[HAVING clause])
(1) WHERE expression [NOT]IN (subquery)
(2) WHERE expression comparison_operator [ANY|ALL](subquery)
(3) WHERE [NOT]EXISTS (subquery)
SELECT *
FROM nhanvien
WHERE madonvi NOT IN ( SELECT madonvi
FROM donvi
WHERE dienthoai like '82%')
Gia誰o tr巽nh th脱短c ha狸nh SQL
INSERT [INTO] table_name
VALUES(value1, value2, ...)
INSERT INTO nhanvien
VALUES('NV02003','L達 Th谷 Mai','23/5/72',
NULL,'523312',1.92,'02')
INSERT [INTO] table_name(col1,col2,..., colN)
VALUES(value1, value2, ...,valueN)
INSERT INTO nhanvien(manv,hoten,diachi)
VALUES('NV03002','Nguy達湛n Th谷 Ha短nh Dung','56 Tr叩旦n Phu誰')
INSERT INTO luong_nhanvien
SELECT hoten,hsluong*210000 FROM nhanvien
Tr叩旦n Nguy達n Phong
UPDATE updated_table_name
SET colname = expression
[, ..., colname = expression ]
[FROM table_name [,..., table_name]]
[WHERE conditions ]
UPDATE nhanvien
SET hsluong = hsluong+0.2
WHERE madonvi ='04'


UPDATE nhatkybanhang
SET thanhtien = soluong*mathang.dongia
FROM mathang
WHERE nhatkybanhang.mahang = mathang.mahang
DELETE [FROM] delete_table_name
[FROM table_name [,..., table_name]]
[WHERE conditions]
DELETE FROM nhanvien
Gia誰o tr巽nh th脱短c ha狸nh SQL
FROM donvi
WHERE nhanvien.madonvi = donvi.madonvi AND
donvi.dienthoai ='848484'
Tr叩旦n Nguy達n Phong
CChh脱脱奪奪nngg 33:: NNGGNN NNGGテ IIUU KKHHIINN
GRANT ALL | statement [,...,statementN ]
TO account [,...,accountN]
GRANT ALL | permission [,...,permissionN]
ON table_name |view_name [(column1 [,...,columnN])]
|ON stored_procedure
TO account [,...,accountN]
Gia誰o tr巽nh th脱短c ha狸nh SQL



GRANT CREATE TABLE, CREATE VIEW
TO db_user
GRANT SELECT, UPDATE
ON nhanvien(hoten,diachi,dienthoai,hsluong)
TO db_user1, db_user2
REVOKE ALL | statement [,...,statementN]
FROM account [,...,accountN]
REVOKE ALL | permission [,...,permissionN]}
ON table_name | view_name [(column [,...,columnN])]
| stored_procedure
FROM account [,...,accountN ]
Tr叩旦n Nguy達n Phong
REVOKE SELECT, UPDATE
ON nhanvien(hsluong)
FROM db_user1
REVOKE ALL
FROM db_user
Gia誰o tr巽nh th脱短c ha狸nh SQL
CChh脱脱奪奪nngg 44:: TTHHUU TTUUCC LLUU TTRRテ VVAA TTRRIIGGGGEERR
C存c th単 t担c l足u tr歎 l袖 m辿t trong nh歎ng 速竪i t足樽ng c測 s谷 d歎 liu. C達 th xem
ch坦ng t足測ng t湛 nh足 nh歎ng th単 t担c trong c存c ng束n ng歎 lp trnh. M巽i m辿t th単 t担c l足u
tr歎 c達 th c達 c存c kh其 n即ng sau:
 Nhn c存c tham s竪 速u v袖o, th湛c thi c存c c息u lnh b捉n trong th単 t担c v袖 tr其 v c存c
gi存 tr.
 B捉n trong m巽i th単 t担c c達 th ch淡a c存c c息u lnh nh損m th湛c hin c存c thao t存c
tr捉n c測 s谷 d歎 liu (k c其 vic g辰i 速n c存c th単 t担c l足u tr歎 kh存c)
 Tr其 v m辿t gi存 tr tr孫ng th存i th束ng qua 速達 c達 th x存c 速nh vic th湛c thi th単 t担c
l袖 th袖nh c束ng hay b l巽i.
Vic s旦 d担ng c存c th単 t担c l足u tr歎 b捉n trong c測 s谷 d歎 liu s mang l孫i nh歎ng l樽i
ch sau:
 Th単 t担c l足u tr歎 cho php module ho存 c束ng vic, t孫o 速iu kin thun l樽i cho
vic th湛c hin c存c thao t存c tr捉n d歎 liu.
 Th単 t担c l足u tr歎 速足樽c ph息n tch, t竪i 足u v袖 bi捉n dch khi t孫o ra n捉n vic th湛c thi
ch坦ng nhanh h測n nhiu so v鱈i vic s旦 d担ng m辿t tp c存c c息u lnh giao t存c
SQL theo nh歎ng c存ch th束ng th足棚ng.
 Th単 t担c l足u tr歎 cho php ch坦ng ta th湛c hin c誰ng m辿t y捉u cu b損ng m辿t c息u
lnh 速測n gi其n thay v ph其i s旦 d担ng nhiu dng lnh SQL. 則iu n袖y s l袖m
gi其m thiu s湛 l足u th束ng tr捉n m孫ng.
 Thay v cp ph存t quyn tr湛c tip cho ng足棚i s旦 d担ng tr捉n c存c c息u lnh SQL, ta
c達 th cp ph存t quyn cho ng足棚i s旦 d担ng th束ng qua c存c th単 t担c l足u tr歎, nh棚
速達 t即ng kh其 n即ng b其o mt 速竪i v鱈i h th竪ng.
T孫o c存c th単 t担c l足u tr歎
則 t孫o m辿t sp, ta s旦 d担ng c息u lnh CREATE PROCEDURE c達 c坦 ph存p nh足 sau:
CREATE PROCEDURE procedure_name [;number]
[(parameter1 [,parameter2]...[parameter255])]
AS sql_statements
V d担 4.1:
CREATE PROC sp_list @bten char(20)
AS
SELECT hoten, ngaysinh, diachi
FROM nhanvien
WHERE hoten= @bten
Ch坦 箪: Nu khi g辰i th単 t担c, ch坦ng ta truyn tham s竪 cho th単 t担c d足鱈i d孫ng:
Tr叩旦n Nguy達n Phong
@tham_s竪 = gi存_tr
Th th淡 t湛 c存c tham s竪 kh束ng cn ph其i tu息n theo th淡 t湛 nh足 khi t孫o th単 t担c b損ng c息u
lnh CREATE PROCEDURE. Tuy nhi捉n, nu nh足 速 c達 m辿t tham s竪 速足樽c truyn gi存
tr theo c存ch tr捉n th tt c其 c存c tham s竪 cn l孫i c嘆ng ph其i 速足樽c truyn gi存 tr theo c存ch
速達.
Ta c達 th g存n m辿t gi存 tr mc 速nh cho tham s竪 trong c息u lnh CREATE
PROCEDURE. Gi存 tr n袖y, c達 th l袖 h損ng bt k炭, s 速足樽c ly l袖m tham s竪 c単a th単 t担c
khi ng足棚i s旦 d担ng kh束ng cung cp gi存 tr cho tham s竪 khi g辰i th単 t担c.
V d担 4.2:
CREATE PROC sp_list;2 @bten char(20)=Nguyen Van A
AS
SELECT * FROM nhanvien
WHERE hoten = @bten
V鱈i th単 t担c tr捉n, nu ta g辰i msp_list;2 m袖 kh束ng c達 tham s竪 th th単 t担c s ly
tham s竪 mc 速nh l袖 Nguyn V即n A cho @bten.
Gi存 tr mc 速nh c達 th NULL. Trong tr足棚ng h樽p n袖y, nu ng足棚i s旦 d担ng kh束ng
cung cp tham s竪, SQL Server s thi h袖nh th単 t担c theo c存c tham s竪 kh存c.
V d担 4.3: V鱈i c息u lnh
CREATE PROC sp_list;3 @bten char(20)=NULL,@bluong float
AS
SELECT * FROM nhanvien
WHERE hoten=@bten AND hsluong=@bluong
Ta th g辰i th単 t担c tr捉n nh足 sau:
msp_list;3 @btuoi=23
m袖 kh束ng b l巽i.
Mc 速nh c達 th bao g奪m c存c k箪 t湛 速孫i din (%, _, [], [^] ) nu th単 t担c s旦 d担ng
tham s竪 v鱈i t探 kh達a LIKE.
V d担 4.4:
CREATE PROC sp_list;4 @bten char(20) =Trn%
AS
SELECT * FROM nhanvien
WHERE hoten LIKE @bten
Th束ng tin tr其 v t探 c存c th単 t担c l足u tr歎
C存c gi存 tr tr孫ng th存i tr其 v:
C存c th単 t担c c達 th tr其 v m辿t gi存 tr nguy捉n 速足樽c g辰i l袖 m辿t tr孫ng th存i tr其 v. Gi存
tr n袖y ch ra cho bit th単 t担c 速足樽c th湛c hin th袖nh c束ng hay gp l巽i v袖 nguy捉n nh息n
c単a l巽i (SQL Server 速 速nh ngha s遜n m辿t tp c存c gi存 tr tr其 v, c存c gi存 tr n袖y n損m
trong kho其ng [-99;0]; trong 速達 gi存 tr tr其 v b損ng 0 t淡c l袖 vic th湛c hin th単 t担c th袖nh
c束ng, c存c gi存 tr cn l孫i cho bit nguy捉n do khi b l巽i).
Gi存 tr tr其 v do ng足棚i s旦 d担ng 速nh ngha
Ng足棚i s旦 d担ng c達 th 速nh ngha c存c gi存 tr tr其 v c単a mnh trong c存c th単 t担c
l足u tr歎 b損ng c存ch b脱 sung m辿t tham s竪 v袖o c息u lnh RETURN. Tt c其 c存c s竪 nguy捉n
ngo孫i tr探 c存c gi存 tr d袖nh ri捉ng cho h th竪ng 速u c達 th 速足樽c s旦 d担ng.
Gia誰o tr巽nh th脱短c ha狸nh SQL
V d担 4.5:
CREATE PROC sp_exam @bten char(20)
AS
IF EXISTS (SELECT * FROM nhanvien WHERE hoten = @bten)
RETURN 1
ELSE
RETURN 2
C存c tham s竪 tr其 v
Khi c其 hai c息u lnh CREATE PROCEDURE v袖 EXECUTE ch淡a m担c ch辰n
OUTPUT cho t捉n m辿t tham s竪, th単 t担c c達 th s旦 d担ng m辿t bin 速 tr其 v tr c単a tham
s竪 速達 速n ng足棚i g辰i. B損ng vic s旦 d担ng t探 kho存 OUTPUT, bt c淡 s湛 thay 速脱i n袖o 速n
c嘆ng vn cn gi歎 l孫i sau khi th単 t担c 速足樽c th湛c hin, v袖 c存c bin c達 th 速足樽c s旦 d担ng
trong c存c c息u lnh SQL b脱 sung sau 速達 trong tp lnh hay th単 t担c 速足樽c g辰i. Nu t探
kho存 OUTPUT kh束ng 速足樽c s旦 d担ng, vic thay 速脱i 速n tham s竪 s kh束ng 速足樽c gi歎 l孫i
sau khi kt th坦c th湛c hin th単 t担c. Ngo袖i ra, ta cn c達 th d誰ng RETURN 速 tr其 v gi存
tr.
M辿t th単 t担c l足u tr歎 c達 th s旦 d担ng bt k炭 hoc tt c其 kh其 n即ng sau 速 tr其 v:
 M辿t hoc nhiu tp c存c gi存 tr.
 M辿t gi存 tr tr其 v r但 r袖ng (s旦 d担ng c息u lnh RETURN).
 M辿t tham s竪 OUTPUT.
Nu ch坦ng ta ch 速nh OUTPUT khi th湛c hin m辿t th単 t担c nh足ng tham s竪 t足測ng
淡ng kh束ng 速足樽c 速nh ngha v鱈i OUTPUT khi t孫o th単 t担c th s b l巽i. Tuy nhi捉n nu
ta 速nh ngha OUTPUT cho m辿t tham s竪 trong th単 t担c nh足ng kh束ng ch 速nh
OUTPUT khi th湛c hin th vn kh束ng b l巽i (gi存 tr tham s竪 khi 速達 s kh束ng 速足樽c tr其
v).
V d担 4.6:
CREATE PROC Chia @sobichia real,@sochia real,
@kqua real OUTPUT
AS
IF (@sochia =0)
Print Division by zero
ELSE
SELECT @kqua = @sobichia / @sochia
Khi 速達 nu ta th湛c hin nh足 sau:
DECLARE @ketqua real
EXEC Chia 100, 2, @ketqua OUT
SELECT @ketqua
S cho kt qu其 l袖:
----------------------
50.0
Cn nu th湛c hin
DECLARE @ketqua real
EXEC Chia 100, 2, @ketqua
SELECT @ketqua
Tr叩旦n Nguy達n Phong
S cho kt qu其 l袖:
----------------------
(null)
I.3. C存c qui t他c s旦 d担ng cho sp
Sau 速息y l袖 m辿t s竪 qui t他c cn l足u 箪 khi t孫o c存c th単 t担c l足u tr歎
 C息u lnh CREATE PROCEDURE kh束ng th kt h樽p v鱈i c存c c息u lnh SQL
kh存c trong m辿t kh竪i lnh 速測n (single batch).
 B其n th息n 速nh ngha CREATE PROCEDURE c達 th bao g奪m bt k炭 s竪
l足樽ng c嘆ng nh足 c息u lnh SQL n袖o ngo孫i tr探 nh歎ng c息u lnh sau:
CREATE VIEW CREATE TRIGGER
CREATE DEFAULT CREATE PROCEDURE
CREATE RULE
 C存c 速竪i t足樽ng CSDL kh存c c達 th 速足樽c t孫o b捉n trong m辿t th単 t担c l足u tr歎. Ta
c達 th tham chiu m辿t 速竪i t足樽ng 速足樽c t孫o trong c誰ng th単 t担c min l袖 n達 速
速足樽c t孫o tr足鱈c khi tham chiu.
 B捉n trong m辿t th単 t担c, ta kh束ng th t孫o m辿t 速竪i t足樽ng, xo存 n達 v袖 sau 速達 t孫o
m辿t 速竪i t足樽ng m鱈i v鱈i c誰ng t捉n.
 Ta c達 th tham chiu c存c b其ng t孫m th棚i b捉n trong m辿t th単 t担c.
 Nu ta th湛c thi m辿t th単 t担c m袖 g辰i 速n th単 t担c kh存c, th単 t担c 速足樽c g辰i c達 th
truy cp 速n m辰i 速竪i t足樽ng ngo孫i tr探 c存c b其ng t孫m th棚i 速足樽c t孫o b谷i th単 t担c
速u ti捉n.
 Nu ta t孫o m辿t b其ng t孫m th棚i ri捉ng (private temporary table) b捉n trong m辿t
th単 t担c, b其ng t孫m th棚i ch t奪n t孫i cho nh歎ng m担c 速ch c単a th単 t担c 速達; n達 s
mt 速i khi tho存t ra kh叩i th単 t担c.
 S竪 tham s竪 t竪i 速a c単a m辿t th単 t担c l袖 255.
 S竪 bin c担c b辿 v袖 to袖n c担c trong m辿t th単 t担c ch b gi鱈i h孫n b谷i kh其 n即ng b辿
nh鱈.
 C存c th単 t担c t孫m th棚i c担c b辿 (private) v袖 to袖n c担c (public), t足測ng t湛 nh足 c存c
b其ng t孫m th棚i, c達 th 速足樽c t孫o v鱈i du # v袖 ## 速淡ng tr足鱈c t捉n th単 t担c. # biu
din th単 t担c t孫m th棚i c担c b辿 cn ## biu din th単 t担c t孫m th棚i to袖n c担c.
I.4 X存c 速nh t捉n b捉n trong c存c th単 t担c
B捉n trong m辿t th単 t担c, t捉n c存c 速竪i t足樽ng 速足樽c s旦 d担ng v鱈i c息u lnh ALTER
TABLE, CREATE TABLE, DROP TABLE, TRUNCATE TABLE, CREATE INDEX,
DROP INDEX, UPDATE STATISTICS v袖 DBCC ph其i 速足樽c x存c 速nh v鱈i t捉n c単a
ng足棚i s谷 h歎u 速竪i t足樽ng (object owners name) nu nh足 nh歎ng ng足棚i d誰ng (user) kh存c
s旦 d担ng th単 t担c. V d担, ng足棚i d誰ng Mary, l袖 s谷 h歎u ch単 c単a b其ng marytab, ph其i ch
速nh t捉n c単a b其ng c単a mnh khi n達 速足樽c s旦 d担ng v鱈i m辿t trong nh歎ng c息u lnh n袖y
nu c束 ta mu竪n nh歎ng user kh存c c達 th th湛c hin th単 t担c m袖 trong 速達 b其ng 速足樽c s旦
d担ng.
Qui t他c n袖y l袖 cn thit v t捉n 速竪i t足樽ng 速足樽c ph息n tch khi c存c th単 t担c 速足樽c
ch孫y. Nu marytab kh束ng 速足樽c ch 速nh v袖 user John tm c存ch th湛c hin th単 t担c, SQL
Gia誰o tr巽nh th脱短c ha狸nh SQL
s tm b其ng marytab do John s谷 h歎u. V d担 d足鱈i 速息y l袖 m辿t c存ch d誰ng 速坦ng, n達 ch ra
cho SQL Server tm b其ng marytab do Mary s谷 h歎u:
CREATE PROC p1
AS
CREATE INDEX marytab_ind
ON mary.marytab(col1)
I.5 則脱i t捉n c存c th単 t担c:
S旦 d担ng th単 t担c:
sp_rename old_name, new_name
Ta ch c達 th 速脱i t捉n nh歎ng th単 t担c m袖 ta s谷 h歎u. Ng足棚i s谷 h歎u CSDL c達 th
thay 速脱i t捉n c単a bt k炭 th単 t担c n袖o c単a ng足棚i s旦 d担ng. Th単 t担c 速足樽c 速脱i t捉n ph其i n損m
trong CSDL hin th棚i.
Ta ph其i xo存 v袖 t孫o l孫i m辿t th単 t担c nu ta thay 速脱i t捉n c単a m辿t 速竪i t足樽ng 速足樽c
tham chiu b谷i th単 t担c 速達.
則 c達 速足樽c b存o c存o v nh歎ng 速竪i t足樽ng 速足樽c tham chiu b谷i m辿t th単 t担c, ta s旦
d担ng th単 t担c h th竪ng: sp_depends.
則 xem n辿i dung c単a 速nh ngha m辿t th単 t担c, ta s旦 d担ng th単 t担c h th竪ng:
sp_helptext.
I.6. Xo存 th単 t担c:
則 xo存 m辿t th単 t担c, ta s旦 d担ng c息u lnh:
DROP PROCEDURE proc_name
II. S旦 d担ng c存c Trigger
M辿t trigger l袖 m辿t d孫ng 速c bit c単a th単 t担c l足u tr歎 v袖 n達 速足樽c th湛c hin t湛
速辿ng khi ng足棚i d誰ng 存p d担ng c息u lnh s旦a 速脱i d歎 liu l捉n m辿t b其ng 速足樽c ch 速nh.
C存c trigger th足棚ng 速足樽c s旦 d担ng cho vic p bu辿c c存c qui t他c l袖m vic v袖 to袖n vn d歎
liu. Tnh to袖n vn tham chiu c達 th 速足樽c 速nh ngha b損ng c存ch s旦 d担ng r袖ng bu辿c
FOREIGN KEY v鱈i c息u lnh CREATE TABLE. Nu c存c r袖ng bu辿c t奪n t孫i trong
b其ng c達 s湛 t存c 速辿ng c単a trigger, n達 速足樽c kim tra tr足鱈c vic th湛c hin trigger. Nu
c存c r袖ng bu辿c b vi ph孫m, trigger s kh束ng th湛c thi.
C存c trigger 速足樽c s旦 d担ng trong nh歎ng c存ch sau:
 C存c trigger c達 th thay 速脱i 速奪ng lo孫t (cascade change) c存c b其ng c達 li捉n h
trong m辿t CSDL.
 C存c trigger c達 th kh束ng cho php hoc roll back nh歎ng thay 速脱i vi ph孫m
tnh to袖n vn tham chiu, h単y b叩 giao t存c s旦a 速脱i d歎 liu.
 C存c trigger c達 th 存p 速t c存c gi鱈i h孫n ph淡c t孫p h測n nh歎ng gi鱈i h孫n 速足樽c 速nh
ngha b損ng r袖ng bu辿c CHECK. Kh存c v鱈i r袖ng bu辿c CHECK, c存c trigger c達
th tham chiu 速n c存c c辿t trong c存c b其ng kh存c.
 C存c trigger cn c達 th tm s湛 kh存c bit gi歎a c存c tr孫ng th存i c単a m辿t b其ng
tr足鱈c v袖 sau khi s歎a 速脱i d歎 liu v袖 ly ra nh歎ng t存c 速辿ng d湛a tr捉n s湛 kh存c
bit 速達.
Tr叩旦n Nguy達n Phong
II.1 T孫o c存c trigger
M辿t trigger l袖 m辿t 速竪i t足樽ng CSDL. Ta t孫o m辿t trigger b損ng vic ch 速nh b其ng
hin h袖nh v袖 c息u lnh s旦a 速脱i d歎 liu kch ho孫t trigger. Sau 速達 ta x存c 速nh c存c c束ng
vic m袖 trigger l袖m.
M辿t b其ng c達 th c達 t竪i 速a 3 lo孫i trigger: m辿t trigger cp nht (update trigger),
m辿t trigger chn (insert trigger) v袖 m辿t trigger x達a (delete trigger). Tuy nhi捉n, m巽i
trigger c達 th th湛c hin nhiu h袖m v袖 g辰i 速n 16 th単 t担c. M巽i trigger ch c達 th 存p
d担ng cho m辿t b其ng. Tuy nhi捉n, m辿t trigger 速測n c達 th 存p d担ng cho c其 3 c束ng vic
(UPDATE, INSERT v袖 DELETE).
Ta kh束ng th t孫o m辿t trigger tr捉n m辿t khung nhn hay m辿t b其ng t孫m th棚i mc d誰
c存c trigger c達 th tham chiu c存c khung nhn hay c存c b其ng t孫m th棚i.
C息u lnh TRUNCATE TABLE mc d誰 gi竪ng c息u lnh DELETE khi kh束ng c達
mnh 速 WHERE nh足ng n達 kh束ng th kch ho孫t m辿t trigger.
則 t孫o m鱈i m辿t trigger, ta s旦 d担ng c息u lnh c達 c坦 ph存p nh足 sau:
CREATE TRIGGER trigger_name
ON table_name
FOR {INSERT, UPDATE, DELETE}
AS sql_statements
Hoc s旦 d担ng mnh 速 IF UPDATE:
CREATE TRIGGER trigger_name
ON table_name
FOR {INSERT, UPDATE}
AS
IF UPDATE (column_name)
[{AND錚OR}UPDATE (column_name)...] sql_statements
V d担 4.7: Nu ch坦ng ta mu竪n sau khi ta cp nht d歎 liu cho b其ng nhanvien,
SQL Server s hin th n辿i dung c単a b其ng 速 xem th ta t孫o m辿t trigger nh足 sau:
CREATE TRIGGER tgr_check
ON nhanvien
FOR INSERT, UPDATE
AS
print '*** Ket qua sau khi cap nhat ***'
SELECT * FROM nhanvien
II.2 C存c gi存 tr null ngm 速nh v袖 hin (implicit and explicit null values)
Mnh 速 IF UPDATE(t捉n_c辿t) l袖 速坦ng cho m辿t c息u lnh INSERT khi m袖 c辿t
速足樽c g存n m辿t gi存 tr trong danh s存ch ch辰n hay trong mnh 速 VALUES. M辿t NULL
hin (explicit) hay m辿t mc 速nh g存n m辿t gi存 tr cho m辿t c辿t v袖 v th kch ho孫t
trigger. V鱈i m辿t NULL ngm 速nh, nu gi存 tr kh束ng 速足樽c x存c 速nh b谷i c息u h叩i hoc
b谷i mc 速nh 速足樽c g存n, trigger tr捉n c辿t 速達 kh束ng 速足樽c kch ho孫t.
V d担 4.8:
CREATE TABLE vidu(col1 int NULL,col2 int NOT NULL)
GO
CREATE TRIGGER tgr_vidu
ON vidu
Gia誰o tr巽nh th脱短c ha狸nh SQL
FOR INSERT
AS
IF UPDATE(col1) AND UPDATE(col2)
Print Firing
GO
CREATE DEFAULT col2_default
AS 99
GO
/* IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */
INSERT vidu(col1,col2) VALUES(1, 2)
/* IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */
INSERT vidu VALUES(1, 2)
/* NULL hin: IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */
INSERT vidu VALUES(null, 2)
/* Kh束ng c達 mc 速nh tr捉n c辿t col1, IF UPDATE kh束ng 速坦ng cho c其 hai c辿t, trigger
kh束ng 速足樽c kch ho孫t */
INSERT vidu(col2) VALUES(2)
/* Kh束ng c達 mc 速nh tr捉n c辿t col2, IF UPDATE kh束ng 速坦ng cho c其 hai c辿t, trigger
kh束ng 速足樽c kch ho孫t */
INSERT vidu(col1) VALUES(2)
Kt qu其 t足測ng t湛 速足樽c s其n sinh v鱈i vic s旦 d担ng ch mnh 速
IF UPDATE(col1)
則 t孫o m辿t trigger kh束ng cho php vic chn c存c gi存 tr null ngm 速nh, ta s旦
d担ng:
IF UPDATE(col2) OR UPDATE(col2)
C息u lnh SQL trong trigger c達 th sau 速達 kim tra xem col1 l袖 NULL hay
kh束ng.
II.3 Vic 速脱i t捉n v袖 c存c trigger
Nu m辿t b其ng 速足樽c tham chiu b谷i m辿t trigger b 速脱i t捉n, ta ph其i xo存 trigger 速達
速i v袖 t孫o l孫i n達 速 ph誰 h樽p vic tham chiu c単a n達 速n b其ng.
Th単 t担c sp_depends c達 ch淡c n即ng lit k捉 tt c其 c存c trigger tham chiu 速n 速竪i
t足樽ng (ch村ng h孫n b其ng hay khung nhn) hoc tt c其 c存c b其ng hay khung nhn m袖
trigger t存c 速辿ng. V d担 sau 速息y lit k捉 c存c 速竪i t足樽ng 速足樽c tham chiu b谷i trigger
tgr_check:
sp_depends tgr_check
II.4 Hin th th束ng tin v c存c trigger
Do c存c trigger l袖 c存c 速竪i t足樽ng CSDL n捉n ch坦ng 速足樽c lit k捉 trong b其ng h
th竪ng sysobjects. C辿t type trong sysobjects x存c 速nh c存c trigger v鱈i ch歎 vit t他t TR. S測
速奪 th湛c thi c存c trigger 速足樽c l足u tr歎 trong b其ng sysprocedures.
Truy vn d足鱈i 速息y tm c存c trigger trong m辿t CSDL:
SELECT * FROM sysobjects WHERE type=TR
則 hin th th束ng tin v m辿t trigger ta th湛c hin th単 t担c:
Tr叩旦n Nguy達n Phong
sp_help trigger_name
C息u lnh CREATE TRIGGER cho m巽i trigger 速足樽c l足u tr歎 trong b其ng h th竪ng
syscomments. Ta c達 th hin th l棚i 速nh ngha trigger b損ng c存ch s旦 d担ng th単 t担c
sp_helptext.
V d担 4.9: th湛c hin sp_helptext tgr_check ta 速足樽c kt qu其 nh足 sau:
text
--------------
create trigger tgr_check
on nhanvien
for insert,update
as
print ' Ket qua sau khi cap nhat '
select * from nhanvien
II.5 Xo存 trigger
Ta c達 th xo存 m辿t trigger b損ng c存ch xo存 n達 hoc xo存 b其ng trigger. Khi m辿t
b其ng 速足樽c x達a, nh歎ng trigger n袖o c達 li捉n quan v鱈i n達 c嘆ng 速奪ng th棚i b x達a. DROP
TRIGGER mc 速nh cho php 速竪i v鱈i ng足棚i s旦 d担ng b其ng trigger v袖 kh束ng th
chuyn cho ng足棚i kh存c.
Ta c達 th x達a m辿t trigger b損ng c存ch s旦 d担ng c息u lnh DROP TRIGGER
Gia誰o tr巽nh th脱短c ha狸nh SQL
CChh脱脱奪奪nngg 55:: PPHHUU LLUUCC
Tr叩旦n Nguy達n Phong
Gia誰o tr巽nh th脱短c ha狸nh SQL
Tr叩旦n Nguy達n Phong
MMUUCC LLUUCC
1.1 X存c 速nh b其ng b損ng mnh 速 FROM ...................................................................................................12
1.2 Mnh 速 WHERE.................................................................................................................................13
1.3 Danh s存ch ch辰n trong c息u lnh SELECT............................................................................................14
1.4 Tnh to存n c存c gi存 tr trong c息u lnh SELECT .....................................................................................16
1.5 T探 kho存 DISTINCT .............................................................................................................................16
1.6 T孫o b其ng m鱈i b損ng c息u lnh SELECT ... INTO ..................................................................................17
1.7 S他p xp kt qu其 truy vn b損ng ORDER BY..........................................................................................17
1.8 Php h樽p v袖 to存n t旦 UNION...............................................................................................................18
1.9 Php n竪i...............................................................................................................................................20
1.10 T孫o c存c dng th竪ng k捉 d歎 liu v鱈i COMPUTE ... BY........................................................................24
1.11 Th竪ng k捉 d歎 liu v鱈i GROUP BY v袖 HAVING...................................................................................26
1.12 Truy v叩炭n con (subquery)..................................................................................................................27
I.1. T孫o c存c th単 t担c l足u tr歎........................................................................................................................35
I.2. Th束ng tin tr其 v t探 c存c th単 t担c l足u tr歎.................................................................................................36
I.3. C存c qui t他c s旦 d担ng cho sp .................................................................................................................38
I.4 X存c 速nh t捉n b捉n trong c存c th単 t担c.......................................................................................................38
I.5 則脱i t捉n c存c th単 t担c:..............................................................................................................................39
I.6. Xo存 th単 t担c: .........................................................................................................................................39
II. S DNG C存C TRIGGER
II.1 T孫o c存c trigger....................................................................................................................................40
II.2 C存c gi存 tr null ngm 速nh v袖 hin (implicit and explicit null values)................................................40
II.3 Vic 速脱i t捉n v袖 c存c trigger..................................................................................................................41
II.4 Hin th th束ng tin v c存c trigger .........................................................................................................41
II.5 Xo存 trigger .........................................................................................................................................42
2.2 Ca誰c ha狸m v達旦 chu辰湛i..........................................................................................................................44

More Related Content

Ebook giao trinh thuc hanh sql

  • 2. Tr叩旦n Nguy達n Phong CChh脱脱奪奪nngg 11:: NNGGNN NNGGテ NNHH NNGGHHAA DDテ LLIIUU Binary Bit Char Datetime Decimal Float Image Int Money Nchar Ntext Nvarchar Real Smalldatetime Smallint Smallmoney Text Tinyint Varbinary Varchar
  • 3. Gia誰o tr巽nh th脱短c ha狸nh SQL CREATE TABLE table_name ( {colname_1 col_1_properties [constraints_1 ] [,{colname_2 col_2_properties [constraints_2 ]] ... [,{colname_N col_N_properties [constraints_N ]] [table_constraints] ) - table_name: - colname_i:
  • 4. Tr叩旦n Nguy達n Phong - col_i_properties: - constraints_i: - table_constraint: CREATE TABLE nhanvien ( manv char(10) not null, hoten char(30) not null, ngaysinh datetime null, diachi char(50) null, dienthoai char(6) null ) [CONSTRAINT constraint_name] CHECK (expression) CREATE TABLE nhanvien (
  • 5. Gia誰o tr巽nh th脱短c ha狸nh SQL manv char(10) not null, hoten char(30) not null, ngaysinh datetime null, diachi char(50) null, dienthoai char(6) null constraint check_dienthoai check (dienthoai like '[0-9][0-9][0-9] [0-9][0-9] [0-9]') ) [CONSTRAINT constraint_name] DEFAULT {const_expression 錚 nonarguments_function 錚 NULL} CREATE TABLE nhanvien ( manv char(10) not null, hoten char(30) not null, ngaysinh datetime null, diachi char(50) default 'kh辰ng bi達炭t', dienthoai char(6) null )
  • 6. Tr叩旦n Nguy達n Phong [CONSTRAINT constraint_name ] PRIMARY KEY [CLUSTERED|NONCLUSTERED] [( colname [,colname2 [...,colname16]])] CREATE TABLE nhanvien ( manv char(10) primary key, hoten char(30) not null, ngaysinh datetime null, diachi char(50) null, dienthoai char(6) null ) CREATE TABLE nhanvien ( manv char(10) not null, hoten char(30) not null, ngaysinh datetime null, diachi char(50) null, dienthoai char(6) null constraint pk_nv primary key(manv) )
  • 7. Gia誰o tr巽nh th脱短c ha狸nh SQL [CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED] [colname1 [,colname2 [...,colname16]])] [CONSTRAINT constraint_name ] [FOREIGN KEY (colname [,colname2 [...,colname16]])] REFERENCES reference_table [(ref_colname [,ref_colname2 [...,ref_colname 16]])] CREATE TABLE donvi (
  • 8. Tr叩旦n Nguy達n Phong madv char(2) primary key, tendv char(20) not null ) CREATE TABLE nhanvien ( manv char(10) primary key, hoten char(20) not null, ngaysinh datetime null, diachi char(50) default 'khong biet', dienthoai char(6) check(dienthoai like '[0-9][0-9][0-9] [0-9][0-9][0-9]'), madv char(2) foreign key(madv) references donvi(madv) ) ALTER TABLE table_name [ADD {col_name column_properties [column_constraints] 錚 [[,]table_constraint ] } [,{next_col_name|next_table_constraint}]...] 錚[DROP [CONSTRAINT] constraint_name1 [, constraint_name2]...] ALTER TABLE donvi ADD CONSTRAINT check_madv CHECK (madv LIKE [0-9][0-9])
  • 9. Gia誰o tr巽nh th脱短c ha狸nh SQL CREATE [CLUSTERED錚NONCLUSTERED] INDEX index_name ON table_name(column_name [, column_name]...) CREATE NONCLUSTERED INDEX idx_nhanvien_madv ON nhanvien(madv)
  • 10. Tr叩旦n Nguy達n Phong CREATE VIEW view_name[(column_name [, column_name]...)] AS select_statement CREATE VIEW thongtin_nv AS SELECT manv,hoten,datediff(year,ngaysinh,getdate()),tendv FROM nhanvien,donvi WHERE nhanvien.madv=donvi.madv CREATE VIEW thongtin_nv(manv,hoten,tuoi,donvi)
  • 11. Gia誰o tr巽nh th脱短c ha狸nh SQL AS SELECT manv,hoten,datediff(year,ngaysinh,getdate()),tendv FROM nhanvien,donvi WHERE nhanvien.madv=donvi.madv
  • 12. Tr叩旦n Nguy達n Phong CChh脱脱奪奪nngg 22:: NNGGNN NNGGテ TTHHAAOO TTAACC DDテ LLIIUU 則 truy xut d歎 liu t探 c存c dng v袖 c存c c辿t c単a m辿t hay nhiu b其ng, khung nhn, ta s旦 d担ng c息u lnh SELECT. C息u lnh n袖y c達 th d誰ng 速 th湛c hin php ch辰n (t淡c l袖 truy xut m辿t tp con c存c dng trong m辿t hay nhiu b其ng), php chiu (t淡c l袖 truy xut m辿t tp con c存c c辿t trong m辿t hay nhiu b其ng) v袖 php n竪i (t淡c l袖 li捉n kt c存c dng trong hai hay nhiu b其ng 速 truy xut d歎 liu). C坦 ph存p chung c単a c息u lnh SELECT c達 d孫ng nh足 sau: SELECT [ ALL | DISTINCT ] select_list [ INTO [ newtable_name ]] FROM { table_name | view_name } ................ [,{table_name | view_name }] [WHERE clause ] [GROUP BY clause ] [HAVING BY clause ] [ORDER BY clause ] [COMPUTE clause ] Ch坦 箪: C存c th袖nh phn trong m辿t c息u lnh SELECT ph其i 速足樽c s旦 d担ng theo th淡 t湛 速足樽c n捉u tr捉n. 1.1 X存c 速nh b其ng b損ng mnh 速 FROM Mnh 速 FROM trong c息u lnh SELECT 速足樽c s旦 d担ng nh損m ch 速nh c存c b其ng v袖 khung nhn cn truy xut d歎 liu. Sau mnh 速 FROM l袖 danh s存ch t捉n c存c b其ng v袖 khung nhn tham gia v袖o truy vn (t捉n c単a c存c b其ng v袖 khung nhn 速足樽c ph息n c存ch nhau b谷i du phy). SELECT select_list FROM {table_name錚view_name list}
  • 13. Gia誰o tr巽nh th脱短c ha狸nh SQL 則 速測n gi其n ho存 c息u h叩i, ta c達 th s旦 d担ng c存c b danh (alias) cho c存c b其ng hay khung nhn. B danh 速足樽c g存n trong mnh 速 FROM b損ng c存ch ch 速nh b danh sau t捉n b其ng. V d担 c息u lnh sau g存n b danh n1 cho b其ng nhanvien. SELECT ten, diachi FROM nhanvien n1 1.2 Mnh 速 WHERE Mnh 速 WHERE trong c息u lnh SELECT x存c 速nh c存c 速iu kin 速竪i v鱈i vic truy xut d歎 liu. Sau mnh 速 WHERE l袖 m辿t biu th淡c logic v袖 ch nh歎ng dng d歎 liu n袖o tho其 mn biu th淡c sau WHERE m鱈i 速足樽c hin th trong kt qu其 truy vn. Trong mnh 速 WHERE th足棚ng s旦 d担ng: C存c to存n t旦 so s存nh Gi鱈i h孫n ( BETWEEN v袖 NOT BETWEEN). Danh s存ch (IN, NOT IN) Khu束n d孫ng (LIKE v袖 NOT LIKE). C存c gi存 tr ch足a bit (IS NULL v袖 IS NOT NULL). Kt h樽p c存c 速iu kin (AND, OR). C存c to存n t旦 so s存nh: To存n t旦 箪 ngha = B損ng > L鱈n h測n < Nh叩 h測n >= L鱈n h測n hoc b損ng <= Nh叩 h測n hoc b損ng <> Kh存c !> Kh束ng l鱈n h測n !< Kh束ng nh叩 h測n V d担 2.1: Truy vn sau 速息y cho bit t捉n, 速a ch v袖 速in tho孫i c単a nh歎ng nh息n vi捉n c達 h s竪 l足測ng l鱈n h測n 1.92: SELECT ten, diachi, dienthoai FROM nhanvien WHERE hsluong>1.92 Gi鱈i h孫n (BETWEEN v袖 NOT BETWEEN) T探 kho存 BETWEEN v袖 NOT BETWEEN 速足樽c s旦 d担ng nh損m ch 速nh kho其ng gi存 tr tm kim 速竪i v鱈i c息u lnh SELECT. C息u lnh d足鱈i 速息y cho bit t捉n v袖 速ia ch c単a nh歎ng nh息n vi捉n c達 h s竪 l足測ng n損m trong kho其ng 1.92 速n 3.11 SELECT ten, tuoi, diachi FROM nhanvien WHERE hsluong BETWEEN 1.92 AND 3.11
  • 14. Tr叩旦n Nguy達n Phong Danh s存ch (IN v袖 NOT IN) T探 kho存 IN 速足樽c s旦 d担ng khi ta cn ch 速nh 速iu kin tm kim d歎 liu cho c息u lnh SELECT l袖 m辿t danh s存ch c存c gi存 tr. Sau IN (hoc NOT IN) c達 th l袖 m辿t danh s存ch c存c gi存 tr hoc l袖 m辿t c息u lnh SELECT kh存c. V d担 2.2: 則 hin th th束ng tin v c存c nh息n vi捉n c達 h s竪 l足測ng l袖 1.86, 1.92 hoc 2.11, thay v s旦 d担ng c息u lnh: SELECT * FROM nhanvien WHERE hsluong=1.86 OR hsluong=1.92 OR hsluong=2.11 Ta c達 th s旦 d担ng c息u lnh sau: SELECT * FROM nhanvien WHERE hsluong IN (1.86, 1.92, 2.11) C存c k箪 t湛 速孫i din v袖 mnh 速 LIKE T探 kho存 LIKE (NOT LIKE) s旦 d担ng trong c息u lnh SELECT nh損m m束 t其 khu束n d孫ng c単a d歎 liu cn tm kim. Ch坦ng th足棚ng 速足樽c kt h樽p v鱈i c存c k箪 t湛 速孫i din sau 速息y: K箪 t湛 速孫i din 箪 ngha % Chu巽i k箪 t湛 bt k炭 g奪m kh束ng hoc nhiu k箪 t湛 - K箪 t湛 速測n bt k炭 [] K箪 t湛 速測n bt k炭 trong gi鱈i h孫n 速足樽c ch 速nh (v d担 [a-f]) hay m辿t tp (v d担 [abcdef]) [^] K箪 t湛 速測n bt k炭 kh束ng n損m trong gi鱈i h孫n 速足樽c ch 速nh ( v d担 [^a-f] hay m辿t tp (v d担 [^abcdef]). V d担 2.3: C息u lnh d足鱈i 速息y hin th th束ng tin v c存c nh息n vi捉n c達 t捉n l袖 Nam SELECT * FROM nhanvien WHERE hoten LIKE '% Nam' IS NULL v袖 NOT IS NULL Gi存 tr NULL c達 th 速足樽c nhp v袖o m辿t c辿t cho php chp nhn gi存 tr NULL theo m辿t trong ba c存ch sau: Nu kh束ng c達 d歎 liu 速足樽c 速足a v袖o v袖 kh束ng c達 mc 速nh cho c辿t hay kiu d歎 liu tr捉n c辿t 速達. Ng足棚i s旦 d担ng tr湛c tip 速足a gi存 tr NULL v袖o cho c辿t 速達. M辿t c辿t c達 kiu d歎 liu l袖 kiu s竪 s ch淡a gi存 tr NULL nu gi存 tr 速足樽c ch 速nh g息y tr袖n s竪. Trong mnh 速 WHERE, ta s旦 d担ng IS NULL hoc IS NOT NULL nh足 sau: WHERE col_name IS [NOT] NULL C存c to存n t旦 logic C存c to存n t旦 logic s旦 d担ng trong mnh 速 WHERE bao g奪m AND, OR, NOT. AND v袖 OR 速足樽c s旦 d担ng 速 kt h樽p nhiu 速iu kin trong WHERE. 1.3 Danh s存ch ch辰n trong c息u lnh SELECT
  • 15. Gia誰o tr巽nh th脱短c ha狸nh SQL 辰n tt c其 c存c c辿t trong b其ng Khi mu竪n truy xut tt c其 c存c c辿t trong b其ng, ta s旦 d担ng c息u lnh SELECT c達 c坦 ph存p sau: SELECT * FROM table_name Khi s旦 d担ng c息u lnh n袖y, c存c c辿t trong kt qu其 s 速足樽c hin th theo th淡 t湛 m袖 ch坦ng 速 速足樽c t孫o ra trong c息u lnh CREATE TABLE. * Ch辰n c存c c辿t 速足樽c ch 速nh 則 ch辰n ra m辿t s竪 c辿t n袖o 速達 trong b其ng, ta s旦 d担ng c息u lnh SELECT c達 c坦 ph存p sau: SELECT t捉n_c辿t [,...,t捉n_c辿t_n] FROM t捉n_b其ng | khung_nhn C存c t捉n c辿t trong c息u lnh ph其i 速足樽c ph息n c存ch nhau b損ng du phy. Ch坦 箪: Trong c息u lnh SELECT, th淡 t湛 c単a c存c c辿t 速足樽c n捉u ra trong c息u lnh s x存c 速nh th淡 t湛 c単a c存c c辿t 速足樽c hin th ra trong kt qu其. * 則脱i t捉n c存c c辿t trong c存c kt qu其 Khi kt qu其 速足樽c hin th, ti捉u 速 c単a c存c c辿t mc 速nh s l袖 t捉n c単a c存c c辿t khi n達 速足樽c t孫o ra trong c息u lnh CREATE TABLE. Tuy nhi捉n, 速 c存c ti捉u 速 tr谷 n捉n th息n thin h測n, ta c達 th 速脱i t捉n c存c ti捉u 速 c単a c存c c辿t. 則 l袖m 速足樽c vic n袖y, ta c達 th s旦 d担ng m辿t trong hai c存ch vit sau: ti捉u_速_c辿t = t捉n_c辿t hoc t捉n_c辿t ti捉u_速_c辿t V d担 2.4: Hai c息u lnh sau s 速t ti捉u 速 H辰 v袖 t捉n cho l袖 hoten v袖 則a ch cho c辿t diachi khi kt qu其 速足樽c hin th cho ng足棚i s旦 d担ng: SELECT 'H辰 v袖 t捉n'=hoten, '則a ch '= diachi FROM nhanvien Hoc: SELECT hoten 'H辰 v袖 t捉n',diachi '則ia ch ' FROM nhanvien * S旦 d担ng cu tr坦c CASE 速 thay 速脱i d歎 liu trong kt qu其 Trong c息u lnh SELECT, ta c達 th s旦 d担ng cu tr坦c CASE 速 thay 速脱i c存ch hin th kt qu其 ra m袖n hnh. V d担 2.5: C息u lnh sau cho bit h辰 t捉n, h s竪 l足測ng v袖 xp lo孫i l足測ng c単a nh息n vi捉n theo h s竪 l足測ng: SELECT 'H辰 v袖 t捉n' = ten, 'H s竪 l足測ng' = hsluong, 'Xp lo孫i l足測ng' = CASE WHEN lsluong=NULL THEN 'Kh束ng x存c 速nh'
  • 16. Tr叩旦n Nguy達n Phong WHEN hsluong<=1.92 THEN 'Lu測ng thp' WHEN hsluong<=3.1 THEN 'L足測ng TB' WHEN hsluong<=5.2 THEN 'L足測ng cao' ELSE 'L足測ng rt cao' END FROM Nhanvien * C存c chu巽i k箪 t湛 trong kt qu其 Ta c達 th th捉m c存c chu巽i k箪 t湛 v袖o b捉n trong truy vn nh損m thay 速脱i c存ch th淡c trnh b袖y d歎 liu. V d担 2.6: C息u lnh sau s th捉m chu巽i k箪 t湛 H s竪 l足測ng l袖 v袖o tr足鱈c kt qu其 谷 c辿t m淡c l足測ng 谷 t探ng dng trong kt qu其: SELECT 'H辰 v袖 t捉n' = hoten, 'H s竪 l足測ng l袖 : ','H s竪 l足測ng'=hsluong FROM nhanvien Truy vn tr捉n cho c達 kt qu其 c達 d孫ng nh足 sau: H辰 v袖 t捉n H s竪 l足測ng ---------------- -------------- ------------- Trn Nguy捉n Phong H s竪 l足測ng l袖 : 1.92 L捉 Ho袖i Nam H s竪 l足測ng l袖 : 1.86 Nguyn H歎u Tnh H s竪 l足測ng l袖 : 1.92 Nguyn Trung Ki捉n H s竪 l足測ng l袖 : 1.86 Nguyn Th Hoa H s竪 l足測ng l袖 : 2.11 Ho袖ng Nam Phong H s竪 l足測ng l袖 : 3.21 1.4 Tnh to存n c存c gi存 tr trong c息u lnh SELECT Danh s存ch ch辰n trong c息u lnh SELECT c達 th c達 c存c biu th淡c s竪 h辰c. Khi 速達 kt qu其 c単a biu th淡c s l袖 m辿t c辿t trong kt qu其 truy vn: V d担 2.7: C息u lnh sau cho bit h辰 t捉n v袖 l足測ng c単a c存c nh息n vi捉n SELECT 'H辰 v袖 t捉n'=ten, 'L足測ng'=hsluong*210000 FROM nhanvien 1.5 T探 kho存 DISTINCT T探 kho存 DISTINCT 速足樽c s旦 d担ng trong c息u lnh SELECT nh損m lo孫i b叩 ra kh叩i kt qu其 truy vn nh歎ng dng d歎 liu c達 gi存 tr gi竪ng nhau V d担 2.8: nu ta s旦 d担ng c息u lnh: SELECT hsluong FROM nhanvien Ta s c達 kt qu其 nh足 sau:
  • 17. Gia誰o tr巽nh th脱短c ha狸nh SQL hsluong ----------------- 1.92 1.86 1.92 1.86 2.11 3.21 Nh足ng nu ta s旦 d担ng c息u lnh: SELECT DISTINCT hsluong FROM nhanvien kt qu其 c単a truy vn s l袖: hsluong ---------- 1.92 1.86 2.11 3.21 1.6 T孫o b其ng m鱈i b損ng c息u lnh SELECT ... INTO C息u lnh SELECT ... INTO c達 t存c d担ng t孫o m辿t b其ng m鱈i c達 cu tr坦c v袖 d歎 liu 速足樽c x存c 速nh t探 kt qu其 c単a truy vn. B其ng m鱈i 速足樽c t孫o ra s c達 s竪 c辿t b損ng s竪 c辿t 速足樽c ch 速nh trong danh s存ch ch辰n v袖 s竪 dng s 袖 s竪 dng kt qu其 c単a truy vn V d担 2.9: C息u lnh d足鱈i 速息y t孫o m鱈i m辿t b其ng c達 t捉n l袖 NHANVIEN_LUU bao g奪m h辰 t捉n v袖 速a ch c単a nh歎ng nh息n vi捉n c達 h s竪 l足測ng l鱈n h測n 1.92: SELECT hoten, diachi INTO nhanvien_luu FROM nhanvien WHERE hsluong>1.92 1.7 S他p xp kt qu其 truy vn b損ng ORDER BY Mnh 速 ORDER BY 速足樽c s旦 d担ng nh損m s他p xp kt qu其 truy vn theo m辿t hay nhiu c辿t (t竪i 速a l袖 16 c辿t). Vic s他p xp c達 th theo th淡 t湛 t即ng t即ng (ASC) hoc gi其m (DESC). Nu kh束ng ch 速nh r但 th mc 速nh l袖 t即ng. V d担 2.10: C息u lnh sau s s他p xp c存c nh息n vi捉n theo th淡 t湛 gi其m dn c単a h s竪 l足測ng v袖 nu h s竪 l足測ng b損ng nhau th s他p xp theo th淡 t湛 t即ng dn c単a ng袖y sinh: SELECT hoten,ngaysinh,hsluong FROM nhanvien ORDER BY hsluong DESC, ngaysinh Ta c達 th s旦 d担ng c存c s竪 thay v s旦 d担ng t捉n c辿t sau mnh 速 ORDER BY. V d担 2.11: c息u lnh d足鱈i 速息y s他p xp c存c nh息n vi捉n theo th淡 t湛 t即ng dn c単a ng袖y sinh:
  • 18. Tr叩旦n Nguy達n Phong SELECT hoten,ngaysinh,hsluong FROM nhanvien ORDER BY 3 1.8 Php h樽p v袖 to存n t旦 UNION To存n t旦 UNION cho php ta h樽p c存c kt qu其 c単a hai hay nhiu truy vn th袖nh m辿t tp kt qu其 duy nht. C坦 ph存p c単a php h樽p nh足 sau: Query_1 [UNION [ALL] Query_2 ] ... [UNION [ALL] Query_N ] [ORDER BY clause] [COMPUTE clause] Trong 速達: Query_1 c達 d孫ng: SELECT select_list [INTO clause] [FROM clause] [WHERE clause] [GROUP BY clause] [HAVING clause] v袖 Query_i (i=2,..,N) c達 d孫ng: SELECT select_list [FROM clause] [WHERE clause] [GROUP BY clause] [HAVING clause] V d担 2.12: Gi其 s旦 ta c達 hai b其ng nh足 sau: R S A B C E F abc 3 5 edf 15 jks 5 7 hht 1 bdg 10 5 abc 3 Hht 12 0 adf 2 Th php h樽p: SELECT A,B FROM R UNION
  • 19. Gia誰o tr巽nh th脱短c ha狸nh SQL SELECT * FROM S C達 kt qu其 nh足 sau: A B ---- ----------- abc 3 adf 2 bgd 10 edf 15 hht 1 hht 12 jks 5 Theo mc 速nh, php to存n UNION s lo孫i b叩 nh歎ng dng gi竪ng nhau trong kt qu其. Nu ta s旦 d担ng t誰y ch辰n ALL th c存c dng gi竪ng nhau s kh束ng b lo孫i b叩. Ta c達 th s旦 d担ng c存c du ngoc 速 x存c 速nh th淡 t湛 tnh to存n trong php h樽p. 1.8.1 C存c nguy捉n t他c khi x息y d湛ng c息u lnh UNION Khi x息y d湛ng c存c c息u lnh UNION, ta cn ch坦 箪 c存c nguy捉n t他c sau: Tt c其 c存c danh s存ch ch辰n trong c息u lnh UNION ph其i c達 c誰ng s竪 biu th淡c (c存c t捉n c辿t, c存c biu th淡c s竪 h辰c, c存c h袖m g辿p,...) C存c c辿t t足測ng 淡ng trong tt c其 c存c b其ng, hoc tp con bt k炭 c存c c辿t 速足樽c s旦 d担ng trong b其n th息n m巽i truy vn ph其i c誰ng kiu d歎 liu. C存c c辿t t足測ng 淡ng trong b其n th息n t探ng truy vn c単a m辿t c息u lnh UNION ph其i xut hin theo th淡 t湛 nh足 nhau. Nguy捉n nh息n l袖 do php h樽p so s存nh c存c c辿t t探ng c辿t m辿t theo th淡 t湛 速足樽c cho trong m巽i truy vn. Khi c存c kiu d歎 liu kh存c nhau 速足樽c kt h樽p v鱈i nhau trong c息u lnh UNION, ch坦ng s 速足樽c chuyn sang kiu d歎 liu cao h測n (nu c達 th 速足樽c). Ti捉u 速 c辿t trong kt qu其 c単a php h樽p s l袖 ti捉u 速 c辿t 速足樽c ch 速nh trong truy vn 速u ti捉n. 1.8.2 S旦 d担ng UNION v鱈i c存c giao t存c SQL kh存c C存c nguy捉n t他c sau ph其i 速足樽c tu息n theo khi s旦 d担ng php h樽p v鱈i c存c c息u lnh giao t存c SQL kh存c: Truy vn 速u ti捉n trong c息u lnh UNION c達 th c達 INTO 速 t孫o m辿t b其ng t探 kt qu其 cu竪i c誰ng. Mnh 速 ORDER BY v袖 COMPUTE d誰ng 速 x存c 速nh th淡 t湛 kt qu其 cu竪i c誰ng hoc tnh to存n c存c gi存 tr t達m t他t ch 速足樽c cho php s旦 d担ng 谷 cu竪i c単a c息u lnh UNION. Ch坦ng kh束ng 速足樽c php s旦 d担ng trong bt k炭 b其n th息n truy vn n袖o trong php h樽p. Mnh 速 GROUP BY v袖 HAVING ch c達 th 速足樽c s旦 d担ng trong b其n th息n t探ng truy vn. Ch坦ng kh束ng th 速足樽c s旦 d担ng 速 t存c 速辿ng l捉n kt qu其 cu竪i c誰ng.
  • 20. Tr叩旦n Nguy達n Phong Php to存n UNION c嘆ng c達 th 速足樽c s旦 d担ng b捉n trong m辿t c息u lnh INSERT. Php to存n UNION kh束ng th s旦 d担ng trong c息u lnh CREATE VIEW. 1.9 Php n竪i Php n竪i 速足樽c s旦 d担ng 速 truy xut d歎 liu t探 hai hay nhiu b其ng hoc khung nhn trong c誰ng CSDL hoc trong c存c CSDL kh存c nhau b谷i c誰ng m辿t php x旦 l箪. 1.9.1 Php to存n n竪i M辿t c息u lnh n竪i (join statament) th湛c hin c存c c束ng vic sau 速息y: X存c 速nh m辿t c辿t t探 m巽i b其ng. So s存nh c存c gi存 tr trong nh歎ng c辿t n袖y theo t探ng dng. Kt h樽p c存c dng c達 nh歎ng gi存 tr tho其 mn 速iu kin th袖nh nh歎ng dng m鱈i. V d担 2.13: C息u lnh d足鱈i 速息y cho bit h辰 t捉n, 速a ch c単a c存c nh息n vi捉n v袖 t捉n 速測n v m袖 m巽i nh息n vi捉n th湛c thu辿c: SELECT hoten, diachi, tendonvi FROM nhanvien, donvi WHERE nhanvien.madonvi = donvi.madonvi Danh s存ch ch辰n trong php n竪i Gi竪ng nh足 c存c c息u lnh ch辰n (selection statment), m辿t c息u lnh n竪i b他t 速u v鱈i t探 kh達a SELECT. C存c c辿t 速足樽c ch 速nh t捉n sau t探 kho存 SELECT l袖 c存c c辿t 速足樽c d足a ra trong kt qu其 truy vn. Trong danh s存ch ch辰n c単a php n竪i, ta c達 th ch 速nh m辿t s竪 c辿t b損ng c存ch ch 速nh t捉n c単a c辿t 速達 hoc tt c其 c存c c辿t c単a nh歎ng b其ng tham gia v袖o php n竪i b損ng c存ch s旦 d担ng du sao (*). Danh s存ch ch辰n kh束ng nht thit ph其i bao g奪m c存c c辿t c単a nh歎ng b其ng tham gia php n竪i. Mnh 速 FROM trong php n竪i Mnh 速 FROM c単a c息u lnh n竪i x存c dnh c存c b其ng (hay khung nhn) tham gia v袖o php n竪i. Nu ta s旦 d担ng du * trong danh s存ch ch辰n th th淡 t湛 c単a c存c b其ng lit k捉 trong FROM s 其nh h足谷ng 速n kt qu其 速足樽c hin th. Mnh 速 WHERE trong php n竪i Mnh 速 WHERE x存c 速nh 速iu kin n竪i gi歎a c存c b其ng v袖 c存c khung nhn 速足樽c ch 速nh. N達 x存c 速nh t捉n c単a c辿t 速足樽c s旦 d担ng 速 n竪i v袖 php to存n n竪i 速足樽c s旦 d担ng. C存c to存n t旦 so s存nh d足鱈i 速息y 速足樽c s旦 d担ng 速 x存c 速nh 速iu kin n竪i Php to存n 箪 ngha = B損ng > L鱈n h測n >= L鱈n h測n hoc b損ng < Nh叩 h測n <= Nh叩 h測n hoc b損ng <> Kh存c
  • 21. Gia誰o tr巽nh th脱短c ha狸nh SQL !> Kh束ng l鱈n h測n !< Kh束ng nh叩 h測n. 1.9.2 C存c lo孫i php n竪i * Php n竪i b損ng v袖 php n竪i t湛 nhi捉n M辿t php n竪i b損ng (equijoin) l袖 m辿t php n竪i trong 速達 gi存 tr c単a c存c c辿t 速足樽c s旦 d担ng 速 n竪i 速足樽c so s存nh v鱈i nhau d湛a tr捉n ti捉u chun b損ng v袖 tt c其 c存c c辿t trong c存c b其ng tham gia n竪i 速u 速足樽c 速足a ra trong kt qu其. V d担 2.14: SELECT * FROM nhanvien, donvi WHERE nhanvien.madonvi = donvi.madonvi Trong kt qu其 c単a c息u lnh tr捉n, c辿t madonvi v袖 tendonvi xut hin hai ln trong kt qu其 php n竪i v袖 nh足 vy l袖 kh束ng cn thit. 則 lo孫i b叩 速iu n袖y, ta c達 th s旦 d担ng php n竪i t湛 nhi捉n (natural join) b損ng c存ch lo孫i b叩 速i c存c c辿t tr誰ng t捉n v鱈i nhau. * Php n竪i v鱈i c存c 速iu kin b脱 sung Trong mnh 速 WHERE c単a c息u lnh n竪i, ta c達 th b竪 sung c存c 速iu kin tm kim kh存c. V d担 2.15: SELECT hoten, diachi, tendonvi FROM nhanvien, donvi WHERE nhanvien.madonvi = donvi.madonvi AND Nhanvien.hsluong>=2.11 * Php t湛 n竪i v袖 c存c b danh Php t湛 n竪i l袖 php n竪i m袖 trong 速達 ta so s存nh c存c gi存 tr b捉n trong m辿t c辿t c単a c誰ng m辿t b其ng. V d担 2.16: Tm nh歎ng nh息n vi捉n c達 c誰ng 速a ch v鱈i nh息n vi捉n 'Trn Nguy捉n Phong' SELECT n1.hoten FROM nhanvien n1, nhanvien n2 WHERE n2.hoten='Trn Nguy捉n Phong' AND n1.diachi = n2.diachi * Php n竪i kh束ng d湛a tr捉n ti捉u chun b損ng Trong php n竪i n袖y, c存c c辿t 速足樽c s旦 d担ng 速 kt n竪i 速足樽c so s存nh v鱈i nhau kh束ng d湛a tr捉n 速iu kin b損ng. * Php n竪i ngo袖i (outer join) Trong c存c php n竪i 速 速 cp 谷 tr捉n, ch nh歎ng dng h樽p l (t淡c l袖 nh歎ng dng c達 gi存 tr trong c存c c辿t 速足樽c ch 速nh tho其 m 速iu kin kt n竪i) m鱈i 速足樽c 速足a ra trong kt qu其. Theo m辿t ngha n袖o 速達, nh歎ng php n竪i n袖y lo孫i b叩 th束ng tin ch淡a trong nh歎ng dng kh束ng h樽p l. Tuy nhi捉n, 速束i khi ta c嘆ng cn gi歎 l孫i nh歎ng th束ng tin kh束ng h樽p l b損ng c存ch cho php nh歎ng dng kh束ng h樽p l c達 mt trong kt qu其 c単a
  • 22. Tr叩旦n Nguy達n Phong php n竪i. 則 l袖m 速iu n袖y, ta c達 th s旦 d担ng php n竪i ngo袖i. Giao t存c SQL cung cp hai php n竪i ngo袖i: Php n竪i ngo袖i tr存i (*=) : Php n竪i n袖y cho php ly tt c其 c存c t探 b其ng c達 t捉n 速u ti捉n. Php n竪i ngo袖i ph其i (=*) : Php n竪i n袖y cho php ly tt c其 c存c dng t探 b其ng c達 t捉n th淡 hai. V d担 2.17: Gi其 s旦 ta c達 hai b其ng R v袖 S c達 n辿i dung nh足 sau A B C D ----- ----------- ----------- ----- aaa 2 4 aaaa fff 8 4 f2 ggg 2 7 g4 xxx 2 12 gdf ggg 2 12 khf sss 45 0 k3h B其ng R E F G ----- ----------- ----------- aaa 3 (null) xxx 23 26 abc 3 6 (null)12 (null) sss 20 3 B其ng S Khi 速達 c息u lnh: SELECT * FROM R,S WHERE R.A = S.E Cho kt qu其 l袖: A B C D E F G ---- ----- ----- ----- ----- ------ -------- aaa 2 4 aaaa aaa 3 (null) xxx 2 12 gdf xxx 23 26 sss 45 0 k3h sss 20 3 Cn c息u lnh:
  • 23. Gia誰o tr巽nh th脱短c ha狸nh SQL SELECT * FROM R,S WHERE R.A *= S.E Cho kt qu其 l袖: A B C D E F G --- ---- ---- ----- ----- ------ ------ aaa 2 4 aaaa aaa 3 (null) fff 8 4 f2 (null) (null) (null) ggg 2 7 g4 (null) (null) (null) xxx 2 12 gdf xxx 23 26 ggg 2 12 khf (null) (null) (null) sss 45 0 k3h sss 20 3 V袖 c息u lnh SELECT * FROM R,S WHERE R.A =* S.E Cho kt qu其 l袖: A B C D E F G ---- ----- ----- ----- ----- ------ --------- aaa 2 4 aaaa aaa 3 (null) xxx 2 12 gdf xxx 23 26 (null)(null) (null) (null) abc 3 6 (null)(null) (null) (null) (null)12 (null) sss 45 0 k3h sss 20 3 C存c gi鱈i h孫n c単a php n竪i ngo袖i Giao t存c SQL kh束ng cho php hai php n竪i ngo袖i l奪ng nhau v袖 php n竪i trong l奪ng v袖o trong php n竪i ngo袖i. Tuy nhi捉n, m辿t b其ng c達 th tham gia trong m辿t php n竪i trong v袖 l袖 b其ng ngo袖i (outer table) trong m辿t php n竪i ngo袖i. B其ng d足鱈i 速息y cho bit c存c c存ch kt h樽p h樽p l v袖 kh束ng h樽p l c単a php n竪i trong v袖 php n竪i ngo袖i: H樽p l Kh束ng h樽p l T1 =* T2 *= T3 T1 *= T2 *= T3 T1 = T2 *= T3 T1 *= T2 = T3 T1 *= T2 =* T3 T3 T3
  • 24. Tr叩旦n Nguy達n Phong || * T2 =* T1 *= T4 * || T5 || * T2 =* T1 =* T4 * || T5 T3 * || T2 *= T1 =* T4 || * T5 T3 || * T2 *= T1 *= T4 || * T5 * Php n竪i v袖 c存c gi存 tr NULL Nu trong c存c c辿t c単a c存c b其ng tham gia php n竪i c達 c存c gi存 tr NULL th c存c gi存 tr NULL 速足樽c xem nh足 l袖 kh束ng b損ng nhau. Ch村ng h孫n ta c達 hai b其ng: A ------ B --------- C -------- D -------- 1 b1 Null d1 Null b2 4 d2 4 b3 B其ng R B其ng S Th c息u lnh: SELECT * FROM R, S WHERE A *= C S cho kt qu其 l袖: A ------ B ------ C ------ D ------ 1 b1 Null Null Null b2 Null Null 4 b3 4 D2 1.10 T孫o c存c dng th竪ng k捉 d歎 liu v鱈i COMPUTE ... BY Ta s旦 d担ng mnh 速 COMPUTE BY kt h樽p v鱈i c存c h袖m g辿p dng v袖 mnh 速 ORDER BY 速 s其n sinh ra c存c c存c b存o c存o (report) nh損m th竪ng k捉 c存c gi存 tr d歎 liu
  • 25. Gia誰o tr巽nh th脱短c ha狸nh SQL theo t探ng nh達m. Nh歎ng gi存 tr th竪ng k捉 n袖y xut hin nh足 l袖 nh歎ng dng b脱 sung trong kt qu其 truy vn. M辿t mnh 速 COMPUTE BY cho php ta quan s存t c其 c存c chi tit v d歎 liu ln c存c gi存 tr th竪ng k捉. Ta c達 th tnh c存c gi存 tr th竪ng k捉 cho c存c nh達m con (subgroups) v袖 ta c嘆ng c達 th tnh to存n nhiu h袖m g辿p tr捉n c誰ng m辿t nh達m. Mnh 速 COMPUTE BY c達 c坦 ph存p nh足 sau: COMPUTE row-aggregate(col_name) [,...,row_aggregate(col_name)] BY col_name [,...,col_name] C存c h袖m g辿p c達 th s旦 d担ng 速足樽c v鱈i COMPUTE BY bao g奪m SUM, AVG, MIN, MAX v袖 COUNT. V d担 2.18: C息u lnh d足鱈i 速息y cho bit h辰 t捉n, t捉n 速測n v h s竪 l足測ng c単a nh息n vi捉n 速奪ng th棚i cho bit l足測ng trung bnh c単a c存c nh息n vi捉n trong m巽i 速測n v SELECT hoten,tendonvi,hsluong FROM nhanvien,donvi WHERE nhanvien.madonvi=donvi.madonvi ORDER BY nhanvien.madonvi COMPUTE AVG(hsluong) BY nhanvien.madonvi Kt qu其 c単a truy vn n袖y s nh足 sau: Hoten tendonvi hsluong --------------- -------------- -------------- Nguyn Th Hoa Phng k to存n 2.11 avg =========== 2.11 L捉 Ho袖i Nam Phng T脱 ch淡c 1.86 Ho袖ng Nam Phong Phng T脱 ch淡c 3.21 avg =========== 2.535 Trn Nguy捉n Phong Phng 速iu h袖nh 1.92 Nguyn H歎u Tnh Phng 速iu h袖nh 1.92 avg =========== 1.92 Nguyn Trung Ki捉n Phng t袖i v担 1.86
  • 26. Tr叩旦n Nguy達n Phong avg =========== 1.86 Khi s旦 d担ng mnh 速 COMPUTE ... BY cn tu息n theo c存c qui t他c d足鱈i 速息y: T探 kh達a DISTINCT kh束ng cho php s旦 d担ng v鱈i c存c h袖m g辿p dng C存c c辿t s旦 d担ng trong mnh 速 COMPUTE ph其i xut hin trong danh s存ch ch辰n. Kh束ng s旦 d担ng SELECT INTO trong m辿t c息u lnh SELECT c達 s旦 d担ng COMPUTE. Nu s旦 d担ng mnh 速 COMPUTE ... BY th c嘆ng ph其i s旦 d担ng mnh 速 ORDER BY. C存c c辿t lit k捉 trong COMPUTE BY ph其i gi竪ng ht hay l袖 m辿t tp con c単a nh歎ng g 速足樽c lit k捉 sau ORDER BY. Ch坦ng ph其i c達 c誰ng th淡 t湛 t探 tr存i qua ph其i, b他t 速u v鱈i c誰ng m辿t biu th淡c v袖 kh束ng b叩 qua bt k炭 m辿t biu th淡c n袖o. Ch村ng h孫n nu mnh 速 ORDER BY c達 d孫ng: ORDER BY a, b, c Th mnh 速 COMPUTE BY c達 d孫ng d足鱈i 速息y l袖 h樽p l: COMPUTE row_aggregate (column_name) BY a, b, c COMPUTE row_aggregate (column_name) BY a, b COMPUTE row_aggregate (column_name) BY a V袖 c存c d孫ng d足鱈i 速息y l袖 sai COMPUTE row_aggregate (column_name) BY b, c COMPUTE row_aggregate (column_name) BY a, c COMPUTE row_aggregate (column_name) BY c Ph其i s旦 d担ng m辿t t捉n c辿t hoc m辿t biu th淡c trong mnh 速 ORDER BY, vic s他p xp (order) kh束ng 速足樽c th湛c hin d湛a tr捉n ti捉u 速 c辿t. T探 kho存 COMPUTE c達 th 速足樽c s旦 d担ng m袖 kh束ng c達 BY v袖 khi 速達 ORDER BY l袖 t誰y ch辰n. 1.11 Th竪ng k捉 d歎 liu v鱈i GROUP BY v袖 HAVING Ta c達 th s旦 d担ng c存c mnh 速 GROUP BY v袖 HAVING 速 th竪ng k捉 d歎 liu. GROUP BY t脱 ch淡c d歎 liu v袖o c存c nh達m, HAVING thit lp c存c 速iu kin l捉n c存c nh達m trong kt qu其 truy vn. Nh歎ng mnh 速 n袖y th足棚ng 速足樽c s旦 d担ng kt h樽p v鱈i nhau (HAVING 速足樽c s旦 d担ng kh束ng km v鱈i GROUP BY c達 th t孫o ra nh歎ng kt qu其 nhm ln). C存c h袖m g辿p tr其 v c存c gi存 tr t達m l足樽c cho c其 b其ng hoc cho c存c nh達m trong b其ng. Do 速達, ch坦ng th足棚ng 速足樽c s旦 d担ng v鱈i GROUP BY. C存c h袖m g辿p c達 th xut hin trong m辿t dang s存ch ch辰n hay trong mnh 速 HAVING, nh足ng kh束ng 速足樽c s旦 d担ng trong mnh 速 WHERE. Ta c達 th s旦 d担ng c存c h袖m g辿p d足鱈i 速息y v鱈i GROUP BY (Trong 速達 expression l袖 m辿t t捉n c辿t).
  • 27. Gia誰o tr巽nh th脱短c ha狸nh SQL H袖m g辿p Ch淡c n即ng SUM([ALL | DISTINCT] expression) Tnh t脱ng c存c gi存 tr. AVG([ALL | DISTINCT] expression) Tnh trung bnh c単a c存c gi存 tr COUNT([ALL | DISTINCT] expression) S竪 c存c gi存 tr trong biu th淡c. COUNT(*) S竪 c存c dng 速足樽c ch辰n. MAX(expression) Tnh gi存 tr l鱈n nht MIN(expression) Tnh gi存 tr nh叩 nht Trong 速達, SUM v袖 AVG ch l袖m vic v鱈i nh歎ng gi存 tr kiu s竪. SUM, AVG, COUNT, MAX v袖 MIN b叩 qua c存c gi存 tr null cn COUNT(*) th kh束ng. V d担 2.19: C息u lnh d足鱈i 速息y cho bit h s竪 l足測ng trung bnh c単a c存c nh息n vi捉n theo t探ng 速測n v: SELECT donvi.madonvi,tendonvi, avg(hsluong) FROM nhanvien,donvi WHERE nhanvien.madonvi = donvi.madonvi GROUP BY donvi.madonvi,tendonvi Ch坦 箪: Danh s存ch c存c t捉n c辿t trong danh s存ch ch辰n c単a c息u lnh SELECT v袖 danh s存ch c存c t捉n c辿t sau GROUP BY ph其i nh足 nhau, nu kh束ng c息u lnh s kh束ng h樽p l. V d担 c息u lnh d足鱈i 速息y l袖 kh束ng 速坦ng: SELECT donvi.madonvi,tendonvi, avg(hsluong) FROM nhanvien,donvi WHERE nhanvien.madonvi = donvi.madonvi GROUP BY donvi.madonvi Mnh 速 HAVING thit lp c存c 速iu kin 速竪i v鱈i mnh 速 GROUP BY t足測ng t湛 nh足 c存ch th淡c mnh 速 WHERE thit lp c存c 速iu kin cho c息u lnh SELECT. Mnh 速 HAVING s kh束ng c達 ngha nu nh足 kh束ng s旦 d担ng kt h樽p v鱈i mnh 速 WHERE. C達 m辿t 速im kh存c bit gi歎a HAVING v袖 WHERE l袖 trong 速iu kin tm kim c単a WHERE kh束ng 速足樽c c達 c存c h袖m g辿p trong khi HAVING l孫i cho php s旦 d担ng c存c h袖m g辿p trong 速iu kin tm kim c単a mnh. Mnh 速 HAVING c達 th tham chiu 速n bt k炭 m担c n袖o trong danh s存ch ch辰n v袖 mnh 速 HAVING c達 th ch淡a t竪i 速a 128 速iu kin tm kim. V d担 2.20: C息u lnh d足鱈i 速息y cho bit h s竪 l足測ng trung bnh c単a c存c nh息n vi捉n theo t探ng 速測n v v袖 ch hin th nh歎ng 速測n v c達 h s竪 l足測ng trung bnh l鱈n h測n 1.92 SELECT donvi.madonvi,tendonvi, avg(hsluong) FROM nhanvien,donvi WHERE nhanvien.madonvi = donvi.madonvi GROUP BY donvi.madonvi,tendonvi HAVING avg(hsluong)>1.92
  • 28. Tr叩旦n Nguy達n Phong (SELECT [ALL|DISTINCT] subquery_select_list [FROM {table_name|view_name} [optimizer_hints] [[,table_name2|view_bame2} [optimizer_hints] [...,table_name16|view_name16}[optimizer_hints]]] [WHERE clause] [GROUP BY clause] [HAVING clause]) (1) WHERE expression [NOT]IN (subquery) (2) WHERE expression comparison_operator [ANY|ALL](subquery) (3) WHERE [NOT]EXISTS (subquery) SELECT * FROM nhanvien WHERE madonvi NOT IN ( SELECT madonvi FROM donvi WHERE dienthoai like '82%')
  • 29. Gia誰o tr巽nh th脱短c ha狸nh SQL INSERT [INTO] table_name VALUES(value1, value2, ...) INSERT INTO nhanvien VALUES('NV02003','L達 Th谷 Mai','23/5/72', NULL,'523312',1.92,'02') INSERT [INTO] table_name(col1,col2,..., colN) VALUES(value1, value2, ...,valueN) INSERT INTO nhanvien(manv,hoten,diachi) VALUES('NV03002','Nguy達湛n Th谷 Ha短nh Dung','56 Tr叩旦n Phu誰') INSERT INTO luong_nhanvien SELECT hoten,hsluong*210000 FROM nhanvien
  • 30. Tr叩旦n Nguy達n Phong UPDATE updated_table_name SET colname = expression [, ..., colname = expression ] [FROM table_name [,..., table_name]] [WHERE conditions ] UPDATE nhanvien SET hsluong = hsluong+0.2 WHERE madonvi ='04' UPDATE nhatkybanhang SET thanhtien = soluong*mathang.dongia FROM mathang WHERE nhatkybanhang.mahang = mathang.mahang DELETE [FROM] delete_table_name [FROM table_name [,..., table_name]] [WHERE conditions] DELETE FROM nhanvien
  • 31. Gia誰o tr巽nh th脱短c ha狸nh SQL FROM donvi WHERE nhanvien.madonvi = donvi.madonvi AND donvi.dienthoai ='848484'
  • 32. Tr叩旦n Nguy達n Phong CChh脱脱奪奪nngg 33:: NNGGNN NNGGテ IIUU KKHHIINN GRANT ALL | statement [,...,statementN ] TO account [,...,accountN] GRANT ALL | permission [,...,permissionN] ON table_name |view_name [(column1 [,...,columnN])] |ON stored_procedure TO account [,...,accountN]
  • 33. Gia誰o tr巽nh th脱短c ha狸nh SQL GRANT CREATE TABLE, CREATE VIEW TO db_user GRANT SELECT, UPDATE ON nhanvien(hoten,diachi,dienthoai,hsluong) TO db_user1, db_user2 REVOKE ALL | statement [,...,statementN] FROM account [,...,accountN] REVOKE ALL | permission [,...,permissionN]} ON table_name | view_name [(column [,...,columnN])] | stored_procedure FROM account [,...,accountN ]
  • 34. Tr叩旦n Nguy達n Phong REVOKE SELECT, UPDATE ON nhanvien(hsluong) FROM db_user1 REVOKE ALL FROM db_user
  • 35. Gia誰o tr巽nh th脱短c ha狸nh SQL CChh脱脱奪奪nngg 44:: TTHHUU TTUUCC LLUU TTRRテ VVAA TTRRIIGGGGEERR C存c th単 t担c l足u tr歎 l袖 m辿t trong nh歎ng 速竪i t足樽ng c測 s谷 d歎 liu. C達 th xem ch坦ng t足測ng t湛 nh足 nh歎ng th単 t担c trong c存c ng束n ng歎 lp trnh. M巽i m辿t th単 t担c l足u tr歎 c達 th c達 c存c kh其 n即ng sau: Nhn c存c tham s竪 速u v袖o, th湛c thi c存c c息u lnh b捉n trong th単 t担c v袖 tr其 v c存c gi存 tr. B捉n trong m巽i th単 t担c c達 th ch淡a c存c c息u lnh nh損m th湛c hin c存c thao t存c tr捉n c測 s谷 d歎 liu (k c其 vic g辰i 速n c存c th単 t担c l足u tr歎 kh存c) Tr其 v m辿t gi存 tr tr孫ng th存i th束ng qua 速達 c達 th x存c 速nh vic th湛c thi th単 t担c l袖 th袖nh c束ng hay b l巽i. Vic s旦 d担ng c存c th単 t担c l足u tr歎 b捉n trong c測 s谷 d歎 liu s mang l孫i nh歎ng l樽i ch sau: Th単 t担c l足u tr歎 cho php module ho存 c束ng vic, t孫o 速iu kin thun l樽i cho vic th湛c hin c存c thao t存c tr捉n d歎 liu. Th単 t担c l足u tr歎 速足樽c ph息n tch, t竪i 足u v袖 bi捉n dch khi t孫o ra n捉n vic th湛c thi ch坦ng nhanh h測n nhiu so v鱈i vic s旦 d担ng m辿t tp c存c c息u lnh giao t存c SQL theo nh歎ng c存ch th束ng th足棚ng. Th単 t担c l足u tr歎 cho php ch坦ng ta th湛c hin c誰ng m辿t y捉u cu b損ng m辿t c息u lnh 速測n gi其n thay v ph其i s旦 d担ng nhiu dng lnh SQL. 則iu n袖y s l袖m gi其m thiu s湛 l足u th束ng tr捉n m孫ng. Thay v cp ph存t quyn tr湛c tip cho ng足棚i s旦 d担ng tr捉n c存c c息u lnh SQL, ta c達 th cp ph存t quyn cho ng足棚i s旦 d担ng th束ng qua c存c th単 t担c l足u tr歎, nh棚 速達 t即ng kh其 n即ng b其o mt 速竪i v鱈i h th竪ng. T孫o c存c th単 t担c l足u tr歎 則 t孫o m辿t sp, ta s旦 d担ng c息u lnh CREATE PROCEDURE c達 c坦 ph存p nh足 sau: CREATE PROCEDURE procedure_name [;number] [(parameter1 [,parameter2]...[parameter255])] AS sql_statements V d担 4.1: CREATE PROC sp_list @bten char(20) AS SELECT hoten, ngaysinh, diachi FROM nhanvien WHERE hoten= @bten Ch坦 箪: Nu khi g辰i th単 t担c, ch坦ng ta truyn tham s竪 cho th単 t担c d足鱈i d孫ng:
  • 36. Tr叩旦n Nguy達n Phong @tham_s竪 = gi存_tr Th th淡 t湛 c存c tham s竪 kh束ng cn ph其i tu息n theo th淡 t湛 nh足 khi t孫o th単 t担c b損ng c息u lnh CREATE PROCEDURE. Tuy nhi捉n, nu nh足 速 c達 m辿t tham s竪 速足樽c truyn gi存 tr theo c存ch tr捉n th tt c其 c存c tham s竪 cn l孫i c嘆ng ph其i 速足樽c truyn gi存 tr theo c存ch 速達. Ta c達 th g存n m辿t gi存 tr mc 速nh cho tham s竪 trong c息u lnh CREATE PROCEDURE. Gi存 tr n袖y, c達 th l袖 h損ng bt k炭, s 速足樽c ly l袖m tham s竪 c単a th単 t担c khi ng足棚i s旦 d担ng kh束ng cung cp gi存 tr cho tham s竪 khi g辰i th単 t担c. V d担 4.2: CREATE PROC sp_list;2 @bten char(20)=Nguyen Van A AS SELECT * FROM nhanvien WHERE hoten = @bten V鱈i th単 t担c tr捉n, nu ta g辰i msp_list;2 m袖 kh束ng c達 tham s竪 th th単 t担c s ly tham s竪 mc 速nh l袖 Nguyn V即n A cho @bten. Gi存 tr mc 速nh c達 th NULL. Trong tr足棚ng h樽p n袖y, nu ng足棚i s旦 d担ng kh束ng cung cp tham s竪, SQL Server s thi h袖nh th単 t担c theo c存c tham s竪 kh存c. V d担 4.3: V鱈i c息u lnh CREATE PROC sp_list;3 @bten char(20)=NULL,@bluong float AS SELECT * FROM nhanvien WHERE hoten=@bten AND hsluong=@bluong Ta th g辰i th単 t担c tr捉n nh足 sau: msp_list;3 @btuoi=23 m袖 kh束ng b l巽i. Mc 速nh c達 th bao g奪m c存c k箪 t湛 速孫i din (%, _, [], [^] ) nu th単 t担c s旦 d担ng tham s竪 v鱈i t探 kh達a LIKE. V d担 4.4: CREATE PROC sp_list;4 @bten char(20) =Trn% AS SELECT * FROM nhanvien WHERE hoten LIKE @bten Th束ng tin tr其 v t探 c存c th単 t担c l足u tr歎 C存c gi存 tr tr孫ng th存i tr其 v: C存c th単 t担c c達 th tr其 v m辿t gi存 tr nguy捉n 速足樽c g辰i l袖 m辿t tr孫ng th存i tr其 v. Gi存 tr n袖y ch ra cho bit th単 t担c 速足樽c th湛c hin th袖nh c束ng hay gp l巽i v袖 nguy捉n nh息n c単a l巽i (SQL Server 速 速nh ngha s遜n m辿t tp c存c gi存 tr tr其 v, c存c gi存 tr n袖y n損m trong kho其ng [-99;0]; trong 速達 gi存 tr tr其 v b損ng 0 t淡c l袖 vic th湛c hin th単 t担c th袖nh c束ng, c存c gi存 tr cn l孫i cho bit nguy捉n do khi b l巽i). Gi存 tr tr其 v do ng足棚i s旦 d担ng 速nh ngha Ng足棚i s旦 d担ng c達 th 速nh ngha c存c gi存 tr tr其 v c単a mnh trong c存c th単 t担c l足u tr歎 b損ng c存ch b脱 sung m辿t tham s竪 v袖o c息u lnh RETURN. Tt c其 c存c s竪 nguy捉n ngo孫i tr探 c存c gi存 tr d袖nh ri捉ng cho h th竪ng 速u c達 th 速足樽c s旦 d担ng.
  • 37. Gia誰o tr巽nh th脱短c ha狸nh SQL V d担 4.5: CREATE PROC sp_exam @bten char(20) AS IF EXISTS (SELECT * FROM nhanvien WHERE hoten = @bten) RETURN 1 ELSE RETURN 2 C存c tham s竪 tr其 v Khi c其 hai c息u lnh CREATE PROCEDURE v袖 EXECUTE ch淡a m担c ch辰n OUTPUT cho t捉n m辿t tham s竪, th単 t担c c達 th s旦 d担ng m辿t bin 速 tr其 v tr c単a tham s竪 速達 速n ng足棚i g辰i. B損ng vic s旦 d担ng t探 kho存 OUTPUT, bt c淡 s湛 thay 速脱i n袖o 速n c嘆ng vn cn gi歎 l孫i sau khi th単 t担c 速足樽c th湛c hin, v袖 c存c bin c達 th 速足樽c s旦 d担ng trong c存c c息u lnh SQL b脱 sung sau 速達 trong tp lnh hay th単 t担c 速足樽c g辰i. Nu t探 kho存 OUTPUT kh束ng 速足樽c s旦 d担ng, vic thay 速脱i 速n tham s竪 s kh束ng 速足樽c gi歎 l孫i sau khi kt th坦c th湛c hin th単 t担c. Ngo袖i ra, ta cn c達 th d誰ng RETURN 速 tr其 v gi存 tr. M辿t th単 t担c l足u tr歎 c達 th s旦 d担ng bt k炭 hoc tt c其 kh其 n即ng sau 速 tr其 v: M辿t hoc nhiu tp c存c gi存 tr. M辿t gi存 tr tr其 v r但 r袖ng (s旦 d担ng c息u lnh RETURN). M辿t tham s竪 OUTPUT. Nu ch坦ng ta ch 速nh OUTPUT khi th湛c hin m辿t th単 t担c nh足ng tham s竪 t足測ng 淡ng kh束ng 速足樽c 速nh ngha v鱈i OUTPUT khi t孫o th単 t担c th s b l巽i. Tuy nhi捉n nu ta 速nh ngha OUTPUT cho m辿t tham s竪 trong th単 t担c nh足ng kh束ng ch 速nh OUTPUT khi th湛c hin th vn kh束ng b l巽i (gi存 tr tham s竪 khi 速達 s kh束ng 速足樽c tr其 v). V d担 4.6: CREATE PROC Chia @sobichia real,@sochia real, @kqua real OUTPUT AS IF (@sochia =0) Print Division by zero ELSE SELECT @kqua = @sobichia / @sochia Khi 速達 nu ta th湛c hin nh足 sau: DECLARE @ketqua real EXEC Chia 100, 2, @ketqua OUT SELECT @ketqua S cho kt qu其 l袖: ---------------------- 50.0 Cn nu th湛c hin DECLARE @ketqua real EXEC Chia 100, 2, @ketqua SELECT @ketqua
  • 38. Tr叩旦n Nguy達n Phong S cho kt qu其 l袖: ---------------------- (null) I.3. C存c qui t他c s旦 d担ng cho sp Sau 速息y l袖 m辿t s竪 qui t他c cn l足u 箪 khi t孫o c存c th単 t担c l足u tr歎 C息u lnh CREATE PROCEDURE kh束ng th kt h樽p v鱈i c存c c息u lnh SQL kh存c trong m辿t kh竪i lnh 速測n (single batch). B其n th息n 速nh ngha CREATE PROCEDURE c達 th bao g奪m bt k炭 s竪 l足樽ng c嘆ng nh足 c息u lnh SQL n袖o ngo孫i tr探 nh歎ng c息u lnh sau: CREATE VIEW CREATE TRIGGER CREATE DEFAULT CREATE PROCEDURE CREATE RULE C存c 速竪i t足樽ng CSDL kh存c c達 th 速足樽c t孫o b捉n trong m辿t th単 t担c l足u tr歎. Ta c達 th tham chiu m辿t 速竪i t足樽ng 速足樽c t孫o trong c誰ng th単 t担c min l袖 n達 速 速足樽c t孫o tr足鱈c khi tham chiu. B捉n trong m辿t th単 t担c, ta kh束ng th t孫o m辿t 速竪i t足樽ng, xo存 n達 v袖 sau 速達 t孫o m辿t 速竪i t足樽ng m鱈i v鱈i c誰ng t捉n. Ta c達 th tham chiu c存c b其ng t孫m th棚i b捉n trong m辿t th単 t担c. Nu ta th湛c thi m辿t th単 t担c m袖 g辰i 速n th単 t担c kh存c, th単 t担c 速足樽c g辰i c達 th truy cp 速n m辰i 速竪i t足樽ng ngo孫i tr探 c存c b其ng t孫m th棚i 速足樽c t孫o b谷i th単 t担c 速u ti捉n. Nu ta t孫o m辿t b其ng t孫m th棚i ri捉ng (private temporary table) b捉n trong m辿t th単 t担c, b其ng t孫m th棚i ch t奪n t孫i cho nh歎ng m担c 速ch c単a th単 t担c 速達; n達 s mt 速i khi tho存t ra kh叩i th単 t担c. S竪 tham s竪 t竪i 速a c単a m辿t th単 t担c l袖 255. S竪 bin c担c b辿 v袖 to袖n c担c trong m辿t th単 t担c ch b gi鱈i h孫n b谷i kh其 n即ng b辿 nh鱈. C存c th単 t担c t孫m th棚i c担c b辿 (private) v袖 to袖n c担c (public), t足測ng t湛 nh足 c存c b其ng t孫m th棚i, c達 th 速足樽c t孫o v鱈i du # v袖 ## 速淡ng tr足鱈c t捉n th単 t担c. # biu din th単 t担c t孫m th棚i c担c b辿 cn ## biu din th単 t担c t孫m th棚i to袖n c担c. I.4 X存c 速nh t捉n b捉n trong c存c th単 t担c B捉n trong m辿t th単 t担c, t捉n c存c 速竪i t足樽ng 速足樽c s旦 d担ng v鱈i c息u lnh ALTER TABLE, CREATE TABLE, DROP TABLE, TRUNCATE TABLE, CREATE INDEX, DROP INDEX, UPDATE STATISTICS v袖 DBCC ph其i 速足樽c x存c 速nh v鱈i t捉n c単a ng足棚i s谷 h歎u 速竪i t足樽ng (object owners name) nu nh足 nh歎ng ng足棚i d誰ng (user) kh存c s旦 d担ng th単 t担c. V d担, ng足棚i d誰ng Mary, l袖 s谷 h歎u ch単 c単a b其ng marytab, ph其i ch 速nh t捉n c単a b其ng c単a mnh khi n達 速足樽c s旦 d担ng v鱈i m辿t trong nh歎ng c息u lnh n袖y nu c束 ta mu竪n nh歎ng user kh存c c達 th th湛c hin th単 t担c m袖 trong 速達 b其ng 速足樽c s旦 d担ng. Qui t他c n袖y l袖 cn thit v t捉n 速竪i t足樽ng 速足樽c ph息n tch khi c存c th単 t担c 速足樽c ch孫y. Nu marytab kh束ng 速足樽c ch 速nh v袖 user John tm c存ch th湛c hin th単 t担c, SQL
  • 39. Gia誰o tr巽nh th脱短c ha狸nh SQL s tm b其ng marytab do John s谷 h歎u. V d担 d足鱈i 速息y l袖 m辿t c存ch d誰ng 速坦ng, n達 ch ra cho SQL Server tm b其ng marytab do Mary s谷 h歎u: CREATE PROC p1 AS CREATE INDEX marytab_ind ON mary.marytab(col1) I.5 則脱i t捉n c存c th単 t担c: S旦 d担ng th単 t担c: sp_rename old_name, new_name Ta ch c達 th 速脱i t捉n nh歎ng th単 t担c m袖 ta s谷 h歎u. Ng足棚i s谷 h歎u CSDL c達 th thay 速脱i t捉n c単a bt k炭 th単 t担c n袖o c単a ng足棚i s旦 d担ng. Th単 t担c 速足樽c 速脱i t捉n ph其i n損m trong CSDL hin th棚i. Ta ph其i xo存 v袖 t孫o l孫i m辿t th単 t担c nu ta thay 速脱i t捉n c単a m辿t 速竪i t足樽ng 速足樽c tham chiu b谷i th単 t担c 速達. 則 c達 速足樽c b存o c存o v nh歎ng 速竪i t足樽ng 速足樽c tham chiu b谷i m辿t th単 t担c, ta s旦 d担ng th単 t担c h th竪ng: sp_depends. 則 xem n辿i dung c単a 速nh ngha m辿t th単 t担c, ta s旦 d担ng th単 t担c h th竪ng: sp_helptext. I.6. Xo存 th単 t担c: 則 xo存 m辿t th単 t担c, ta s旦 d担ng c息u lnh: DROP PROCEDURE proc_name II. S旦 d担ng c存c Trigger M辿t trigger l袖 m辿t d孫ng 速c bit c単a th単 t担c l足u tr歎 v袖 n達 速足樽c th湛c hin t湛 速辿ng khi ng足棚i d誰ng 存p d担ng c息u lnh s旦a 速脱i d歎 liu l捉n m辿t b其ng 速足樽c ch 速nh. C存c trigger th足棚ng 速足樽c s旦 d担ng cho vic p bu辿c c存c qui t他c l袖m vic v袖 to袖n vn d歎 liu. Tnh to袖n vn tham chiu c達 th 速足樽c 速nh ngha b損ng c存ch s旦 d担ng r袖ng bu辿c FOREIGN KEY v鱈i c息u lnh CREATE TABLE. Nu c存c r袖ng bu辿c t奪n t孫i trong b其ng c達 s湛 t存c 速辿ng c単a trigger, n達 速足樽c kim tra tr足鱈c vic th湛c hin trigger. Nu c存c r袖ng bu辿c b vi ph孫m, trigger s kh束ng th湛c thi. C存c trigger 速足樽c s旦 d担ng trong nh歎ng c存ch sau: C存c trigger c達 th thay 速脱i 速奪ng lo孫t (cascade change) c存c b其ng c達 li捉n h trong m辿t CSDL. C存c trigger c達 th kh束ng cho php hoc roll back nh歎ng thay 速脱i vi ph孫m tnh to袖n vn tham chiu, h単y b叩 giao t存c s旦a 速脱i d歎 liu. C存c trigger c達 th 存p 速t c存c gi鱈i h孫n ph淡c t孫p h測n nh歎ng gi鱈i h孫n 速足樽c 速nh ngha b損ng r袖ng bu辿c CHECK. Kh存c v鱈i r袖ng bu辿c CHECK, c存c trigger c達 th tham chiu 速n c存c c辿t trong c存c b其ng kh存c. C存c trigger cn c達 th tm s湛 kh存c bit gi歎a c存c tr孫ng th存i c単a m辿t b其ng tr足鱈c v袖 sau khi s歎a 速脱i d歎 liu v袖 ly ra nh歎ng t存c 速辿ng d湛a tr捉n s湛 kh存c bit 速達.
  • 40. Tr叩旦n Nguy達n Phong II.1 T孫o c存c trigger M辿t trigger l袖 m辿t 速竪i t足樽ng CSDL. Ta t孫o m辿t trigger b損ng vic ch 速nh b其ng hin h袖nh v袖 c息u lnh s旦a 速脱i d歎 liu kch ho孫t trigger. Sau 速達 ta x存c 速nh c存c c束ng vic m袖 trigger l袖m. M辿t b其ng c達 th c達 t竪i 速a 3 lo孫i trigger: m辿t trigger cp nht (update trigger), m辿t trigger chn (insert trigger) v袖 m辿t trigger x達a (delete trigger). Tuy nhi捉n, m巽i trigger c達 th th湛c hin nhiu h袖m v袖 g辰i 速n 16 th単 t担c. M巽i trigger ch c達 th 存p d担ng cho m辿t b其ng. Tuy nhi捉n, m辿t trigger 速測n c達 th 存p d担ng cho c其 3 c束ng vic (UPDATE, INSERT v袖 DELETE). Ta kh束ng th t孫o m辿t trigger tr捉n m辿t khung nhn hay m辿t b其ng t孫m th棚i mc d誰 c存c trigger c達 th tham chiu c存c khung nhn hay c存c b其ng t孫m th棚i. C息u lnh TRUNCATE TABLE mc d誰 gi竪ng c息u lnh DELETE khi kh束ng c達 mnh 速 WHERE nh足ng n達 kh束ng th kch ho孫t m辿t trigger. 則 t孫o m鱈i m辿t trigger, ta s旦 d担ng c息u lnh c達 c坦 ph存p nh足 sau: CREATE TRIGGER trigger_name ON table_name FOR {INSERT, UPDATE, DELETE} AS sql_statements Hoc s旦 d担ng mnh 速 IF UPDATE: CREATE TRIGGER trigger_name ON table_name FOR {INSERT, UPDATE} AS IF UPDATE (column_name) [{AND錚OR}UPDATE (column_name)...] sql_statements V d担 4.7: Nu ch坦ng ta mu竪n sau khi ta cp nht d歎 liu cho b其ng nhanvien, SQL Server s hin th n辿i dung c単a b其ng 速 xem th ta t孫o m辿t trigger nh足 sau: CREATE TRIGGER tgr_check ON nhanvien FOR INSERT, UPDATE AS print '*** Ket qua sau khi cap nhat ***' SELECT * FROM nhanvien II.2 C存c gi存 tr null ngm 速nh v袖 hin (implicit and explicit null values) Mnh 速 IF UPDATE(t捉n_c辿t) l袖 速坦ng cho m辿t c息u lnh INSERT khi m袖 c辿t 速足樽c g存n m辿t gi存 tr trong danh s存ch ch辰n hay trong mnh 速 VALUES. M辿t NULL hin (explicit) hay m辿t mc 速nh g存n m辿t gi存 tr cho m辿t c辿t v袖 v th kch ho孫t trigger. V鱈i m辿t NULL ngm 速nh, nu gi存 tr kh束ng 速足樽c x存c 速nh b谷i c息u h叩i hoc b谷i mc 速nh 速足樽c g存n, trigger tr捉n c辿t 速達 kh束ng 速足樽c kch ho孫t. V d担 4.8: CREATE TABLE vidu(col1 int NULL,col2 int NOT NULL) GO CREATE TRIGGER tgr_vidu ON vidu
  • 41. Gia誰o tr巽nh th脱短c ha狸nh SQL FOR INSERT AS IF UPDATE(col1) AND UPDATE(col2) Print Firing GO CREATE DEFAULT col2_default AS 99 GO /* IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */ INSERT vidu(col1,col2) VALUES(1, 2) /* IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */ INSERT vidu VALUES(1, 2) /* NULL hin: IF UPDATE l袖 速坦ng cho c其 hai c辿t, trigger 速足樽c kch ho孫t */ INSERT vidu VALUES(null, 2) /* Kh束ng c達 mc 速nh tr捉n c辿t col1, IF UPDATE kh束ng 速坦ng cho c其 hai c辿t, trigger kh束ng 速足樽c kch ho孫t */ INSERT vidu(col2) VALUES(2) /* Kh束ng c達 mc 速nh tr捉n c辿t col2, IF UPDATE kh束ng 速坦ng cho c其 hai c辿t, trigger kh束ng 速足樽c kch ho孫t */ INSERT vidu(col1) VALUES(2) Kt qu其 t足測ng t湛 速足樽c s其n sinh v鱈i vic s旦 d担ng ch mnh 速 IF UPDATE(col1) 則 t孫o m辿t trigger kh束ng cho php vic chn c存c gi存 tr null ngm 速nh, ta s旦 d担ng: IF UPDATE(col2) OR UPDATE(col2) C息u lnh SQL trong trigger c達 th sau 速達 kim tra xem col1 l袖 NULL hay kh束ng. II.3 Vic 速脱i t捉n v袖 c存c trigger Nu m辿t b其ng 速足樽c tham chiu b谷i m辿t trigger b 速脱i t捉n, ta ph其i xo存 trigger 速達 速i v袖 t孫o l孫i n達 速 ph誰 h樽p vic tham chiu c単a n達 速n b其ng. Th単 t担c sp_depends c達 ch淡c n即ng lit k捉 tt c其 c存c trigger tham chiu 速n 速竪i t足樽ng (ch村ng h孫n b其ng hay khung nhn) hoc tt c其 c存c b其ng hay khung nhn m袖 trigger t存c 速辿ng. V d担 sau 速息y lit k捉 c存c 速竪i t足樽ng 速足樽c tham chiu b谷i trigger tgr_check: sp_depends tgr_check II.4 Hin th th束ng tin v c存c trigger Do c存c trigger l袖 c存c 速竪i t足樽ng CSDL n捉n ch坦ng 速足樽c lit k捉 trong b其ng h th竪ng sysobjects. C辿t type trong sysobjects x存c 速nh c存c trigger v鱈i ch歎 vit t他t TR. S測 速奪 th湛c thi c存c trigger 速足樽c l足u tr歎 trong b其ng sysprocedures. Truy vn d足鱈i 速息y tm c存c trigger trong m辿t CSDL: SELECT * FROM sysobjects WHERE type=TR 則 hin th th束ng tin v m辿t trigger ta th湛c hin th単 t担c:
  • 42. Tr叩旦n Nguy達n Phong sp_help trigger_name C息u lnh CREATE TRIGGER cho m巽i trigger 速足樽c l足u tr歎 trong b其ng h th竪ng syscomments. Ta c達 th hin th l棚i 速nh ngha trigger b損ng c存ch s旦 d担ng th単 t担c sp_helptext. V d担 4.9: th湛c hin sp_helptext tgr_check ta 速足樽c kt qu其 nh足 sau: text -------------- create trigger tgr_check on nhanvien for insert,update as print ' Ket qua sau khi cap nhat ' select * from nhanvien II.5 Xo存 trigger Ta c達 th xo存 m辿t trigger b損ng c存ch xo存 n達 hoc xo存 b其ng trigger. Khi m辿t b其ng 速足樽c x達a, nh歎ng trigger n袖o c達 li捉n quan v鱈i n達 c嘆ng 速奪ng th棚i b x達a. DROP TRIGGER mc 速nh cho php 速竪i v鱈i ng足棚i s旦 d担ng b其ng trigger v袖 kh束ng th chuyn cho ng足棚i kh存c. Ta c達 th x達a m辿t trigger b損ng c存ch s旦 d担ng c息u lnh DROP TRIGGER
  • 43. Gia誰o tr巽nh th脱短c ha狸nh SQL CChh脱脱奪奪nngg 55:: PPHHUU LLUUCC
  • 46. Tr叩旦n Nguy達n Phong MMUUCC LLUUCC 1.1 X存c 速nh b其ng b損ng mnh 速 FROM ...................................................................................................12 1.2 Mnh 速 WHERE.................................................................................................................................13 1.3 Danh s存ch ch辰n trong c息u lnh SELECT............................................................................................14 1.4 Tnh to存n c存c gi存 tr trong c息u lnh SELECT .....................................................................................16 1.5 T探 kho存 DISTINCT .............................................................................................................................16 1.6 T孫o b其ng m鱈i b損ng c息u lnh SELECT ... INTO ..................................................................................17 1.7 S他p xp kt qu其 truy vn b損ng ORDER BY..........................................................................................17 1.8 Php h樽p v袖 to存n t旦 UNION...............................................................................................................18 1.9 Php n竪i...............................................................................................................................................20 1.10 T孫o c存c dng th竪ng k捉 d歎 liu v鱈i COMPUTE ... BY........................................................................24 1.11 Th竪ng k捉 d歎 liu v鱈i GROUP BY v袖 HAVING...................................................................................26 1.12 Truy v叩炭n con (subquery)..................................................................................................................27 I.1. T孫o c存c th単 t担c l足u tr歎........................................................................................................................35 I.2. Th束ng tin tr其 v t探 c存c th単 t担c l足u tr歎.................................................................................................36 I.3. C存c qui t他c s旦 d担ng cho sp .................................................................................................................38 I.4 X存c 速nh t捉n b捉n trong c存c th単 t担c.......................................................................................................38 I.5 則脱i t捉n c存c th単 t担c:..............................................................................................................................39 I.6. Xo存 th単 t担c: .........................................................................................................................................39 II. S DNG C存C TRIGGER II.1 T孫o c存c trigger....................................................................................................................................40 II.2 C存c gi存 tr null ngm 速nh v袖 hin (implicit and explicit null values)................................................40 II.3 Vic 速脱i t捉n v袖 c存c trigger..................................................................................................................41 II.4 Hin th th束ng tin v c存c trigger .........................................................................................................41 II.5 Xo存 trigger .........................................................................................................................................42 2.2 Ca誰c ha狸m v達旦 chu辰湛i..........................................................................................................................44