Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 54

Cơ sở dữ liệu

Chương 6: Introduce to T-SQL


ThS. Bùi Xuân Huy
Khoa Công Nghệ ThôngTin Kinh Doanh
huybx@ueh.edu.vn

(2022)
Mục tiêu

 Hiểu những khái niệm cơ bản về lập trình với T-SQL

 Vận dụng kỹ năng lập trình với Trigger, Cursor và Procedure
(Microsoft SQL Server)

2
Bùi Xuân Huy (2022) Chương 6: T-SQL
Tài liệu tham khảo

 Tài liệu tiếng Anh

Garcia-Molina H., Ullman J. D., & Widom J., Database System: The
complete book, 2nd Edition, Prentice Hall, 2008.

Microsoft, Stored Procedures (Database Engine),


https://technet.microsoft.com/en-us/library/ms190782(v=sql.120).aspx

 Tài liệu tiếng Việt

Nguyễn An Tế, Nguyễn Thúy Ngọc & Nguyễn Kiều Oanh, CSDL: Nhập
môn và thực hành, NXB Khoa Học Kỹ Thuật, 2015.

3
Bùi Xuân Huy (2022) Chương 6: T-SQL
CSDL minh họa

THANH_PHO(matp, tentp)
NHAN_VIEN(manv, honv, tennv, ngaysinh, phai, mucluong, macn, manvquanly)
THAN_NHAN(manv, tenthannhan, ngaysinh, phai, moiquanhe)

CHI_NHANH(macn, tencn, manvptr, ngaynhamchuc)

VPHONG_CN(macn, matp)
CONG_TRINH(mact, tenct, ngaybd, ngaykt, matp, macn)
PHAN_CONG(mact, manv, sogiotuan)

4
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

5
Bùi Xuân Huy (2022) Chương 6: T-SQL
1. Biến

 Đặt tên

● quy tắc

● gợi nhớ (mnemonic)

 Kiểu dữ liệu: // sử dụng các kiểu dữ liệu của MS-SQL

 Khai báo biến


DECLARE @<biến> [AS] <kiểu DL> [ = <biểu thức> ] [, . . . ]

● Không sử dụng được biến khi chưa khai báo

● có thể khai báo nhiều biến cùng một lúc

● có thể gán giá trị ban đầu cho biến khi khai báo
6
Bùi Xuân Huy (2022) Chương 6: T-SQL
1. Biến

DECLARE @<biến> [AS] <kiểu DL> [ = <biểu thức> ] [, . . . ]

DECLARE @ngaybd DATE, @ngaykt DATE;

DECLARE @macv CHAR(3);

DECLARE @mucluong INT = 350 000;

DECLARE @bhxh INT = @mucluong * 0.5;

7
Bùi Xuân Huy (2022) Chương 6: T-SQL
1. Biến (tt.)

 Hiển thị giá trị của biến hay của biểu thức

PRINT <biểu thức>| (‘<message>’)

