You are on page 1of 19

1 KHUNG NHÌN (VIEW)

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.

1.1 Định nghĩa khung nhìn (View)


VIEW được xem như một bảng ảo trong CSDL có nội dung được định
nghĩa thông qua một câu lệnh truy vấn (SELECT)
 Cú pháp
CREATE VIEW tên-khung-nhìn [(ds-tên-cột)]
AS câu-lệnh-SELECT
 Lưu ý
1. Một View trông giống như một TABLE (bảng) với một tên khung nhìn
và một tập các dòng, cột. Điểm khác biệt giữa VIEW và TABLE là:
View không được xem là một cấu trúc lưu trữ dữ liệu tồn tại trong
CSDL ( đó là lý do tại sao bảo khi sử dụng VIEW thì tài nguyên hệ
thống được giảm thiểu)
2. Nếu không chỉ định danh sách tên cột cho khung nhìn, tên các cột
chính là tiêu đề các cột trong kết quả câu SELECT
3. Tên các cột trong view được chỉ định thì phải có cùng số lượng với số
lượng cột trong kết quả của câu SELECT
4. Phải đặt tên cho cột của View (ds-tên-cột) trong trường hợp sau:
• Cột được phát sinh từ một biểu thức số học, hoặc hàm có sẵn
hay hằng (tức là không phải tên cột trong bảng dữ liệu cơ sở)
• Tồn tại hai cột trong kết quả của câu lệnh SELECT có cùng tiêu
đề cột
• Đổi tên của cột so với tên của cột trong bảng CSDL.
Ví dụ 1 Tạo VIEW hiển thị thông tin của các sinh viên nữ

CREATE VIEW SINHVIEN_NU AS


SELECT MaSV, HotenSV AS 'Họ tên SV', Gioitinh 'Giới
tính'
FROM SINHVIEN WHERE gioitinh = N'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

1.2 Thay đổi định nghĩa khung nhìn


 Cú pháp:
ALTER VIEW tên-khung-nhìn [(ds-tên-cột)]
AS câu-lệnh-SELECT
 Điều kiện:
 Trong lệnh SELECT định nghĩa khung nhìn không chứa từ khoá
DISTINCT, TOP, GROUP BY và UNION.
 Các thành phần xuất hiện trong danh sách chọn của câu lệnh SELECT
phải là các cột trong các bảng cơ sở, không được chứa các biểu thức
tính toán, các hàm gộp.
 Đảm bảo ràng buộc dữ liệu
Thực chất các thao tác này sẽ là những thao tác trên bảng cơ sở và tác động
vào bảng cơ sở.
1.3 Xóa khung nhìn
 Cú pháp:

drop view tên-khung-nhìn

 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;

Execute Tên_thủ_tục_lưu _trữ [danh_sách_tham_số]

 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ị

Ví dụ 3: Chèn dữ liệu vào hai bảng Sinh viên và Môn học

CREATE PROCEDURE sp_themsv_mh


(
@tensv nvarchar(50),
@ngaysinh date,
@quequan nvarchar(50),
@lop nvarchar(10),
@tenmh nvarchar(50),
@DVHT int
)
AS
INSERT INTO SINHVIEN(TenSV,Ngaysinh,quequan,Lop) VALUES
(@TenSV,@Ngaysinh,@Quequan,@Lop)
INSERT INTO MONHOC (tenmh,DVHT) VALUES (@tenmh,@DVHT)
 Cách 1
sp_themsv_mh N'Lê Bảo Minh ','1996-8-29',N'Hà
Nội','AT5B',N'Vi xử lý',10
 Cách 2
sp_themsv_mh @TenSV = N'Lê Bảo Minh',
@Quequan = N'Hà Nội',
@Ngaysinh = '1996-8-29',
@TenMH = N'Vi xử lý',
@DVHT = 10,
@Lop = 'AT5B'
2.3 Sử dụng biến trong thủ tục lưu trữ
 Ý nghĩa

 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

DECLARE TÊN_BIẾN KIỂU_DỮ_LIỆU

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'

Cách kiểm tra


kiemtralop 1,6
2.4 SỬA THỦ TỤC LƯU TRỮ
 Cú pháp:

ALTER 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>

2.5 XÓA THỦ THỤC LƯU TRỮ


 Cú pháp:

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


