Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường

Mục đích

• Nắm vững các khái niệm lô (batch) và xử lý theo lô

• Viết các câu lệnh SQL thể hiện logic của ứng dụng

• Định nghĩa và gán giá trị cho các biến

• Nắm vững và dùng được các lệnh điều khiển cấu trúc lập trình

• Nắm cách dùng biến con trỏ

• Viết được các thủ tục cơ bản đáp ứng yêu cầu qt csdl

• Viết được và Sử dụng được hàm SQL trong truy vấn

• Tạo được các trigger cơ bản

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 1

Trang 1

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 2

Trang 2

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 3

Trang 3

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 4

Trang 4

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 5

Trang 5

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 6

Trang 6

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 7

Trang 7

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 8

Trang 8

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 9

Trang 9

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 114 trang xuanhieu 3540
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường

Bài giảng Cơ sở dữ liệu - Chương 7: Ngôn ngữ T-SQL - Đỗ Thị Mai Hường
An:
sp_testDefault @noisinh=N'Nghệ An'
• Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng:
sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng' 
Lý thuyết CSDL 73
Biên dịch lại các thủ tục lưu trữ
 Các thủ tục lưu trữ được biên dịch lại để phản ánh sự thay
đổi tới các chỉ số.
 Có ba cách để biên dịch lại các thủ tục: 
 Sử dụng thủ tục hệ thống sp_recompile system
 Chỉ rõ WITH RECOMPILE với lệnh CREATE 
PROCEDURE 
 Chỉ rõ WITH RECOMPILE với lệnh EXECUTE 
Lý thuyết CSDL 74
Sửa các thủ tục lưu trữ
 Câu lệnh ALTER PROCEDURE được sử dụng để sửa
chữa một thủ tục lưu trữ
 Cú pháp giống như lệnh CREATE PROCEDURE
 Sự thay đổi này vẫn giữ lại các quyền người dùng
 Cp: 
ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]
[WITH RECOMPILE|ENCRYPTION| 
RECOMPILE,ENCRYPTION] AS
Lý thuyết CSDL 75
Các thông báo lỗi
 Trả về các mã hoặc lệnh RAISERROR có thể được dùng
để đưa ra các lỗi của người dùng
 Trả về mã trong thủ tục lưu trữ là các giá trị nguyên
 Lệnh RAISERROR statement ghi các lỗi và gán các cấp độ
nghiêm trọng của lỗi
Lý thuyết CSDL 76
Xoá thủ tục
• Sử dụng câu lệnh DROP PROCEDURE với cú pháp như sau:
DROP PROCEDURE 
Lý thuyết CSDL 77
Tóm tắt
Một thủ tục lưu trữ là một nhóm các câu lệnh SQL được biên
dịch lại.
Người phát triển CSDL hoặc người quản trị hệ thống viết thủ
tục để chạy các nhiệm vụ quản trị thông thường, hoặc để ứng
dụng các luật giao dịch phức tạp. Thủ tục lưu trữ chứa các thao
tác hoặc các câu lệnh truy vấn dữ liệu.
Các thủ tục lưu trữ tăng tốc độ thực thi của truy vấn, hỗ trợ truy
cập dữ liệu nhanh, hỗ trợ việc lập trình theo mô đun, duy trì
tính nhất quán, và tăng tính bảo mật.
Lý thuyết CSDL 78
Tóm tắt 
Có hai kiểu thủ tục lưu trữ:
 Các thủ tục lưu trữ yêu cầu các cơ chế đối với CSDL quản
trị, và cập nhật các bảng.
 Các thủ tục người dùng định nghĩa.
Câu lệnh CREATE PROCEDURE được sử dụng để tạo lập một
thủ tục lưu trữ người dùng dịnh nghĩa.
Câu lệnh EXECUTE được sử dụng để chạy thủ tục lưu trữ.
Các tham số có thể được sử dụng để truyền các giá trị vào và
ra từ thủ tục lưu trữ.
Lý thuyết CSDL 79
Tóm tắt 
Có ba cách để biên dịch lại các thủ tục lưu trữ:
 Sử dụng thủ tục hệ thống sp_recompile
 Chỉ rõ WITH RECOMPILE với lệnh CREATE 
PROCEDURE
 Chỉ rõ WITH RECOMPILE với lện EXECUTE