PRINT @mucluong; /* hiện giá trị của biến @mucluong ra màn hình
PRINT (‘Hello! How are you! ’); /*hiện thông điệp ra màn hình

 Gán giá trị cho biến bằng hằng số hay biểu thức

SET @<biến> = <biểu thức>

SELECT @<biến> = <biểu thức>

SET @mucluong = 350 000;

SELECT @mucluong = 350 000; 8


Bùi Xuân Huy (2022) Chương 6: T-SQL
1. Biến (tt.)

 Gán giá trị cho biến từ 1 dòng trong table bằng lệnh SELECT

SELECT @<biến> = <cột> [, . . . ]


FROM . . .
...
Thuộc tính của bảng
SELECT @mucluong = mucluong NHAN_VIEN

FROM NHAN_VIEN

WHERE…. Biến

Để sử dụng câu lệnh này, kiểu dữ liệu của biến phải giống với
kiểu dữ liệu của thuộc tính cần lấy giá trị.

9
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

10
Bùi Xuân Huy (2022) Chương 6: T-SQL
1.2 Cấu trúc điều khiển IF

 Block / Khối lệnh

BEGIN
Các lệnh trong block
...
END

11
Bùi Xuân Huy (2022) Chương 6: T-SQL
1.2 Cấu trúc điều khiển IF(tt.)

 Rẽ nhánh có điều kiện: cấu trúc IF


Có thể sử dụng các
IF <điều kiện> toán tử: NOT, AND,
<lệnh> | <block> OR kết hợp nhiều
điều kiện
[ ELSE
<lệnh> | <block> ]

12
Bùi Xuân Huy (2022) Chương 6: T-SQL
1.2 Cấu trúc điều khiển IF(tt.)

 Rẽ nhánh có nhiều điều kiện: cấu trúc IF lồng nhau

IF1 <điều kiện1>


<lệnh> | <block>
[ ELSE
IF2 <điều kiện2>
<lệnh> | <block>
[ELSE

]]

13
Bùi Xuân Huy (2022) Chương 6: T-SQL
1.2 Cấu trúc điều khiển IF (tt.)

14
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

15
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER
 Trigger: hành động (Action – A) được tự động thực hiện khi 1
biến cố (Event – E) xảy ra và khi 1 điều kiện (Condition – C)
được thỏa mãn Thêm, sửa, xóa
dòng dữ liệu/xóa
giá trị của thuộc
thêm, tính = sửa
biến cố sửa,
(trước / sau) xóa

giá trị cũ Thực hiện


True
và Điều kiện hành động
giá trị mới
False

END

16
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

• When a trigger is executing, it has access to two memory-resident


tables that allow access to the data that was modified: Inserted
and Deleted.
• These tables are available only within the body of a trigger for
read-only access.
• The structures of the inserted and deleted tables are the same as
the structure of the table on which the trigger is defined

17
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Đối với mỗi công trình, ngày bắt đầu luôn luôn nằm trước
(nhỏ hơn) ngày kết thúc.

● Ôn lại:
 Nếu không xem đây là một ràng buộc cần kiểm soát thì điều gì sẽ
xảy ra khi thêm/xóa/sửa dữ liệu.
 Đây là ràng buộc loại mấy. Cần kiểm soát thao tác nào và thuộc
tính nào (bảng TAH)?

18
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

19
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Mức lương tối thiểu của nhân viên là 650 000

20
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

21
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

22
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

23
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Bài tập:

Mỗi công trình không được phân công quá bốn người làm việc.

24
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Bài tập:

Mỗi công trình không được phân công quá bốn người làm việc.

25
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)
 Bài tập:

Nhân viên mới phải có tuổi trên 18.

Trưởng phòng phải làm việc tại chi nhánh mình đang phụ trách.

 Thuộc tính khóa chính kiểu char vẫn có thể bị xóa? Tại sao?

-> viết trigger để điều này không xảy ra (làm trên bảng
NHAN_VIEN, các bảng khác tương tự)

26
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Bài tập: Trưởng phòng phải làm việc tại chi nhánh mình đang phụ
trách.

27
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

Manv Hoten mucluong


N01 Trần Thùy An 500000
N02 Bùi Văn Vinh 1000000

Xóa N01
Không báo lỗi

Manv Hoten mucluong


Trần Thùy An 500000
N02 Bùi Văn Vinh 1000000

28
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

29
Bùi Xuân Huy (2022) Chương 6: T-SQL
3. TRIGGER (cont.)

 Xóa TRIGGER

DROP TRIGGER <trigger name>

 Vô hiệu hóa/kích hoạt lại TRIGGER

DISABLE TRIGGER <trigger name> ON <table_name>

ENABLE TRIGGER <trigger name> ON <table_name>

30
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

31
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor

Tìm hiểu về Cursor (con


trỏ) trong T-SQL

32
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Tạo một bảng mới BHXH_NAM (manv, ho_ten, bhxh) chứa


thông tin về mức bảo hiểm xã hội của nhân viên nam, trong đó
bhxh=0.3*mucluong và ho_ten được ghép từ honv và tennv.

● Thực hiện:
 Tạo một bảng BHXH_NAM với cấu trúc như trên
 Duyệt qua từng dòng trong bảng nhân viên, nếu là nam thì ghép
honv và tennv, tính bhxh và chuyển dữ liệu vào bảng BHXH_NAM

33
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Dùng lệnh SQL để tính mức thưởng dựa trên tổng số giờ làm
việc cho các công trình

● số giờ < 20: 2 triệu

● 20  số giờ < 40: 3 triệu

● 40  số giờ: 4 triệu

● Nếu là Nữ: tăng thêm 20%


Mã NV Họ và tên Phái Số giờ Tiền thưởng

N01 Nguyễn Duy Anh Nam

N02 Lê Ngọc Bích Nữ

N03 Trần Văn Bình Nam

N04 Lê Thị Cúc Nữ

N05 Phạm Minh Cường Nam

34
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Dùng lệnh SQL để tính tính chi tiết đơn hàng như sau

35
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Dùng lệnh SQL để truy vấn dữ liệu như sau:

36
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Cursor (con trỏ): cơ chế truy xuất TỪNG DÒNG của table

● Trỏ đến dòng “hiện hành” trong table

● Xử lý dòng “hiện hành”

● di chuyển con trỏ để xử lý các dòng khác

manv honv tennv ngaysinh phai mucluong macn


N01 Nguyen Van Tung 12/08/1955 M 40000 C01
N02 Bui Thuy Hang 07/19/1968 F 25000 C02
N03 Le Ngoc Nhu 06/20/1951 F 43000 C02
N04 Nguyen Van Hung 09/15/1962 M 38000 C01

37
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

B1. Khai báo biến kiểu CURSOR

B2. Mở cursor đã khai báo

B3. Đọc và xử lý từng dòng dữ liệu

B4. Đóng và giải phóng cursor

38
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 B1. Khai báo biến kiểu CURSOR

DECLARE <tên cursor> CURSOR


FOR <lệnh SQL>

 B2. Mở cursor đã khai báo

OPEN <tên cursor>

39
Nguyễn An Tế (2018) Chương 7: Lập trình với cursors
4. Lập trình với Cursor (cont.)

 B3. Đọc dữ liệu từ cursor

FETCH [<điều hướng>] FROM <tên cursor>


[INTO <danh sách biến>] R1

R2

● <điều hướng>: R3
NEXT (default),
PRIOR, FIRST, LAST, R4

ABSOLUTE | RELATIVE <n> R5

ABSOLUTE
LAST 32
RELATIVE
PRIOR
FIRST
NEXT
40
Nguyễn An Tế (2018) Chương 7: Lập trình với cursors
4. Lập trình với Cursor (cont.)

 Kiểm tra việc đọc dữ liệu của cursor:

● @@FETCH_STATUS = 0: đọc dữ liệu thành công

● @@FETCH_STATUS ≠ 0: đọc dữ liệu KHÔNG thành công

41
Nguyễn An Tế (2018) Chương 7: Lập trình với cursors
4. Lập trình với Cursor (cont.)

 B4. Đóng, giải phóng cursor

CLOSE <tên cursor>

DEALLOCATE <tên cursor>

42
Nguyễn An Tế (2018) Chương 7: Lập trình với cursors
4. Lập trình với Cursor (cont.)

 Tạo một bảng mới BHXH_NAM (manv, ho_ten, bhxh) chứa


thông tin về mức bảo hiểm xã hội của nhân viên nam, trong đó
bhxh=0.3*mucluong và ho_ten được ghép từ honv và tennv.

● Thực hiện:
 Tạo một bảng BHXH_NAM với cấu trúc như trên
 Duyệt qua từng dòng trong bảng nhân viên, nếu là nam thì ghép
honv và tennv, tính bhxh và chuyển dữ liệu vào bảng BHXH_NAM

43
Bùi Xuân Huy (2022) Chương 6: T-SQL
4. Lập trình với Cursor (cont.)

 Xem file cursor_example trên LMS

 Bài tập:

● Tự làm bài tập trên slide số 32, 33, 34

44
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

45
Bùi Xuân Huy (2022) Chương 6: T-SQL
5. Một số vấn đề mở rộng.

46
Bùi Xuân Huy (2022) Chương 6: T-SQL
5. Một số vấn đề mở rộng (cont.)

47
Bùi Xuân Huy (2022) Chương 6: T-SQL
Nội dung

1. Biến

2. Cấu trúc điều khiển IF

3. TRIGGER

4. Lập trình với Cursor

5. Một số vấn đề mở rộng

6. Store Procedure

48
Bùi Xuân Huy (2022) Chương 6: T-SQL
6. Store Procedure

 Là một đoạn chương trình viết bằng T-SQL nhằm thực thi một
hoặc nhiều tác vụ cụ thể

● Module hóa: viết một lần, dùng nhiều lần trong các ứng dụng.

● Hiệu suất: giảm thời gian và băng thông khi xử lý

● Bảo mật: Viết bởi db designer/administrator nên


end-user/software developer không can thiệp trực tiếp vào
DB/Server

49
Bùi Xuân Huy (2022) Chương 6: T-SQL
6. Store Procedure (cont.)
 Tạo, sửa đổi thủ tục

CREATE | ALTER PROCEDURE <tên thủ tục>


[<tham biến> <kiểu DL>, . . .]
AS
<lệnh> | <block>

 Thi hành thủ tục

EXEC <tên thủ tục> [<danh sách tham biến>]

 Xóa thủ tục


DROP PROCEDURE <tên thủ tục>

50
Bùi Xuân Huy (2022) Chương 6: T-SQL
6. Store Procedure (cont.)
 Ví dụ: thủ tục không có tham biến

CREATE PROCEDURE PRC_TINHBHXH_NAM


AS
BEGIN
/** toàn bộ khối lệnh tính BHXH_NAM của bài trước
END
 Thi hành thủ tục

EXEC PRC_TINHBHXH_NAM

 Xóa thủ tục


DROP PROCEDURE PRC_TINHBHXH_NAM

51
Bùi Xuân Huy (2022) Chương 6: T-SQL
6. Store Procedure (cont.)

 Ví dụ: thủ tục có tham biến

- Nếu chỉ muốn viết 1 thủ tục, nhưng mỗi lần thực thi, người dùng
cần tính BHXH cho Nam hoặc cho Nữ thì sẽ có kết quả tương
ứng?
CREATE PROCEDURE PRC_TINHBHXH @gioitinh NVARCHAR(3)
AS
BEGIN
/** ??? Tên thủ tục
END

Tham biến
EXEC PRC_TINHBHXH @gioitinh = N’Nam’

EXEC PRC_TINHBHXH @gioitinh = N’Nữ’


52
Bùi Xuân Huy (2022) Chương 6: T-SQL
5. Một số vấn đề mở rộng (cont.)

 Tìm hiểu về FUNCTION trên SQL

 Phân biệt giữa FUNCTION và PROCEDURE

53
Bùi Xuân Huy (2022) Chương 6: T-SQL
Thảo luận

54
Bùi Xuân Huy (2022) Chương 6: T-SQL

You might also like