2.6 Lợi ích khi sử dụng thủ tục (PROCEDURE)
 Tăng tính bảo mật: Thay vì cấp phát quyền trực tiếp cho người sử dụng
trên các câu lệnh SQL và trên các đối tượng cơ sở dữ liệu, ta có thể cấp phát
quyền cho người sử dụng thông qua các thủ tục lưu trữ, nhờ đó tăng khả
năng bảo mật đối với hệ thống.
 Khả năng module hoá: Bạn có thể tạo một SP một lần và tái sử dụng nó
bao nhiêu lần tùy thích trong chương trình của bạn. Điều này làm tăng khả
năng bảo trì ứng dụng của bạn và cho phép các ứng dụng truy cập vào các cơ
sở dữ liệu trong một cách thức thống nhất và tối ưu hóa.
 Đơn giản hoá các thao tác trên cơ sở dữ liệu: nhờ vào khả năng module
hoá các thao tác này.
 Thực thi nhanh: Thủ tục lưu trữ được phân tích, tối ưu khi tạo ra nên việc
thực thi chúng nhanh hơn nhiều so với việc phải thực hiện một tập rời rạc
các câu lệnh SQL tương đương theo cách thông thường.
 Làm giảm thiểu sự lưu thông trên mạng: Thủ tục lưu trữ cho phép chúng
ta thực hiện cùng một yêu cầu bằng một câu lệnh đơn giản thay vì phải sử
dụng nhiều dòng lệnh SQL. Điều này sẽ làm giảm thiểu sự lưu thông trên
mạng.
 Được ưa chuộng trong lập trình CSDL: SP có thể được gọi từ các chương
trình phía client hoặc từ các SP khác do đó SP được ưa chuộng trong lập
trình CSDL, đặc biệt là trong các ứng dụng theo mô hình N-tier và các Web
services.
3 HÀM (FUNCTION)
Hàm cũng là một đối tượng trong cơ sở dữ liệu giống như thủ tục. Nhưng
điểm khác nhau giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm
còn thủ tục thì không. Điều này cho phép ta sử dụng hàm như một thành phần của
biểu thức, ví dụ như trong các câu lệnh truy vấn hay các câu lệnh truy vấn thực
hiện cập nhập dữ liệu.
Có hai loại hàm: một loại do SQL định sẵn và một loại do người dùng tự
định nghĩa.

3.1 Hàm do SQL định nghĩa sẵn


Trong SQL có rất nhiều hàm được định nghĩa sẵn được chia theo nhóm.
Trong 1 Database chọn: Programability/ Functions/System Functions.
Ví dụ:
Hàm toán học (Mathematical functions): Abs(), Log(10), Sqrt(),Round(),….
Hàm tập hợp (Aggregate functions): Sum(), Min(), Max(), Count(),…
Hàm thời gian (Date and Time Functions): Datepart(), Year(),…
3.2 Hàm do người dùng tự định nghĩa
Hàm do người dùng định nghĩa để phục vụ cho mục đích riêng của mình.
Các hàm do người dùng định nghĩa thường có 2 loại:
• Loại 1 là hàm với giá trị trả về là “dữ liệu kiểu bảng” – Table-valued
Functions;
• Loại 2 là hàm với giá trị trả về là một giá trị – Scalar-valued
Functions và các hàm này cũng sẽ được Hệ quản trị phân thành 2
nhó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
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())

Cách làm sử dụng hàm


CREATE FUNCTION GetCurrYear1()
RETURNS int
AS
BEGIN
RETURN YEAR(getdate())
END
Ví dụ 2: Xác định thứ trong tuần của một 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 N’Chủ nhật'
WHEN 2 THEN N'Thứ hai'
WHEN 3 THEN N'Thứ ba'
WHEN 4 THEN N'Thứ tư'
WHEN 5 THEN N'Thứ năm'
WHEN 6 THEN N'Thứ sáu'
ELSE N'Thứ bảy'
END
RETURN (@st) /* Trị trả về của hàm */
END
Cách sử dụng hàm sau khi được định nghĩa
Ví dụ 1_1:
SELECT dbo.GetCurrYear1() 'Năm nay là năm'
Kết quả sẽ trả về cho các bạn năm hiện tại

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

You might also like