Professional Documents
Culture Documents
Các bảng trong cơ sở dữ liệu đóng vai trò là các đối tượng tổ chức là lưu trữ
dữ liệu. Như vậy ta có thể quan sát dữ liệu trong cơ sở dữ liệu bằng cách thực hiện
các truy vấn trên bảng dữ liệu. Ngoài ra SQL còn cho phép chúng ta quan sát được
dữ liệu thông qua việc định nghĩa các khung nhìn.
Ví dụ 2 Tạo VIEW hiển thị thông tin điểm của các sinh viên
CREATE VIEW DIEMTHI AS
SELECT sv.masv,sv.hosv + ' ' + sv.tensv 'Họ và tên',
mh.tenMh,kq.diem
FROM sinhvien sv, ketqua kq,monhoc mh
WHERE sv.masv = kq.masv and mh.mamh = kq.mamh
Lưu ý:
Khi một View bị xóa thì các quyền được cấp phát cho người dùng trên View đó
cũng sẽ bị xóa. Nên khi tạo lại View thì phải cấp phát lại quyền cho người sử dụng
1.4 Ưu nhược điểm của VIEW
1.4.1 Lợi ích của việc sử dụng View trong CSDL:
Đơn giản hóa các thao tác truy vấn dữ liệu: Một View đóng vai trò
như một đối tượng tập hợp dữ liệu từ nhiều bảng khác nhau vào trong
một bảng => Người sử dụng có thể thực hiện các yêu cầu truy vấn dữ
liệu một cách đơn giản từ View thay vì phải đưa ra những câu truy vấn
phức tạp.(Thêm vào đó có thể sử dụng các trường khác nhau ở các bảng
khác nhau)
Khi sử dụng Database View sẽ giúp bạn đơn giản hóa các câu truy vấn
phức tạp bởi vì một View được tạo ra bởi một câu truy vấn SQL, nên
dữ liệu mà nó lưu trữ ta có thể gọi là thành phẩm của một công đoạn
truy vấn nên giải quyết được nhiều vấn đề về tốc độ, đặc biệt là những
câu truy vấn JOIN. Bạn có thể sử dụng View để che giấu đi sự phức tạp
của mô hình dữ liệu trong hệ thống bởi những gì mà họ thấy chỉ là môt
View rất đơn giản.
Bảo mật dữ liệu: Người sử dụng được cấp phát quyền trên các View
với những phần dữ liệu mà người sử dụng được phép -> Hạn chế việc
người sử dụng truy cập trực tiếp dữ liệu.
Độc lập dữ liệu: Một View có thể cho phép người dùng có được cái
nhìn về dữ liệu độc lập với cấu trúc của các bảng trong CSDL cho dù
các bảng cơ sở có bị thay đổi phần nào về cấu trúc (thêm, bớt trường...)
Tính mới nhất : Mọi sự thay đổi dữ liệu trong bảng đều được cập nhập
trên khung nhìn View (Khi ta tạo một View từ một table thì nếu table
đó đổi dữ liệu thì mặc nhiên View cũng sẽ thay đổi theo. Điều này thật
tuyệt vời vì ta không mất nhiều công sức để cập nhật lại dữ liệu.
Database View cho phép tăng hoặc giảm các Fields tùy theo yêu cầu
sử dụng bởi vì nó được tạo từ một câu truy vấn SELECT nên bạn có thể
JOIN nhiều Table lại với nhau và lưu vào View.
Database View tăng khả năng phát triển lại ứng dụng hoặc tương
thích với nhiều ứng dụng chạy chung một CSDL. Ví dụ như bạn có một
hệ thống dữ liệu khách hàng và một này nào đó bạn cần đổi cấu trúc thì
lúc này trong Source của bạn phải đổi theo. Nhưng nếu sử dụng View
thì ta có thể hạn chế được việc này.
1.4.2 Một số nhược điểm của việc sử dụng View:
Do hệ quản trị CSDL thực hiện chuyển đổi các truy vấn trên VIEW
thành những truy vấn trên các bảng cơ sở nên nếu một VIEW được
định nghĩa bởi một truy vấn phức tạp thì sẽ dẫn đến chi phí về mặt thời
gian khi thực hiện truy vấn liên quan đến VIEW lớn;
Mặc dù thông qua VIEW có thể thực hiện được các thao tác bổ sung và
cập nhật dữ liệu cho bảng cơ sở nhưng chỉ hạn chế đối với những
VIEW đơn giản. Đối với các VIEW phức tạp thì thường không thực
hiện được, hay nói cách khác dữ liệu trong VIEW chỉ là đọc;
Khi truy vấn trong VIEW có thể sẽ chậm hơn trong table;
Bị phụ thuộc vào TABLE gốc, nếu TABLE gốc thay đổi cấu trúc thì
đòi hỏi VIEW cũng phải thiết kế lại cho phù hợp.
2 THỦ TỤC LƯU TRỮ (STORE PROCEDURE)
Nếu các câu lệnh truy vấn ngắn gọn và đơn giản thì thực thi trực tiếp có thể là
một giải pháp tối ưu hơn. Nhưng với khối lượng các câu lệnh truy vấn nhiều thì lời
khuyên là hãy dung VIEW hoặc PROCEDURE. Bởi lẽ VIEW và PROCEDURE
trong SQL Server có cơ chế bên dịch 1 lần và sử dụng lại nên sẽ làm giảm tối đa
lưu lượng mạng sử dụng cũng như thời gian truy vấn. Và đặc biệt hơn, dùng VIEW
và PROCEDURE sẽ giúp chúng ta bảo mật các thông tin đầu vào tốt hơn.
2.1 Định nghĩa thủ tục
Thủ tục lưu trữ là một đối tượng trong CSDL, bao gồm nhiều câu lệnh T-
SQL được tập hợp lại với nhau thành một nhóm, và tất cả các lệnh này sẽ được
thực thi khi thủ tục lưu trữ được thực thi.
Thủ tục lưu trữ có thể có các thành phần sau:
1. Các cấu trúc điều khiển (IF, WHILE, FOR) có thể được sử dụng trong
thủ tục
2. Bên trong thủ tục lưu trữ có thể sử dụng các biến như trong ngôn ngữ lập
trình nhằm lưu giữ các giá trị tính toán được, các giá trị được truy xuất
được từ cơ sở dữ liệu.
3. Một tập các câu lệnh T-SQL được kết hợp lại với nhau thành một khối
lệnh bên trong một thủ tục.
(Một thủ tục có thể nhận các tham số truyền vào cũng như có thể trả về các
giá trị thông qua các tham số (như trong các ngôn ngữ lập trình). Khi một
thủ tục lưu trữ đã được định nghĩa, nó có thể được gọi thông qua tên thủ
tục, nhận các tham số truyền vào, thực thi các câu lệnh SQL bên trong
thủ tục và có thể trả về các giá trị sau khi thực hiện xong)
Cú pháp:
CREATE PROCEDURE <tên thủ tục>
[(<DSách tham số>) ]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE, ENCRYPTION]
AS
<Các câu lệnh của thủ tục>
Trong đó:
Tên của thủ tục lưu trữ phải tuân theo quy tắc định danh và không vượt
quá 128 ký tự
Danh sách tham số: Khai báo của mỗi một tham số tối thiểu phải bao gồm
hai phần:
tên tham số được bắt đầu bởi dấu @
kiểu dữ liệu của tham số
RECOMPILE: Nếu tuỳ chọn WITH RECOMPILE được chỉ định, thủ tục sẽ
được dịch lại mỗi khi được gọi.
ENCRYPTION: nếu tuỳ chọn WITH ENCRYPTION, thủ tục sẽ được mã hóa
Tập hợp các câu lệnh sử dụng trong nội dung thủ tục: Các câu lệnh này
có thể đặt trong cặp từ khoá BEGIN … END hoặc không
Ví dụ 1: Tạo thủ tục cho biết danh sách sinh viên theo Lớp
CREATE PROCEDURE thongtinsinhvien
(@lop nvarchar(5))
AS
SELECT MaSV, TenSV, Gioitinh, Ngaysinh, Lop
FROM Sinhvien
WHERE lop = @lop
2.2 Lời gọi thủ tục lưu trữ
Thủ tục lưu trữ được gọi theo cấu trúc:
Tên_thủ_tục [danh_sách_tham_số]
Ví dụ 2: thongtinsinhvien AT9B
Lưu ý:
Nếu thủ tục được gọi từ một thủ tục khác, thực hiện bên trong một trigger
hay phối hợp với câu lệnh SELECT, cấu trúc như sau;
Danh sách tham số truyền vào trong lời gọi phải theo đúng thứ tự khai báo
các tham số trong thủ tục lưu trữ
Thứ tự các đối số có thể không cần tuân theo thứ tự của các tham số như khi
định nghĩa
@tên_tham_số = giá_trị
Sử dụng các biến nhằm lưu giá trị tính toán được hoặc truy xuất được
từ cơ sở dữ liệu.
Khai báo biến bằng từ khóa DECLARE
Cú pháp
Ví dụ 4: Kiểm tra hai bạn sinh viên có cùng lớp hay không
create proc kiemtralop
(@maSV1 int,
@maSV2 int)
as
declare @lop1 varchar(10),@lop2 varchar(10)
set @lop1 = (select lop from Sinhvien where MaSV = @maSV1)
set @lop2 = (select lop from Sinhvien where MaSV = @maSV2)
if @lop1 = @lop2
print N'Hai bạn sinh viên có mã '+ str(@masv1,2)+N' và
'+str(@masv2,2)+N' học cùng lớp ' + @lop1
else
print N'Hai bạn sinh viên có mã '+ str(@masv1,2)+N' và
'+str(@masv2,2)+N' không học cùng lớp'
AS
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
Trong đó:
– Ten_Ham: Tên của hàm cần tạo. Tên phải tuân theo qui tắc định danh và không
trùng với tên của các hàm hệ thống có sắn.
– Danh_Sach_Cac_Tham_So: Các tham số của hàm được khai báo ngay sau tên
hàm và được bao bởi cặp dấu (), Danh sách các tham số này có thể không có –
trường hợp này thì sau tên hàm bạn cần có cặp dấu (). Nếu hàm có nhiều tham số
thì các khai báo phân cách nhau bởi dấu phẩy và phải bao hồm 2 phần: Tên tham
số được bắt đầu bởi dấu @, Kiểu dữ liệu của tham số
– Cac_Cau_Lenh_Cua_Ham: Tập hợp các câu lệnh sử dụng trong nội dung hàm để
thực hiện các yêu cầu của hàm.
3.2.1 Hàm với giá trị trả về là một giá trị
Ví dụ 1 Hàm trả về giá trị năm hiện hành (Hàm không có tham số)
Cách làm thông thường
select DATEPART(yy,getdate())
Ví dụ 2_1:
set dateformat dmy
select dbo.thu('20/11/2018')
Kết quả sẽ trả về cho các bạn ngày 20/11/2018 sẽ vào thứ mấy
Ngoài ra chúng ta còn có thể sử dụng kết quả của hàm trong một câu truy vấn khác
Ví dụ 3:Xem danh sách sinh viên sinh vào thứ mấy trong tuần
SELECT MaSV, TenSV, Ngaysinh, dbo.thu(ngaysinh) AS 'Thứ
trong tuần'
FROM Sinhvien
3.2.2 Hàm với giá trị trả về kiểu bảng
Hàm kiểu bảng (table-valued function) là một loại hàm do người dùng định
nghĩa, trong đó kết quả trả về là một cấu trúc kiểu bảng và bạn có thể sử dụng như
một bảng thông thường, như SELECT hay JOIN với nó.
Hàm kiểu bảng được chia làm hai loại:
• Hàm nội tuyến (Inline)
• Hàm bao gồm nhiều câu lệnh bên trong (Multi-statement)
3.2.3 Hàm nội tuyến (Inline)
Cú pháp
CREATE FUNCTION tên_hàm ([danh_sách_tham_số])
RETURNS TABLE
AS
RETURN (câu_lệnh_select)
Lưu ý:
Kiểu trả về của hàm phải đượ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.
Ví dụ 1: Tạo hàm xem điểm của sinh viên theo lớp
CREATE FUNCTION diem_lop
(@lop nvarchar(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT Sinhvien.MaSV, TenSV, Lop, TenMH, Diem
FROM Sinhvien, Monhoc, Ketqua
WHERE sinhvien.MaSV = Ketqua.MaSV and Ketqua.MaMH =
Monhoc.MaMH and Lop = @lop
)
Sau khi khởi tạo thành công, ta có thể thực thi hàm bằng cách:
SELECT * FROM dbo.diem_lop ('AT9C')
3.2.4 Hàm bao gồm nhiều câu lệnh bên trong (Multi-statement)
Trong trường hợp cần sử dụng nhiều câu lệnh trong phần thân hàm, ta sử dụng cú
pháp như sau:
CREATE FUNCTION tên_hàm([danh_sách_tham_số])
RETURNS @biến_bảng TABLE định_nghĩa_bảng
AS
BEGIN
các_câu_lệnh_trong_thân_hàm
RETURN
END
Ví dụ: Tạo hàm cho biết số sinh viên của mỗi lớp đã thi môn nhập vào
CREATE FUNCTION func_tongsv
(@mamon int)
RETURNS @bangthongke TABLE
(
lop nvarchar(10),
tongsosv int
)
AS
BEGIN
INSERT INTO @bangthongke
SELECT lop, count(sv.masv)
FROM sinhvien sv, ketqua kq, monhoc mh
WHERE sv.masv = kq.masv and mh.mamh = kq.mamh
and mh.MaMH = @mamon
GROUP BY Lop
RETURN
END
Sau khi khởi tạo thành công, ta có thể thực thi hàm bằng cách:
select * from dbo.func_tongsv(1)
Chú ý: “1” chính là mã số môn thi mà chúng ta cần chỉ ra để tìm số sinh viên đã thi
môn này của mỗi lớp
3.2.5 Sửa hàm
ALTER 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
3.2.6 2. Xóa hàm
DROP FUNCTION tên_hàm