ậ
ớ
L p trình v i TSQL
DBMS07 – Slides 1
ậ
ớ
L p trình v i T_SQL
ữ
ệ
ể
n Khai báo bi n:ế DECLARE @Tên_Bi n ế Ki u_D _Li u n Ví d :ụ DECLARE @Tuoi int
DECLARE @MSSV varchar(5)
DECLARE @numCount int
ữ ệ
ể
ở @ n Tên bi n: B t đ u b i ấ ế n Ki u d li u c a bi n: L y ki u d li u
ể ệ ố
ắ ầ ủ ừ ể
ế ữ ệ h th ng,
tr ki u text, ntext, image
DBMS07 – Slides 2
ế
ị Gán giá tr cho bi n
ế
n Cách 1: SET @Tên_Bi n =
Giá_Trị
n Ví d :ụ DECLARE @HoTen nvarchar(20)
ễ
ằ
SET @HoTen = N‘Nguy n H ng Nga
’
DBMS07 – Slides 3
ế
ị Gán giá tr cho bi n
ế
n Cách 2: SELECT @Tên_Bi n =
Giá_Trị
n Ví d :ụ DECLARE @HoTen nvarchar(20)
ễ
ằ
SELECT @HoTen = N‘Nguy n H ng Nga
’
DBMS07 – Slides 4
ế
ị Gán giá tr cho bi n
ế
Tên_c tộ
n Cách 3: SELECT @Tên_Bi n = FROM Tên_B ngả
ươ
ớ
ng l n nh t c a t
ấ ủ ấ ả t c
ụ n Ví d : Tìm l nhân viên:
DECLARE @MaxSalary decimal(18,2)
SELECT @MaxSalary = MAX(Luong)
FROM NhanVien
DBMS07 – Slides 5
SQL Server Object – Local Variables
n Các bi n đ tham s . ố
ế ượ ử ụ ư ấ ấ c s d ng trong c u truy v n nh là các
n Cho l
ượ ữ ệ ươ ồ ư ứ c đ CSDL và d li u t ng ng nh sau:
TenHS NgaySinh DiaCh
HocKy NamHo
Diem
MaH S
i
MaH S
c
01
B oả
10/10/1977
123
01
2001
10
01
02
H iả
11/11/1981
456
03
2002
8
01
HocSinh DiemThi
DBMS07 – Slides 6
SQL Server Object – Local Variables
ệ
ọ t kê danh sách h c sinh có ngày
ụ Ví d : Li sinh vào ngày ‘10/10/1977’
DECLARE @NgaySinh datetime SET @NgaySinh = ’10/10/1977’ SELECT * FROM HocSinh WHERE NgaySinh = @NgaySinh
DBMS07 – Slides 7
SQL Server Object – Local Variables
ệ
ọ
ị
ỉ t kê danh sách các h c sinh có đ a ch
ể
ơ
ớ
ụ Ví d : Li là ‘123’ và đi m thi l n h n 7
DECLARE @DiaChi nvarchar(50), @Diem Decimal SELECT@DiaChi=’123’, @Diem = 7 SELECT * FROM HocSinh JOIN DiemThi ON
HocSinh.MaHS = DiemThi.MaHS
WHERE DiaChi = @DiaChi AND DiemThi > @Diem
DBMS07 – Slides 8
ề
ể
ấ
C u trúc đi u khi n
ấ
ệ ề
ệ thì
ể ố ệ
ề n C u trúc đi u ki n: ứ N uế (bi u th c đi u ki n) ệ L nh/Kh i l nh
ề
ệ ) ứ ể IF (bi u th c đi u ki n BEGIN
ệ
S
ặ
ệ ố l nh L nh/Kh i ho c SQL Statement
END ệ
P
ặ
ố ệ L nh/Kh i l nh ho c SQL Statement
DBMS07 – Slides 9
ệ
ề
ấ
C u trúc đi u ki n
n Tìm Max 2 số
DECLARE @a, @b, @Max int SET @Max = @a IF (@a < @b) BEGIN
SET @Max = @b
END Print @Max
DBMS07 – Slides 10
ề
ệ
ấ
C u trúc đi u ki n
ề ệ thì
ể ố ệ ệ ứ n N uế (bi u th c đi u ki n) S1 L nh/Kh i l nh
ượ ạ i c l n Ng ố ệ ệ L nh/Kh i li nh S2
ề
ệ ) ứ ể IF (bi u th c đi u ki n BEGIN ệ ố ệ L nh/Kh i l nh S1
END ELSE BEGIN ệ ố ệ L nh/Kh i l nh S
DBMS07 – Slides 11
ố ệ END ệ L nh/Kh i l nh P
ề
ệ
ấ
C u trúc đi u ki n
n Tìm Max 2 số
DECLARE @a, @b, @Max int IF (@a < @b) BEGIN
SELECT @Max = @b
END ELSE BEGIN
SELECT @Max = @a
END Print @Max
DBMS07 – Slides 12
ấ
C u trúc CASE
ể
ấ
n Cho phép ki m tra đi u ki n và xu t
ề ườ
ợ
ừ
ệ ng h p
thông tin theo t ng tr
n Cú pháp 1
ứ
ể
ộ
CASE /
ứ
ể
WHEN
ị THEN
ứ
ể
WHEN
ị THEN
…
ứ
ể
[ELSE
END
DBMS07 – Slides 13
ấ
C u trúc CASE
n Cú pháp 2
ứ
ể
CASE WHEN
ị THEN
ứ
ể
WHEN
ị THEN
…
ứ
ể
[ELSE
END
DBMS07 – Slides 14
ụ Ví d Case
ế
ả
Ví d 1:ụ SELECT TENCLB1, ‘K t qu ’ = CASE
END, TENCLB2 FROM vKETQUA
WHEN (SOBANTHANG – SOBANTHUA > 0) THEN ‘Th ng’ắ WHEN (SOBANTHANG – SOBANTHUA = 0) THEN ‘Hòa’ WHEN (SOBANTHANG – SOBANTHUA < 0) THEN ‘Thua’
DBMS07 – Slides 15
ụ
Ví d Case (tt)
CHITIETBAN(sohd, masach, slban, dgban) Ví d 2:ụ SELECT masach,sum(slban)as tongslban, (CASE WHEN sum(slban)>10 THEN
N‘Bán ch y'ạ
ELSE
N‘Bán ch m'ậ
END) as thongtin FROM CHITIETBAN GROUP BY masach
DBMS07 – Slides 16
ụ
Ví d Case (tt)
ố
ữ
ộ
ạ
ủ
ữ
ố
ọ ể ạ
ộ
ọ
SACH (masach, tuasach, sotrang, matheloai, slton) Ví d 3ụ : Tăng s trang c a nh ng sách thu c th ể ủ lo i Tin h c thêm 10, câp s trang c a nh ng sách thu c th lo i Toán h c UPDATE sach SET sotrang=sotrang+ CASE WHEN matheloai=1 THEN
10
WHEN matheloai=4 THEN
10 ELSE 0
END
DBMS07 – Slides 17
ặ
ấ
C u trúc l p
ế
ươ
ổ
n Vi
t ch
ng trình tính t ng s = 1 + 2 + .. + n
DBMS07 – Slides 18
ặ
ấ
C u trúc l p
ặ
ệ ầ ặ
ỏ n BREAK: Thoát kh i vòng l p WHILE ớ ự n CONTINUE: Th c hi n l n l p m i
DBMS07 – Slides 19
ậ
ớ
ỏ
L p trình v i con tr
ượ
ơ ở ữ ệ ng c s d li u đ ớ
ỏ n M t con tr là m t đ i t ở ứ
ữ ệ
ỏ ượ
ụ ậ ớ Procedure và Trigger
ỏ
ủ ậ ế ị ị
ỉ ặ ậ ơ ợ
ế
ộ ố ượ ộ c ể ử ụ s d ng b i ng d ng đ thao tác v i các hàng ợ ữ ệ d li u thay vì các t p h p d li u. n Con tr đ c dùng v i ể ớ n V i con tr chúng ta có th : ị ả n Cho phép đ nh v các hàng ch đ nh c a t p k t qu . ề ộ ừ ị n Nh n v m t hàng đ n ho c t p h p các hàng t v trí ả i c a t p k t qu . ủ ổ ữ ệ n H tr s a đ i d li u c a hàng
ệ ạ ở ị v trí hi n t i trong
n H tr nhi u c p đ quan sát đ i v i các thay đ i đ
ố ớ
ổ ượ ủ ậ ữ ộ c ườ i dùng khác trên các d liêu c a t p
ậ ệ ạ ủ ậ hi n t ỗ ợ ử ả ế ậ t p k t qu . ấ ề ỗ ợ ở ạ t o ra b i các ng ả ế k t qu .
DBMS07 – Slides 20
ử
ỏ
Quy trình x lý con tr
DBMS07 – Slides 21
ạ
ỏ
T o con tr
ỏ ộ
ệ ể ả ồ ừ ể ạ n L nh ệ DECLARE dùng đ t o m t con tr . n Nó ch a các l nh SELECT đ bao g m các b n ghi t
n Cú pháp là:
ả ứ b ng.
DECLARE
DBMS07 – Slides 22
ướ
ử ụ
ỏ
Các b
c s d ng con tr
ở
ỏ n M con tr :
OPEN
ề
ả
ậ
n Nh n v các b n ghi:
FETCH
n Đóng con tr :ỏ
CLOSE
ế ớ
n Xoá các tham chi u t
ỏ i con tr :
DEALLOCATE
DBMS07 – Slides 23
ệ
ấ
ỏ
Truy xu t và duy t con tr
ầ ế
ấ n FETCH FIRST: Truy xu t hàng đ u tiên. ấ n FETCH NEXT: Truy xu t hàng ti p theo hàng truy
ấ ướ
xu t tr
c đó.
ấ
ướ
n FETCH PRIOR: Truy xu t hàng tr
c hàng truy
ấ ướ
xu t tr
c đó.
ố ộ ố
ươ
ấ n hàng trong con tr . N u ướ
ộ ố
n hàng tr ấ c truy xu t. N u
ấ n FETCH LAST: Truy xu t hàng cu i cùng. n FETCH ABSOLUTE n: N u ế n là m t s nguyên ế ỏ ố c hàng cu i ế n b ng 0, ằ ụ
ấ
ủ
ộ
ẽ ng, nó s truy xu t d n là m t s nguyên âm, ỏ ượ cùng trong con tr đ ượ c truy xu t. Ví d , FETCH không hàng nào đ ứ ị ả ẽ ể Absolute 2 s hi n th b n ghi th hai c a m t b ng.ả DBMS07 – Slides 24
ệ
ấ
ỏ
Truy xu t và duy t con tr
ấ
ươ
ừ ế n là s ố c ướ n hàng tr ấ ượ c truy xu t. ậ ạ ượ c nh n i đ
§ FETCH RELATIVE n: Truy xu t ấ n hàng t ướ hàng truy xu t tr c đó, n u ế n là s âm, ố d ng. N u ướ ấ c đó đ hàng truy xu t tr ệ ằ N u ế n b ng 0, hàng hi n t v .ề
DBMS07 – Slides 25
ủ ệ
ụ
ế
Các bi n toàn c c c a l nh FETCH
ộ ố
ễ
ấ
ế ế ủ ế
ả ề n @@FETCH _STATUS: Bi n này tr v ả ủ ễ m t s nguyên bi u di n k t qu c a ỏ ố ệ l nh truy xu t cu i cùng c a con tr . ả ề n @@CURSOR_ROWS: Bi n này tr v ệ ạ
ỏ
ố
i trong con tr đang
ổ t ng s hàng hi n t m .ở
DBMS07 – Slides 26
ụ ạ
ỏ
Ví d t o con tr
DBMS07 – Slides 27
Con tr (tt)ỏ
ộ
ậ
ề
ỏ
ợ ụ
ừ
ệ
ặ
ầ
§ M t con tr là m t đ i t ơ ở ữ ố ượ ộ ỏ ng c s d ể ụ ượ ệ ở ứ ử ụ li u đ c s d ng b i ng d ng đ thao ữ ệ ớ tác v i các hàng d li u thay vì các t p ử ụ ữ ệ h p d li u. S d ng con tr , nhi u tác ự ể ượ c th c hi n theo t ng hàng v có th đ ể ầ ả ế ậ trên t p k t qu mà có th c n ho c ko ố ả ặ ủ ự c n s có m t c a b ng g c
DBMS07 – Slides 28
Con tr (tt)ỏ
ỏ ượ ạ ầ ằ c t o b ng l nh
ạ ộ
n Con tr đ ỏ ượ tr đ ớ ượ m i đ
ở ệ DECLARE. Đ u tiên con ớ c khai báo và t o ra trong b nh . Sau đó nó c m .
n L nh ệ OPEN m con tr . Vi c nh n v các b n ghi t
ề ả ậ ỏ
ừ ỉ i dùng ch có
ạ
ệ ộ ườ c g i là fetching. M t ng ể ờ i m t th i đi m. ả ộ ể ọ ượ ừ ở ỏ ượ ọ m t con tr đ ề ộ ả ậ th nh n v m t b n ghi t ử ụ FETCH đ c s d ng đ đ c các b n ghi t con
n Ng m đ nh, m t con tr là
ộ ể ỏ
ế ả ộ ể n L nh ệ tr . ỏ ầ ấ ả các b n ghi t
ị ầ ự ố ầ ấ ự ế
ộ ả ặ ố forward only. Nó có th truy ừ ả b n ghi đ u tiên đ n b n xu t tu n t ứ ể ghi cu i cùng. Nó không th truy xu t tr c ti p hàng th 1 ho c hàng cu i cùng trong m t b ng.
DBMS07 – Slides 29
Con tr (tt)ỏ
ế
ầ
t,
ộ nó có th đ
ỗ
ờ ỏ ạ n Khi m t con tr t m th i không c n thi ở ệ CLOSE. ể ượ c đóng b i l nh ỏ ử ụ ượ n M i khi con tr không đ ế
ượ
c s d ng, các ạ ỏ ằ c lo i b b ng
ế tham chi u đ n nó nên đ l nh ệ DEALLOCATE