Câu lệnh ALTER PROCEDURE được sử dụng để sửa chữa
một thủ tục lưu trữ.
Trả về các mã hoặc lệnh RAISERROR được sử dụng để đưa ra
các lỗi của người sử dụng.
Lý thuyết CSDL 80
Hàm
• Hàm là đối tượng cơ sở dữ liệu tương tự như thủ
tục. 
• Điểm khác biệt giữa hàm và thủ tục: Hàm trả về một
giá trị thông qua tên hàm còn thủ tục thì không. 
• Có thể sử dụng hàm như là một thành phần của một
biêu thức (chẳng hạn, trong dsách chọn của lệnh
SELECT).
• Co hàm do HQT CSDL cung cấp sẵn
• Người sử dụng có thể định nghĩa các hàm nhằm
phục vụ cho mục đích riêng của mình
Lý thuyết CSDL 81
Hàm hệ thống
Lý thuyết CSDL 82
Ba loại hàm
– Các hàm thao tác với tập bản ghi có thể được dùng
thay cho tên các bảng trong SQL.
– Các hàm tập hợp tính toán cho ra kết quả là một giá trị
đơn nhất (ví dụ tính tổng hay trung bình).
– Các hàm vô hướng thao tác trên một giá trị và trả về
một giá trị. Các hàm này có thể được dùng trong các
biểu thức.
Lý thuyết CSDL 83
Các hàm chuyển đổi
Hàm chuyển đổi được dùng để chuyển 1 giá trị từ một
kiểu dữ liệu sang kiểu dữ liệu khác. Ngoài ra nó còn
được dùng để định dạng ngày tháng. SQL Server cung
cấp cho ta hàm chuyển đổi duy nhất là CONVERT().
Cú pháp:
CONVERT(datatype[(length)], expression [,style])
Ví dụ:
SELECT ‘EMP ID:’ + CONVERT (CHAR(4), EMPLOYEEID FROM 
EMPLOYEES
Lý thuyết CSDL 84
Date Parts 
DatePart Từ viết tắt Giá trị
Hour hh 0-23
Minute Mi 0-59
Second Ss 0-59
Millisecond Ms 0-999
Day of year Dy 1-366
Day Dd 1-31
Lý thuyết CSDL 85
Date Parts (tiếp)
Datepart Từ viết tắt Giá trị
Week wk 1-53
Weekday dw 1-7
Month mm 1-12
Quarter qq 1-4
Year yy 1753-9999
Lý thuyết CSDL 86
Các hàm ngày tháng và số học
Các hàm ngày tháng
GETDATE()
DATEADD(datepart,number,date)
DATEDIFF(datepart,date1,date2)
DATENAME(datepart,date)
DATEPART(datepart,date)
Các hàm số học
ABS(num_expr)
CEILING(num_expr)
FLOOR(num_expr)
POWER(num_expr,y)
ROUND(num_expr,length)
Sign(num_expr)
Sqrt(float_expr)
Lý thuyết CSDL 87
Các hàm hệ thống
Hàm
DB_ID([‘database_name’])
DB_NAME([database_id])
HOST_ID()
HOST_NAME()
ISNULL(expr,value)
OBJECT_ID(‘obj_name’)
OBJECT_NAME(object_id)
SUSER_SID([‘login_name’])
SUSER_ID([‘login_name’])
SUSER_SNAME([server_user_id])
SUSER_NAME([server_user_id])
USER_ID([‘user_name’])
USER_NAME([user_id])
Lý thuyết CSDL 88
Các hàm tập hợp
Hàm Giá trị trả về
Sum(col_name) Trả về giá trị tổng.
Avg(col_name) Trả về giá trị trung bình.
COUNT(*) Hàm đếm các bản ghi trong bảng thỏa
mãn điều kiện
Max(col_name) Trả về giá trị lớn nhất trong một tập giá trị.
Min(col_name) Trả về giá trị nhở nhất trong một tập hợp.
Lý thuyết CSDL 89
Định nghĩa và sử dụng hàm
Cú pháp: 
CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS 
(kiểu_trả_về_của_hàm)
AS BEGIN
các_câu_lệnh_của_hàm
END
Lý thuyết CSDL 90
VD: Định nghĩa hàm tính ngày trong tuần (thứ) của
một giá trị kiểu ngày
CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @st NVARCHAR(10)
SELECT @st=CASE DATEPART(DW,@ngay)
WHEN 1 THEN 'Chu nhật'
WHEN 2 THEN 'Thứ hai'
WHEN 3 THEN 'Thứ ba'
WHEN 4 THEN 'Thứ tư'
WHEN 5 THEN 'Thứ năm'
WHEN 6 THEN 'Thứ sáu'
ELSE 'Thứ bảy' END
RETURN (@st) /* Trị trả về của hàm */
END
Lý thuyết CSDL 91
Sử dụng hàm
• Sử dụng như hàm do hqt csdl cung cấp: 
• SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh
FROM sinhvien
WHERE malop=’C24102’
Lý thuyết CSDL 92
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) 
RETURNS TABLE
AS
RETURN (câu_lệnh_select)
Lý thuyết CSDL 93
Các qui tắc: 
• Kiểu trả về của hàm được chỉ định bởi mệnh đề RETURNS 
TABLE.
• Trong phần thân của hàm chỉ có duy nhất một câu lệnh
RETURN xác định giá trị trả về của hàm thông qua duy nhất
một câu lệnh SELECT (không sử dụng bất kỳ câu lệnh nào
khác trong phần thân của hàm).
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 94
VD: Định nghĩa hàm func_XemSV
CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLE
AS
RETURN(SELECT masv,hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE khoa=@khoa)
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 95
Dùng hàm đã định nghĩa:
• Để biết danh sách các sinh viên khoá 25, ta sử dụng câu lệnh như sau:
SELECT * FROM dbo.func_XemSV(25)
• Còn câu lệnh dưới đây cho ta biết được danh sách sinh viên khoá 26
SELECT * FROM dbo.func_XemSV(26)
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 96
• Khi cần phải sử dụng nhiều câu lệnh trong phần thân hàm, cú pháp
đnghĩa hàm:
• CREATE FUNCTION ([]) RETURNS 
@ TABLE 
AS
BEGIN
RETURN
END
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 97
Lưu ý 
• Cấu trúc bảng trả về bởi hàm được xác định dựa vào định nghĩa của
bảng trong mệnh đề RETURNS. 
• Biến @ trong mệnh đề RETURNS có phạm vi sử dụng
trong hàm và được sử dụng như một tên bảng.
• Câu lệnh RETURN trong thân hàm không chỉ định giá trị trả về. Giá trị trả
về của hàm chính là các dòng dữ liệu trong bảng có tên là @ 
được định nghĩa trong mệnh đề RETURNS
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 98
Ví dụ dưới đây minh hoạ cách sử dụng dạng hàm
này trong SQL
CREATE FUNCTION Func_Tongsv(@khoa SMALLINT) RETURNS 
@bangthongke TABLE
(
makhoa NVARCHAR(5),
tenkhoa NVARCHAR(50),
tongsosv INT
) AS
BEGIN
IF @khoa=0
INSERT INTO @bangthongke
SELECT khoa.makhoa,tenkhoa,COUNT(masv) 
Hàm với giá trị trả về là “dữ liệu kiểu
bảng”
Lý thuyết CSDL 99
• FROM (khoa INNER JOIN lop
ON khoa.makhoa=lop.makhoa)
INNER JOIN sinhvien
on lop.malop=sinhvien.malop
GROUP BY khoa.makhoa,tenkhoa
ELSE
INSERT INTO @bangthongke
SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN 
lop
ON khoa.makhoa=lop.makhoa)
INNER JOIN sinhvien
ON lop.malop=sinhvien.malop
WHERE khoa=@khoa
GROUP BY khoa.makhoa,tenkhoa
RETURN /*Trả kết quả về cho hàm*/
END
Hàm với giá trị trả về là “dữ liệu
kiểu bảng”
Lý thuyết CSDL 100
• SELECT * FROM dbo.func_TongSV(25)
Sẽ cho kết quả thống kê tổng số sinh viên khoá 25 của mỗi khoa:
• Còn câu lệnh:
SELECT * FROM dbo.func_TongSV(0)
Cho ta biết tổng số sinh viên hiện có (tất cả các khoá) của mỗi khoa
Hàm với giá trị trả về là “dữ liệu
kiểu bảng”
Lý thuyết CSDL 101
Các trigger
Lý thuyết CSDL 102
Sử dụng Trigger
 So sánh kiểu dữ liệu.
 Đọc dữ liệu từ các bảng nằm trong cơ sở dữ liệu khác.
 Thay đổi theo tầng hoặc xoá liên tục các bảng liên quan
