L p trình v i T­SQL

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   CURSOR [LOCAL | GLOBAL] [FORWARD ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC |FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR  [FOR UPDATE [OF Column_name[,….N]]]

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

DBMS07 – Slides 30