trong một cơ sở dữ liệu
 Huỷ bỏ các thay đổi không đúng
 Tuân theo các giới hạn,các giới hạn đó phức tạp hơn việc
bắt lỗi bằng ràng buộc CHECK 
 Thực thi các thủ tục lưu cục bộ và các thủ tục lưu từ xa
Lý thuyết CSDL 103 103
- Trigger là một kiểu thủ tục được kích họat tự động
theo các sự kiện (events).
- Có 02 lọai triggers:
+ Data Modification Language –DML (For | After 
triggers, Instead-of triggers)
+ DDL triggers (For | After triggers)
Khái niệm về trigger
Lý thuyết CSDL 104 104
Data Definition Language (DDL) 
Trigger
Cú pháp:
CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH [ 
ENCRYPTION ] | [ EXECUTE AS CALLER | SELF | 'user_login' ] { FOR | AFTER } 
{ event_type | event_group } [ ,...n ] AS { sql_statement [ ; ] [ ...n ] } 
Execute As Caller là option mặc định.
Execute As User = 'user' 
Cú pháp: DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER } 
DISABLE TRIGGER { [ schema . ] trigger_name [ ,...n ] | ALL } ON {DATABASE | ALL 
SERVER } [ ; ]
DDL triggers là các triggers được tự động gọi sau khi máy thực hiện các lệnh
sau:
Create Table, Drop Table, Alter Procedure, Drop Schema, Create Login, 
(Xem BOL: DDL triggers, events used for firing)
Lý thuyết CSDL 105 105
DML Triggers
• Cú Pháp:
-Tạo CREATE TRIGGER ON 
|
[With encryption|EXECUTE AS { CALLER | SELF | 'user_name' } ]
{[FOR| AFTER] [insert],[update],[delete] | Instead of}
AS Transact-SQL statements 
- Xoá Drop Trigger 
- DISABLE TRIGGER { trigger_name [ ,...n ] | ALL } ON object_name
ON: Chỉ ra rằng Trigger đang được viết cho bảng hoặc view nào. 
With encryption: nội dung của trigger sẽ được mã hóa.
Lý thuyết CSDL 106 106
Các dạng họat động của DML trigger
• AFTER (FOR): các câu lệnh bên trong trigger sẽ được thực
hiện sau khi các sự kiện tạo nên trigger đã xảy ra rồi. 
• INSTEAD OF: sẽ bỏ qua sự kiện đã kích hoạt trigger mà thay
vào đó sẽ thực hiện các dòng lệnh SQL bên trong Trigger 
Ví dụ: ta có một Update trigger trên một table với câu
INSTEAD OF: Khi đó nếu ta thực hiện việc update dữ liệu
trong bảng thì thay vì update dữ liệu, SQL Server sẽ thực
hiện các lệnh đã được viết sẵn bên trong trigger.
Lý thuyết CSDL 107
- Trigger Insert: Trigger được phát biểu bởi For insert. Trigger 
được thực hiện khi tiến hành thêm một mẫu tin vào bảng. Mẫu
tin cần thêm sẽ được lưu trong một bảng tạm có tên là Inserted.
- Trigger Delete: Trigger được phát biểu bởi For delete. Trigger 
được thực hiện khi tiến hành xóa một mẫu tin trong bảng. Mẫu
tin bị xóa sẽ được lưu trong một bảng tạm có tên là deleted.
- Trigger Update: Trigger được phát biểu bởi for update. Trigger 
được thực hiện khi tiến hành sửa một mẫu tin trong bảng. Mẫu
tin bị thay đổi sẽ được lưu trong 2 bảng tạm có tên là Inserted 
(chứa giá trị mới) và Deleted (chứa giá trị cũ).
Các kiểu Trigger
Lý thuyết CSDL 108 108
Chú ý
- Trigger không thể được tạo ra trên bảng tạm thời hay bảng hệ
thống. Trigger chỉ có thể được kích hoạt một cách tự động bởi 
một trong các event Insert, Update, Delete mà không thể chạy 
manually được. Có thể áp dụng trigger cho View.
- Inserted và Deleted là 2 table tạm chỉ chứa trên bộ nhớ và chỉ có
giá trị bên trong trigger mà thôi (nghĩa là chỉ nhìn thấy được
trong trigger mà thôi). Ta có thể dùng thông tin trong 2 table này
để so sánh data cũ và mới hoặc kiểm tra xem data mới. 
Lý thuyết CSDL 109 109
Trigger dạng INSTEAD OF – Thay thế
Dạng INSTEAD OF sẽ bỏ qua sự kiện đã kích hoạt trigger mà thay vào đó sẽ thực hiện các
dòng lệnh SQL bên trong Trigger
INSTEAD OF được chia làm 3 loại nhỏ: INSTEAD OF INSERT, INSTEAD OF UPDATE và
INSTEAD OF DELETE.
Ví dụ:create database Test1 go use Test1 go
create table HangHoa(MaHD int, NgayHD Datetime, GhiChu ntext,
MaSP NVarchar(10), Soluong int, DonGia float) go
create Table NhapHangHoa(MaHD int, NgayHD Datetime, GhiChu ntext) go
create Table NhapHangHoaCT(MaHD int,MaSP NVarchar(10), Soluong int, DonGia float) go
CREATE TRIGGER dbo.Trig_Instead ON HangHoa instead of INSERT
AS Begin
insert into NhapHangHoa select MaHD , NgayHD , GhiChu from inserted
insert into NhapHangHoaCT select MaHD ,MaSP , Soluong , DonGia from inserted
End go
insert into HangHoa values(1,getdate() , 'GhiChu ntext','MaSP', 101, 12.1)
select * from hanghoa
select * from NhapHangHoa
select * from NhapHangHoaCT
--Drop database Test1
Lý thuyết CSDL 110 110
Trigger dạng FOR 
CREATE TRIGGER Ktra_DonGia1 ON [dbo].[Products] 
AFTER INSERT
AS
If exists( Select * from inserted i where 
i.dongiamua>i.dongiaban)
Begin
RollBack tran
RaisError ('Khong hop le', 16,1)
End
Lý thuyết CSDL 111 111
Hàm Update() trong các trigger
CREATE TRIGGER Ktra_DonGia2 ON [dbo].[Products] 
FOR UPDATE AS
If Update(dongiamua) or Update(dongiaban)
Begin
If exists( Select 'true' from inserted i where 
i.dongiamua>i.dongiaban) 
Begin
RollBack tran
RaisError ('Khong hop le', 16,1)
End
End
Lý thuyết CSDL 112 112
Debug trigger
Để gỡ rối một trigger chúng ta phải viết một procedure có gọi các thao tác làm
phát sinh sự kiện để thực thi trigger. Ví dụ để kiểm tra các trigger 
Ktra_DonGia1 và Ktra_DonGia2 chúng ta viết thủ tục sau
CREATE PROCEDURE dbo.DebugTrigger as
insert into Products(Masp, Tensp, Mota, Donvitinh, Dongiamua, Dongiaban, 
VAT)
Values ( 'SP-01', ‘San Pham-01 ' , '@Mota' ,'@donvi', 20,10 , 1 )
GO
Lý thuyết CSDL 113
Tổng kết
Các trigger là các thủ tục lưu mà được thực hiện tự động để
tương tác với các tác vụ thêm, cập nhật và xoá trên một bảng. 
Các trigger thường được sử dụng để thực hiện các quy tắc
nghiệp vụ đòi hỏi.
Lệnh CREATE TRIGGER được sử dụng để tạo một trigger.
Các trigger truy nhập tới các bảng logic Inserted và Deleted. 
Các bảng này chứa các hình ảnh của dữ liệu trước đó, và sau
quá trình cập nhật.
Lý thuyết CSDL 114
Tổng kết
Các kiểu trigger:
 INSERT: Thực hiện mỗi khi xuất hiện việc thêm mới dữ
liệu vào bảng. Các trigger này đảm bảo rằng dữ liệu được
chèn vào bảng là hợp lệ.
 UPDATE: Thực hiện khi một tác vụ cập nhật xảy ra trên
một bảng. Các trigger này có thể được thi hành ở mức
bảng hoặc mức cột.
 DELETE: Thực hiện khi dữ liệu được xoá khỏi một bảng.

File đính kèm:

  • pdfbai_giang_co_so_du_lieu_chuong_7_ngon_ngu_t_sql_do_thi_mai_h.pdf