You are on page 1of 216

Ths.

NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

LỜI NÓI ĐẦU


Microsoft SQL Server 2019 là một hệ quản trị cở sở dữ liệu mô hình
quan hệ (Relational Database Management System – RDBMS) đƣợc phát
triển bởi Microsoft dùng để quản lý và lƣu trữ dữ liệu theo mô hình
Client/Server. Đây là một trong các hệ quản trị cơ sở dữ liệu có đầy đủ các
tính năng của một hệ quản trị cơ sở dữ liệu cơ bản, đƣợc nhiều nhà phát triển
ứng dụng lựa chọn nhƣ một giải pháp lƣu trữ dữ liệu cho các ứng dụng.
Học phần Hệ quản trị cơ sở dữ liệu SQL Server là một trong những học
phần quan trọng trong chƣơng tr nh đào t o cho sinh vi n ngành CNTT. Hiện
n y có rất nhiều giáo tr nh về Hệ quản trị cơ sở dữ liệu SQL Server nhƣng
kh ng phù hợp với việc giảng d y và học tập t i trƣờng ĐHQN. Việc xây
dựng giáo trình Hệ quản trị cơ sở dữ liệu SQL Server là sự cấp thiết, gi p cho
sinh vi n có đƣợc tài liệu th m khảo đầy đủ cả l thuyết lẫn thực hành vê
Microsoft SQL Server. Giáo tr nh đƣợc chia thành 7 chƣơng, bao gồm:
Chƣơng 1: Giới thiệu về hệ quản trị SQL Server.
Chƣơng 2: Các th o tác cơ bản trong SQL Server
Chƣơng 3: Ngôn ngữ truy vấn có cấu trúc (SQL) trong Sql Server
Chƣơng 4: Khung nhìn (view) và Bẫy sự kiện (Trigger)
Chƣơng 5: Thủ tục lƣu trữ (stored procedure) và Hàm trong Sql Server
Chƣơng 6: Bảo mật & phân quyền ngƣời dùng trong SQL Server
Chƣơng 7: Kết nối vào SQL Server từ các ngôn ngữ lập tr nh để xây
dựng các ứng dụng li n qu n đến cơ sở dữ liệu
Cuối mỗi chƣơng đều có các câu hỏi, bài tập thực hành và bài tập tự giải
để sinh viên ôn luyện và tự kiểm tra kiến thức của mình.
Mặc dù đã có nhiều cố gắng trong việc biên so n và cập nhật cho phù
hợp với thực tế nhƣng giáo tr nh chắc chắn vẫn còn những h n chế và thiếu
sót. Tác giả mong nhận đƣợc những ý kiến đóng góp từ đồng nghiệp và các
b n sinh vi n để giáo tr nh ngày đƣợc hoàn thiện hơn với mục ti u đáp ứng
tốt nhất cho ngƣời học.
Quảng Nam, tháng 07 năm 2022
NHÓM TÁC GIẢ
NGUYỄN THỊ MINH CHÂU
1
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

MỤC LỤC
LỜI NÓI ĐẦU ...............................................................................................1
MỤC LỤC .....................................................................................................2
CHƢƠNG 1: GIỚI THIỆU VỀ HỆ QUẢN TRỊ SQL SERVER 2019 ............ 8
1.2. Tổng quan về Hệ quản trị CSDL SQL Server 2019 ................................... 8
1.2.1. Giới thiệu SQL Server ..............................................................................8
1.2.2. Các thành phần củ SQL Server 2019 ....................................................10
1.2.3. M h nh chung củ SQL Server .............................................................11
1.2.3.1. Kết nối trên Desktop ........................................................................12
1.2.3.2. Kết nối qua m ng diện rộng theo mô hình Client/Server ................12
1.2.3.3. Kết nối ứng dụng trên m ng Internet ...............................................13
1.2.4. Các lo i CSDL có trong hệ quản trị CSDL SQL Server 2019 ...............14
1.2.5. Các đặc điểm củ hệ quản trị CSDL SQL Server 2019 .........................15
1.2.6. Hệ thống tập tin ......................................................................................15
1.2.7. Các đối tƣợng b n trong củ SQL Server ..............................................16
1.3. Các ấn bản của SQL Server 2019 ............................................................... 18
1.4. Giới thiệu về cài đặt MS SQL Server phiên bản 2019 .............................. 19
1.4.1. Các y u cầu về hệ thống .........................................................................20
1.4.2. Các bƣớc cài đặt .....................................................................................20
1.4.2.1. Cài đặt Microsoft SQL Server 2019 Express. ..................................20
1.4.2.2. Cài đặt SQL Server Management Studio(SSMS) ........................22
1.4.2.3. Cấu hình SQL Server Express 2019 ................................................24
CHƢƠNG 2: CÁC THAO TÁC CƠ BẢN TRONG SQL SERVER ............. 28
2.1. Các kiểu dữ liệu trong SQL Server ............................................................ 28
2.1.1. Các kiểu dữ liệu k tự ............................................................................28
2.1.2. Các kiểu dữ liệu kiểu số .........................................................................28
2.1.3. Các kiểu dữ liệu ngày tháng ...................................................................29
2.1.4. Kiểu dữ liệu luận l ................................................................................29
2.1.5. Các kiểu dữ liệu d ng nhị phân ..............................................................29
2.2. Các thao tác cơ bản trên giao diện ngƣời dùng (UI) của SQL Server .... 29
2.2.1. Đăng nhập vào SQL Server. ...................................................................29
2.2.2. T o, xó CSDL .......................................................................................31
2.2.3. Cơ sở dữ liệu minh họ ..........................................................................32
2.2.4. T o bảng dữ liệu mới và các thuộc tính .................................................32
2.2.5. Xó , sử bảng .........................................................................................35

2
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.2.5.1. Xó bảng ..........................................................................................35


2.2.5.2. Sửa bảng ...........................................................................................36
2.2.6. T o d t b se Di gr m (m h nh CSDL) ................................................37
2.2.7. Mở cử sổ viết câu truy vấn (SQL Editor) .............................................38
2.3. Sao lƣu và phục hồi dữ liệu (Backup and Restore) ................................... 39
2.3.1. Các l do phải thực hiện B ckup ............................................................40
2.3.2. Các lo i B ckup ......................................................................................40
2.3.2.1. Full backup và Differential backup ..................................................40
2.3.2.2. Transaction log backup ....................................................................41
2.3.3. Các th o tác thực hiện quá tr nh B ckup và Restore CSDL trong SQL
Server .........................................................................................................41
2.3.3.1. S o lƣu (B ckup)..............................................................................41
2.3.3.2. Phục hồi (Restore) ............................................................................44
2.4. Bài tập chƣơng 2: ......................................................................................... 46
2.4.1. Câu hỏi n tập .........................................................................................46
2.4.2. Bài tập thực hành: ...................................................................................46
CHƢƠNG 3: NGÔN NGỮ TRUY VẤN CÓ CẤU TRÚC (SQL) TRONG
SQL SERVER ................................................................................................. 50
3.1. Ngôn ngữ truy vấn có cấu trúc (SQL) ........................................................ 50
3.1.1. SQL là ng n ngữ củ cơ sở dữ liệu qu n hệ ..........................................50
3.1.2. V i trò củ ng n ngữ SQL......................................................................51
3.1.3. Giới thiệu sơ lƣợc về Tr ns ct SQL (T-SQL) ........................................52
3.2. Cú pháp của T-SQL ..................................................................................... 54
3.2.1. Đặt t n – Identifiers ................................................................................54
3.2.2. Biến (V ri bles)......................................................................................55
3.2.3. Hàm (Function) ......................................................................................55
3.2.3.1. Các lo i hàm .....................................................................................55
3.2.3.2. Các hàm SQL Server định nghĩ sẳn ...............................................56
3.2.4. Các toán tử (Oper tors) ..........................................................................63
3.2.5. Các thành phần điều khiển (Control of flow) .........................................64
3.2.6. Ch thích (Comment) .............................................................................64
3.2.7. Giá trị NULL ..........................................................................................64
3.3. Ngôn ngữ định nghĩa dữ liệu – DDL .......................................................... 64
3.3.1. T o bảng .................................................................................................65
3.3.2. Các lo i ràng buộc ..................................................................................67
3.3.2.1. Ràng buộc CHECK ..........................................................................67
3.3.2.2. Ràng buộc khóa chính PRIMARY KEY .........................................68

3
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3.3.2.3. Ràng buộc FOREIGN KEY .............................................................69


3.3.2.4. Ràng buộc UNIQUE ........................................................................72
3.3.2.5. Ràng buộc DEFAULT .....................................................................72
3.3.3. Sử đổi định nghĩ bảng .........................................................................73
3.3.4. Xó bảng .................................................................................................75
3.4. Ngôn ngữ thao tác dữ liệu – DML .............................................................. 75
3.4.1. Th m, cập nhật và xó dữ liệu................................................................76
3.4.1.1. Thêm dữ liệu ....................................................................................76
3.4.1.2. Cập nhật dữ liệu ...............................................................................78
3.4.1.3. Xó dữ liệu .......................................................................................78
3.4.2. Câu lệnh truy xuất dữ liệu SELECT ......................................................80
3.4.2.1. Câu lệnh truy vấn d ng tổng quát ....................................................80
3.4.2.2. Danh sách chọn trong câu lệnh SELECT.........................................81
3.4.2.3. Mệnh đề FROM ...............................................................................84
3.4.2.4. Mệnh đề WHERE ............................................................................85
3.4.2.5. Mệnh đề ORDER BY - Sắp xếp kết quả truy vấn ...........................88
3.4.2.6. Mệnh đề GROUP BY ......................................................................89
3.4.2.7. Thống kê dữ liệu ..............................................................................90
3.4.2.8. Mệnh đề HAVING ch định điều kiện trong hàm gộp.....................92
3.4.3. Phép hợp (UNION) ................................................................................92
3.4.4. Các lo i phép kết nối trong SQL Server: ...............................................94
3.4.4.2. Phép kết nối trong (Inner Join).........................................................96
3.4.4.3. Phép kết nối ngoài (Outer Join) .......................................................98
3.4.4.4. Phép kết nối tích hợp (CROSS JOIN)............................................101
3.4.4.5. Phép tự kết kết nối (Self Join) ........................................................101
3.4.5. Truy vấn con (Subquery) ......................................................................101
3.5. Ngôn ngữ điều khiển dữ liệu ..................................................................... 103
3.5.1. Cấp quyền truy cập – câu lệnh Gr nt ...................................................103
3.5.2. Thu hồi quyền truy cập – Câu lệnh Deny .............................................103
3.5.3. Thực hiện l i th o tác phân quyền – Câu lệnh Revoke C pháp: ........104
3.6. Bài tập chƣơng 3 ......................................................................................... 104
3.6.1. Câu hỏi n tập. ......................................................................................104
3.6.2. Bài tập thực hành: .................................................................................104
3.6.3. Bài tập tự giải .......................................................................................113
CHƢƠNG 4: KHUNG NHÌN (VIEW) VÀ BẪY SỰ KIỆN (TRIGGER) .. 115
4.1. Khung nhìn (View) ..................................................................................... 115
4.1.1. Giới thiệu ..............................................................................................115
4
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4.1.2. T o khung nh n .....................................................................................116


4.1.2.1. T o khung nhìn bằng công cụ có sẳn của SQL Server 2019 .........116
4.1.2.2. T o khung nhìn bằng câu lệnh .......................................................116
4.1.3. Sử cấu tr c khung nh n .......................................................................120
4.1.4. Xóa khung nhìn ....................................................................................121
4.1.5. Sử dụng khung nh n để cập nhật dữ liệu ..............................................121
4.2. Bẫy sự kiện ( Trigger) ................................................................................ 122
4.2.1. Định nghĩ ............................................................................................122
4.2.2. Các đặc điểm củ trigger ......................................................................122
4.2.3. Các trƣờng hợp sử dụng trigger............................................................123
4.2.4. Các khả năng củ trigger ......................................................................124
4.2.5. T o Trigger ...........................................................................................124
4.2.5.1. Cú pháp ..........................................................................................124
4.2.5.2. Các ví dụ minh họa ........................................................................127
4.2.6. Kích ho t trigger dự tr n sự th y đổi dữ liệu tr n cột ........................130
4.2.7. Sử dụng trigger và Gi o tác (TRANSACTION) ..................................131
4.2.7.1. Khái niệm về giao tác.....................................................................131
4.2.7.2. Sử dụng trigger và Giao tác ...........................................................132
4.2.8. Trigger cho ng n ngữ định nghĩ dữ liệu (DDL Trigger ) ...................133
4.2.9. Kích ho t/ bỏ kích ho t Trigger (ENABLE/ DISABLE TRIGGER) ..134
4.2.10. Sử đổi Trigger ...................................................................................135
4.2.11. Xóa Trigger ........................................................................................135
4.3. Bài tập chƣơng 6 ......................................................................................... 136
4.3.1. Câu hỏi n tập .......................................................................................136
4.3.2. Bài tập thực hành ..................................................................................136
4.3.3. Bài tập tự giải .......................................................................................140
CHƢƠNG 5: THỦ TỤC LƢU TRỮ (STORED PROCEDURE) VÀ HÀM
(FUNCTION) ................................................................................................ 143
5.1. Thủ tục lƣu trữ ........................................................................................... 143
5.1.1. Giới thiệu ..............................................................................................143
5.1.1.1. Định nghĩ thủ tục. .........................................................................143
5.1.1.2. Phân lo i thủ tục:............................................................................144
5.1.2. Các lợi ích khi sử dụng thủ tục lƣu trữ .................................................145
5.1.3. T o thủ tục lƣu trữ ................................................................................147
5.1.4. Các t o thác tr n thủ tục lƣu trữ ...........................................................150
5.1.4.1. Lời gọi thủ tục ................................................................................150
5.1.4.2. Biến trong thủ tục lƣu trữ ...............................................................151
5
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

5.1.4.3. Giá trị trả về trong thủ tục lƣu trữ ..................................................152
5.1.4.4. Sử dụng lệnh RETURN .................................................................153
5.1.4.5. Th m số với giá trị mặc định .........................................................153
5.1.5. Sử đổi thủ tục ......................................................................................154
5.1.6. Xó thủ tục lƣu trữ ...............................................................................154
5.2. Hàm do ngƣời dùng định nghĩa ( User Defined Function) ..................... 155
5.2.1. Khái niệm .............................................................................................155
5.2.2. Những h n chế khi sử dụng hàm do ngƣời dùng định nghĩ ................155
5.2.3. Phân lo i ...............................................................................................155
5.2.3.2. Hàm nội tuyến - Inline UDF ..........................................................158
5.2.3.3. Hàm bao gồm nhiều câu lệnh bên trong – Multi statement UDF ..159
5.2.4. Th y đổi hàm ........................................................................................160
5.2.5. Xóa hàm................................................................................................160
5.3. Bài tập chƣơng 5 ......................................................................................... 160
5.3.1. Câu hỏi n tập .......................................................................................160
5.3.2. Bài tập thực hành ..................................................................................161
5.3.3. Bài tập tự giải .......................................................................................170
CHƢƠNG 6: BẢO MẬT & PHÂN QUYỀN NGƢỜI DÙNG TRONG SQL
SERVER........................................................................................................ 171
6.1. Bảo mật trong SQL Server ........................................................................ 171
6.1.1. Khái niệm .............................................................................................171
6.1.2. Giới thiệu về cơ chế bảo mật trong SQL Server ..................................172
6.1.3. Mã hó dữ liệu trong SQL Server ........................................................173
6.1.4. Các lỗ hổng bảo mật thƣờng gặp trong SQL Server ............................177
6.2. Phân quyền ngƣời dùng trong SQL Server ............................................. 180
6.2.1. Tài khoản đăng nhập vào SQL Server..................................................180
6.2.2. Quản l ngƣời dùng ..............................................................................181
6.2.3. T o ngƣời dùng ....................................................................................183
6.2.3.1. T o Login .......................................................................................183
6.2.3.2. T o USER ......................................................................................185
6.2.4. Cấp phát quyền cho ngƣời dùng ...........................................................187
6.2.5. Quản l Role .........................................................................................187
6.2.6. Thêm thành viên cho Role ....................................................................190
6.2.7. Đối tƣợng và quyền tr n đối tƣợng ( D t b se Objects nd Object
Permission) ..............................................................................................190
6.2.7.1. Đối tƣợng .......................................................................................190
6.2.7.2. Quyền .............................................................................................190

6
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

6.2.8. Cho phép và hủy bỏ quyền tr n đối tƣợng ...........................................191


6.3. Bài tập chƣơng 6 ......................................................................................... 191
6.3.1. Câu hỏi n tập .......................................................................................191
6.3.2. Bài tập thực hành ..................................................................................191
CHƢƠNG 7: KẾT NỐI VÀO SQL SERVER TỪ CÁC NGÔN NGỮ LẬP
TRÌNH ĐỂ XÂY DỰNG CÁC ỨNG DỤNG LIÊN QUAN ĐẾN CSDL... 192
7.1. Cấu hình Microsoft SQL Server ............................................................... 192
7.1.1. Cho phép tiếp nhận các kết nối từ x tr n SQL Server ........................193
7.1.2. Kích ho t dịch vụ SQL Server Browser ...............................................193
7.1.3. T o các ngo i lệ tr n Windows Firew ll ..............................................194
7.2. Kết nối vào SQL Server trong các ngôn ngữ lập trình ........................... 195
7.2.1. Kết nối vào SQL Server trong các ng n ngữ lập tr nh C# ...................195
7.2.2. Xây dựng lớp (cl ss) truy cập vào CSDL trong ng n ngữ C# .............197
7.3. Bài tập chƣơng 7 ......................................................................................... 200
7.3.1. Câu hỏi ôn tập .......................................................................................200
7.3.2. Bài tập thực hành ..................................................................................200
PHỤ LỤC ..................................................................................................208
BÀI TẬP THỰC HÀNH ...........................................................................208
PHẦN KẾT LUẬN – KIẾN NGHỊ ...........................................................216
PHẦN TÀI LIỆU THAM KHẢO .............................................................216

7
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 1: GIỚI THIỆU VỀ HỆ QUẢN TRỊ SQL SERVER 2019


Mục tiêu chƣơng 1: Trong chƣơng này, tr nh bày một cách khái quát về
hệ quản trị cơ sở dữ liệu Microsoft SQL Server. Các chức năng mà một hệ
quản trị cơ sở dữ liệu cần phải có. Nội dung chính củ chƣơng này gồm:
- Giới thiệu hệ quản trị cơ sở dữ liệu Microsoft SQL Server 2019.
- Các thành phần của Microsoft SQL Server 2019
- Mô hình Microsoft SQL Server 2019
- Giới thiệu các ấn bản của SQL Server 2019
- Hƣớng dẫn cài đặt MS SQL Server phiên bản 2019 ấn bản Express
Edition.
1.2. Tổng quan về Hệ quản trị CSDL SQL Server 2019
1.2.1. Giới thiệu SQL Server

Hình 1-1: Mô hình SQL Server


Microsoft SQL Server là một lo i phần mềm đƣợc phát triển bởi
Microsoft, nó là một hệ quản l cơ sở dữ liệu quan hệ đối tƣợng (Relational
Database Management System - RDBMS) có chức năng chính là lƣu trữ, truy
xuất dữ liệu và thông qua câu lệnh SQL nó có thể tr o đổi dữ liệu với các ứng
dụng tr n máy Client. Trong m i trƣờng Client/Server cơ sở dữ liệu đƣợc lƣu
tr n máy Server, ngƣời dùng truy cập dữ liệu từ các máy Client qua một hệ
thống m ng.
SQL Server hỗ trợ nhiều chức năng quản trị dữ liệu trên môi trƣờng
nhiều ngƣời dùng theo kiểu Client/Server. SQL Server chịu trách nhiệm đáp
ứng các yêu cầu truy cập dữ liệu từ các máy Client, xử lý và chuyển kết quả
về cho máy Server. SQL Server có một hệ thống bảo mật nhiều cấp giúp cho
việc quản lý và bảo mật dữ liệu thuận tiện và chặt chẽ.
8
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

SQL Server có một số đặc tính sau:


Cho phép quản trị một hệ CSDL lớn, có tốc độ xử lý dữ liệu nh nh đáp
ứng yêu cầu về thời gian.
Cho phép nhiều ngƣời cùng khai thác trong một thời điểm đối với một
CSDL (tối đ 30000 user).
Có hệ thống phân quyền bảo mật tƣơng thích với hệ thống bảo mật của
công nghệ NT (Network Technology), tích hợp với hệ thống bảo mật của
Windows NT hoặc sử dụng hệ thống bảo mật độc lập của SQL Server.
Hỗ trợ trong việc triển khai CSDL phân tán và phát triển ứng dụng trên
Internet.
Cho phép lập trình kết nối với nhiều ngôn ngữ lập tr nh khác dùng để
xây dựng các ứng dụng (Visual Basic, C, C++, C#, ASP, ASP.NET,
XML,...).
Sử dụng câu lệnh truy vấn dữ liệu Transact-SQL: là ngôn ngữ SQL mở
rộng dựa trên SQL chuẩn của ISO (International Organization for
Standardization) và ANSI (American National Standards Institute).
SQL Server có khả năng cung cấp đầy đủ các công cụ cho việc quản lý
từ giao diện GUI đến sử dụng ngôn ngữ cho việc truy vấn SQL.
Cụ thể nhƣ s u:
T-SQL là một trong những lo i ngôn ngữ thuộc quyền sở hữu của
Microsoft và đƣợc gọi với cái tên Transact-SQL. Nó thƣờng cung cấp thêm
rất nhiều cho các khả năng kh i báo biến, thủ tục lƣu trữ và xử lý ngo i lệ,...
SQL Server Management Studio là một lo i công cụ giao diện chính cho
máy chủ cơ sở của chính dữ liệu SQL, th ng thƣờng thì nó hỗ trợ cho cả môi
trƣờng 64 bit và 32 bit.
SQL Server đƣợc tối ƣu để có thể ch y tr n m i trƣờng cơ sở dữ liệu rất
lớn (Very L rge D t b se Environment) l n đến Tera-Byte và có thể phục vụ
cùng l c cho hàng ngàn ngƣời sử dụng (user). SQL Server có thể kết hợp ăn
ý" với các server khác nhƣ Microsoft Internet Inform tion Server (IIS), E-
Commerce Server, Proxy Server....
SQL Server có các ƣu điểm sau:
 Mở rộng khả năng quản l dữ liệu của doanh nghiệp.
9
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Cải thiện hiệu quả làm việc của lập trình viên.
 Hỗ trợ xữ lý thông minh các giao tác.
 Các chức năng hỗ trợ phân quyền bảo mật.
SQL Server 2019 là bộ phận quản l cơ sở dữ liệu, đƣợc xây dựng dựa
trên khái niệm trí tuệ nhân t o nhằm t o điều kiện thuận lợi, cải tiến dịch vụ
cơ sở dữ liệu, bảo mật và giảm bớt các khó khăn gặp phải khi phát triển các
ứng dụng và lƣu trữ dữ liệu.
SQL Server 2019 đƣợc tích hợp với Cloud, điều này đồng nghĩ các tổ
chức có thể hƣởng lợi từ tính năng bảo mật cao, vừ đồng bộ đƣợc dữ liệu
trên nhiều máy tính và các thiết bị hiện đ i khác.
SQL Server 2019 t o ra nền tảng dữ liệu hợp nhất đi kèm với Hệ thống
tệp phân tán Ap che Sp rk và H doop (HDFS) để trở n n th ng minh hơn với
tất cả dữ liệu.
1.2.2. Các thành phần của SQL Server 2019

Các thành cơ bản trong SQL Server gồm có: Reporting Services,
Database Engine, Integration Services, Notification Services, Full Text
Se rch Service,… Tất cả kết hợp với nhau t o thành một giải pháp hoàn ch nh
giúp cho việc phân tích và lƣu trữ dữ liệu trở nên dễ dàng hơn.
1. D t b se Engine: Đây là phần lõi của SQL Server nó có chức năng
chứa dữ liệu dƣới d ng các bảng và hỗ trợ các kết nối đến CSDL. Ngoài ra,
nó còn có khả năng tự điều ch nh ví dụ: trả l i tài nguyên cho hệ điều hành
khi một user log off và yêu cầu thêm các tài nguyên của máy khi cần.
2. Integration Services: là tập hợp các đối tƣợng lập trình và các công cụ
đồ họa cho việc sao chép, di chuyển và chuyển đổi dữ liệu. Khi làm việc trong
một công ty lớn thì dữ liệu đƣợc lƣu trữ ở nhiều nơi khác nh u nhƣ đƣợc chứa
trong: Or cle, SQL Server, DB2, Microsoft Access,… và chắc chắn sẽ có nhu
cầu di chuyển dữ liệu giữa các server này. Ngoài ra, việc muốn định d ng dữ
liệu trƣớc khi lƣu vào d t b se, Integration Services sẽ giúp giải quyết đƣợc
công việc này dễ dàng.
3. An lysis Services: Đây là một dịch vụ phân tích dữ liệu của
Microsoft. Công cụ này giúp việc phân tích dữ liệu một cách hiệu quả và dễ
dàng bằng cách dùng kỹ thuật khai thác dữ liệu – datamining và khái niệm
hình khối nhiều chiều – multi dimendion cubes.
10
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4. Notification Services: Dịch vụ thông báo này là nền tảng cho sự phát
triển và triển khai các ứng dụng so n và gửi th ng báo đến hàng ngàn ngƣời
đăng k sử dụng trên nhiều lo i thiết bị khác nhau.
5. Reporting Services: là một công cụ t o, quản lý và triển khai báo cáo
trên server và client. Ngoài ra, nó còn là nền tảng cho việc phát triển và xây
dựng các ứng dụng báo cáo.
6. Full Text Search Service: là một thành phần đặc biệt trong việc truy
vấn và đánh ch mục dữ liệu văn bản không cấu tr c đƣợc lƣu trữ trong các cơ
sở dữ liệu SQL Server.
7. Service Broker: là dịch vụ cân bằng tải cho SQL Server. Nó giúp cho
CSDL thực hiện đƣợc nhiều thao tác với dữ liệu bằng cách dùng hàng đợi lƣu
dữ liệu t m thời.

Hình 1-2: Các thành phần của SQL Server


1.2.3. Mô hình chung của SQL Server

SQL Server là hệ quản trị CSDL ho t động theo mô hình Client/Server,


có thể thực hiện tr o đổi dữ liệu theo nhiều mô hình m ng khác nhau, nhiều
giao thức và phƣơng thức truyền tin khác nhau.

Hình 1-3: Mô hình SQL Server trên hệ thống mạng


11
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Trong sơ đồ trên thể hiện ba kiểu kết nối ứng dụng đến SQL Server:
Kết nối trên Desktop: Có thể kết nối trên cùng máy chủ chứa CSDL SQL
Server hoặc kết nối qua m ng nội bộ.
Kết nối qua m ng diện rộng: Th ng qu đƣờng truyền m ng diện rộng
kết nối đến máy chủ CSDL SQL Server.
Kết nối qua m ng Internet: Các ứng dụng kết nối thông qua Internet, sử
dụng dịch vụ webserver IIS thực hiện ứng dụng trên Internet (ASP, JSP,
ASP.net,…)
1.2.3.1. Kết nối trên Desktop

Tr n Desktop m h nh SQL Server đƣợc thể hiện nhƣ s u:

Hình 1-4: Mô hình SQL Server trên Desktop


Trên một Desktop có thể có nhiều ứng dụng, mỗi ứng dụng có thể thực
hiện thao tác với nhiều CSDL.
1.2.3.2. Kết nối qua mạng diện rộng theo mô hình Client/Server

Trong mô hình client/server, ứng dụng tr o đổi với SQL Server theo sơ
đồ sau:

Hình 1-5: Mô hình Client/Server của SQL Server

12
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Nhƣ sơ đồ trên nhận thấy SQL Server cho phép các ứng dụng kết nối
theo các phƣơng thức sau: OLE DB, ODBC, DB-Library, Embedded SQL,
đây là các phƣơng thức kết nối hữu ích cho những nhà phát triển ứng dụng.
Chi tiết hơn t có sơ đồ sau:

Hình 1-6: Mô hình trao đổi dữ liệu với các ứng dụng
Trong sơ đồ trên cho thấy, SQL Server có thể thực hiện tr o đổi dữ liệu
với các ứng dụng theo nhiều giao thức truyền tin khác nhau (TCP/IP,
NetBeUI, N mes Pipes,…), các ứng dụng có thể sử dụng nhiều phƣơng thức
kết nối khác nhau (OLE DB, ODBC, DB-Library).
1.2.3.3. Kết nối ứng dụng trên mạng Internet

Các ứng dụng kết nối với SQL Server trên m ng Internet, các máy chủ
SQL Server sẽ đƣợc quản lý thông qua các hệ thống máy chủ m ng, hệ điều
hành m ng, các ứng dụng (COM+, ASP, IIS) sẽ thông qua máy chủ m ng kết
nối đến SQL Server, mô hình này có thể áp dụng cho các m ng nội bộ, diện
rộng, ứng dụng đƣợc khai thác trên trình duyệt Internet. Xem xét mô hình
dƣới đây:

Hình 1-7:Mô hình kết nối các ứng dụng

13
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

1.2.4. Các loại CSDL có trong hệ quản trị CSDL SQL Server 2019

SQL Server hỗ trợ các lo i CSDL sau:


1. Database system ( CSDL hệ thống):
CSDL hệ thống ( system database) là lo i CSDL đƣợc t o bởi SQL
Server, nó dùng để lƣu trữ các th ng tin về chính bản thân SQL Server
th ng tin về các CSDL do ngƣời dùng định nghĩ . SQL Server cung cấp các
CSDL hệ thống s u:
M ster: Lƣu các th ng tin của hệ thống của SQL Server.
Msdb: Đƣợc dùng bởi SQL Server để lƣu các th ng tin cảnh báo.
Resource: Là một CSDL ch đọc. Nó chứ các đối tƣợng hệ thống của
SQL Server.
Tempdb: Lƣu giữ các đối tƣợng t m các kết quả trung gi n.
2. Database Snapshots (CSDL Snapshots)
D t b se sn pshot là tính năng đƣợc giới thiệu từ SQL Server 2015.
Tính năng này cung cấp khả năng re d-only, sticview cho database SQL. Nếu
ngƣời dùng thao tác, ch y lệnh sai khiến database gặp lỗi, source database sẽ
chuyển đổi l i tr ng thái khi sn pshot đƣợc t o ra. SQL Server Management
Studio (SSMS) không hỗ trợ t o snapshot mà buộc phải sử dụng câu lệnh T-
SQL làm việc này.
Ƣu điểm của snapshot:
 Cung cấp phiên bản copy của dữ liệu một cách thuận tiện và read-
only
 Khi đƣợc truy vấn, không bị suy giảm hiệu suất
 Snapshot file nhẹ và khởi t o nhanh
 Nhƣợc điểm của snapshot:
 Không thể t o snapshot backup
 Snapshot phải tồn t i tr n cùng d t b se server nhƣ là source của
dataabase
 Ngƣời dùng mới không thể đƣợc gán quyền truy cập dữ liệu trong
snapshot

14
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3. User-defined database (CSDL do ngƣời dùng định nghĩ )


CSDL do ngƣời dùng định nghĩ (user defined database) là lo i CSDL
do ngƣời dùng t o r . Ch ng lƣu trữ các th ng tin c ng nhƣ dữ liệu củ ngƣời
sử dụng.
1.2.5. Các đặc điểm của hệ quản trị CSDL SQL Server 2019

Microsoft SQL Server có các đặc điểm sau:


Dễ cài đặt (Easy Installation): SQL Server cung cấp các công cụ quản trị
và phát triển để cho ngƣời sử dụng dễ dàng cài đặt, sử dụng và quản l hệ
thống.
Tích hợp với Internet (Integr tion with Internet): SQL Server hỗ trợ kiểu
dữ liệu XML, là một kiểu dữ liệu, một chuẩn trong việc tr o đổi dữ liệu trên
Internet.
Khả năng mở rộng c o: SQL Server đƣợc tối ƣu để có thể ch y tr n m i
trƣờng cơ sở dữ liệu rất lớn (Very L rge D t b se Environment) l n đến
Tera- Byte và có thể phục vụ cùng l c cho hàng ngàn ngƣời sử dụng.
Hỗ trợ kiến tr c Client/Server: Ứng dụng có thể ch y trên máy khách
(máy Client), truy cập dữ liệu đƣợc lƣu trữ trên chủ (máy Server). Server có
nhiệm vụ xử lý các yêu cầu và trả l i kết quả cho Client.
Tƣơng thích với nhiều hệ điều hành (Oper ting System Comp tibility):
Có thể cài đặt trên hầu hết các hệ điều hành từ windows 7 trở lên. Đối với
SQL Server 2019 hỗ trợ cả windowns và Linux
Ngoài r , SQL Server còn hỗ trợ một số đặc tính khác nhƣ hỗ trợ c ng
cụ English Query để ngƣời phát triển hệ thống có thể truy vấn dữ liệu thân
thiện hơn; cung cấp dịch vụ Microsoft Search Services có khả năng t m kiếm
rất m nh, đặc biệt thích hợp cho phát triển ứng dụng Web; SQL Server tƣơng
tích với ngôn ngữ SQL chuẩn (ANSI/ISO SQL-92); có công cụ hỗ trợ s o lƣu
dữ liệu nh nh chóng, tự động; Có tài liệu hƣớng dẫn trực tuyến. Kiến trúc một
CSDL theo HQT CSDL SQL Server
1.2.6. Hệ thống tập tin

Trong SQL Server, mọi CSDL đƣợc lƣu trữ thông qua một nhóm các file (tập
tin). Các CSDL riêng biệt có các file riêng củ ch ng và các th ng tin về dữ liệu
th ng tin về nhật k th o tác (log) đƣợc lƣu trong các file khác nh u.

15
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-8: Hệ thống tập tin trong SQL Server


Có 3 lo i file của một CSDL torng SQL Server:
File dữ liệu chính (Primary data files): Chứa thông tin hệ thống và một
số đối tƣợng chính của database. Mọi dữ liệu củ CSDL đƣợc chứ trong file
này. Mỗi CSDL ch có 1 file dữ liệu chính có phần mở rộng th ng thƣờng là
*.MDF.
File dữ liệu dự phòng (Second ry d t files): File dự phòng chứ dữ liệu
dự phòng khi File dữ liệu chính gặp sự cố. File này do ngƣời dùng t o thêm
(nếu cần). Đối với các CSDL lớn không chứ đủ trên một ổ đĩ , khi đó cần có
các file phụ lƣu tr n các ổ đĩ khác. Các file dữ liệu phụ tiếp theo nên có phần
mở rộng là NDF để phân biệt.
Các file dữ liệu đƣợc lƣu theo từng nhóm (File Groups). Mỗi CSDL có
một nhóm file chính (PRIMARY) chứa file dữ liệu chính và một số file dữ
liệu phụ.
File log (Log files): File log chứ tất cả các th ng tin về nhật ký làm việc
c ng nhƣ tất cả các th ng tin cần thiết cho việc phục hồi CSDL. Có ít nhất
một file log cho mỗi CSDL. File log có phần mở rộng là .ldf.
1.2.7. Các đối tƣợng bên trong của SQL Server

STT Đối tƣợng M tả


Bảng trong CSDL lƣu trữ dữ liệu dƣới d ng một tập
1. Table
các hàng các cột.
Ch định các kiểu dữ liệu đƣợc lƣu trữ trong các cột
2. Data Type
dữ liệu, th m số và các biến.

16
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Views đƣợc t o r bằng các sử dụng câu lệnh


3. View SELECT, nó dùng để t o r nhƣng góc nh n khác
nh u củ cùng một tập dữ liệu.
Là một tập hợp các phát biểu SQL đƣợc bi n dịch
Store trƣớc đƣợc lƣu l i dƣới một cái t n, các lần sử
4.
procedure dụng s u ch cần cung cấp t n củ Stored Procedure,
SP là một đơn vị xử l trong CSDL.
Hàm là một đo n code nó thực hiện một tác vụ cụ
5. Function
thể.
Là một đối tƣợng trong CSDL cung cấp cơ chế truy
6. Index cập nh nh vào dữ liệu trong bảng dự tr n các khó
đã đƣợc đánh ch mục củ nó.
Là một thuộc tính có thể đƣợc thiết lập tr n một cột
7. Constraint hoặc một tập các cột trong bảng để đảm bảo tính
toàn vẹn dữ liệu.
Là một d ng SP đặc biệt, nó đƣợc gọi thực thi một
8. Trigger cách tự động khi có một sự kiện nào đó xảy r tr n
bảng dữ liệu (th m/ xó / sử / ... dữ
Mỗi ngƣời sử dụng phải có một định d nh đăng
nhập để kết nối vào SQL Server. SQL Server chấp
nhận 2 cơ chế đăng nhập: Đăng nhậpth ng qu tài
9. Login
khoản củ Windows (Windows Authentic tion) và
Đăng nhập th ng qu tài khoản củ SQL Server
(SQL Server Authentication).
Tài khoản ngƣời dùng định d nh một ngƣời dùng
trong CSDL. Tất cả các quyền th o tác và quyền sở
10. User
hữu các đối tƣợng trong CSDL đƣợc điều khiển bởi
tài khoản ngƣời dùng.
Đƣợc dùng để chi các ngƣời dùng thành các nhóm
và áp dụng các phân quyền giống nh u l n nhóm
11. Role này. Các quyền củ nhóm sẽ đƣợc áp dụng tự động
khi có một ngƣời dùng mới trở thành thành vi n củ
nhóm

Bảng 1: Các đối tƣợng SQL Server quản lý.

17
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

1.3. Các ấn bản của SQL Server 2019


SQL Server 2019 cung cấp một nền tảng cơ sở dữ liệu bảo mật, hiệu suất
cao và thông minh cho dữ liệu doanh nghiệp. SQL Server 2019 có 3 phiên
bản chính gồm SQL Server 2019 Express, Standard và Enterprise
1. SQL Server 2019 Standard
Phiên bản d t b se đầy đủ tính năng với Big Data Cluster cho các ứng
dụng tầm trung và kho dữ liệu
Các tính năng chính:
 Hỗ trợ CPU tới 24 core
 Hỗ trợ tới 128GB RAM
 SQL Server 2019 Big Data Cluster
 Trực quan dữ liệu qua PolyBase
 Tăng cƣờng hiệu suất bộ nhớ trong
 Tự động điều ch nh database thông minh
 Azure Data Studio có hỗ trợ notebook
2. SQL Server 2019 Enterprise
Phiên bản database cao cấp với hiệu năng và trí th ng minh hàng đầu
cho các ứng dụng quan trọng
Các tính năng chính:
 Không giới h n số core CPU
 Không giới h n số RAM
 Hiệu năng và độ ổn định hàng đầu
 Nhiều lợi ích cho ảo hóa
 Kho dữ liệu tới quy mô hàng petabyte
 Tính khả dụng cao trên Windows và Linux
 Chi phí sở hữu thấp
 Kết nối với Power BI Report Server.
4. SQL Server 2019 Express

18
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Phiên bản database miễn phí, gọn nhẹ dành cho việc xây dựng các web
nhỏ và ứng dụng di động
Các tính năng chính:
 Hỗ trợ tới CPU 4 core
 Hỗ trợ tới 1 GB RAM
 Bộ nhớ tích hợp OLTP và Cloumnstore
 Mã hó đầu cuối với các lớp vỏ bảo mật
 Đầy đủ vùng bề mặt T-SQL
 Hỗ trợ các container Linux và Windows
 Hỗ trợ giải mã UTF-8
 Phân lo i và kiểm tra dữ liệu
Ngoài các ấn bản tr n, Microsoft c ng có 2 ấn bản SQL Server khác,
gồm:
SQL Server 2019 Web: Ấn bản web này là tùy chọn chi phí thấp cho các
máy chủ lƣu trữ web và VAP Web để cung cấp khả năng mở rộng, chi phí
thấp và khả năng quản trị cho các web quy mô nhỏ tới lớn.
SQL Server 2019 Developer: Ấn bản dành cho các lập trình viên xây
dựng mọi lo i ứng dụng trên SQL Server. Nó gồm tất cả các tính năng của
bản Enterprise. Tuy nhiên bản quyền ch sử dụng cho hệ thống dev/test,
không phải máy chủ cho sản phẩm. Phiên bản SQl Server 2019 Developer
hoàn toàn miễn phí.
1.4. Giới thiệu về cài đặt MS SQL Server phiên bản 2019
SQL Server 2019 là nền tảng quản l cơ sở dữ liệu hàng đầu trong ngành
củ Microsoft, đã đƣợc công ty phát hành vào ngày 4/11/2019. SQL Server
2019 cung cấp nhiều cải tiến khác nhau cho công cụ cơ sở dữ liệu cốt lõi và
tích hợp với một số nền tảng Big D t nhƣ Ap che Sp rk, D t L ke, H doop
Distributed File System (HDFS), học máy... Bản phát hành này đƣợc coi là
một bƣớc nhảy vọt trong việc tích hợp cơ sở dữ liệu với các tính năng và c ng
nghệ thú vị khác.

19
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Chúng ta có thể cài đặt SQL Server 2019 trên Windows, Linux hay
Docker container và trong giáo trình này sẽ hƣớng dẫn cách cài đặt SQL
Server 2019 trên Windows.
1.4.1. Các yêu cầu về hệ thống

Để cài đặt Microsoft SQL Server 2019 hệ thống cần những yêu cầu sau:
Os : Windows 7 (32 bit hoặc 64 bit) trở lên.
CPU : Pentium IV trở lên.
Ram : Ít nhất 1GB.
Ổ đĩ trống: Ít nhất 10GB.
. NET Framework: Phiên bản 3.5 SP1 .
 Lƣu trƣớc khi cài đặt SQL SERVER
Trƣớc khi cài đặt Microsoft SQL Server cần chú ý:
- Cài SQL Server trƣớc khi cài Microsoft Visual Studio để tránh xung
đột.
- Phải cài .Net Framework 3.5 trƣớc khi mở file cài đặt SQL Server để
tránh bị lỗi.
- Phải cài SQL Server 2019 trƣớc khi cài Red Gate SQL(SQL
Toolbelt).
1.4.2. Các bƣớc cài đặt

1.4.2.1. Cài đặt Microsoft SQL Server 2019 Express.

Bƣớc 1: Tải Microsoft SQL Server 2019 Express:


Có thể vào đƣờng dẫn s u để tải Microsoft SQL Server 2019 Express.
https://www.microsoft.com/en-us/sql-server/sql-server-downloads )
Bƣớc 2: T m đến Express edition of SQL Server 2019 và
chọn Download now

20
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-9: Download SQL Server 2019 Express


Bƣớc 3: Sau khi hoàn thành tải xuống, chọn file SQL2019-SSEI-
Expr.exe và nhấn Open

Hình 1-10: Mở SQL Server 2019 Express


Bƣớc 4: T i cửa sổ cài đặt SQL Server 2019, chọn Basic

Hình 1-11: Cửa sổ cài đặt SQL Server 2019


Bƣớc 5: Chọn Accept.

21
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-12: Cửa sổ đồng ý các điều khoản khi cài đặt
Bƣớc 6: Lựa chọn địa ch lƣu file, s u đó chọn Install

Hình 1-13: Chọn địa chỉ lưu file


Chờ để quá tr nh cài đặt hoàn tất.
1.4.2.2. Cài đặt SQL Server Management Studio(SSMS)

Sau khi cài đặt SQL Server 2019 Express thành công, chọn Install SQL
Server Management Studio (SSMS ) hoặc chọn Close và truy cập trang
web:
https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-
management-studio-ssms?view=sql-serverver15 để tiếp tục cài đặt SSMS

22
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-14: Chọn Install SSMS


- T m đến mục Download SSMS, tải từ link nhƣ hình.

Hình 1-15: Dowload SSMS


- Sau khi tải về, mở file chọn Install

Hình 1-16: Cài đặt SSMS


- Chờ cho tới khi việc cài đặt hoàn tất. Và restart l i máy tính sau khi cài
đặt hoàn tất.

23
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-17: Hoàn tất cải đặt SQL Server Management Studio
1.4.2.3. Cấu hình SQL Server Express 2019

- Vào Microsoft SQL Server 2019 nhƣ h nh s u:

Hình 1-18: SQL Server Express 2019


Vào chức năng SQL Server Configur tion M n gement để cấu hình
SQL Server

Hình 1-19: Cấu hình SQL Server Configuration Management

24
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Chức năng này cho phép cấu h nh để có thể từ một máy tính khác truy
cập vào SQL Server thông qua IP hoặc Server name.

Hình 1-20: Cửa sổ cấu hình SQL Server Configuration Management


Chuyển chế độ Start service sang Automatic (tự động)

Hình 1-21: Chuyển chế độ Start service sang Automatic


- Chọn T b Logon, s u đó nhấn Start, để khởi động dịch vụ:

25
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-22:Khởi động dịch vụ


- Tiếp theo bật TPC/IP cho phép máy tính khác kết nối vào SQL Server
thông qua IP.

Hình 1-23: Bật TCP/IP


- Tƣơng tự bật: Named Pipes, cho phép máy tính khác kết nối vào SQL
Server thông qua Server name.

26
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 1-24: Named Pipes


Tiếp theo, đảm bảo rằng SQL Server đ ng ch y dƣới chế độ Network
Service.

Hình 1-25: SQL Server đ ng ch y dƣới chế độ Network Service.

- Sau khi cấu hình xong, restart l i service của SQL Server.

Hình 1-26: Restart l i service của SQL Server.


- Hoàn tất quá trình cấu hình.

27
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 2: CÁC THAO TÁC CƠ BẢN TRONG SQL SERVER


Mục ti u chƣơng 2:
Trong chƣơng này ch ng t sẽ tìm hiểu những kiến thức li n qu n đến
các th o tác cơ bản trong SQL Server nhƣ:
- Đăng nhập vào SQL Server, T o, xóa csdl, t o, xóa các bản dữ liệu, mở
cửa sổ viết câu truy vấn
- S o lƣu và phục hồi dữ liệu
- Các kiểu dữ liệu trong SQL server
2.1. Các kiểu dữ liệu trong SQL Server
2.1.1. Các kiểu dữ liệu ký tự

 Char(n): Kiểu chuỗI có độ dàI cố định là n k tự và kh ng hỗ trợ


Unicode
 Nchar(n): Kiểu chuỗi có độ cố định là n k tự và có hỗ trợ
Unicode
 Varchar(n): Kiểu chuỗi có độ dài th y đổi, có tối đ là n k tự và
kh ng hỗ trợ Unicode
 Nvarchar(n): Kiểu chuỗi có độ dài th y đổi, có tối đ là n k tự và
có hỗ trợ
 Unicode
 Text: Dữ liệu kiếu chuỗi với độ dài lớn và kh ng hỗ trợ Unicode
(tối đ 2,147,483,647 k tự)
 Ntext: Dữ liệu kiếu chuỗi với độ dài lớn và có hỗ trợ UNICODE
(tối đ 1,073,741,823 k tự)
2.1.2. Các kiểu dữ liệu kiểu số

 Tinyint: Số nguy n có giá trị từ 0 đến 255.


 Sm llint: Số nguy n có giá trị từ -215 đến 215 – 1
 Int: Số nguy n có giá trị từ -231 đến 231 - 1
 Bigint: Số nguy n có giá trị từ -263 đến 263-1
 Numeric: Kiểu số vớI độ chính xác cố định.
28
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Decim l(n, m): Tƣơng tự kiểu Numeric nhƣng cho phép ch ng t


ch định số chữ số (n) và số chữ số l (m)
 Re l: Số thực có giá trị từ -3.40E+38 đến 3.40E+38
 Flo t: Số thực có giá trị từ -1.79E+308 đến 1.79E+308
 Money: Kiểu tiền tệ
2.1.3. Các kiểu dữ liệu ngày tháng

 Smalldatetime: Kiểu ngày giờ (chính xác đến ph t)


 Datetime: Kiểu ngày giờ (chính xác đến phần trăm củ giây)
2.1.4. Kiểu dữ liệu luận lý

 Bit: Là kiểu dữ liệu d ng luận l , ch nhận h i giá trị là 0 hoặc 1,


tƣơng ứng với true và false.
2.1.5. Các kiểu dữ liệu dạng nhị phân

 Binary: Dữ liệu nhị phân với độ dài cố định (tối đ 8000bytes)


 Varbinary: Dữ liệu nhị phân với độ dài th y đổi (tối đ 8000
bytes)
 Image: Dữ liệu nhị phân với độ dài th y đổi (tối đ
2,147,483,647bytes)
2.2. Các thao tác cơ bản trên giao diện ngƣời dùng (UI) của SQL Server
2.2.1. Đăng nhập vào SQL Server.

S u khi cài đặt thành c ng, SQL Server mặc định nằm trong mục
Microsoft SQL Server trong mục Progr m Files. Ch ng t kích vào biểu
tƣợng SQL Server M n gement Studio Express để khởi động SQL Server
nhƣ h nh s u:

29
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-1: Khởi động SQL


S u đó, sẽ xuất hiện cửa sổ Connect nhƣ s u:
Trong cửa sổ này, trong phần Servername, phải chọn đ ng t n
servern me nhƣ đã cài đặt và trong phần xác thực thì có 2 chế độ xác thực:
+ Xác thực theo Windows thì chọn windows Authentication
+ Xác thực theoSQL Server thì chọn SQL Server Authentication và yêu
cầu nhập đ ng login và p sswword
Để đăng nhập, ch ng t có thể chọn Windows Authentication hoặc SQL
Server Authentic tion trong Authentic tion, việc chọn chế độ đăng nhập
này còn phụ thuộc vào việc thiết lập tài khoản đăng nhập khi ch ng t cài đặt
SQL Server. Nếu chọn SQL Server Authentic tion th phải nhập p ssword.
P ssword này đƣợc thiết lập trong quá tr nh cài đặt SQL Server Express
Edition.

Hình 2-2: Kết nối SQL Server


Giao diện s u khi đăng nhập thành c ng:

30
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-3: Giao diện đăng nhập


2.2.2. Tạo, xóa CSDL

Để t o CSDL mới, ch ng t kích chuột phải vào mục D t b ses, s u đó


chọn New D t b se..., nhƣ h nh s u:

Hình 2-4: Cửa sổ tạo CSDL


S u đó hộp tho i t o Database sẽ xuất hiện, t i đây ch ng t sẽ:
Đặt tên Database t i Database name, ví dụ đ ng t o Cơ sở dữ liệu để
quản l sinh vi n và đặt tên Database là QLSV.
Th y đổi kích thƣớc khởi t o, kích thƣớc gi tăng, kích thƣớc tối đ cho
Database.
Có thể thiết lập l i đƣờng dẫn lƣu file D t b se, nếu kh ng th D t b se
đƣợc lƣu theo đƣờng dẫn mặc định.
S u đó click OK để kết thúc quá trình t o Database.

31
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-5: Kết thúc quá trình tạo Database


Kết quả ta t o đƣợc D t b se nhƣ s u, trong trƣờng hợp chƣ thấy tên
CSDL vừa t o thì chúng ta có thể làm mới l i hệ thống bằng cách kích chuột
phải vào mục d t b se s u đó chọn refresh.

Hình 2-6: Kết quả tạo được Database


2.2.3. Cơ sở dữ liệu minh họa

Cơ sở dữ diệu QLSINHVIEN- quản l điểm sinh viên củ Trƣờng ĐH


Quảng N m đƣợc sử dụng làm ví dụ xuyên suốt trong giáo trình
2.2.4. Tạo bảng dữ liệu mới và các thuộc tính

32
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-7: Cơ sở dữ liệu QLSV


Sau khi t o D t b se, ch ng t kích vào dấu cộng trƣớc t n D t b se để
bung cây phân cấp quản l các đối tƣợng trong CSDL, kích chuột phải l n
mục Tables, chọn New Table...

Hình 2-8: Cửa sổ tạo bảng


Cử sổ để t o cấu tr c củ bảng dữ liệu nhƣ h nh s u:

33
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-9: Cửa sổ để tạo cấu tr c của ảng ữ liệu


Trong đó:
Column N me: T n trƣờng thuộc tính trong bảng.
Data Type: Kiểu dữ liệu củ các trƣờng thuộc tính ( sẽ giới thiệu trong
mục KIỂU DỮ LIỆU TRONG SQL)
Allow Nulls: Trƣờng thuộc tính có nhận giá trị Null (Rỗng) hay không.
M i t n b n trái thể hiện Record hiện hành mà ch ng t đ ng ch nh sửa.
Bảng Column Properties có chứa các yếu tố tƣơng ứng mà chúng ta có thể
ch nh sử ri ng cho Record đó.
Trong bảng sẽ có ít nhất một thuộc tính làm khó chính (prim ry key).
Thuộc tính làm khó chính sẽ có biểu tƣợng ch khó trƣớc t n thuộc tính.
Để chọn một hoặc một số thuộc tính nào đó làm khó chính th chọn các
thuộc tính đó, kích chuột phải chọn Set Primary Key
S u đó lƣu bảng vừa t o bằng cách nhấn Biểu tƣợng SAVE hoặc phím
tắt Ctrl + S. Cửa sổ Choose Name hiển thị. Nhập tên Table nhấn Ok

Hình 2-10: Cửa sổ lưu tên ảng dữ liệu

34
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.2.5. Xóa, sửa bảng

2.2.5.1. Xóa ảng

Click chuột phải l n bảng h y CSDL muốn xó , chọn Delete

Hình 2-11: Xóa table


S u đó kích n t OK.

Hình 2-12: Chọn cs l để xóa.


Trong trƣờng hợp xó một CSDL, n n chọn dấu tích vào mục Close
existing connections. Khi đó SQL Server sẽ ngắt tất cả các kết nối vào CSDL
này và việc xó sẽ kh ng gây báo lỗi.

35
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.2.5.2. Sửa bảng

Để sử đổi bảng, t i tên bảng cần sử đổi, kích chuột phải chọn
Design. Cửa sổ design xuất hiện nhƣ cửa sổ t o bảng b n đầu, sau khi sửa ta
lƣu l i l i bảng.
Chú ý: Mặc định của SQL Server là không cho phép ch nh sửa nên
trong trƣờng hợp lƣu l i sau khi ch nh sửa thì sẽ xuất hiện hộp thoài nhƣ s u:

Hình 2-13: Cửa sổ lỗi SQL Server là không cho phép chỉnh sửa
Cách khắc phục nhƣ s u:
Từ giao diện Sql server management các vào Menu Tools chọn Options
S u đó, gi o diện options sẽ hiện thị nhƣ h nh b n dƣới:
Trong hộp tho i Options - Chọn Desingers--> Table and Database
Designers
Bỏ chọn Prevent saving changes that require table re-creation, nhấn OK để
hoàn tất.

36
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-14: Cửa sổ Table and Database Designers


2.2.6. Tạo database Diagram (mô hình CSDL)

Nhấp chọn CSDL cần t o Diagram, t i Database Diagram, kích chuột


phải chọn New Database Diagram, xuất hiện hộp tho i chứa các bảng cần t o
liên kết nhƣ s u:

Hình 2-15: Cửa sổ tạo Tạo database Diagram


Lần lƣợc chọn bảng, nhấp add, sau khi hoàn tất, sẽ xuất hiện cửa sổ sau:

Hình 2-16: Cửa sổ thêm bảng vào mô hình database Diagram


Thực hiện việc kết nối bằng cách nhấp chuột trái vào bảng chứa khóa
chính, s u đó kéo đến bảng chứa khóa ngo i, hộp tho i sau xuất hiện:
37
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 2-17: Cửa sổ kết nối các bảng trong mô hình database Diagram
Nhấp chọn OK và tiếp tục thực hiện kết nối các bảng còn l i. Sau khi
việc kết nối hoàn tất, thì cửa số Database Diagram sẽ xuất hiện nhƣ s u, t
bấm biểu tƣợng lƣu hoặc cltr+S để lƣu D t b se di gr m tr n.

Hình 2-18: Cửa sổ hoàn tất việc tạo database Diagram


2.2.7. Mở cửa sổ viết câu truy vấn (SQL Editor)

Để mở cử sổ so n thảo câu lệnh SQL, ch ng t kích vào n t New Query


tr n th nh c ng cụ.
Cần ch là câu lệnh SQL sẽ có tác dụng tr n CSDL đ ng đƣợc chọn
gọi là CSDL hiện hành trong hộp chọn. Do đó cần ch lựa chọn Database
38
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

mong muốn trong danh sách xổ xuống trƣớc khi thực thi lệnh trong cửa sổ
viết câu truy vấn.

Hình 2-19: Cửa sổ viết câu truy vấn


2.3. Sao lƣu và phục hồi dữ liệu (Backup and Restore)
S o lƣu ( B ckup) và phục hồi (Restore) dữ liệu trong sql server là một
trong những thao tác quan trọng mà ngƣời quản trị cơ sở dữ liệu phải thực
hiện. Đây là kỹ thuật thƣờng đƣợc sử dụng nhằm bảo đảm an toàn dữ liệu
phòng trƣờng hợp CSDL xảy ra sự cố. Nếu nhƣ th o tác s o lƣu (B ckup
database) đƣợc thực hiện để lƣu dữ liệu và đƣợc thực hiện thƣờng xuyên thì
thao tác phục hồi dữ liệu (Restore database) ch đƣợc thực hiện khi nào máy
chủ bị sự cố nhƣ hƣ ổ cứng hoặc dữ liệu bị mất do ngƣời dùng vô tình hoặc cố
xoá,… Ngoài r th o tác phục hồi dữ liệu c ng đƣợc thực hiện để sao chép
database từ máy chủ này sang máy chủ khác.

Hình 2-20: Mô hình sao lưu và phục hổi dữ liệu

39
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.3.1. Các lý do phải thực hiện Backup

Trong quá tr nh thực hiện quản trị CSDL SQL Server th một số
nguy n nhân s u đây bắt buộc phải xem xét đến kỹ thuật s o lƣu và kh i phục
dữ liệu:
 Thiết bị lƣu trữ (CSDL nằm tr n các thiết bị lƣu trữ này) bị hƣ
hỏng.
 Ngƣời dùng v t nh xó dữ liệu.
 Các hành động v t nh h y cố phá ho i, di chuyển CSDL.
2.3.2. Các loại Backup

Microsoft SQL Server cung cấp h i kỹ thuật s o lƣu CSDL chính, đó là:
full b ckup và differenti l b ckup. Ngoài r , SQL Server còn cung cấp cơ chế
Transaction log backup.
2.3.2.1. Full backup và Differential backup

+ Full b ckup: s o lƣu một bản đầy đủ củ CSDL tr n các phƣơng tiện
lƣu trữ. Quá tr nh full b ckup có thể tiến hành mà kh ng cần offline CSDL,
nhƣng quá tr nh này l i chiếm một lƣợng lớn tài nguy n hệ thống và có thể
ảnh hƣởng nghi m trọng tới thời gi n đáp ứng các y u cầu của hệ thống. V
vậy máy chủ sẽ mất nhiều thời gi n để thực hiện nếu database lớn
+ Differenti l b ckup: đƣợc xây dựng nhằm làm giảm thời gi n cần thiết
để thực hiện quá tr nh full b ckup. Differenti l b ckup ch s o lƣu những th y
đổi tr n dữ liệu kể từ lần full backup gần nhất. Trong những hệ thống CSDL
lớn, quá tr nh differenti l b ckup sẽ sử dụng tài nguy n ít hơn rất nhiều so với
quá tr nh full b ckup và có thể kh ng ảnh hƣởng đến hiệu suất của hệ thống.
+ Quá tr nh differenti l b ckup ch s o lƣu những sự th y đổi của dữ liệu
từ lần full backup gần nhất, do đó khi có sự cố với CSDL nếu kh ng có bản
s o lƣu củ quá tr nh full b ckup th bản s o lƣu của quá tr nh differenti l
b ckup sẽ trở n n v nghĩ .
Ví dụ: C ng ty X thực hiện full b ckup vào cuối ngày thứ 6 hàng tuần và
thực hiện differenti l b ckup vào tối các ngày từ thứ 2 tới thứ 5. Nếu CSDL
có sự cố vào sáng thứ 4, quản trị vi n CSDL sẽ phục hồi dữ liệu bằng bản s o
lƣu củ quá tr nh full b ckup củ ngày thứ 6 tuần trƣớc và s u đó phục hồi

40
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

các th y đổi của dữ liệu bằng cách áp dụng bản s o lƣu củ quá tr nh
differenti l b ckup vào ngày thứ ba.
2.3.2.2. Transaction log backup

Quá tr nh full b ckup và differenti l b ckup chiếm nhiều tài nguy n hệ


thống và ảnh hƣởng đến hiệu suất làm việc hệ thống n n thƣờng đƣợc thực
hiện vào s u giờ làm việc. Tuy nhi n điều này có thể dẫn đến các mất mát dữ
liệu trong một ngày làm việc nếu CSDL có sự cố trƣớc khi quá tr nh s o lƣu
diễn r . Tr ns ction log b ckup là một giải pháp nhằm giảm thiểu tối đ
lƣợng dữ liệu có thể mất khi có sự cố CSDL.
Trong quá tr nh ho t động, SQL Server sử dụng tr ns ction log để theo
d i tất cả các th y đổi tr n CSDL. Log bảo đảm CSDL có thể phục hồi s u
những sự cố đột xuất và c ng đảm bảo ngƣời dùng có thể qu y ngƣợc các kết
quả trong các gi o tác CSDL. Các gi o tác chƣ hoàn thành đƣợc lƣu trong
log trƣớc khi đƣợc lƣu vĩnh viễn trong CSDL.
Tr ns ction log b ckup s o lƣu tr ns ction log củ CSDL vào thiết bị
lƣu trữ. Mỗi khi tr ns ction log đƣợc s o lƣu, SQL Server bỏ đi các
tr ns ction đã thực hiện thành c ng (committed tr cs ction) và ghi các
tr ns ction vào phƣơng tiện s o lƣu. Tr ns ction log b ckup sử dụng tài
nguy n hệ thống ít hơn rất nhiều so với full b ckup và differenti l b ckup, do
đó có thể sử dụng transaction log backup bất kỳ thời gi n nào mà kh ng sợ
ảnh hƣởng đến hiệu suất hệ thống.
Trở l i với ví dụ về c ng ty X. C ng ty này thực hiện full b ckup vào tối
thứ 6 và differenti l b ckup vào tối từ thứ 2 tới thứ 5. C ng ty thực hiện th m
quá tr nh tr ns ction log b ckup mỗi giờ một lần. Giả sử sự cố CSDL xảy r
vào 9h:05 sáng thứ 4. Quá tr nh kh i phục l i CSDL nhƣ s u: Dùng full
backup và differential backup củ tối thứ 6 và tối thứ 3 để phục hồi l i tr ng
thái CSDL vào tối thứ 3. Tuy nhi n quá tr nh này vẫn còn để mất dữ liệu
trong 2 giờ (7 – 9h) sáng thứ 4. Tiếp theo, quản trị vi n CSDL c ng ty X sử
dụng 2 bản s o lƣu tr ns ction b ckup l c 8h và 9h sáng để kh i phục CSDL
về tr ng thái l c 9h sáng thứ 4.
2.3.3. Các thao tác thực hiện quá trình Backup và Restore CSDL trong
SQL Server

2.3.3.1. Sao lưu (Backup)

41
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ch ng t chọn CSDL cần s o lƣu, kích chuột phải chọn Properties, trong
cử sổ Properties, ch ng t thiết lập các th ng số cần thiết cho quá tr nh s o
lƣu. Các bƣớc thực hiện đƣợc minh họ bằng các h nh ảnh s u:

Hình 2-21: Sao lưu ữ liệu

Hình 2-22: Cửa sổ thiết lập các thông số sao lưu ữ liệu
S u khi thiết lập xong, kích n t OK.
Tiếp theo ch ng t tiến hành quá tr nh s o lƣu dữ liệu nhƣ s u:
Ví dụ 2-1: Câu lệnh full backup cơ sở dữ liệu QLSV và lƣu vào
“E:\b ckup” (Lƣu ch ng t phải t o thƣ mục Backup trong ổ đĩ E trƣớc khi
thực thi câu lệnh)

42
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kích chuột phải vào CSDL cần s o lƣu, vào mục Tasks, chọn Backup...
Trong cử sổ B ckup, ch ng t chọn một trong ba lo i b ckup, đó là Full,
Differential hay Transaction Log. Trong mục Destination, chọn B ckup to
Disk, s u đó kích n t Add và chọn đƣờng dẫn nơi lƣu file b ckup, s u đó
nhấn n t OK để hoàn tất quá tr nh B ckup.

Hình 2-23: Cửa sổ tiến hành quá trình sao lưu ữ liệu
Các h nh vẽ s u minh họ quá tr nh b ckup:
Trong trƣờng hợp t i bƣớc 2 của hình trên nếu có nhiều đƣờng dẫn thì ta
remove những đƣờng dẫn kh ng dùng đến.
T i bƣớc 4 chúng ta chọn thƣ mục cần lƣu file b ckup, t i file name gõ
tên file cần backup vào.
S u đó nhấp OK, nếu quá trình backup thành công sẽ báo hộp tho i nhƣ
sau:

Hình 2-24: Kết th c quá trình sao lưu ữ liệu.


43
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.3.3.2. Phục hồi (Restore)

Để phục hồi dữ liệu, chúng ta thực hiện theo các bƣớc sau:
Chọn CSDL cần phục hồi, kích chuột phải, chọn task, chọn Restore,
chọn Database

Hình 2-25: Cửa sổ chọn CSDL để phục hồi.


Xuất hiện hộp tho i sau:

Hình 2-26: Cửa sổ sao lưu.

44
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Chọn Device để mở tập tin s o lƣu nhƣ trong h nh dƣới đây.

Hình 2-27: Cửa sổ mở tập tin sao lưu.


Chọn dd để chọn tập tin đã s o lƣu. S u đó nhấp OK. Chọn CSDL cần
khôi phục và tập tin s o lƣu đã t o trƣớc đó

Hình 2-28: Cửa sổ chọn CSDL cần khôi phục và tập tin s o lƣu
Nhấp OK để bắt đầu quá tr nh s o lƣu. S o lƣu thành c ng sẽ xuất hiện
hộp tho i dƣới đây:

Hình 2-29: Cửa sổ hoàn tất việc sao lưu.

45
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.4. Bài tập chƣơng 2:


2.4.1. Câu hỏi ôn tập

1. Hệ quản trị CSDL quan hệ là gì?


2. SQL Server là gì? các thành phần trong SQL Server?
3. Kiến trúc SQL Server trong hệ thống client/server?
2.4.2. Bài tập thực hành:

1. Bài thực hành số 1


1.1. T o cơ sở dữ liệu Quản lý phòng máy theo cấu trúc sau:
THAM SỐ GIÁ TRỊ
Database name QuanlyPM
Tên logic của data file chính QuanlyPM_data
Tên tập tin và đƣờng dẫn của data
E:\HoTenSV\QuanlyPM_Data.mdf
file chính
Kích cỡ khởi t o của CSDL 10 MB
Kích cỡ tối đ của CSDL 20 MB
Kích thƣớc gia tăng tập tin CSDL 1 MB
Tên logic của transaction log QuanlyPM _Log
Tên tập tin và đƣờng dẫn của
E:\HoTenSV\ QuanlyPM _Log.ldf
transaction log
Kích cỡ khởi t o của
3 MB
transaction log
Kích cỡ tối đ của transaction log 6 MB
Kích thƣớc gi tăng tập tin
1 MB
transaction log
1.2. T o các bảng dữ liệu thuộc CSDL Qu nlyPM nhƣ s u:
Bảng PhongMay

Tên cột Kiểu dữ liệu Ghi chú


Khóa chính, not
MaPhong varchar(20)
null
GhiChu nvarchar(100) Null
Bảng MayTinh

46
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Tên cột Kiểu dữ liệu Ghi chú


MaMay varchar(20) Khóa chính, not null
GhiChu nvarchar(100) null
MaPhong varchar(20) Khóa ngo i, not null
Bảng MonHoc

Tên cột Kiểu dữ liệu Ghi chú


MaMon varchar(20) Khóa chính, not null
TenMon nvarchar(100) Not null
SoGio Int not null
Bảng DangKy

Tên cột Kiểu dữ liệu Ghi chú


Khóa ngo i, not null , khóa chính gồm
MaMon varchar(20)
(MaMon,maphong)
MaPhong varchar(20) Khóa ngo i, Not null
NgayDK Datetime not null
1.3. Nhập dữ liệu cho các bảng trên, mỗi bảng 5 bộ dữ liệu
1.4. T o Database digram cho CSDL trên.
1.5. Thực hiện full, differenti l và log b ckup cho cơ sở dữ
liệu QuanLyPhongMay
Lần 1: Thêm dữ liệu cho bảng MayTinh và thực hiện full backup
MaMay GhiChu MaPhong
m01 TH 601
Lần 2: Thêm dữ liệu cho bảng MayTinh và thực hiện different backup
MaMay GhiChu MaPhong
m02 TH 602
Lần 3: Thêm dữ liệu cho bảng MayTinh và thực hiện log backup
MaMay GhiChu MaPhong
m03 TH 603

47
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

1.6. Giả lập máy tính bị sự cố bằng cách xó CSDL Qu nlyPM, s u đó


thực hiện việc khôi phục dữ liệu cho CSDL QuanlyPM.
2. Bài thực hành số 2:
2.1. T o cơ sở dữ liệu tên QLNV theo cấu tr c nhƣ s u:

THAM SỐ GIÁ TRỊ

Database name QLNV

Tên logic của data file chính QLNV_data

Tên tập tin và đƣờng dẫn file chính E:\HoTenSV\QLNV_Data.mdf

Kích cỡ khởi t o của CSDL 10 MB

Kích cỡ tối đ của CSDL Không giới h n

Kích thƣớc gi tăng tập tin CSDL 10 MB

Tên logic của transaction log QLNV _Log

Tên tập tin và đƣờng dẫn của transaction log E:\HoTenSV\ QLNV _Log.ldf

Kích cỡ khởi t o của transaction log 30 MB

Kích cỡ tối đ của transaction log Không giới h n

Kích thƣớc gi tăng tập tin transaction log 10 MB

2.2. T o các bảng dữ liệu thuộc CSDL QLNV nhƣ s u:


Bảng PhongBan
Tên cột Kiểu dữ liệu Số kí tự Ghi chú
MaPhong varchar 20 Khóa chính
TenPhong nvarchar 100
DienThoai Int
Bảng NhanVien
Tên cột Kiểu dữ liệu Số kí tự Ghi chú
MaNv varchar 20 Khóa chính
48
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

TenNv nvarchar 100


GioiTinh nvarchar 3
NgaySinh date
DiaChi nvarchar 200
MaPhong varchar 20 Khóa ngo i
2.3 T o database diagram
2.4. Nhập dữ liệu cho các bảng, mỗi bảng 5 bộ dữ liệu.
2.5. Thêm dữ liệu và backup
 Thêm dữ liệu cho bảng Nh nVien s u đó thực hiện full backup
 Thêm dữ liệu cho bảng Nh nVien s u đó thực hiện different backup
 Thêm dữ liệu cho bảng Nh nVien s u đó thực hiện log backup (lần
1)
2.6. Thêm dữ liệu cho bảng NhanVien s u đó thực hiện log backup (lần
2, sử dụng l i t n file đã t o ở lần 1)
2.7. Khôi phục dữ liệu
 Xoá cơ sở dữ liệu QLNV
 Khôi phục dữ liệu với tỳ chọn With Standby thay cho With
NoRecovery.

49
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 3: NGÔN NGỮ TRUY VẤN CÓ CẤU TRÚC (SQL) TRONG


SQL SERVER
Mục tiêu củ chƣơng 3:
Trong chƣơng này ch ng t sẽ tìm hiểu những kiến thức li n qu n đến
ngôn ngữ truy vấn có cấu trúc – SQL trong SQL Server, bao gồm:
- Tìm hiểu về ngôn ngữ truy vấn có cấu trúc SQL
- Giới thiệu các ngôn ngữ truy vấn: Ngôn ngữ định nghĩ dữ liệu, ngôn
ngữ thao tác dữ liệu, ngôn ngữ điều khiển dữ liệu. Trong đó, ng n th o tác dữ
liệu là ngôn ngữ nhằm thực hiện việc truy xuất trong các bảng nhằm phục vụ
nhu cầu khai thác thông tin. Kết th c chƣơng này ta có thể thực hiện đƣợc các
thao tác truy vấn dữ liệu;
- Truy vấn trên nhiều bảng với các lo i phép kết nối;
- Sử dụng truy vấn con để truy vấn dữ liệu.
3.1. Ngôn ngữ truy vấn có cấu trúc (SQL)
3.1.1. SQL là ngôn ngữ của cơ sở dữ liệu quan hệ

SQL, viết tắt của Structured Query Language (ngôn ngữ hỏi có cấu
trúc), là công cụ sử dụng để tổ chức, quản lý và truy xuất dữ liệu đƣợc lƣu trữ
trong các cơ sở dữ liệu. SQL là một hệ thống ngôn ngữ bao gồm tập các câu
lệnh sử dụng để tƣơng tác với cơ sở dữ liệu quan hệ.
SQL đƣợc phát triển từ ngôn ngữ SEQUEL bởi IBM theo mô hình
E.F.Codd t i trung tâm nghiên cứu của IBM ở California vào những năm 70
cho hệ quản trị CSDL lớn. Đầu ti n SQL đƣợc sử dụng trong các ngôn ngữ
quản lý CSDL và ch y tr n các máy đơn l . Song do sự phát triển nhanh
chóng của nhu cầu xây dựng những CSDL lớn theo mô hình khách chủ: trong
mô hình này toàn bộ CSDL đƣợc tập trung trên máy chủ (Server), mọi thao
tác xử lý dữ liệu đƣợc thực hiện trên máy chủ bằng các lệnh SQL máy tr m
ch dùng để cập nhập hoặc lấy thông tin từ máy chủ.
Tên gọi ngôn ngữ hỏi có cấu trúc phần nào làm ch ng t li n tƣởng đến
một công cụ (ngôn ngữ) dùng để truy xuất dữ liệu trong các cơ sở dữ liệu.
Hơn thế nữ , SQL đƣợc sử dụng để điều khiển tất cả các chức năng mà một
hệ quản trị cơ sở dữ liệu cung cấp cho ngƣời dùng bao gồm:

50
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Định nghĩa dữ liệu: SQL cung cấp khả năng định nghĩ các cơ sở dữ
liệu, các cấu tr c lƣu trữ và tổ chức dữ liệu đồng thời t o mối quan hệ giữa
các thành phần dữ liệu.
Truy xuất và thao tác dữ liệu: Với SQL, ngƣời dùng có thể dễ dàng
thực
hiện các thao tác truy xuất, bổ sung, cập nhật và lo i bỏ dữ liệu trong các
cơ sở dữ liệu.
Điều khiển truy cập: SQL có thể đƣợc sử dụng để t o và cấp phát
quyền ngƣời dùng đồng thời kiểm soát các thao tác củ ngƣời dùng trên dữ
liệu, đảm bảo sự an toàn cho cơ sở dữ liệu.
Đảm bảo toàn vẹn dữ liệu: SQL định nghĩ các ràng buộc toàn vẹn
trong cơ sở dữ liệu nhờ đó đảm bảo tính hợp lệ và chính xác của dữ liệu trƣớc
các thao tác cập nhật c ng nhƣ các lỗi của hệ thống.
Nhƣ vậy, có thể nói rằng SQL là một ngôn ngữ hoàn thiện đƣợc sử dụng
trong các hệ thống cơ sở dữ liệu và là một thành phần không thể thiếu trong
các hệ quản trị cơ sở dữ liệu. Mặc dù SQL không phải là một ngôn ngữ lập
tr nh nhƣ C, C++, J v ,... song các câu lệnh mà SQL cung cấp có thể đƣợc
nhúng vào trong các ngôn ngữ lập trình nhằm xây dựng các ứng dụng tƣơng
tác với cơ sở dữ liệu.
Khác với các ngôn ngữ lập trình quen thuộc nhƣ C, C++, J v ,... SQL là
ngôn ngữ có tính khai báo. Với SQL, ngƣời dùng ch cần mô tả các yêu cầu
cần phải thực hiện tr n cơ sở dữ liệu mà không cần phải ch ra cách thức thực
hiện các yêu cầu nhƣ thế nào. Chính vì vậy, SQL là ngôn ngữ dễ tiếp cận và
dễ sử dụng. Ngày nay trong các ngôn ngữ lập trình bậc c o đều có sự trợ giúp
của SQL. Nhất là trong lĩnh vực phát triển của Internet ngôn ngữ SQL càng
đóng v i trò qu n trọng hơn, nó đƣợc sử dụng để nhanh chóng t o các trang
web động.
3.1.2. Vai trò của ngôn ngữ SQL

Bản thân SQL không phải là một hệ quản trị cơ sở dữ liệu, nó không thể
tồn t i độc lập. SQL thực sự là một phần của hệ quản trị cơ sở dữ liệu, nó xuất
hiện trong các hệ quản trị cơ sở dữ liệu với vai trò ngôn ngữ và là công cụ
giao tiếp giữ ngƣời sử dụng và hệ quản trị cơ sở dữ liệu.

51
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Trong hầu hết các hệ quản trị cơ sở dữ liệu quan hệ, SQL có những vai
trò nhƣ s u:
SQL là ngôn ngữ hỏi có tính tƣơng tác: Ngƣời sử dụng có thể dễ dàng
thông qua các trình tiện ích để gởi các yêu cầu dƣới d ng các câu lệnh SQL
đến cơ sở dữ liệu và nhận kết quả trả về từ cơ sở dữ liệu.
SQL là ngôn ngữ lập trình cơ sở dữ liệu: Các lập trình viên có thể
nhúng các câu lệnh SQL vào trong các ngôn ngữ lập tr nh để xây dựng nên
các chƣơng tr nh ứng dụng giao tiếp với cơ sở dữ liệu.
SQL là ngôn ngữ quản trị cơ sở dữ liệu: Th ng qu SQL, ngƣời quản
trị cơ sở dữ liệu có thể quản l đƣợc cơ sở dữ liệu, định nghĩ các cấu trúc
lƣu trữ dữ liệu, điều khiển truy cập cơ sở dữ liệu,...
SQL là ngôn ngữ cho các hệ thống client/server: Trong các hệ thống
cơ sở dữ liệu client/server, SQL đƣợc sử dụng nhƣ là c ng cụ để giao tiếp
giữa các trình ứng dụng phía máy khách với máy chủ cơ sở dữ liệu.
SQL là ngôn ngữ truy cập dữ liệu trên Internet: Cho đến nay, hầu hết
các máy chủ Web c ng nhƣ các máy chủ trên Internet sử dụng SQL với vai
trò là ngôn ngữ để tƣơng tác với dữ liệu trong các cơ sở dữ liệu.
SQL là ngôn ngữ cơ sở dữ liệu phân tán: Đối với các hệ quản trị cơ sở
dữ liệu phân tán, mỗi một hệ thống sử dụng SQL để giao tiếp với các hệ thống
khác trên m ng, gởi và nhận các yêu cầu truy xuất dữ liệu với nhau.
SQL là ngôn ngữ sử dụng cho các cổng giao tiếp cơ sở dữ liệu: Trong
một hệ thống m ng máy tính với nhiều hệ quản trị cơ sở dữ liệu khác nhau,
SQL thƣờng đƣợc sử dụng nhƣ là một chuẩn ngôn ngữ để giao tiếp giữa các
hệ quản trị cơ sở dữ liệu.
3.1.3. Giới thiệu sơ lƣợc về Transact SQL (T-SQL)

Transact-SQL là ng n ngữ SQL mở rộng dự tr n SQL chuẩn củ ISO


(Intern tion l Org niz tion for St nd rdiz tion) và ANSI (Americ n N tion l
St nd rds Institute) đƣợc sử dụng trong SQL Server khác với P-SQL
(Procedur l- SQL) dùng trong Or cle.
SQL chuẩn b o gồm khoảng 40 câu lệnh. Trong các hệ quản trị cơ sở dữ
liệu khác nhau, mặc dù các câu lệnh đều có cùng d ng và cùng mục đích sử
dụng song mỗi một hệ quản trị cơ sở dữ liệu có thể có một số th y đổi nào đó.

52
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Điều này đ i khi dẫn đến c pháp chi tiết củ các câu lệnh có thể sẽ khác nh u
trong các hệ quản trị cơ cơ sở dữ liệu khác nhau.
T-SQL đƣợc chi làm 3 nhóm:
Ng n ngữ định nghĩ dữ liệu (Data Definition Language – DDL)
Ngôn ngữ định nghĩ dữ liệu (DDL) là ngôn ngữ máy tính đƣợc sử dụng
để t o, xóa và sử đổi cấu trúc củ các đối tƣợng cơ sở dữ liệu trong cơ sở dữ
liệu. Các đối tƣợng cơ sở dữ liệu này bao gồm các khung nh n, lƣợc đồ, bảng,
ch mục, hàm, thủ tục v.v.
DDL thƣờng đƣợc sử dụng trong truy vấn SQL là:
Lệnh CREATE object : Lệnh này dùng để t o một đối tƣợng mới.
Lệnh ALTER Object: Lệnh th y đổi / sử đổi đối tƣợng.
Lệnh DROP object: Lệnh xó đối tƣợng.
Trong đó đối tƣợng có thể là: table, View, storedprocedure, function,
trigger, ...
Cú pháp các câu lệnh trên sẽ đƣợc làm rõ trong mục 3.2
Ng n ngữ điều khiển dữ liệu (Data control language – DCL)
Đây là các lệnh quản l quyền truy cập l n các object (t ble, view,
stored procedure, ...). DCL b o gồm các câu lệnh sau:
Lệnh Grant : T o một quyền đến ngƣời dùng.
Lệnh Deny: Từ chối quyền.
Lệnh Revoke: xó bỏ các quyền đƣợc cấp h y từ chối trƣơc đó.
Cú pháp các câu lệnh trên sẽ đƣợc làm rõ trong mục 3.4
Ng n ngữ th o tác dữ liệu (Data manipulation language – DML)
DML là ngôn ngữ thao tác dữ liệu. Các lệnh DML bao gồm:
Lệnh Select: truy xuất dữ liệu của các bản ghi cụ thể từ một hoặc nhiều
bảng.
Lệnh Insert: T o một bản ghi.
Lệnh Update: Sử đổi các bản ghi.
Lệnh Delete: Xóa các bản ghi.

53
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Cú pháp các câu lệnh trên sẽ đƣợc làm rõ trong mục 3.3
3.2. Cú pháp của T-SQL
3.2.1. Đặt tên – Identifiers

Các đối tƣợng trong cơ sở dữ liệu dự tr n SQL (t ble, view,


index, stored procedure, ...) đƣợc xác định th ng qu t n củ đối tƣợng. T n
củ các đối tƣợng là duy nhất trong mỗi cơ sở dữ liệu. T n đƣợc sử dụng
nhiều nhất trong các truy vấn SQL và đƣợc xem là nền tảng trong cơ sở dữ
liệu quan hệ là t n bảng và t n cột.
Có hai lo i Identifiers:
 Lo i th ng thƣờng (Regul r Identifier): đặt tên theo chuẩn nhƣ bắt
đầu với ký tự, không sử dụng ký tự đặc biệt, không sử dụng chữ số
ở đầu, không có khoảng trắng
 Lo i cần phải sử dụng các dấu “” hoặc dấu [] để phân biệt giữa các
từ khoá (Delimited Identifier) ví dụ nhƣ các từ khóa trùng với từ
khoá của SQL Server (reserved keyword) hoặc các từ có khoảng
trống.
Ví dụ 3-1:
SELECT * FROM [My Table]
WHERE [Order] = 10

Trong ví dụ trên chữ My Table có khoàng trống nên dùng dấu [] , chữ
Order trùng với từ khoá Order của SQL Server nên cần đặt trong dấu ngoặc
vuông [].
Trong các cơ sở dữ liệu lớn với nhiều ngƣời sử dụng, khi t ch định t n
của một bảng nào đó trong câu lệnh SQL, hệ quản trị cơ sở dữ liệu hiểu đó là
t n củ bảng do t sở hữu (tức là bảng do t t o r ). Th ng thƣờng, trong các
hệ quản trị cơ sở dữ liệu này cho phép những ngƣời dùng khác nh u t o ra
những bảng trùng t n với nh u mà kh ng gây r xung đột về t n. Nếu trong
một câu lệnh SQL ta cần ch đến một bảng do một ngƣời dùng khác sở hữu
(hiển nhi n là phải đƣợc phép) th t n củ bảng phải đƣợc viết s u t n củ
ngƣời sở hữu và phân cách với t n ngƣời sở hữu bởi dấu chấm:

54
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Một số đối tƣợng cơ sở dữ liệu khác (nhƣ khung nh n, thủ tục, hàm),
việc sử dụng t n c ng tƣơng tự nhƣ đối với bảng.
T có thể sử dụng t n cột một cách b nh thƣờng trong các câu lệnh SQL
bằng cách ch cần ch định t n của cột trong bảng. Tuy nhi n, nếu trong câu
lệnh có li n qu n đến h i cột trở l n có cùng t n trong các bảng khác nh u th
bắt buộc phải ch định th m t n bảng trƣớc t n cột; t n bảng và t n cột đƣợc
phân cách nh u bởi dấu chấm theo cú pháp:
Tên bảng.Tên cột
Để t m r sinh vi n có t n Nguyễn Văn An đã có điểm môn CSDL là b o
nhi u, câu truy vấn nhƣ s u:

Select MaSV, Hoten, tenhp, diem


from Sinhvien, DMHocphan, DiemHP
= H
H = H H H =
A H = ‘C L’

3.2.2. Biến (Variables)

Biến trong T-SQL c ng có chức năng tƣơng tự nhƣ trong các ng n ngữ
lập tr nh khác nghĩ là cần kh i báo trƣớc lo i dữ liệu trƣớc khi sử dụng. Biến
đƣợc bắt đầu bằng dấu @ (Ðối với các global variable thì có hai dấu @@)
Ví dụ: Ví dụ dƣới đây kh i báo một biến có t n @numberOfsinhvien qu
từ khó decl re. Biến này lƣu số sinh vi n đếm đƣợc th ng qu hàm count.
S u đó in r giá trị củ biến.
declare @SoLuongsinhvien int
select @SoLuongsinhvien = count(*) from Sinhvien
print @SoLuongsinhvien

3.2.3. Hàm (Function)

3.2.3.1. Các loại hàm

Có 2 lo i hàm một lo i là built-in và một lo i user-defined


Các hàm Built-In là các hàm nội t i của SQL Server đƣợc chia làm 3
nhóm:

55
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

+ Rowset Functions : Lo i này thƣờng trả về một object và đƣợc đối xử


nhƣ một table. Ví dụ nhƣ hàm OPENQUERY sẽ trả về một recordset và có
thể đứng vị trí của một table trong câu lệnh Select.
+ Aggregate Functions: Lo i này làm việc trên một số giá trị và trả về
một giá trị đơn h y là các giá trị tổng. Ví dụ nhƣ hàm AVG sẽ trả về giá trị
trung bình của một cột.
+ Scalar Functions : Lo i này làm việc trên một giá trị đơn và trả về
một giá trị đơn. Trong lo i này l i chia làm nhiều lo i nhỏ nhƣ các hàm về
toán học, về thời gian, xử lý kiểu dữ liệu String….Ví dụ nhƣ hàm
MONTH(„2002-09-30‟) sẽ trả về tháng 9.
Các hàm User-Defined là các hàm do ngƣời dùng định nghĩ (đƣợc t o
ra bởi câu lệnh CREATE FUNCTION và phần body thƣờng đƣợc gói trong
cặp lệnh BEGIN…END) c ng đƣợc chi làm các nhóm nhƣ s u:
+ Scalar Functions : Lo i này c ng trả về một giá trị đơn bằng câu lệnh
RETURNS.
+ Table Functions : Lo i này trả về một table
3.2.3.2. Các hàm SQL Server định nghĩa sẳn

Ng n ngữ T-SQL có nhiều hàm có thể th m gi vào câu lệnh T-SQL.


Những hàm này thực hiện các nhiệm vụ quan trọng khác nh u. Chƣơng này
sẽ tr nh bày một số các hàm th ng dụng để làm việc với các kiểu dữ liệu số,
chuỗi, thời gi n và giá trị NULL trong SQL Server.
 Các hàm làm việc với kiểu dữ liệu số
Các hàm quan trọng làm việc với kiểu dữ liệu số là hàm ISNUMERIC và
hàm ROUND.
+ Hàm ISNUMERIC
Hàm isNumeric kiểm tra một giá trị có phải thuộc kiểu dữ liệu số h y
kh ng.
Ví dụ: Câu lệnh dƣới đây trả về t n Sinhvien, và một cột có t n Numeric.
Cột này sẽ m ng giá trị 0 nếu mã sinhvien kh ng phải là số và ngƣợc l i.
select HOTEN, isnumeric(right(masv,2)) as 'NUMERIC'
from Sinhvien

56
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả:

+ Hàm ROUND
Hàm ROUND trả về một giá trị số, đã đƣợc làm tròn theo một độ dài ch
định.
Cấu tr c hàm ROUND nhƣ s u:
ROUND (số làm tròn, số chữ số l )
Khi sử dụng hàm ROUND cần lƣu : số làm tròn phải là kiểu dữ liệu số
nhƣ int, flo t, decim l, ...
Ví dụ 1:
select ROUND(123.9994, 3), ROUND(123.9995, 0)

Ví dụ 2:
select ROUND(123.4545, 2), ROUND(123.45, -2)
Kết quả:

 Các hàm làm việc với kiểu dữ liệu chuỗi


Các hàm quan trọng b o gồm LEFT, RIGHT, LEN, REPLACE, STUFF,
SUBSTRING, LOWER, UPPER, LTRIM, and RTRIM.
+ Hàm LEFT
Hàm LEFT trả về một chuỗi k tự có chiều dài đƣợc ch định tính từ b n
trái củ chuỗi.
Ví dụ:
select left('Nha Trang', 5)

Kết quả:

57
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

+ Hàm RIGHT
Hàm RIGHT tƣơng tự hàm LEFT nhƣng tính từ b n phải củ chuỗi.
Ví dụ:
select right('Nha Trang', 5)

Kết quả:

+ Hàm SUBSTRING
Hàm STRING trích xuất một chuỗi con từ một chuỗi cho trƣớc.
Cấu tr c hàm
SUBSTRING nhƣ s u:
SUBSTRING (chuỗi b n đầu, vị trí bắt đầu, chiều dài chuỗi con)
Ví dụ:
select substring ('Nha Trang', 2, 5)

Kết quả:

+ Hàm LEN
Hàm LEN trả về chiều dài một chuỗi.
Ví dụ:
l l (‘ ’)

Kết quả:
+ Hàm REPLACE
Hàm REPLACE th y thế một chuỗi bởi một chuỗi khác.
Ví dụ 1: Câu lệnh dƣới đây th y thế chữ “Nh ” trong chuỗi Nh Tr ng
bằng chữ “nh ”
l l (‘ ’, ‘ ’, ‘ )

Kết quả:
Ví dụ 2:
select replace(DIACHI, 'Minh', 'Ninh') from KhachHang

58
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

+ Hàm STUFF
Hàm STUFF th y thế một số lƣợng xác định các k tự trong một chuỗi
bằng một chuỗi khác bắt đầu từ một vị trí đƣợc ch định.
Ví dụ:
select stuff('Nha Trang', 2, 3, '***')

Kết quả:

+ Hàm LOWER/UPPER
Hàm LOWER chuyển các k tự ho trong chuỗi thành các kí tự thƣờng.
Hàm UPPER chuyển các chuỗi k tự thƣờng trong chuỗi thành các k tự ho .
Ví dụ:
select lower('Nha Trang'), upper('Nha Trang')

Kết quả:

+ Hàm LTRIM/RTRIM
Hàm LTRIM cắt các khoảng trắng b n trái củ chuỗi, hàm RTRIM cắt
khoảng trắng b n phải chuỗi.
Ví dụ:
declare @llen int, @rlen int, @len int select @llen
= len(ltrim(' Nha Trang')),
@rlen = len(rtrim('Nha Trang ')), @len = len('Nha
Trang') select @llen, @rlen

Kết quả:

 Các hàm làm việc với kiểu dữ liệu thời gian


+ Hàm GETDATE
Hàm GETDATE trả về ngày giờ l c thực hiện câu truy vấn.
Ví dụ:

59
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

select getdate()

+ Hàm DAY/ MONTH/ YEAR


Hàm DAY trả về ngày của một giá trị thuộc kiểu d tetime. Hàm
MONTH trả về tháng của một giá trị thuộc kiểu datetime. Hà m YEAR trả về
năm của một giá trị thuộc kiểu datetime.
Ví dụ:
select hoten, day(Ngaysinh) as N'Ngày Sinh',
month(NgaySinh) as N'Tháng Sinh', year(Ngaysinh) as

from Sinhvien

Kết quả:

+ Hàm DATEPART
Trong quá tr nh làm việc với các CSDL, đ i l c t muốn biết xem một
ngày nào đó thuộc qu mấy trong năm, h y thuộc tuần thứ mấy trong tháng.
Hàm DATEPART gi p giải quyết các y u cầu tr n một cách dễ dàng.
Cấu tr c hàm DATEPART nhƣ s u:
DATEPART (y u cầu trích xuất, giá trị trích xuất)
– giá trị trích xuất: là một giá trị thuộc kiểu datetime.
– y u cầu trích xuất: ngày, tháng, năm, qu , ....
Khi có một y u cầu trích xuất nào đó, ch ng t sẽ có các chữ viết tắt
tƣơng ứng với các y u cầu đó. Bảng dƣới đây m tả các y u chữ viết tắt và
các y u cầu trích xuất tƣơng ứng.

nghĩ Chữ viết tắt

Năm yy, yyyy

Qu qq, q

60
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Tháng mm, m

Số ngày đã qu trong năm dy, y

Ngày dd, d

Tuần wk, ww

Số ngày đã qu trong tuần Dw

Giờ Hh

Ph t mi, n

Giây ss, s

Ví dụ:
select , ( , ) ,
datepart(qq,NgaySinh) as N'Quý', datepart(m,Ngaysinh) as
N'Tháng',datepart(d,Ngaysinh) as N'Ngày', datepart(dy,
Ngaysinh) as N'Thứ', datepart(dw, Ngaysinh) as N'Tuần'
from Sinhvien
Kết quả:

+ Hàm DATENAME
Tƣơng tự hàm DATEPART nhƣng hàm DATENAME trả về một chuỗi
k tự
Ví dụ:
select , ( , ) ,
datename(qq,NgaySinh) as N'Quý', datename(m,Ngaysinh) as
N'Tháng',datename(d,Ngaysinh) as N'Ngày'
, datename(dy, Ngaysinh) as N'Thứ', datename(dw,
Ngaysinh) as N'Tuần'
from Sinhvien

61
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả:

 Các Hàm chuyển đổi kiểu dữ liệu (Hàm CAST và CONVERTER)


Chuyển đổi một giá trị thuộc kiểu dữ liệu này sang một kiểu dữ liệu
khác. Hàm CAST và CONVERTER cung cấp cùng một chức năng. Một điểm
thuận lợi khi dùng CONVERTER là khi chuyển đổi, hàm này còn cho phép
ngƣời dùng sẽ định d ng l i giá trị kết quả theo muốn.
Cấu tr c hàm CAST và CONVERT ER nhƣ s u:

CAST ( ứ A l u
[đ l u])
C ( l [đ , ứ [
, đ )

Năm 2 chữ số Năm 4 chữ số Output


0 0 hoặc 100 mon dd yyyy hh:mi AM (PM)
1 101 mm/dd/yy
2 102 yy.mm.dd
3 103 dd/mm/yy
4 104 dd.mm.yy
5 105 dd-mm-yy
6 106 dd mon yy
7 107 Mon dd, yy
8 108 hh:mm:ss
9 9 hoặc 109 mon dd yyyy hh:mi:ss:mmm AM (PM)
10 110 mm-dd-yy
11 111 yy/mm/dd
12 112 yymmdd
13 13 hoặc 113 dd mon yyyy hh:mm:ss:mmm (24h)

62
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

14 114 hh:mi:ss:mmm (24h)


Bảng: Bảng quy định kiểu định dạng trong hàm Convert
Ví dụ:
Select HoTen, convert (varchar, NgaySinh, 103) as
NgaySinh, DiaChi, year(getdate()) - year(NgaySinh)
from Sinhvien
where HoTen like N'Nguy n %' and (year(getdate()) -
year(NgaySinh))>20

Hàm CONVERT và hàm CAST có thể sử dụng kết hợp với nh u để cho
kết qu nhƣ mong muốn.
3.2.4. Các toán tử (Operators)

Trong SQL Server các biểu thức (expression) có thể chứ nhiều toán tử.
Độ ƣu ti n của toán tử sẽ quyết định thứ tự thực hiện củ các phép tính. Thứ
tự thực hiện ảnh hƣởng rất lớn đến kết quả.
Bảng dƣới đây m tả các toán tử trong SQL Server và mức độ ƣu ti n
của các toán tử đó.

Mức ƣu
ti n Phép toán

1 * (Nhân), / (Chi ), (Chi dƣ)

2 + (số dƣơng), - (số âm), + (cộng), + (kết chuỗi), - (hiệu)

3 =, >, <, >=, <=, <>, =, >, < (Các phép toán so sánh)

4 NOT (phép phủ định)

5 AND (phép kết VÀ)

6 ALL, ANY, BETWEEN, IN, LIKE, OR, SOME

7 = (Phép gán)

63
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3.2.5. Các thành phần điều hiển (Control of flow)

SQL Server còn cung cấp các cấu tr c điều khiển cho phép ch ng t điều
khiển luồng thực thi củ các đo n lệnh SQL: BEGIN...END, BREAK,
CONTINUE, GOTO, IF...ELSE, RETURN, WHILE, ...
3.2.6. Ch thích (Comment)

T-SQL dùng kí hiệu “--” để ch thích cho một dòng đơn và kí hiệu /* ...
*/ để ch thích cho một nhóm dòng.
Ví dụ:
*
C đ *
CLA --
SET @MyNumber=4-2+27
l 29
SELECT @MyNumber

3.2.7. Giá trị NULL

Một cơ sở dữ liệu là sự phản ánh của một hệ thống trong thế giới thực,
do đó các giá trị dữ liệu tồn t i trong cơ sở dữ liệu có thể kh ng xác định
đƣợc. Một giá trị kh ng xác định đƣợc xuất hiện trong cơ sở dữ liệu có thể do
một số nguy n nhân s u:
Giá trị đó có tồn t i nhƣng kh ng biết.
Kh ng xác định đƣợc giá trị đó có tồn t i h y kh ng.
T i một thời điểm nào đó giá trị chƣ có nhƣng rồi có thể sẽ có. Giá trị bị
lỗi do tính toán (tràn số, chi cho kh ng, ...)
Những giá trị kh ng xác định đƣợc biểu diễn trong cơ sở dữ liệu quan hệ
bởi các giá trị NULL. Đây là giá trị đặc biệt và kh ng n n nhầm lẫn với chuỗi
rỗng (đối với dữ liệu kiểu chuỗi) h y giá trị kh ng (đối với giá trị kiểu số).
Giá trị NULL đóng một v i trò qu n trọng trong các cơ sở dữ liệu và hầu hết
các hệ quản trị cơ sở dữ liệu quan hệ
3.3. Ngôn ngữ định nghĩa dữ liệu – DDL
Trong phần này, ch ng t sẽ đề cập đến nhóm các câu lệnh đƣợc sử dụng
để định nghĩ và quản l đến đối tƣợng ở đây là bảng (t ble). Còn các đối

64
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

tƣợng khác, nhƣ khung nh n (view), hàm (function), thủ tục


(storeProcedure)... th đƣợc đề cập ở các chƣơng tiếp theo.
Về cơ bản, ng n ngữ định nghĩ dữ liệu b o gồm các lệnh:
CREATE: định nghĩ và t o mới đối tƣợng CSDL;
ALTER: th y đổi định nghĩ củ đối tƣợng CSDL;
DROP: Xoá đối tƣợng CSDL đã có.
3.3.1. Tạo bảng

Câu lệnh CREATE TABLE đƣợc sử dụng để định nghĩ một bảng dữ
liệu mới trong CSDL. Khi định nghĩ một bảng dữ liệu mới, ta cần phải xác
định đƣợc các y u cầu s u đây:
Bảng mới đƣợc t o ra sử dụng với mục đích g và có v i trò nhƣ thế nào
trong cơ sở dữ liệu.
Cấu tr c củ bảng b o gồm những trƣờng (cột) nào, mỗi một trƣờng có
nghĩ nhƣ thế nào trong việc biểu diễn dữ liệu, kiểu dữ liệu củ mỗi trƣờng là
g và trƣờng đó có cho phép nhận giá trị NULL h y kh ng.
Những trƣờng nào sẽ th m gi vào khó chính củ bảng. Bảng có qu n
hệ với những bảng khác h y kh ng và nếu có th qu n hệ nhƣ thế nào.
Tr n các trƣờng củ bảng có tồn t i những ràng buộc về khu n d ng,
điều kiện hợp lệ của dữ liệu h y kh ng; nếu có th sử dụng ở đâu và nhƣ thế
nào.
Câu lệnh CREATE TABLE có c pháp nhƣ s u:
C A A L
(
[,
,
[,
)

T n bảng: tuân theo quy tắc định d nh, kh ng vƣợt quá 128 k tự
T n cột: các cột trong bảng, mỗi bảng có ít nhất một cột.
Thuộc tính cột: b o gồm kiểu dữ liệu của cột, giá trị mặc định của cột,
cột có đƣợc thiết lập thuộc tính identity, cột có chấp nhận giá trị NULL h y
kh ng. Trong đó kiểu dữ liệu là thuộc tính bắt buộc.
65
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Các_ràng_buộc: gồm các ràng buộc về khu n d ng dữ liệu (ràng buộc


CHECK) hay các ràng buộc về bảo toàn dữ liệu (PRIMARY KEY,
FOREIGN KEY, UNIQUE).
Ví dụ 3-2: Câu lệnh dƣới đây định nghĩ bảng DMNganh gồm các cột
manganh (mã ngành), tennganh (tên ngành), makhoa (ch tiêu tuyển sinh của
ngành học). Ràng buộc cột manganh làm khóa chính.
CREATE TABLE DMNganh
(
manganh CHAR(10) NOT NULL CONSTRAINT
pk_manganh PRIMARY KEY,
tennganh NVARCHAR(50) NOT NULL,
makhoa char(10) NOT NULL constraint FK_Nganh
foreign key references DMKHOA(makhoa)
)

Ví dụ 3-3: Câu lệnh dƣới đây định nghĩ bảng Sinhvien với các cột masv
(mã sinh viên), ho ten (họ và tên), gioitinh (giới tính), ngaysinh (ngày sinh
của sinh viên), dienthoai (điện tho i), diachi (địa ch liên hệ), malop (mã lớp
sinh viên theo học). Ràng buộc cột masv làm khóa chính, manganh là khóa
ngoài (tham chiếu đến manganh của bảng nganh), ngaysinh ch nhập sinh
viên từ 18 tuổi trở lên.
CREATE TABLE Sinhvien
(masv nchar(10) not null constraint pk_masv
primary key,
hoten NVARCHAR(150) NOT NULL,
ten NVARCHAR(8) NOT NULL,
gioitinh BIT NULL,
ngaysinh DATE NULL CONSTRAINT chk_ngaysinh
CHECK (YEAR(GETDATE())-YEAR(ngaysinh)>=18),
dienthoai CHAR(11) NULL, diachi NVARCHAR (50) NULL,
malop CHAR(10) NOT NULL
CONSTRAINT fk_malop FOREIGN KEY(malop) REFERENCES
DMLOP(malop)
ON DELETE CASCADE ON UPDATE CASCADE)

Trong đó:
Getdate() là hàm lấy ngày tháng năm hiện t i của hệ thống Year(D) là
hàm lấy r năm của ngày D
66
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ngoài ra, có thể t o bảng bằng chức năng New T ble có sẵn của
Microsoft SQL Server.
3.3.2. Các loại ràng buộc

3.3.2.1. Ràng buộc CHECK

Ràng buộc CHECK đƣợc sử dụng nhằm ch định điều kiện hợp lệ đối
với dữ liệu vào cột thông qua một biểu thức điều kiện. Mỗi khi có sự th y đổi
dữ liệu tr n bảng (INSERT, UPDATE), những ràng buộc này sẽ đƣợc sử
dụng nhằm kiểm tra xem dữ liệu mới có hợp lệ h y kh ng. Nếu biểu thức điều
kiện nhận giá trị False (với bộ dữ liệu đ ng nhập), thì dữ liệu vi ph m ràng
buộc này và kh ng đƣợc nhập vào trong bảng.
Ràng buộc CHECK đƣợc kh i báo theo c pháp nhƣ s u:
[CONSTRAINT t n ràng buộc] CHECK (điều kiện)
Ví dụ 3-4: Cột diem của bảng DIEMHP ch lƣu trữ các điểm số từ 0 đến
10. Để đảm bảo điều kiện này, chúng ta sử dụng ràng buộc Check để giới h n
giá trị nhập vào cột điểm của sinh viên ch trong đo n [0-10], ngƣời dùng sẽ
không thể nhập những giá trị nằm ngoài đo n [0-10].
create table DIEMHP
(
MaSV nchar(10) notnull,
MAhp char(10) not null,
Diemhp tinyint not null constraint Ktra_Diemhp
CHECK (Diemhp >= 0 and Diemhp <= 10),
)

Hoặc là:
create table DIEMHP
(
MaSV nchar(10) notnull,
MAhp char(10) not null,
Diemhp tinyint not null constraint Ktra_Diemhp
CHECK Diemhp between 0 and 10
)

Hoặc là:
create table DIEMHP

67
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

(
MaSV nchar(10) notnull,
MAhp char(10) not null,
Diemhp tinyint not null constraint Ktra_Diemhp
CHECK Diemhp in (1,2,3,4,5,6,7,8,9,10))

3.3.2.2. Ràng buộc khóa chính PRIMARY KEY

Ràng buộc khó chính đƣợc sử dụng để định nghĩ khoá chính củ bảng.
Khoá chính của một bảng là một hoặc một tập nhiều cột mà giá trị củ ch ng
là duy nhất trong bảng. H y nói cách khác, giá trị củ khoá chính sẽ gi p cho
t xác định đƣợc duy nhất một dòng (bản ghi) trong bảng dữ liệu. Mỗi một
bảng ch có thể có duy nhất một khoá chính và bản thân khoá chính kh ng
chấp nhận giá trị NULL. Ràng buộc primary key là cơ sở cho việc đảm bảo
tính toàn vẹn thực thể c ng nhƣ toàn vẹn th m chiếu.
Để khai báo một ràng buộc PRIMARY KEY, ta sử dụng c pháp nhƣ
sau:
[CONSTRAINT t n ràng buộc] PRIMARY KEY [(d nh sách cột)]
Nếu khoá chính củ bảng ch b o gồm đ ng một cột và ràng buộc
primary key đƣợc ch định ở mức cột, t kh ng cần thiết phải ch định d nh
sách cột s u từ khoá primary key. Tuy nhi n, nếu việc khai báo khoá chính
đƣợc tiến hành ở mức bảng (sử dụng khi số lƣợng các cột th m gi vào khoá
là từ h i trở l n) th bắt buộc phải ch định d nh sách cột ng y s u từ khó
primary key và t n các cột đƣợc phân cách nh u bởi dấu phẩy.
Ví dụ 3-5: T o bảng DMKho với các cột makhoa (mã khoa), tenkhoa
(tên khoa), Sodthoai (Số điện tho i) với ràng buộc khóa chính là cột makhoa.
create table DMKHOA
(
Makhoa char(10)not null Primarykey,
Tenkhoa nvarchar(50) not null,
Sodthoai char(11)
)

Hoặc là:
create table DMKHOA
(

68
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Makhoa char(10)not null constraint KT_KC primary


key,
Tenkhoa nvarchar(50) not null
)

Hoặc là:
create table DMKHOA
(
Makhoa char(10) not null ,
Tenkhoa nvarchar(50) not null,
Sodthoai char(11),
constraint KT_KC primary key (Makhoa) )

Ví dụ 3-6: T o bảng DIEMHP với các cột maSV (mã sinh viên), MaHP
(Mã học phần), Diemhp (Điểm học phần). Ràng buộc khóa chính là 2 cột
(masv, maHP).
create table DIEMHP
(
MaSV nchar(10) notnull,
MAHP char(10) not null,
Diemhp tinyint not null constraint Ktra_Diem1 CHECK
(Diemhp >= 0 and Diemhp <= 10),
Constraint KC_DiemHP Primary key (Masv,Mahp)
)

3.3.2.3. Ràng buộc FOREIGN KEY

Các bảng dữ liệu trong một cơ sở dữ liệu thƣờng có mối quan hệ với
nhau. Những mối quan hệ này biểu diễn cho sự quan hệ giữ các đối tƣợng
trong thế giới thực. Về mặt dữ liệu, những mối quan hệ đƣợc đảm bảo thông
qua việc đòi hỏi sự có mặt của một giá trị dữ liệu trong bảng này phải phụ
thuộc vào sự tồn t i của giá trị dữ liệu đó ở trong một bảng khác.
Foreign key là một cột hay một sự kết hợp củ nhiều cột đƣợc sử dụng
để áp đặt mối li n kết dữ liệu giữ h i bảng. Foreign key của một bảng sẽ giữ
giá trị của primary key của một bảng khác và ch ng t có thể t o r nhiều
FOREIGN KEY trong một table.
Foreign key có thể th m chiếu vào primary key hay cột có ràng buộc
duy nhất. Foreign key có thể chứ giá trị NULL. Mặc dù mục đích chính của
ràng buộc foreign key là để kiểm soát dữ liệu chứ trong bảng có khóa ngo i
69
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

(tức t ble con) nhƣng thực chất nó c ng kiểm soát lu n cả dữ liệu trong bảng
chứ primary key (tức t ble ch ). Ví dụ nếu t xó dữ liệu trong bảng ch th
dữ liệu trong bảng con trở n n mồ c i (orph n) h y “th m chiếu treo” v
kh ng thể th m chiếu ngƣợc về bảng ch . Do đó ràng buộc khóa ngo i sẽ đảm
bảo điều đó kh ng xảy r . Nếu muốn xó dữ liệu trong bảng ch th trƣớc hết
phải xó h y v hiệu hó ràng buộc khóa ngo i trong bảng con trƣớc.
Ràng buộc foreign key đƣợc định nghĩ theo c pháp dƣới đây:
[CONSTRAINT t n ràng buộc] FOREIGN KEY [(d nh sách cột)]
REFERENCES t n bảng th m chiếu (d nh sách cột th m chiếu)
[ON DELETE CASCADE | NO ACTION | SET NULL | SET
DEFAULT] [ON UPDATE CASCADE | NO ACTION | SET NULL | SET
DEFAULT]
Việc định nghĩ một ràng buộc khóa ngo i b o gồm các yếu tố s u:
T n cột hoặc danh sách cột củ bảng đƣợc định nghĩ th m gi vào khoá
ngoài.
T n củ bảng đƣợc th m chiếu bởi khoá ngoài và danh sách các cột đƣợc
th m chiếu đến trong bảng th m chiếu.
Cách thức xử l đối với các bản ghi trong bảng đƣợc định nghĩ trong
trƣờng hợp các bản ghi đƣợc th m chiếu trong bảng th m chiếu bị xoá (ON
DELETE) hay cập nhật (ON UPDATE). SQL chuẩn đƣ r 4 cách xử l :
CASCADE: Tự động xoá (cập nhật) nếu bản ghi đƣợc th m chiếu bị xoá
(cập nhật).
NO ACTION: (Mặc định) Nếu bản ghi trong bảng th m chiếu đ ng đƣợc
th m chiếu bởi một bản ghi bất kỳ trong bảng đƣợc định nghĩ th bàn ghi đó
kh ng đƣợc phép xoá hoặc cập nhật (đối với cột đƣợc th m chiếu).
SET NULL: Cập nhật l i khoá ngoài củ bản ghi thành giá trị NULL
(nếu cột cho phép nhận giá trị NULL).
SET DEFAULT: Cập nhật l i khoá ngoài củ bản ghi nhận giá trị mặc
định (nếu cột có qui định giá trị mặc định).
Ví dụ: T o bảng DIEMHP với các cột maSV (mã sinh viên), MaHP (Mã
học phần), Diemhp (Điểm học phần). Ràng buộc khóa chính là 2 cột (masv,

70
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

maHP), ràng buộc khóa ngo i là: khóa ngo i masv sẽ tham chiếu đến bảng
SINHVIEN, khóa ngo i maHP sẽ tham chiếu đến bảng DMHOCPHAN
create table DIEMHP
(
MaSV nchar(10) notnull Constraint FK_DIEMHP_SV
Foreign key references SINHVIEN (masv) on delete cascade
on update cascade,
MAHP char(10) not null Constraint FK_DIEMHP_HP
Foreign key references DMHOCPHAN(maHP) on delete cascade
on update cascade,
Diemhp tinyint not null Constraint Ktra_Diem1 CHECK
(Diemhp >= 0 and Diemhp <= 10),
Constraint KC_DiemHP Primary key (Masv,Mamh)
)

Hoặc là:
create table DIEMHP
(
MaSV nchar(10) notnull,
MAHP char(10) not null ,
Diemhp tinyint not null constraint Ktra_Diem1 CHECK
(Diemhp >= 0 and Diemhp <= 10),
Constraint KC_DiemHP Primary key (Masv,Mamh),
Constraint FK_DIEMHP_SV Foreign key (Masv)
references SINHVIEN (masv) on delete cascade on update
cascade,
Constraint FK_DIEMHP_HP Foreign key (MaHP)
references DMHOCPHAN(maHP) on delete cascade on update
cascade
)

Hoặc là:
create table DIEMHP
(
MaSV nchar(10) not null,
MAHP char(10) not null ,
Diemhp tinyint not null constraint Ktra_Diem2 CHECK
(Diemhp >= 0 and Diemhp <= 10),
Constraint KC_DiemHP1 Primary key (Masv,Mahp),

71
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Constraint FK_DIEMHP_SV1
Foreign key (Masv) references SINHVIEN (masv) on
delete cascade on update cascade,
Foreign key (MaHP) references DMHOCPHAN(maHP) on
delete cascade on update cascade
)

3.3.2.4. Ràng buộc UNIQUE

Ràng buộc UNIQUE sẽ yêu cầu tất cả các giá trị trong một cột phải khác
nhau.
Cả hai lo i ràng buộc UNIQUE và PRIMARY KEY đều đảm bảo tính
duy nhất của một cột hoặc tập hợp các cột.
Một ràng buộc PRIMARY KEY sẽ tự động có một ràng buộc UNIQUE.
Tuy nhiên, chúng ta có thể có nhiều ràng buộc UNIQUE trong mỗi bảng
nhƣng ch có một ràng buộc
Ràng buộc UNIQUE đƣợc định nghĩ theo c pháp dƣới đây:
[CONSTRAINT t n ràng buộc] UNIQUE [(d nh sách cột)]
Ví dụ 3-7: T o bảng DMLOP
create table DMlOP
(
Malop char(10) not null UNIQUE
Tenlop nvarchar(50) not null,
HeDT char(20),
NamNH char(25)
Manganh char(10)not null constraint KT_FK foreign
key references DMNGANH (manganh) ,
)

* chú ý: Các trƣờng hợp sử dụng của UNIQUE giống với PRIMARY
KEY
3.3.2.5. Ràng buộc DEFAULT

Ràng buộc DEFAULT đƣợc sử dụng để thiết lập một giá trị mặc định
cho một cột.
Giá trị mặc định (DEFAULT) sẽ đƣợc thêm vào tất cả các bản ghi mới,
nếu không có giá trị khác đƣợc ch đinh.
72
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ràng buộc DEFAUL đƣợc định nghĩ theo c pháp dƣới đây:
[CONSTRAINT t n ràng buộc] DEFAUL <giá trị mặc định>
Ví dụ 3-8: T o bảng DMLOP, trong đó HeDT khi nhập dữ liệu thì mặc
định là „Chính quy‟
create table DMlOP
(
Malop char(10) not null UNIQUE
Tenlop nvarchar(50) not null,
H (20) f l ‘ ’,
NamNH char(25)
Manganh char(10)not null constraint KT_FK foreign
key references DMNGANH (manganh) ,
)

Ví dụ 3-9: T o bảng DIEMHP với các cột maSV (mã sinh viên), MaHP
(Mã học phần), Diemhp (Điểm học phần), NgayND( ngày nhập điểm). Trong
đó ngày nhập điểm luôn mặc định là ngày hiện t i.
create table DIEMHP
(
MaSV nchar(10) not null,
MAHP char(10) not null ,
Diemhp tinyint not null constraint Ktra_Diem2 CHECK
(Diemhp >= 0 and Diemhp <= 10),
Constraint KC_DiemHP1 Primary key (Masv,Mahp),
ngayND smalldatetime not nul constraint DF default
getdate()
)

3.3.3. Sửa đổi định nghĩa bảng

Một bảng s u khi đã đƣợc định nghĩ bằng câu lệnh CREATE TABLE
có thể đƣợc sử đổi th ng qu câu lệnh ALTER TABLE. Câu lệnh này cho
phép thực hiện đƣợc các th o tác s u:
 Bổ sung một cột vào bảng.
 Xoá một cột khỏi bảng.
 Th y đổi định nghĩ của một cột trong bảng.
 Xoá bỏ hoặc bổ sung các ràng buộc cho bảng.
73
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

C pháp củ câu lệnh ALTER TABLE nhƣ s u:


AL A L
A đ t |

AL C L l [ LL LL
C L t |
ADD CONSTRAI đ
C AI c

Ví dụ 1: Th m một cột mới sodt (số điện tho i) vào bảng DMKHOA
alter table DMKHOA
add SoDT char(10) not null

Ví dụ 2: Th y đổi định nghĩ cột sodt


alter table DMKHOA
alter column Sodt char(11) null

Ví dụ 3: Th m ràng buộc CHECK vào cột ng ysinh (ng ysinh tính đến
thời điểm hiện t i phải lớn hơn hoặc bằng 18 tuổi) của Bảng SINHVIEN
alter table SINHVIEN
add CONSTRAINT chk_ngaysinh
CHECK (YEAR(GETDATE())-YEAR(ngaysinh)>=18)

Ví dụ 4: Xó ràng buộc CHECK


alter table sinhvien
drop chk_ngaysinh
Ví dụ 5: Xó cột sodt
alter table DMKHOA
drop column sodt

Nếu bổ sung th m một cột vào bảng và trong bảng đã có ít nhất một bản
ghi th cột mới cần bổ sung phải cho phép chấp nhận giá trị NULL hoặc phải
có giá trị mặc định.
Muốn xoá một cột đ ng đƣợc ràng buộc bởi một ràng buộc hoặc đ ng
đƣợc th m chiếu bởi một khoá ngoài, t phải xoá ràng buộc hoặc khoá ngoài
trƣớc s o cho tr n cột kh ng còn bất kỳ một ràng buộc và kh ng còn đƣợc
th m chiếu bởi bất kỳ khoá ngoài nào.

74
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Nếu bổ sung th m ràng buộc cho một bảng đã có dữ liệu và ràng buộc
cần bổ sung kh ng đƣợc thoả mãn bởi các bản ghi đã có trong bảng th câu
lệnh ALTER TABLE kh ng thực hiện đƣợc.
3.3.4. Xóa bảng

Khi một bảng kh ng còn cần thiết, t có thể xoá nó r khỏi cơ sở dữ liệu
bằng câu lệnh DROP TABLE. Câu lệnh này c ng đồng thời xoá tất cả những
ràng buộc, ch mục, trigger li n qu n đến bảng đó.
Câu lệnh có c pháp nhƣ s u:
DROP TABLE t n bảng
Trong các hệ quản trị cơ sở dữ liệu, khi đã xoá một bảng bằng lệnh
DROP TABLE, t kh ng thể kh i phục l i bảng c ng nhƣ dữ liệu củ nó. Do
đó, cần phải cẩn thận khi sử dụng câu lệnh này.
Câu lệnh DROP TABLE kh ng thể thực hiện đƣợc nếu bảng cần xoá
đ ng đƣợc th m chiếu bởi một ràng buộc khóa ngo i. Trong trƣờng hợp này,
ràng buộc khóa ngo i đ ng th m chiếu hoặc bảng đ ng th m chiếu đến bảng
cần xoá phải đƣợc xoá trƣớc.
Khi một bảng bị xoá, tất cả các ràng buộc, ch mục và trigger li n qu n
đến bảng c ng đồng thời bị xó theo. Do đó, nếu t t o l i bảng th c ng phải
t o l i các đối tƣợng này.
Ví dụ: Để xó bảng DMKHOA trƣớc ti n t phải xó ràng buộc khóa
ngo i từ bảng DMNGANH
alter table DMNGANH
drop constraint fk_nganh

S u đó xó bảng DMKHOA
drop table DMKHOA

3.4. Ngôn ngữ thao tác dữ liệu – DML


SQL đƣợc xem nhƣ là c ng cụ hữu hiệu để thực hiện các y u cầu truy
vấn và th o tác tr n dữ liệu. Trong chƣơng này, t sẽ bàn luận đến nhóm các
câu lệnh trong SQL đƣợc sử dụng cho mục đích này. Nhóm các câu lệnh này
đƣợc gọi chung là ng n ngữ thao tác dữ liệu (DML), DML b o gồm các câu
lệnh sau:

75
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 SELECT: Sử dụng để truy xuất dữ liệu từ một hoặc nhiều bảng.


 INSERT: Th m dữ liệu.
 UPDATE: Cập nhật dữ liệu.
 DELETE: Xoá dữ liệu.
Trong số các câu lệnh này, có thể nói SELECT là câu lệnh tƣơng đối
phức t p và đƣợc sử dụng nhiều trong cơ sở dữ liệu. Với câu lệnh này, t
kh ng ch thực hiện các y u cầu truy xuất dữ liệu đơn thuần mà còn có thể
thực hiện đƣợc các y u cầu thống k dữ liệu phức t p. C ng chính v vậy,
trong chƣơng này sẽ tập trung tƣơng đối nhiều đến câu lệnh SELECT.
3.4.1. Thêm, cập nhật và xóa dữ liệu

Trong phần này, ch ng t sẽ đề cập đến 3 câu lệnh:


Lệnh INSERT
Lệnh UPDATE
Lệnh DELETE
3.4.1.1. Thêm dữ liệu

Dữ liệu trong các bảng đƣợc thể hiện dƣới d ng các dòng (bản ghi). Để
bổ sung th m các dòng dữ liệu vào một bảng, t sử dụng câu lệnh INSERT.
Hầu hết các hệ quản trị CSDL dự tr n SQL cung cấp các cách dƣới đây để
thực hiện thao tác th m dữ liệu cho bảng:

Th m từng dòng dữ liệu với mỗi câu lệnh INSERT. Đây là cách
sử dụng thƣờng gặp nhất trong giao tác SQL.

Th m nhiều dòng dữ liệu bằng cách truy xuất dữ liệu từ các bảng
dữ liệu khác.
Th m từng dòng dữ liệu:
Để bổ sung một dòng dữ liệu mới vào bảng, t sử dụng câu lệnh
INSERT với c pháp:
I I [( )
AL ( )

Nếu nhập danh_sách_giá_trị đầy đủ và theo thứ tự cột trong bảng thì
không cần ghi danh_sách _cột sau tên_bảng.
76
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

- Nếu cột nhận dữ liệu có trong bảng mã Unicode (đã kh i báo khi định
nghĩ bảng) th trƣớc nhập giá trị vào cột đó ta phải thêm ký tự N.
Ví dụ: Th m th ng tin một sinhvien mới vào bảng Sinhvien
insert into Sinhvien (masv, HoTen, malop, GioiTinh,
Ngaysinh, DiaChi)
l (‘001’, A , ‘C 1’, ‘ ’,
4 2 1996 , ‘ ỳ’)

insert into Sinhvien
l (‘001’, A , ‘C 1’, ‘ ’,
4 2 1996 , ‘ ỳ’)

Lƣu : Trong trƣờng hợp một thuộc tính nào đƣợc thiết lập kiểu dữ liệu
là identity là “YES” th t kh ng cần th m giá trị trƣờng này mà SQL sẽ tự
động t o ra một giá trị cho trƣờng này.
Trong trƣờng hợp ch nhập giá trị cho một số cột trong bảng, t phải ch
định d nh sách các cột cần nhập dữ liệu ng y s u t n bảng. Khi đó, các cột
kh ng đƣợc nhập dữ liệu sẽ nhận giá trị mặc định (nếu có) hoặc nhận giá trị
NULL (nếu cột cho phép chấp nhận giá trị NULL). Nếu một cột kh ng có giá
trị mặc định và kh ng chấp nhận giá trị NULL mà kh ng đuợc nhập dữ liệu,
câu lệnh sẽ bị lỗi.
Th m một tập các dòng dữ liệu vào bảng
Một cách sử dụng khác củ câu lệnh INSERT đƣợc sử dụng để bổ sung
nhiều dòng dữ liệu vào một bảng, các dòng dữ liệu này đƣợc lấy từ một bảng
khác th ng qu câu lệnh SELECT. Ở cách này, các giá trị dữ liệu đƣợc bổ
sung vào bảng kh ng đƣợc ch định tƣờng minh mà th y vào đó là một câu
lệnh SELECT truy vấn dữ liệu từ bảng khác.
C pháp câu lệnh INSERT có d ng nhƣ s u:
I I [( ) l L C

Ví dụ:
insert into sinhvien_Backup
select * from sinhvien

Lƣu : Kết quả củ câu lệnh SELECT phải có số cột bằng với số cột
đƣợc ch định trong bảng đích và phải tƣơng thích về kiểu dữ liệu.

77
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3.4.1.2. Cập nhật ữ liệu

Câu lệnh UPDATE trong SQL đƣợc sử dụng để cập nhật dữ liệu trong
các bảng. Câu lệnh này có c pháp nhƣ s u:
UPDATE t n bảng SET t n cột = biểu thức [, ..., t n cột k =
biểu thức k] [FROM d nh sách bảng]
[WHERE điều kiện]
S u UPDATE là t n củ bảng cần cập nhật dữ liệu. Một câu lệnh
UPDATE có thể cập nhật dữ liệu cho nhiều cột bằng cách ch định các d nh
sách t n cột và biểu thức tƣơng ứng s u từ khoá SET. Mệnh đề WHERE trong
câu lệnh UPDATE đƣợc sử dụng để ch định các dòng dữ liệu chịu tác động
củ câu lệnh (nếu kh ng ch định, ph m vi tác động củ câu lệnh đƣợc hiểu là
toàn bộ các dòng trong bảng).
Ví dụ:
update sinhvien set HoTen = 'Cao Van Chung'
where MaKH = 9

Trong câu lệnh UPDATE có thể sử dụng CASE...WHEN.


Ví dụ:
update Sinhvien set gioitinh = case when gioitinh =
1 l

3.4.1.3. Xóa ữ liệu

SQL Server cung cấp 2 câu lệnh để xóa dữ liệu, DELETE và


TRUNCATE. Cú pháp của hai lệnh này nhƣ sau:
L F [F [WH
đ ề

hoặc TRUNCATE TABLE tên_bảng


Những điểm khác nh u cơ bản của hai lệnh này:
DELETE cung cấp các lựa chọn để xóa những dòng dữ liệu thỏa mãn
các điều kiện nhất định, nhƣ WHERE hoặc JOIN với các bảng khác.
TRUNCATE không có lựa chọn nào, mà luôn xóa bỏ toàn bộ dữ liệu của
bảng. Nói cách khác, ta không thể dùng TRUNCATE để xóa một phần dữ liệu
của bảng.
78
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Quá trình thực hiện DELETE: tìm các bản ghi thỏ mãn điều kiện của
câu lệnh và xóa các bản ghi này. Việc tìm các bản ghi cần xó đƣợc thực hiện
giống hệt nhƣ một câu lệnh SELECT, c ng tối ƣu hó , lựa chọn giữa các
phƣơng án thực hiện khác nhau và chọn r phƣơng án tối ƣu. TRUNCATE th
ch có một phƣơng án thực hiện duy nhất, đó là xó bỏ tất cả các dòng dữ liệu
của bảng.
Với DELETE, các bản ghi bị xóa sẽ đƣợc kiểm tra xem có vi ph m ràng
buộc FOREIGN KEY không. Nếu trƣớc đó, khi t định nghĩ ràng buộc
FOREIGN KEY mà có lựa chọn CASCADE DELETE, thì thay vì báo lỗi
SQL Server sẽ đồng thời xóa hết các bản ghi trong cả bảng quan hệ.
TRUNCATE thì không kiểm tr nhƣ vậy, nếu bảng có ràng buộc FOREIGN
KEY, SQL Server sẽ báo lỗi và không cho thực hiện. Do vậy, lựa chọn
CASCADE DELETE trong khai báo FOREIGN KEY ch ảnh hƣởng đến lệnh
DELETE chứ không tác dụng đối với TRUNCATE.
DELETE thực ra ch đánh dấu xóa các bản ghi chứ ng y s u đó dữ liệu
của các bản ghi bị xóa vẫn nằm còn lƣu. Khi t INSERT th m dữ liệu vào
bảng thì các bản ghi mới sẽ ghi đè l n các vùng lƣu trữ đó. T có thể kiểm tra
để thấy kích thƣớc bảng kh ng th y đổi ngay cả sau khi ch y DELETE.
TRUNCATE thì xóa hết dữ liệu đồng thời giải phóng vùng lƣu trữ dành cho
bảng, trả l i cho SQL Server.
DELETE cho phép áp dụng đối với bảng ở server khác đƣợc nối qua
linked server. TRUNCATE kh ng cho phép điều này, ta ch có thể
TRUNCATE bảng nằm trên cùng server.
Vì vậy, dùng DELETE luôn luôn chậm hơn TRUNCATE. Càng có nhiều
bản ghi DELETE càng chậm, còn TRUNCATE thì không phụ thuộc vào
lƣợng dữ liệu. DELETE có ph m vi ứng dụng rộng hơn; còn TRUNCATE th
thực hiện nh nh hơn.
Ví dụ 3-10: Câu lệnh dƣới đây xó khỏi bảng Sinhvien những sinh viên
có địa ch ở Tam Kỳ
DELETE FROM Sinhvien
WH LI ‘% ỳ%’

Ví dụ 3-11: Xóa khỏi bảng Sinhvien những sinh vi n có địa ch ở Tam


kỳ và có điểm học phần bằng 0
DELETE FROM Sinhvien
79
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

FROM Diem
WHERE Sinhvien.masv=Diem.masv AND diachi LIKE
‘%H %’ diemhp=0

Ví dụ 3-12: Xóa khỏi bảng Nganh những ngành không có sinh viên nào
học
DELETE FROM Nganh
WHERE manganh NOT IN (SELECT DISTINCT
manganh FROM Sinhvien)

Ví dụ 3-13: Xóa toàn bộ dữ liệu trong bảng Diem


DELETE FROM Diem

có tác dụng tƣơng tự với câu lệnh


TRUNCATE TABLE Diem

3.4.2. Câu lệnh truy xuất dữ liệu SELECT

3.4.2.1. Câu lệnh truy vấn dạng tổng quát

Câu lệnh SELECT đƣợc sử dụng để truy xuất dữ liệu từ một hay nhiều
bảng và kết quả khi thực hiện câu lệnh c ng đƣợc hiển thị dƣới d ng bảng.
Câu lệnh này có thể dùng để thực hiện phép chọn (truy xuất một tập con các
dòng trong một hay nhiều bảng), phép chiếu (truy xuất một tập con các cột
trong một hay nhiều bảng) và phép kết nối (liên kết các dòng trong hai hay
nhiều bảng để truy xuất dữ liệu). Ngoài ra, câu lệnh này còn cung cấp khả
năng thực hiện các thao tác truy vấn và thống kê dữ liệu phức t p khác.
Cú pháp câu lệnh truy vấn:
L C [ALL I I C [ < >
[ ứ [A < ớ > [I < ớ >
F < ì >
[WH < đ ề ấ >
[G Y < ầ > [G Y
LL C ( ầ )
[HA I G <đ ề ự G Y>
[ Y < ắ x >

Chú ý: Mệnh đề COMPUTE kh ng còn đƣợc hỗ trợ trong SQL Server


2019 mà thay thế vào đó t dùng ROLLUP/ CUBE trong group by
80
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Một số lƣu khi viết câu lệnh:


Câu lệnh SQL không phân biệt chữ hoa, chữ thƣờng.
Các từ khó kh ng đƣợc viết tắt hoặc tách ra thành nhiều dòng.
Các mệnh đề khác nh u n n đặt trên những dòng khác nhau.
- Một câu lệnh có thể viết trên nhiều dòng, nhiều câu lệnh có thể viết trên
một dòng.
- Trong câu lệnh trên, thành phần đặt trong cặp dấu [ ] là không bắt buộc
l c nào c ng có. Thành phần nào không có thì bỏ đi, còn nếu có thì phải xuất
hiện theo trật tự này.
- Thực hiện câu lệnh bằng cách b i đen rồi nhấn F5 hoặc nhấn Execute
trên thanh công cụ và phải chú ý câu lệnh đó đ ng thực hiện trên Database
nào.
- Trong trƣờng hợp đặc biệt, SELECT không có mệnh đề FROM, dùng
để hiển thị thông tin không lấy trong cơ sở dữ liệu.
Ví dụ 3-14: Hiển thị 9 ký tự đầu của chữ Công nghệ thông tin:
L C L F ( ’Cô ô ’,9)

Kết quả hiển thị nhƣ s u:

3.4.2.2. Danh sách chọn trong câu lệnh SELECT

Danh sách chọn trong câu lệnh SELECT đƣợc dùng để ch định các
trƣờng, các biểu thức cần hiển thị trong các cột củ kết quả truy vấn. Các
trƣờng, các biểu thức đƣợc ch định ng y s u từ khoá SELECT và phân cách
nhau bởi dấu phẩy. Sử dụng danh sách chọn trong câu lệnh SELECT b o gồm
các trƣờng hợp s u:
Chọn tất cả các cột: ch ng t dùng dấu * trong câu lệnh Select để hàm
chọn hết tất cả các cột trong các bảng đƣợc liệt kê sau mệnh đề FROM. Trong
trƣờng hợp này, các cột đƣợc hiển thị trong kết quả truy vấn sẽ tuân theo thứ
tự mà ch ng đã đƣợc t o r khi bảng đƣợc định nghĩ .

81
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ví dụ: Muốn lấy toàn bộ thông tin của bảng Sinhvien, ta viết:
SELECT * FROM Sinhvien
H ặ SELECT Sinhvien.* FROM Sinhvien

Lƣu : Nếu truy vấn đƣợc thực hiện tr n nhiều bảng/khung nh n và trong
các bảng/khung nh n có các trƣờng trùng t n th t n của những trƣờng này
nếu xuất hiện trong danh sách chọn phải đƣợc viết dƣới d ng:
tên ảng.tên trư ng
Chọn một số cột cụ thể: Trong trƣờng hợp cần ch định cụ thể các cột
cần hiển thị trong kết quả truy vấn, t ch định d nh sách các t n cột trong
danh sách chọn. Thứ tự của các cột trong kết quả truy vấn tuân theo thứ tự củ
các trƣờng trong d nh sách chọn.
Ví dụ 3-15: Hiển thị thông tin về họ tên, giới tính, mã lớp của các
sinhvien, ta viết:
SELECT hoten, gioitinh, malop
FROM Sinhvien

Th y đổi ti u đề các cột:


Trong kết quả truy vấn, ti u đề của các cột mặc định sẽ là t n củ các
trƣờng tƣơng ứng trong bảng. Tuy nhi n, để các ti u đề trở n n thân thiện
hơn, t có thể đổi t n các ti u đề của các cột. Để đặt ti u đề cho một cột nào
đó, t sử dụng cách viết:
ti u đề cột = t n trƣờng hoặc
t n trƣờng AS ti u đề cột hoặc
t n trƣờng ti u đề cột
Ví dụ 3-16: Hiển thị thông tin về họ tên, giới tính, mã lớp của các
sinhvien, ta viết:
L C ’H ’, ’G ớ
’, l ’ ã lớ ’
FROM Sinhvien

Sử dụng một biểu thức tính toán


Sau câu lệnh SELECT ta có thể dùng các biểu thức tính toán của Cột hay
giá trị tính toán muốn lấy về.
Ví dụ 3-17: Tính tổng số lƣợng sinh viên của ngành CNTT
82
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

l ( ) ’ ổ ố l ợ ’
From sinhvien, DMLop, DMNganh
Where sinhvien.malop = Dmlop.malop and
l = = ‘C ’

Ví dụ 3-18: Ta có bảng dữ liệu Hang gồm các thuộc tính: mahang,


tenhang, dvt, dongia và bảng CTHD gồm các thuộc tính: Sohd, mahang,
soluong. Yêu cầu: Tính thành tiền của các mặt hàng đã bán r
l , , * l ’
ề ’
From Hang, CTHD
Where Hang.mahang = CTHD.mahang

Sử dụng cấu tr c CASE...WHEN:


Cấu tr c CASE đƣợc dùng trong d nh sách chọn nhằm. Cấu tr c này có
c pháp nhƣ s u:
CASE biểu thức
WHEN biểu thức kiểm tr THEN kết quả [ ... ] [ELSE
kết quả củ else] END
hoặc:
CASE
WHEN điều kiện THEN kết quả
[...]
[ELSE kết quả củ else]
END
Ví dụ 3-19: Câu lệnh SQL dƣới đây sẽ hiện thị giới tính củ sinh vi n
tùy theo giá trị thực đƣợc lƣu trong CSDL. Nếu giá trị trong CSDL là FALSE
-> hiện thị giới tính NỮ, nếu giá trị là TRUE -> hiện thị giới tính NAM.
select HOTEN, gioitinh, DIACHI,
GI I I H 1 A l
[GI I H f H

Câu lệnh tr n c ng có thể viết nhƣ s u:


select HOTENKH, DIACHI,

83
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

GI I I H = 1 A l
from KhachHang

Lo i bỏ các dòng dữ liệu trùng nh u:


Từ khó DISTINCT sẽ lo i bỏ các dòng dữ liệu giống nh u. Trong ví dụ
tr n, có h i khách hàng có t n C o V n Trung. Nếu t ch truy vấn t n khách
hàng, để lo i bỏ sự trùng lắp t dùng từ khó DISTINCT.
Ví dụ 3-20: Hiển thị họ tên của sinh viên
Select distinct HOTEN from Sinhvien

Lự chọn một số lƣợng giới h n các dòng:


Từ khó TOP n sẽ trả về ch n dòng dữ liệu
Ví dụ 3-21: Hiển thị họ tên và ngày sinh củ 5 sinh vi n đầu tiên trong
danh sách
SELECT TOP 5 ho,ten,ngaysinh FROM Sinhvien

Nếu sử dụng TOP n PERCENT th sẽ trả về n số dòng dữ liệu hiện có


trong CSDL
Ví dụ 3-22: Hiển thị họ tên và ngày sinh của 10% số lƣợng sinh viên
hiện có trong bảng Sinhvien
SELECT TOP 10 PERCENT ho,ten,ngaysinh FROM Sinhvien

3.4.2.3. Mệnh đề FROM

Mệnh đề FROM trong câu lệnh SELECT đƣợc sử dụng nhằm ch định
các bảng và khung nh n cần truy xuất dữ liệu. S u FROM là d nh sách t n
củ các bảng và khung nh n th m gi vào truy vấn, t n củ các bảng và khung
nh n đƣợc phân cách nh u bởi dấu phẩy. Khi sử dụng nhiều bảng để truy xuất
dữ liệu thì chúng ta có thể sử dụng các kết nối các bảng với câu lệnh Join sau
mệnh đề From ( đƣợc đề cập trong mục 3.4.2.8)
Ví dụ 3-23: Câu lệnh sau hiển thị th ng tin khách hàng
Select * from Sinhvien

Trong mệnh đề FROM có thể sử dụng bí d nh ( li s) nhằm làm cho câu


truy vấn dễ nh n hơn.
Ví dụ 3-24:

84
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Select sv.* from sinhvien sv where sv.makh=1

3.4.2.4. Mệnh đề WHERE

Mệnh đề WHERE trong câu lệnh SELECT đƣợc sử dụng nhằm xác định
các điều kiện đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu
thức logic và ch những dòng dữ liệu nào thoả mãn điều kiện đƣợc ch định
mới đƣợc hiển thị trong kết quả truy vấn.
Ví dụ 3-25: Lọc r th ng tin các sinhvien sinh trƣớc năm 1996
Select *
From Sinhvien
Where year(ngaysinh) > 1996

Trong mệnh đề WHERE thƣờng sử dụng:


 Các toán tử kết hợp điều kiện (AND, OR)
 Các toán tử so sánh (Xem bảng b n dƣới)
 Kiểm tra giới h n của dữ liệu (BETWEEN/ NOT BETWEEN)
 Tập hợp (IN/ NOT IN)
 Kiểm tr khu n d ng dữ liệu. (LIKE/ NOT LIKE)
 Các giá trị NULL (IS NULL/ IS NOT NULL)
 Các toán tử so sánh:

Toán tử nghĩ

= Bằng

> Lớn hơn

< Nhỏ hơn

>= Lớn hơn hoặc bằng

<= Nhỏ hơn hoặc bằng

<> Khác

!> Kh ng lớn hơn

85
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

!< Kh ng nhỏ hơn

Ví dụ 3-26: Ví dụ dƣới đây lấy t n, ngày sinh theo định d ng


dd/MM/yyyy và đị ch của những sinh vi n có t n Le Thi Ho và tuổi lớn
hơn 20.
select HOTEN, convert (varchar, NGAYSINH, 103) as
‘ GÀY I H’, IACHI
from SINHVIEN
where HoTen = 'Le Thi Hoa'
and year(getdate()) - year(NGAYSINH) > 20

Kiểm tr giới h n củ dữ liệu:


Để kiểm tr xem giá trị dữ liệu nằm trong (ngoài) một khoảng nào đó, t
sử dụng toán tử BETWEEN/ NOT BETWEEN nhƣ s u:

Mệnh đề nghĩ

Variable BETWEEN a AND b a <= variable <=b

variable <a hoặc variable >


Variable NOT BETWEEN a AND b b

Ví dụ 3-27: ví dụ này tƣơng tự ví dụ ở tr n nhƣng điều kiện là độ tuổi


nằm trong khoảng từ đến 30 tuổi.
select HOTEN, convert (varchar, NGAYSINH, 103) as
’ GÀY I H’, IACHI
from SINHVIEN
where HoTen = 'Le Thi Hoa'
and year(getdate()) - year(NGAYSINH) between 20 and
30

Toán tử làm việc tr n tập hợp (IN/ NOT IN):


Từ khoá IN/ NOT IN đƣợc sử dụng khi ta cần ch định điều kiện t m
kiếm dữ liệu cho câu lệnh SELECT là một d nh sách các giá trị. S u IN/ NOT
IN có thể là một d nh sách các giá trị hoặc là một câu lệnh SELECT khác.
Ví dụ 3-28: Câu lệnh dƣới đây lấy r các th ng tin củ SINHVIEN có
mã sinh vi n là 5,6 hoặc 7

86
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

select MASV, HOTEN, convert(varchar,NGAYSINH, 103)


‘ GÀY I H‘, IACHI
from KhachHang
where MAsv in (5,6,7)

Ví dụ 3-29: Ví dụ này minh họa một câu lệnh SELECT khác đứng s u
mệnh đề IN/ NOT IN
select MASV, HOTEN, convert(varchar,NGAYSINH, 103)
‘ GÀY I H’, IACHI
from SINHVIEN
where MASV not in (select MASV from SINHVIEN where
YEAR(NGAYSINH) >1996)

Toán tử LIKE/ NOT LIKE và k tự đ i diện (WildCard):


Từ khoá LIKE (NOT LIKE) sử dụng trong câu lệnh SELECT nhằm m
tả khu n d ng của dữ liệu cần t m kiếm. Ch ng thƣờng đƣợc kết hợp với các
k tự đ i diện s u đây:

K tự
đ i diện nghĩ

% Chuỗi k tự bất kỳ gồm kh ng hoặc nhiều k tự

_ Một k tự bất k

Một k tự nằm trong giới h n đƣợc ch định. Ví dụ: [ -f] hàm


[] ch

Một trong các k tự: , b, c, d, e, f.

[^] Một k tự kh ng nằm trong giới h n đƣợc ch định. Ví dụ: [^a-f]

Hàm ch một k tự khác tất cả các k t ự: , b, c, d, e, f.

Ví dụ 3-30: Ví dụ dƣới đây t m r các SINHVIEN có họ là “Nguyễn”.


select *
from SINHVIEN
H l %

Giá trị NULL:

87
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Dữ liệu trong một cột cho phép NULL sẽ nhận giá trị NULL trong
các trƣờng hợp s u:
 Kh ng có dữ liệu đƣợc nhập cho cột và kh ng có giá trị mặc định
nào cho cột.
 Ngƣời sử dụng trực tiếp đƣ giá trị NULL vào cho cột đó.
 Một cột có kiểu dữ liệu là kiểu số sẽ chứ giá trị NULL nếu giá trị
đƣợc ch định gây tràn số.
Trong mệnh đề WHERE, để kiểm tr giá trị của một cột có giá trị NULL
h y kh ng, ta sử dụng cách viết:
WHERE t n cột IS NULL hoặc
WHERE t n cột IS NOT NULL
Ví dụ 3-31: Hiển thị th ng tin các sinh vi n chƣ nhập ngày sinh
select *
from sinhvien
where NgaySinh is null

T o mới bảng dữ liệu từ câu lệnh SELECT:


Câu lệnh SELECT ... INTO có tác dụng t o một bảng mới có cấu tr c và
dữ liệu đƣợc xác định từ kết quả của truy vấn. Bảng mới đƣợc t o r sẽ có số
cột bằng số cột đƣợc ch định trong d nh sách chọn và số dòng sẽ là số dòng
kết quả của truy vấn.
Ví dụ 3-32: T o bảng SV luu để lƣu trƣc th ng tin về họ ten, ngay sinh ,
gioi tinh và địa ch của các sinh viên
select HOTEN, convert(varchar,NGAYSINH, 103) as
’ Y I H’, IACHI l
from sinhvien

Lƣu : Nếu trong d nh sách chọn có các biểu thức th những biểu thức
này phải đƣợc đặt ti u đề.
3.4.2.5. Mệnh đề ORDER B - S p ếp kết quả truy vấn

Mặc định, các dòng dữ liệu trong kết quả củ câu truy vấn tuân theo thứ
tự củ ch ng trong bảng dữ liệu hoặc đƣợc sắp xếp theo ch mục (nếu tr n
bảng có lập ch mục). Trong trƣờng hợp muốn dữ liệu đƣợc sắp xếp theo

88
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

chiều tăng hoặc giảm củ giá trị của một hoặc nhiều trƣờng, t sử dụng th m
mệnh đề ORDER BY trong câu lệnh SELECT; Sau ORDER BY là danh sách
các cột cần sắp xếp (tối đ là 16 cột). Dữ liệu đƣợc sắp xếp có thể theo chiều
tăng (ASC) hoặc giảm (DESC), mặc định là sắp xếp theo chiều tăng. Nếu s u
ORDER BY có nhiều cột th việc sắp xếp dữ liệu sẽ đƣợc ƣu ti n theo thứ tự
từ trái qu phải.
Ví dụ 3-33: Ví dụ dƣới đây sắp xếp th ng tin các các sinh vi n theo thứ
tự tuổi giảm dần.
select HOTEN, year(getdate())- year(NGAYSINH) as
‘ ’, IACHI
from Sinhvien
order by year(getdate())- year(NGAYSINH) DESC

T có thể ch định số thứ tự của cột cấn đƣợc sắp xếp. Câu lệnh ở ví dụ
tr n có thể đƣợc viết l i nhƣ s u:
select HOTEN, year(getdate())- year(NGAYSINH) as
Tuoi, DIACHI
from Sinhvien
order by 2 DESC

3.4.2.6. Mệnh đề ROUP B

Mệnh đề GROUP BY sử dụng trong câu lệnh SELECT nhằm phân


ho ch các dòng dữ liệu trong bảng thành các nhóm dữ liệu, và tr n mỗi nhóm
dữ liệu thực hiện tính toán các giá trị thống k nhƣ tính tổng, tính giá trị trung
b nh, ...( sẽ đề cập trong phần thống kê)
Các hàm gộp ( ggreg te functions) đƣợc sử dụng để tính giá trị thống k
cho toàn bảng hoặc tr n mỗi nhóm dữ liệu. Ch ng có thể đƣợc sử dụng nhƣ là
các cột trong danh sách chọn củ câu lệnh SELECT hoặc xuất hiện trong
mệnh đề HAVING, nhƣng kh ng đƣợc phép xuất hiện trong mệnh đề
WHERE.
SQL cung cấp các hàm gộp dƣới đây:

Hàm gộp Chức năng

SUM([ALL|DISTINCT] biểu thức) Tính tổng các giá trị.

89
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

AVG([ALL|DISTINCT] biểu thức) Tính trung b nh củ các giá trị.

COUNT([ALL|DISTINCT]
biểu thức) Đếm số các giá trị trong biểu thức.

COUNT(*) Đếm số các dòng đƣợc chọn.

MAX(biểu thức) Tính giá trị lớn nhất

MIN(biểu thức) Tính giá trị nhỏ nhất

Hàm SUM và AVG ch làm việc với các biểu thức số.
Hàm SUM, AVG, COUNT, MIN và MAX bỏ qu các giá trị NULL khi
tính toán.
Hàm COUNT(*) kh ng bỏ qu các giá trị NULL.
Lưu ý: Trong trƣờng hợp d nh sách chọn củ câu lệnh SELECT có các
thuộc tính nào th phải có mặt đầy đủ trong mệnh đề GROUP BY nếu kh ng
câu lệnh sẽ kh ng hợp lệ. hoặc nếu sau câu lệnh select ta dùng * thì sau group
by ta ch định cột cần nhóm
3.4.2.7. Thống kê dữ liệu

Thống kê trên toàn bảng


Khi cần tính toán giá trị thống k tr n toàn bộ dữ liệu, ta sử dụng các
hàm gộp trong danh sách chọn củ câu lệnh SELECT. Trong trƣờng hợp này,
trong danh sách chọn kh ng đƣợc sử dụng bất kỳ một t n cột hay biểu thức
nào ngoài các hàm gộp.
Ví dụ 3-34: Tính tuổi trung b nh, tuổi nhỏ nhất và lớn nhất của các
Sinhvien
select min(year(getdate())-year(NGAYSINH)) as
‘ ổ ’ , x( ( ())-year(NGAYSINH)) as
’ ổ L ’, ( ( ())-year(NGAYSINH)) as
TuoiTB
from sinhvien

Ví dụ 3-35: cho biết điểm lớn nhất của học phần Cơ sở dữ liệu
select x( ) ’đ m lớn nhấ ’
from diemHP a, DMHocphan b
90
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

where a.mahp = b.mahp

Thống k tr n nhóm:
Trong trƣờng hợp cần thực hiện tính toán các giá trị thống k tr n các
nhóm dữ liệu, ta sử dụng mệnh đề GROUP BY để phân ho ch dữ liệu vào
trong các nhóm. Các hàm gộp đƣợc sử dụng sẽ thực hiện th o tác tính toán
tr n mỗi nhóm và cho biết giá trị thống k theo các nhóm dữ liệu.
Ví dụ 3-36: Câu truy vấn s u cho biết số tổng số sinhvien của từng lớp
select tenlop, count(masv) as ‘Tổng ố ’
From sinhvien, Dmlop
Where sinhvien.malop = Dmlop.malop
Group by tenlop

Trong trƣờng hợp d nh sách chọn củ câu lệnh SELECT có cả


các hàm gộp và những biểu thức kh ng phải là hàm gộp th những biểu thức
này phải có mặt đầy đủ trong mệnh đề GROUP BY, nếu kh ng câu lệnh sẽ
kh ng hợp lệ.
ROLLUP trong SQL Server là một mệnh đề con của mệnh đề GROUP
BY cung cấp cách viết tắt để xác định nhiều GROUPING SETS. ROLLUP
thƣờng đƣợc sử dụng để t o ra tổng số phụ (subtotals) và tổng số (totals) cho
mục đích báo cáo.
Select tenkhoa,tenlop, count(masv) as N'Tổng SLSV'
From sinhvien a, DMKHOA b, DMLOP c, DMNGANH d
where a.malop = c.malop and c.manganh=d.manganh
and
b.makhoa=d.makhoa
Group By rollup ( tenkhoa,tenlop )
order by Tenkhoa

subtoltal

toltal

91
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3.4.2.8. Mệnh đề V N chỉ định điều kiện trong hàm gộp

Mệnh đề HAVING đƣợc sử dụng nhằm ch định điều kiện đối với các
giá trị thống k đƣợc sản sinh từ các hàm gộp tƣơng tự nhƣ cách thức mệnh
đề WHERE thiết lập các điều kiện cho câu lệnh SELECT. Mệnh đề HAVING
thƣờng kh ng thực sự có nghĩ nếu nhƣ kh ng sử dụng kết hợp với mệnh đề
GROUP BY.
Một điểm khác biệt giữa HAVING và WHERE là mệnh đề WHERE
dùng để lọc các dòng dữ liệu hiện đ ng có trong bảng và điều kiện củ
WHERE kh ng đƣợc có các hàm gộp, trong khi đó mệnh đề HAVING ch
đƣợc phép sử dụng đi kèm theo mệnh đề GROUP BY dùng để lọc l i dữ liệu
s u khi đã nhóm và l i cho phép sử dụng các hàm gộp trong điều kiện củ
m nh.
Ví dụ 0-1: Thống kê những ngành ch có dƣới 20 sinh viên theo học
L C , , ( ) ’ ố

FROM Sinhvien,DMNganh
WHERE Sinhvien.manganh=DMNganh.manganh
GROUP BY Sinhvien.manganh,tennganh
HAVING count(masv)<20

3.4.3. Phép hợp (UNION)

Phép hợp đƣợc sử dụng trong trƣờng hợp t cần gộp kết quả củ h i h y
nhiều truy vấn thành một tập kết quả duy nhất. SQL cung cấp toán tử UNION
để thực hiện phép hợp.
C pháp nhƣ s u:
C l nh_1
UNION [ALL C l nh_2
[ I [ALL C l nh_3]
...
[ I [ALL C l nh_n]
[ORDER BY c ắ x
[C [ Y t]]

Trong đó Câu lệnh 1 có d ng:

92
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

L C t
[F ì
[WH đ ều_ki n]
[G Y t]
[HA I G đ ề n]

và Câu lệnh i (i = 2,..,n) có d ng:


L C t
[F ì
[WH đ ề n]
[G Y t]
[HA I G đ ề n]

Ví dụ 0-2 : Hiển thị những sinh vi n có địa ch Tam kỳ hoặc những sinh
vi n sinh s u năm 2001.
SELECT masv, hoten,diachi, year(ngaysinh) as N'Ngày
sinh'
FROM Sinhvien
WHERE diachi=N'Tam Kỳ'
UNION
ELECT masv, hoten,diachi, year(ngaysinh) as N'Ngày
sinh'
FROM Sinhvien
WHERE YEAR(ngaysinh)>2001

Trong ví dụ trên, câu lệnh SELECT thứ nhất chọn ra những sinh viên có
địa chỉ Tam Kỳ. Câu lệnh SELECT thứ hai chọn ra những sinh viên sinh sau
năm 2001. Hợp kết quả của hai câu lệnh này t đƣợc kết quả là những sinh
viên có địa chỉ Tam kỳ hoặc sinh viên sinh sau năm 2001.
Mặc định kết quả sẽ bỏ đi những dòng dữ liệu giống nhau, nếu muốn giữ
l i những dòng dữ liệu giống nhau ta dùng UNION ALL.
Các nguyên tắc khi sử dụng UNION
 Danh sách cột trong các truy vấn thành phần phải có cùng số lƣợng.
 Các cột tƣơng ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột
đƣợc sử dụng trong mỗi truy vấn thành phần phải cùng kiểu dữ liệu.
 Các cột tƣơng ứng trong từng truy vấn thành phần của một câu lệnh
UNION phải xuất hiện theo thứ tự nhƣ nhau.
93
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Khi các kiểu dữ liệu khác nh u đƣợc kết hợp với nhau trong câu lệnh
UNION, chúng sẽ đƣợc chuyển sang kiểu dữ liệu tƣơng thích (nếu có
thể chuyển đổi kiểu dữ liệu đƣợc).
 Ti u đề cột trong kết quả của phép hợp sẽ là ti u đề cột đƣợc ch định
trong truy vấn đầu tiên.
 Truy vấn thành phần đầu tiên có thể có INTO để t o mới một bảng từ
kết quả của chính phép hợp.
 Mệnh đề ORDER BY và COMPUTE dùng để sắp xếp kết quả truy
vấn hoặc tính toán các giá trị thống kê ch đƣợc sử dụng ở cuối câu
lệnh UNION. Ch ng kh ng đƣợc sử dụng trong bất kỳ truy vấn thành
phần nào.
 Mệnh đề GROUP BY và HAVING ch có thể đƣợc sử dụng trong bản
thân từng truy vấn thành phần. Ch ng kh ng đƣợc phép sử dụng để
tác động lên kết quả chung của phép hợp.
 Phép toán UNION có thể đƣợc sử dụng bên trong câu lệnh INSERT.
 Phép toán UNION kh ng đƣợc sử dụng trong câu lệnh CREATE
VIEW.
3.4.4. Các loại phép kết nối trong SQL Server:

Khi cần thực hiện một y u cầu truy vấn dữ liệu từ h i h y nhiều bảng, t
phải sử dụng đến phép nối. Một câu lệnh nối kết hợp các dòng dữ liệu trong
các bảng khác nh u l i theo một hoặc nhiều điều kiện nào đó và hiển thị
ch ng trong kết quả truy vấn.
Ví dụ: Để t m r khách hàng có mã là 3 đã đặt hàng trong những ngày
nào th câu truy vấn nhƣ s u:
select HOTENKH, NGAYTAO
from KhachHang, HoaDon
where KhachHang.MaKH = HoaDon.MaKH
and KhachHang.MaKH = 3

94
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Giải thích câu truy vấn:


 mệnh đề FROM trong phép kết nối:
Sau mệnh đề FROM của câu lệnh sử dụng phép kết nối là danh sách tên
các bảng tham gia vào truy vấn. Nếu ta sử dụng dấu * trong danh sách chọn
thì thứ tự của các bảng liệt kê sau FROM sẽ ảnh hƣởng đến thứ tự các cột
đƣợc hiển thị trong kết quả truy vấn.
 Mệnh đề Where trong phép kết nối:
Khi h i h y nhiều bảng đƣợc nối với nh u, t phải ch định điều kiện để
thực hiện phép nối ng y s u mệnh đề WHERE. Điều kiện nối đƣợc biểu diễn
dƣới d ng biểu thức logic so sánh giá trị dữ liệu giữa các cột củ các bảng
tham gia truy vấn.
Ví dụ 0-39 : Câu lệnh sau hiển thị thông tin sinh viên, lớp, ngành học và
kho mà sinh vi n đó theo học.
SELECT hoten, tenlop, tennganh,tenkhoa
FROM dmnganh, dmlop, dmkhoa, sinhvien
Where dmlop.manganh =dmnganh.manganh
and dmnganh.makhoa=dmkhoa.makhoa
and dmlop.malop = sinhvien.malop

Có các lo i kết nối nhƣ s u:


 Kết nối trong (Inner Join): gồm Equi Join (kết nối bằng) và
Natural Join (kết nối tự nhiên);

95
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Kết nối ngoài (Outer Join): gồm Left Outer Join (kết nối trái),
Right Outer Join (kết nối phải) và Full Outer Join (kết nối ngoài);
 Kết nối tích hợp (Cross Join);
 Tự kết nối (Self Join).
 Phép kết nối trong (Inner Join).
Tuy nhiên trong khuôn khổ giáo trình ch sử dụng kết nối trong với lệnh
INNER JOIN.
3.4.4.2. Phép kết nối trong (Inner Join)

Sử dụng INNER JOIN để trả về kết quả là các bản ghi mà cột đƣợc kết
nối ở hai bảng bằng giá trị nhau, các bản ghi ch xuất hiện ở một trong hai
bảng sẽ bị lo i.

Kết nối INNER JOIN


Ví dụ 0-40 : Hiển thị thông tin các sinh viên học lớp DT19CTT01
SELECT hoten, tenlop, tennganh,tenkhoa
FROM sinhvien inner join dmlop on dmlop.malop =
sinhvien.malop
l =’ 18C 01’

Ví dụ 3-0-41: Câu lệnh sau hiển thị thông tin sinh viên, lớp, ngành học
và kho mà sinh vi n đó theo học.
SELECT hoten, tenlop, tennganh,tenkhoa
FROM dmnganh inner join dmlop on dmlop.manganh
=dmnganh.manganh
inner join dmkhoa on dmnganh.makhoa=dmkhoa.makhoa
inner join
sinhvien on dmlop.malop = sinhvien.malop

Kết quả:

96
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả thực thi câu lệnh Select sử dụng kết nối Inner join
SQL Server cung cấp các lo i phép kết nối trong s u đây:
- Phép kết nối bằng (Equi Join) là một phép kết nối trong đó giá trị của
các cột sử dụng để kết nối đƣợc so sánh với nhau dựa trên tiêu chuẩn bằng và
tất cả các cột trong các bảng tham gia kết nối đều đƣợc đƣ r trong kết quả.
Ví dụ 0-52 : Câu lệnh dƣới đây thực hiện phép kết nối bằng giữa hai
bảng LOP và KHOA
SELECT *
FROM Lop,Khoa
WHERE Lop.makhoa=Khoa.makhoa

Kết quả thực thi câu lệnh Select sử dụng kết nối bằng
Trong kết quả của câu lệnh trên, cột makhoa (mã khoa) sẽ xuất hiện hai
lần trong kết quả phép kết nối (cột makhoa của bảng Khoa và cột makhoa của
bảng Lop) và nhƣ vậy là không cần thiết. Ta có thể lo i bỏ bớt đi những cột
trùng tên trong kết quả truy vấn bằng cách ch định danh sách cột cần đƣợc
hiển thị trong danh sách chọn của câu lệnh.
SELECT malop,ten lop,Lop.makhoa,tenkhoa FROM Lop,Khoa
WHERE Lop.makhoa=Khoa.makhoa

- Phép kết nối tự nhiên (Natural Join) là một phép kết nối trong đó điều
kiện kết nối giữa hai bảng chính là điều kiện bằng giữa khóa ngoài và khóa

97
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

chính của hai bảng; và trong danh sách chọn của câu lệnh ch giữ l i một
trong hai cột th m gi vào điều kiện của phép kết nối.
Ví dụ 0-43 : Để thực hiện phép kết nối tự nhiên, câu lệnh trong ví dụ trên
đƣợc viết l i nhƣ s u:
SELECT Lop.*,tenkhoa FROM Lop,Khoa
WHERE Lop.makhoa=Khoa.makhoa

Trong các câu lệnh kết nối, ngoài điều kiện của phép kết nối đƣợc ch
định trong mệnh đề WHERE còn có thể ch định các điều kiện tìm kiếm dữ
liệu khác (điều kiện chọn). Th ng thƣờng, các điều kiện này đƣợc kết hợp với
điều kiện kết nối thông qua toán tử AND.
Ví dụ 0-64: Câu lệnh dƣới đây hiển thị họ tên và ngày sinh của các sinh
viên Khoa Công nghệ Thông tin
SELECT ho,ten,ngaysinh FROM Sinhvien,Lop,Khoa
WHERE tenkhoa=N'Khoa Công Thông tin' AND
Sinhvien.malop = Lop.malop AND Lop.makhoa = Khoa.makhoa

3.4.4.3. Phép kết nối ngoài (Outer Join)

Trong các phép kết nối đã đề cập ở trên, ch những dòng có giá trị trong
các cột đƣợc ch định thỏ mãn điều kiện kết nối mới đƣợc hiển thị trong kết
quả truy vấn và đƣợc gọi là phép kết nối trong. Theo một nghĩ nào đó, những
phép kết nối này lo i bỏ thông tin chứa trong những dòng không thỏa mãn
điều kiện kết nối. Tuy nhi n, đ i khi t c ng cần giữ l i những thông tin này
bằng cách cho phép những dòng không thỏ mãn điều kiện kết nối có mặt
trong kết quả của phép kết nối. Để làm điều này, ta có thể sử dụng phép kết
nối ngoài.
SQL Server cung cấp các lo i phép kết nối ngoài s u đây:
- Phép kết nối ngoài trái (Left Outer Join, ký hiệu: *=): Phép kết nối này
hiển thị trong kết quả truy vấn tất cả các dòng dữ liệu của bảng nằm bên trái
trong điều kiện kết nối cho dù những dòng này không thỏ mãn điều kiện của
phép kết nối

98
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết nối Left join


Ví dụ 0-45 : Hiển thị tất cả các ngành mà kh ng có sinh vi n đăng k
học
SELECT Nganh.manganh, tennganh,Sinhvien.manganh,ten
FROM Nganh LEFT JOIN Sinhvien
ON Nganh.manganh=Sinhvien.manganh
where sinhvien.manganh is null

Kết quả thực hiện câu lệnh sử dụng kết nối Left join
- Phép kết nối ngoài phải (Right Outer Join, ký hiệu: =*): Phép kết nối
này hiển thị trong kết quả truy vấn tất cả các dòng dữ liệu của bảng nằm bên
phải trong điều kiện kết nối cho dù những dòng này không thỏ điều kiện của
phép kết nối.

Kết nối Right join


Ví dụ 0-46 : Trƣờng hợp sau cho thấy sinh viên tên Ph đăng k ngành
học không có trong danh sách các Ngành.
SELECT Nganh.manganh, tennganh,Sinhvien.manganh,ten
FROM Nganh RIGHT JOIN Sinhvien
ON Nganh.manganh=Sinhvien.manganh

99
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả thực hiện câu lệnh sử dụng kết nối Right join
Nếu trong các cột của các bảng th m gi vào điều kiện của phép kết nối
có các giá trị NULL thì các giá trị NULL đƣợc xem nhƣ là kh ng bằng nhau.
- Phép kết nối ngoài đầy đủ (Full Outer Join): Phép kết nối này hiển thị
trong kết quả gồm tất cả các bản ghi của cả hai bảng. Với các bản ghi ch xuất
hiện trong một bảng thì các cột dữ liệu từ bảng ki đƣợc điền giá trị NULL.

Kết nối Full join


Ví dụ 0-47: Câu lệnh sau hiển thị những ngành kh ng có sinh vi n đăng
ký học và ngƣợc l i những sinh vi n đăng k ngành kh ng có trong danh sách
ngành.
SELECT Nganh.manganh, tennganh,Sinhvien.manganh,ten
FROM Nganh FULL JOIN Sinhvien
ON Nganh.manganh=Sinhvien.manganh
where nganh.manganh is null or sinhvien.Manganh is
null

100
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả thực hiện câu lệnh sử dụng kết nối Full join
3.4.4.4. Phép kết nối tích hợp (CROSS JOIN)

Dùng Cross Join để ghép dữ liệu từ hai bảng trong đó số dòng thu đƣợc
bằng với số dòng của bảng thứ nhất nhân với số dòng của bảng thứ hai.
Ví dụ 0-7 :
SELECT TOP 10 *
FROM Nganh CROSS JOIN Sinhvien

Lƣu : trong câu lệnh này không có từ khóa "ON".


3.4.4.5. Phép tự kết kết nối (Self Join)

Phép tự kết nối là phép kết nối mà trong đó điều kiện kết nối đƣợc ch
định li n qu n đến các cột của cùng một bảng. Trong trƣờng hợp này, sẽ có sự
xuất hiện tên của cùng một bảng nhiều lần trong mệnh đề FROM và do đó các
bảng cần phải đƣợc đặt bí danh.
Ví dụ 0-49 : Để biết đƣợc họ tên và ngày sinh của các sinh viên có cùng
ngày sinh với nhau, ta phải thực hiện phép tự kết nối ngay trên chính bảng
Sinhvien. Trong câu lệnh kết nối, bảng Sinhvien xuất hiện trong mệnh đề
FROM với bí danh là a và b. Câu lệnh đƣợc viết nhƣ sau:
SELECT b.ho,b.ten,b.ngaysinh FROM Sinhvien a,
Sinhvien b
WHERE a.ngaysinh=b.ngaysinh AND a.masv<>b.masv

3.4.5. Truy vấn con (Subquery)

Truy vấn con là một câu lệnh truy vấn đƣợc lồng vào các câu lệnh truy
vấn khác nhằm thực hiện các truy vấn tính toán phức t p. Truy vấn con đƣợc
đặt trong mệnh đề WHERE, HAVING, FROM, ORDER BY hoặc SELECT.
Ví dụ 0-50 : Xem danh sách sinhviên có diemlan1 cao nhất
SELECT hoten, tenhp, diemlan1
FROM Sinhvien,DiemHP, dmhocphan
WHERE Sinhvien.masv=DiemHP.masv
and dmhocphan.mahp=diemhp.mahp
AND diemlan1=(SELECT max(diemlan1) FROM DiemHP)

101
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Nhƣ vậy truy vấn con tìm diemlan1 cao nhất sẽ thay thế cho một giá trị
trong mệnh đề WHERE của câu lệnh SELECT.
Khi sử dụng đến truy vấn con, cần ch đến một vài yếu tố sau:
 Cần mở và đóng ngoặc đơn cho câu lệnh truy vấn con.
 Ch đƣợc phép tham chiếu đến tên một cột hoặc một biểu thức sẽ trả
về giá trị trong truy vấn con.
 Kết quả của truy vấn con có thể trả về là một giá trị đơn l hoặc một
danh sách (một cột) các giá trị.
 Cấp độ lồng nhau của các truy vấn con bên trong Microsoft SQL
Server là 32 mức.
Ví dụ 0-51 : Liệt kê những ngành kh ng có sinh vi n nào đăng k học.
SELECT *
FROM dmnganh
WHERE manganh NOT IN
(select distinct dmnganh.manganh
from sinhvien inner join dmlop on
sinhvien.malop=dmlop.malop inner join dmnganh on
dmlop.manganh=dmnganh.manganh)

Các toán tử thƣờng dùng khi kết hợp với truy vấn con:
Truy vấn con trả về duy nhất một dòng: Sử dụng các toán tử so sánh một
dòng nhƣ: =, >, >=, <, <=, <>
Truy vấn con trả về nhiều dòng: Sử dụng các toán tử so sánh nhiều dòng
nhƣ:
+ IN: bằng một trong các giá trị trả về của truy vấn con.
+ NOT IN: không bằng giá trị nào trong các giá trị trả về của truy vấn
con.
+ ANY: ch cần thỏa một trong các giá trị trả về của truy vấn con.
+ ALL: phải thỏa tất cả các giá trị trả về của truy vấn con.
+ Hàm EXISTS kiểm tra tồn t i kết quả trả về từ câu truy vấn con. Nếu
tìm thấy một dòng trong truy vấn con thì hàm trả về kết quả TRUE và kết
thúc tìm kiếm trong truy vấn con. Nếu chƣ t m thấy dòng nào thì hàm trả về

102
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

FALSE, tiếp tục tìm kiếm trong truy vấn con. Những câu truy vấn có ANY
hay IN đều có thể chuyển thành câu truy vấn có EXISTS
Ví dụ 0-52 : Chọn những sinh viên có tất cả các m n thi đều có điểm
lan1 từ 5 trở l n (nghĩ là kh ng tồn t i một m n nào điểm cuối kỳ dƣới 5)
SELECT DISTINCT masv
FROM diemhp d1
WHERE NOT EXISTS (SELECT *
FROM diem d2
WHERE d2.masv = d1.masv AND d2.diemlan1 < 5)

3.5. Ngôn ngữ điều khiển dữ liệu


3.5.1. Cấp quyền truy cập – câu lệnh Grant

C pháp:
Gr nt <All th o tác> on <đối tƣợng> to <ngƣời dùng hoặc role>
Ví dụ 0-53:
Cấp quyền truy xuất dữ liệu tr n bảng sinhVien cho ngƣời dùng
ADMIN:
Grant select on sinhvien to admin

Cấp quyền th m, xó , sửa dữ liệu trong bảng sinhvien cho nhóm ngƣời
dùng Qu n tri
Grant insert, update, delete on Sinvien to Quan_tri

3.5.2. Thu hồi qu ền tru cập – C u lệnh Deny

C pháp:
Deny <All th o tác> on <đối tƣợng> to <ngƣời dùng hoặc role>
Ví dụ 0-8: Thu hồi quyền truy xuất dữ liệu tr n bảng Sinhvien cho ngƣời
dùng htkh i:
Deny select on Bang_NhanVien to htkhai
Thu hồi quyền xó và sửa dữ liệu trong bảng SinhVien cho nhóm ngƣời dùng
Quan_tri
Deny update, delete on Sinhvien to Quan_tri

103
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3.5.3. Thực hiện lại thao tác ph n qu ền – C u lệnh Revo e C pháp:

Revoke <All | tha > <đố ợ > f <


ặ l >

Ví dụ 0-9: Cấp l i quyền truy xuất dữ liệu tr n bảng Sinhvien cho ngƣời
dùng htkh i:
Revoke select on Sinhvien from Minhchau

Cấp l i tất cả các quyền th o tác tr n bảng Sinhvien cho nhóm ngƣời
dùng Qu n tri
3.6. Bài tập chƣơng 3
3.6.1. Câu hỏi ôn tập.

1. Các lo i kết nối trong truy vấn?


2. Khi nào thì truy vấn sử dụng mệnh đề Group by?
3. Truy vấn con có đặc điểm gì?
4. Hợp các kết quả truy vấn cần tuân thủ những nguyên tắc nào?
3.6.2. Bài tập thực hành:

Cho cơ sở dữ liệu quản l sinh vi n nhƣ s u:


Trong đó:

104
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

+ Dữ liệu dùng để nhập vào các bảng đƣợc cho nhƣ s u:


- Bảng DMKhoa

- Bảng DMNganh

- Bảng DMLOP

- DMHOCPHAN

- SINHVIEN

105
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

- DIEMHP

1. Bài thực hành số 1:


Thực hiện các yêu cầu sau:
1.1 Dùng câu lệnh t o bảng để t o CSDL trên và tất cả các bảng với kiểu
dữ liệu và các ràng buộc cho từng thuộc tính. (tự chọn kiểu dữ liệu và ràng
buộc cho phù hợp với từng thuộc tính).
1.2. Dùng câu lệnh nhập dữ liệu để nhập dữ liệu cho các theo mô tả dữ
liệu trên.
1.3. T o mô hình liên kết giữa các bảng ( Relation ship)
2. Thực hiện truy vấn dữ liệu với các yêu cầu sau:
2.1. Câu lệnh SQL không kết nối
a. Hiển thị danh sách gồm: MaSV, HoTen, MaLop, NgaySinh
(dd/mm/yyyy), GioiTinh (Nam, Nữ) , Namsinh của những sinh viên có họ
không bắt đầu bằng chữ N,L,T.
b. Hiển thị danh sách gồm: MaSV, HoTen, MaLop, NgaySinh
(dd/mm/yyyy), GioiTinh (Nam, Nữ) , Namsinh của những sinh viên nam học
lớp DT20CTT01 có mã lớp là 2
Lời giải:
a.
SELECT MaSV, HoTen, MaLop,
C ( (10), ,103) A ’ ’,
106
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CASE GioiTinh WHEN 1 THEN N'Nam'


L A G , Y A ( ) A
Namsinh
FROM SINHVIEN
WHERE HoTen NOT LIKE N'[NLT]%'

b.
SELECT MaSV, HoTen, MaLop,
CONVERT(varchar(10),NgaySinh,103) AS NgaySinh,
CA G WH 1 H L
A ’G ớ ’, Y A ( ) A ’ ’
FROM SINHVIEN
WHERE GioiTinh=1 AND MaLop=2

2.2. Câu lệnh SQL có kết nối


a. Hiển thị danh sách gồm MaSV, HoTên, MaLop, DiemHP, MaHP của
những sinh vi n có điểm lần 1 >= 5.
b. Hiển thị d nh sách M SV, HoTen , M Lop, M HP, DiemHP đƣợc sắp
xếp theo ƣu ti n Mã lớp, Họ t n tăng dần.
Lời giải:
a.
SELECT SINHVIEN.MaSV, HoTen, MaLop, DiemHP, MaHP
FROM SINHVIEN INNER JOIN DIEMHP ON
DIEMHP.MaSV = SINHVIEN.MaSV
WHERE Diemlan1>5

b.
SELECT SINHVIEN.MaSV, HoTen, MaLop, TenLopDiemHP, MaHP
FROM SINHVIEN INNER JOIN DIEMHP ON
DIEMHP.MaSV=SINHVIEN.MaSV INNER JOIN DMLOP ON
SINHVIEN.MaLop=DMLOP.MaLop
ORDER BY MaLop, HoTen ASC

2.3. Câu lệnh SQL có từ khoá GROUP BY kh ng điều kiện.


a. Cho biết MaLop, TenLop, tổng số sinh viên của mỗi lớp.
b. Cho biết điểm trung bình chung của mỗi sinh viên, xuất ra bảng mới
có tên DIEMTBC, biết rằng công thức tính DiemTBC nhƣ sau:

107
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

DiemTBC =  (DiemHP * SoDvht) /  (SoDvht)


Lời giải:
a.
SELECT SINHVIEN.MaLop, TenLop, COUNT(Masv) AS ’ ố’
FROM DMLOP INNER JOIN SINHVIEN
ON DMLOP.MaLop=SINHVIEN.MaLop
GROUP BY SINHVIEN.MaLop,TenLop

b.
SELECT
SINHVIEN.MaSV,HOTEN,SUM(Diemlan1*Sotc)/SUM(Sotc)
A ’Đ C’ I DIEMTBC
FROM DIEMHP INNER JOIN DMHOCPHAN ON
DMHOCPHAN.MaHP=DIEMHP.MaHP INNER JOIN SINHVIEN ON
DIEMHP.MASV = SINHVIEN.MASV
GROUP BY SINHVIEN.MaSV, HOTEN

2.4. Câu lệnh SQL có từ khoá GROUP BY với điều kiện lọc.
a. Cho biết điểm trung bình chung của mỗi sinh viên ở học kỳ 1.
DiemTBC =  (DiemHP * SoDvht) /  (SoDvht)
b. Cho biết MaSV, HoTen, Số các học phần thiếu điểm (Diemlan1<5)
của
mỗi sinh viên.
Lời giải:
a.
SELECT MaSV, SUM(DiemHP*Sotc)/SUM(Sotc) AS DiemTBC
FROM DMHOCPHAN INNER JOIN DIEMHP
ON DMHOCPHAN.MaHP=DIEMHP.MaHP
WHERE HocKy='1'
GROUP BY MaSV
b.
SELECT SINHVIEN.MaSV, HoTen, C ( H ) A ’ ố
L ợ ’
FROM DIEMHP

108
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

INNER JOIN SINHVIEN ON DIEMHP.MaSV=SINHVIEN.MaSV


INNER JOIN DMHOCPHAN ON DIEM.MaHP=DMHOCPHAN.MaHP WHERE
DiemHP<5
GROUP BY SINHVIEN.MaSV, HoTen

2.5. Câu lệnh SQL có từ khoá GROUP BY với điều kiện nhóm.
a. Cho biết MaLop, TenLop có tổng số sinh viên >10.
b. Cho biết HoTen sinh vi n có điểm Trung bình chung các học phần <3.
Lời giải:
a.
SELECT SINHVIEN.MaLop, Tenlop, COUNT(MaSV) AS Siso
FROM DMLOP INNER JOIN SINHVIEN
ON DMLOP.MaLop=SINHVIEN.MaLop
GROUP BY SINHVIEN.MaLop, Tenlop
HAVING COUNT(MaSV)>10

b.
SELECT MaSV,HoTen,SUM(Diemlan1*Sotc)/SUM(Sotc)AS
‘ C’
FROM DMHOCPHAN INNER JOIN DIEMHP
ON DMHOCPHAN.MaHP=DIEMHP.MaHP INNER JOIN SINHVIEN
ON SINHVIEN.MaSV=DIEMHP.MaSV
GROUP BY MaSV,HoTen
HAVING SUM(Diemlan1*Sotc)/SUM(Sotc)<3

2.6. Câu lệnh SQL có từ khoá TOP.


a. Cho biết M SV, HoTen sinh vi n có điểm TBC cao nhất ở học kỳ 1.
b. Cho biết MaSV, HoTen sinh viên có số học phần điểm lần 1 < 5 nhiều
nhất.
Lời giải:
a.
SELECT TOP 1 SINHVIEN.MaSV, HoTen,
SUM(Diemlan1*Sotc)/SUM(Sotc) AS ’Đ
C’
FROM DMHOCPHAN INNER JOIN DIEMHP
ON DMHOCPHAN.MaHP=DIEMHP.MaHP INNER JOIN SINHVIEN

109
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

ON SINHVIEN.MaSV=DIEMHP.MaSV WHERE HocKy='1'


GROUP BY SINHVIEN.MaSV, HoTen
ORDER BY SUM(Diemlan1*Sotc)/SUM(Sotc) DESC

b.
SELECT TOP 1 SINHVIEN.MaSV, HoTen, COUNT(MaHP) AS
'So Hoc phan' FROM DIEMHP INNER JOIN SINHVIEN
ON SINHVIEN.MaSV=DIEMHP.MaSV
WHERE Diemlan1 <5
GROUP BY SINHVIEN.MaSV, HoTen
ORDER BY COUNT(MaHP) DESC

2.7. Câu lệnh truy vấn với cấu trúc lồng nhau ( Subquery)
a. Cho biết Họ t n sinh vi n CHƢA học học phần có mã „001‟.
b. Cho biết Tên học phần KHÔNG có sinh vi n điểm HP <5.
Lời giải:
a.
SELECT MaSV,HoTen FROM SINHVIEN
WHERE MaSV NOT IN (SELECT MaSV FROM DIEMHP
WHERE MaHP='001')

b.
SELECT MaHP,TenHP FROM DMHOCPHAN
WHERE MaHP NOT IN (SELECT MaHP FROM DIEMHP
WHERE DiemHP<5)

2.8. Cấu trúc lồng nhau không kết nối.


a. Cho biết Tên lớp có sinh viên tên Hoa.
b. Cho biết HoTen sinh vi n có điểm học phần „001‟là <5.
Lời giải:
a.
SELECT TenLop FROM DMLOP
WHERE MaLop IN (SELECT MaLop FROM SINHVIEN
WHERE HoTen LIKE N'% Hoa')
b.
SELECT HoTen FROM SINHVIEN
110
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

WHERE MaSV IN (SELECT MaSV FROM DIEMHP


WHERE Diemlan1<5 AND MaHP='1')

3. Câu lệnh truy vấn với lƣợng từ all, any, exists


3.1. Câu lệnh truy vấn với lƣợng tự ALL
a. Cho biết HoTen sinh viên có Diemlan1 cao nhất.
b. Cho biết HoTen sinh viên có tuổi cao nhất.học phần lần 1 mã „001‟
cao nhất.
Lời giải:
a.
SELECT SINHVIEN.MaSV, HoTen, MaHP, Diemlan1
FROM DIEMHP INNER JOIN SINHVIEN
ON SINHVIEN.MaSV=DIEMHP.MaSV
WHERE Diemlan1 >=ALL(SELECT DiemHP FROM DIEMHP)
b.
SELECT SINHVIEN.MaSV, HoTen
FROM DIEMHP INNER JOIN SINHVIEN
ON DIEMHP.MaSV=SINHVIEN.MaSV
WHERE MaHP='001' AND DiemHP >=ALL(SELECT DiemHP
FROM DIEMHP WHERE
MaHP='001')

3.2. Câu truy vấn với lƣợng từ ANY


a. Cho biết sinh vi n có điểm học phần lần 1 nào đó lớn hơn gấp rƣỡi
điểm trung bình chung của sinh viên đó.
b. Cho biết M SV, M HP có điểm lần 1 lớn hơn bất kỳ các điểm HP của
sinh viên mã „001‟.
Lời giải:
a.
SELECT MaSV
FROM DIEMTBC
WHERE DiemTBC*1.5 < ANY(SELECT Diemlan1 FROM DIEMHP
WHERE DIEMHP.MaSV=DIEMTBC.MaSV)

Chú ý: bảng DIEMTBC đƣợc t o ra khi thực hiện lệnh GROUP BY sau:

111
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

SELECT MaSV SUM(Diemlan1*Sotc)/SUM(Sotc) AS DiemTBC


IN TO DIEMTBC
FROM DMHOCPHAN INNER JOIN DIEMHP ON
DMHOCPHAN.MaHP=DIEMHP.MaHP
GROUP BY MaSV

3.3. Câu truy vấn với lƣợng từ EXISTS


a. Cho biết M SV, HoTen sinh vi n đã ít nhất một lần học học phần nào
đó.
b. Cho biết M SV, HoTen sinh vi n đã kh ng học học phần nào.
Lời giải:
a.
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE EXISTS(SELECT * FROM DIEMHP
WHERE SINHVIEN.MaSV=DIEMHP.MaSV)

b.
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE NOT EXISTS(SELECT * FROM DIEMHP
WHERE SINHVIEN.MaSV=DIEMHP.MaSV)

4. Câu lệnh truy vấn với cấu trúc tập hợp


a. Cho biết M SV đã học ít nhất một trong 2 học phần có mã là „001‟,
„002‟.
b. Cho biết M SV chƣ học học phần nào.
c. Cho biết Mã sinh viên học ít nhất hai học phần có mã „001‟ và „002‟.
Lời giải:
a.
SELECT MaSV FROM DIEMHP WHERE MaHP='001'
UNION (SELECT MaSV FROM DIEMHP WHERE MaHP='002')

b.
SELECT MaSV FROM SINHVIEN
EXCEPT (SELECT MaSV FROM DIEMHP)
112
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

c.
SELECT MaSV FROM DIEMHP WHERE MAHP='001'
INTERSECT (SELECT MaSV FROM DIEMHP WHERE MAHP='002')

3.6.3. Bài tập tự giải

Dựa vào csdl trên, hãy thực hiện:


1. Thêm vào bảng DIEM học phần các cột chuyên cần (chuyencan),
giữa kỳ(giuaky)
2. Hiển thị danh sách gồm: MaSV, HoTen, MaLop, NgaySinh
(dd/mm/yyyy), GioiTinh (Nam, Nữ) của những sinh viên học lớp
CT11,CT12,CT13.
3. Hiển thị danh sách gồm: MaSV, HoTen, MaLop, NgaySinh
(dd/mm/yyyy), GioiTinh (Nam, Nữ), Tuổi của những sinh viên có tuổi từ 19-
21.
4. Hiển thị danh sách gồm MaSV, HoTen, MaLop, DiemHP, MaHP của
những sinh vi n có điểm HP từ 5 đến 7 ở học kỳ I.
5. Hiển thị danh sách sinh viên gồm MaSV, HoTen, MaLop, TenLop,
MaKhoa của Khoa có mã CNTT.
6. Cho biết MaHP, TenHP có số sinh vi n điểm HP <5 nhiều nhất.
7. Cho biết điểm trung bình chung của mỗi sinh viên ở mỗi học kỳ.
8. Cho biết MaLop, TenLop, số lƣợng nam nữ theo từng lớp.
9. Đếm số sinh vi n có điểm HP <5 của mỗi học phần.
10. Tính tổng số đơn vị học tr nh có điểm HP <5 của mỗi sinh viên.
11. Cho biết HoTen sinh viên có ít nhất 2 học phần có điểm <5.
12. Cho biết HoTen sinh viên học TẤT CẢ các học phần ở ngành
140902.
13. Cho biết HoTen sinh viên học ít nhất 3 học phần mã „001‟, „002‟,
„003‟.
14. Cho biết Họ tên sinh viên KHÔNG có học phần điểm HP<5
15. Cho biết danh sách các học phần có số đơn vị học trình lớn hơn hoặc
bằng số đơn vị học trình của học phần mã 001.

113
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

16. Cho biết M Lop,TenLop đã kh ng có sinh vi n nào học.


17. Cho biết HoTen sinh viên có tuổi cao nhất.

114
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 4: KHUNG NHÌN (VIEW) VÀ BẪY SỰ KIỆN (TRIGGER)


Mục ti u chƣơng 4:
- Ở chƣơng 3, ch ng t biết truy vấn có thể phức t p, đặc biệt khi chúng
sử dụng nhiều phép nối hoặc truy vấn con. Vì vậy, đ i khi cần lƣu l i những
truy vấn đó để sử dụng thƣờng xuyên. Việc đó đƣợc thực hiện bằng cách lƣu
trữ câu lệnh vào file hoặc t o khung nhìn. Khác với bảng, khung nh n đƣợc
lƣu trữ nhƣ một phần củ cơ sở dữ liệu. Khung nhìn có thể đƣợc sử dụng
không ch bởi các lập trình viên mà còn bởi cả ngƣời dùng và các chƣơng
trình ứng dụng truy cập vào cơ sở dữ liệu. Điều này đem l i một số lợi ích so
với việc sử dụng bảng một cách trực tiếp. Để hiểu hơn về khung nhìn, trong
chƣơng này giới thiệu: - Khung nhìn là gì? - T i sao phải sử dụng khung
nhìn? - T o, sửa, xóa và sử dụng khung nh n nhƣ thế nào?
Và trong chƣơng này chúng ta sẽ tìm hiểu một chức năng rất đặc biệt
trong hệ quản trị CSDL SQL Server 2019 đó là Trigger. Trigger đƣợc xem
nhƣ là một chức năng qu n trọng giúp bảo đảm các ràng buộc toàn vẹn.
Trigger trong sql là một stored procedure không có tham số. Stored
procedure là tổng hợp các câu lệnh Transact-SQL. Mỗi khi ta muốn dùng thì
gọi ra và thực thi chứ không cần gõ l i câu lệnh.
Trigger trong sql thƣờng đƣợc thực thi ở phía server khi có một sự
kiện xảy ra. Ví dụ nhƣ Insert (th m mới), Update (cập nhật) hoặc Delete
(Xóa) dữ liệu. Trigger đƣợc lƣu trữ trong server DataBase và dùng trong khi
muốn kiểm tra các ràng buộc vẹn toàn trong DataBase.
Chƣơng này sẽ giúp các bản hiểu về Trigger là gì? nó có tác dụng nhƣ
thế nào? và sử dụng nó ra sao?
4.1. Khung nhìn (View)
4.1.1. Giới thiệu

Truy vấn thƣờng đƣợc sử dụng để xuất dữ liệu r từ bảng. Nó đƣợc thực
hiện tr n dữ liệu thực củ bảng. Th y v việc truy vấn và thực hiện trực tiếp
tr n dữ liệu thực, SQL Server đã hỗ trợ một khái niệm mới, đó là View. View
là một bảng tƣơng tự nhƣ bảng chứ dữ liệu thực, nhƣng nó ch là bảng luận
l (kh ng phải là bảng vật l ), có nghĩ là nó kh ng có vị trí lƣu trữ vật l của
dữ liệu. V thế, View thƣờng đƣợc gọi nhƣ một bảng ảo (Vitu l t ble).

115
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

View là một cách khác để nh n vào dữ liệu, và nó có thể nh n thấy dữ


liệu từ một h y nhiều bảng. Tuy nhi n, View kh ng tồn t i nhƣ một tập dữ
liệu đƣợc lƣu trữ tr n đĩ , mà nó ch là một th m chiếu tới những bảng dữ liệu
vật l .
View ho t động nhƣ một bộ lọc dữ liệu, là kết quả củ câu lệnh truy vấn.
Câu lệnh này có thể lấy dữ liệu từ nhiều bảng và nhiều cơ sở dữ liệu đồng
thời.
4.1.2. Tạo khung nhìn

4.1.2.1. Tạo khung nhìn bằng công cụ có sẳn của SQL Server 2019

Qu n sát h nh dƣới đây:

 Nhấn chuột phải t i View của database, chọn New View;


 Add các bảng tham gia t o View
 Nhấn chọn các trƣờng và th m điều kiện theo yêu cầu của View ở cửa
sổ bên phải.
 Lƣu view
4.1.2.2. Tạo khung nhìn bằng câu lệnh

Câu lệnh CREATE VIEW đƣợc sử dụng để t o ra khung nhìn và có cú


pháp nhƣ s u:
C A I W ì [( )
[WITH {ENCRYPTION / SCHEMABINDING}]
AS
l L C
[WITH CHECK OPTION]

Trong đó:

116
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 WITH SCHEMABINDING: Đảm bảo rằng tất cả các đối tƣợng có


trong câu lệnh t o View kh ng thể đƣợc xoá khi View đ ng tồn t i.
 WITH ENCRYPTION: dùng để mã hó định nghĩ View, đảm bảo
rằng ngƣời sử dụng sẽ không biết view đƣợc định nghĩ nhƣ thế nào
 WITH CHECK OPTION: Đảm bảo rằng nếu muốn sửa (UPDTATE)
hoặc th m (INSERT) dữ liệu th ng qu View th những dữ liệu đó
phải thoả mãn tất cả các điều kiện trong câu lệnh Select.
: T o khung nh n lƣu trữ những sinh vi n có điểm lần1 (diemlan1) từ 8
điểm trở lên
CREATE VIEW ds_sinh_vien_gioi
AS
SELECT sinhvien.masv, ho, ten, diemhp
FROM sinhvien INNER JOIN diem
ON sinhvien.Masv = diem.Masv
WHERE diemlan1 >= 8

- Nếu t th m mệnh đề WITH SCHEMABINDING vào câu lệnh tr n th


hệ thống sẽ kh ng cho phép xoá 2 bảng Sinhvien và DiemHP nếu nhƣ View
có t n là ds_sinh_vien_gioi còn tồn t i.
CREATE VIEW ds_sinh_vien_gioi
WITH SCHEMABINDING
AS
SELECT sinhvien.masv, ho, ten, diemhp
FROM sinhvien INNER JOIN diem
ON sinhvien.Masv = diem.Masv
WHERE diemlan1 >= 8

117
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Nếu t th m WITH ENCRYPTION thì hệ thống sẽ khóa chức năng xem


l i định nghĩ view khi ch ng t kích chuột phải vào view đã t o và chức
năng design sẽ bị khóa.
CREATE VIEW ds_sinh_vien_gioi
WITH ENCRYPTION
AS
SELECT sinhvien.masv, ho, ten, diemhp
FROM sinhvien INNER JOIN diem
ON sinhvien.Masv = diem.Masv
WHERE diemlan1 >= 8

Hoặc thực thi bằng lệnh:


EXEC sp_helptext 'hoclai3';

Kết quả xuất hiện sẽ gặp th ng báo nhƣ s u:

- Nếu t th m WITH CHECK OPTION


CREATE VIEW ds_sinh_vien_gioi
AS
SELECT sinhvien.masv, ho, ten, diemhp
FROM sinhvien INNER JOIN diem
ON sinhvien.Masv = diem.Masv
WHERE diemlan1 >= 8
WITH CHECK OPTION

khi đó:
Nếu ta sử dụng lệnh UPDATE để cập nhật l i điểm lần 1 là 10 vào view
ds_sinh_vien_gioi:
UPDATE hoclai SET diemlan1=10;

thì kết quả sẽ cập nhật thành c ng, v điểm lần 1 khi cập nhật thỏa mãn
điều kiện trong mệnh đề select của View.
 Nếu ta cập nhật điểm lần 1 là 5 ( không thỏ mãn điều kiện trong
mệnh đề select của View thì hệ thống sẽ thông báo lỗi nhƣ s u:
Msg 550, Level 16, State 1, Line 1

118
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

The attempted insert or update failed because the


target view either specifies WITH CHECK OPTION or spans
a view that specifies WITH CHECK OPTION and one or more
rows resulting from the operation did not qualify under
the CHECK OPTION constraint.
The statement has been terminated.

Nhƣ vậy, Views thƣờng đƣợc sử dụng để:


• Lọc những bản ghi từ bảng theo y u cầu.
• Bảo vệ dữ liệu từ những ngƣời dùng kh ng có quyền.
• Giảm độ phức t p của dữ liệu
Tóm lƣợc nhiều cơ sở dữ liệu vật l vào một cơ sở dữ liệu logic. Lợi ích
củ View đối với ngƣời sử dụng
• Đối với ngƣời sử dụng cuối - End Users
• Dễ dàng để hiểu kết quả.
• Dễ hơn để thực hiện dữ liệu
• Đối với ngƣời phát triển hệ thống - Developers
• Dễ dàng để truy cập dữ liệu
• Dễ dàng để bảo tr ứng dụng
Một số quy định khi sử dụng khung nhìn

- Đặt t n khung nh n kh ng đƣợc trùng với tên của bất kỳ bảng hoặc
khung nh n nào đ ng tồn t i.
- Câu lệnh SELECT t o khung nhìn có thể gọi đến 256 bảng và có thể
sử dụng mọi kết hợp giữa các phép nối, hợp, hoặc truy vấn con hợp lệ.
- Có thể t o khung nhìn dựa trên một khung nhìn khác thay vì bảng.
Khung nh n này đƣợc gọi là khung nhìn lồng nhau. Các khung nhìn trong
SQL Server có thể đƣợc lồng vào nhau tới 32 mức.
- Câu lệnh SELECT t o khung nhìn không thể bao gồm mệnh đề
INTO và không thể bao gồm mệnh đề ORDER BY trừ khi từ khóa TOP
c ng đƣợc sử dụng. Để sắp xếp các hàng trong một khung nhìn, bao gồm
mệnh đề ORDER BY trong câu lệnh SELECT lấy dữ liệu từ khung nhìn

119
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

đó.
- Có thể đặt tên cột trong mỗi khung nhìn bằng cách viết một danh
sách tên nằm trong dấu ngoặc đơn ng y s u t n khung nh n, hoặc bằng
cách viết các tên mới trong mệnh đề SELECT. Phải đặt tên cho các cột
củ khung nh n trong các trƣờng hợp sau đây:
+ Trong kết quả củ câu lệnh SELECT có ít nhất một cột đƣợc
sinh r bởi một biểu thức (tức kh ng phải là một t n cột trong bảng cơ
sở) và cột đó chƣ đƣợc đặt ti u đề.
+ 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.
Khi t o view cho phép sửa dữ liệu th ng qu view th còn có th m các
ràng buộc sau:
• View chứ đựng ít nhất một bảng đƣợc định nghĩ s u mệnh đề
FROM.
• Kh ng chứ những hàm nhóm hoặc mệnh đề GROUP BY,
UNION, DISTINCT, hoặc TOP
• View kh ng chứ những cột đƣợc suy r từ những cột khác.
4.1.3. Sửa cấu trúc khung nhìn

Ch ng t có thể sử dụng câu lệnh ALTER VIEW để thực hiện việc sửa
cấu tr c củ View. C pháp củ nó tƣơng tự nhƣ c pháp của lệnh CREATE
VIEW, ch cần th y thế từ khó CREATE bằng từ khoá ALTER.
C pháp:
ALTER VIEW <Viewname> [WITH
SCHEMABINDING/ENCRYPTION]
AS <Select_Statement>
WITH CHECK OPTION]

Ví dụ 4-1: Sửa view ds_sinh_vien_gioi bằng cách thêm các tùy chọn
WITH SCHEMABINDING, ENCRYPTION, CHECK OPTION
alter view ds_sinh_vien_gioi
WITH WITH SCHEMABINDING,ENCRYPTION
as
SELECT dbo.SINHVIEN.Hoten,
dbo.SINHVIEN.Malop, dbo.DIEMHP.Diemlan1
120
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

FROM dbo.DIEMHP INNER JOIN dbo.SINHVIEN


ON dbo.DIEMHP.MaSV = dbo.SINHVIEN.MaSV
WHERE (dbo.DIEMHP.diemlan1 >8)
with CHECK OPTION

4.1.4. Xóa khung nhìn

Khi một View nào đó kh ng còn cần thiết nữ , ch ng t có thể xoá nó


thông qua câu lệnh có c pháp nhƣ sau:
DROP VIEW <Viewname>
Nếu một khung nhìn bị xóa, toàn bộ những quyền đã cấp phát cho ngƣời
sử dụng tr n khung nh n c ng đồng thời bị xó . Do đó, nếu ta t o l i khung
nhìn thì phải tiến hành cấp phát l i quyền cho ngƣời sử dụng.
Ví dụ 4-2: Câu lệnh dƣới đây xó khung nh n ds_sinhvien_gioi
ra khỏi cơ sở dữ liệu
DROP VIEW ds_sinhvien_gioi

4.1.5. Sử dụng hung nhìn để cập nhật dữ liệu

Các chức năng có thể thực hiện tr n View tƣơng tự nhƣ đối với bảng.
Ch ng t có thể thực hiện các câu lệnh INSERT, UPDATE, và DELETE tr n
View.
Khi ch ng t th y đổi dữ liệu th ng qu View, đồng nghĩ với việc
ch ng t th y đổi dữ liệu tr n các bảng mà View đó đ ng th m chiếu. Tuy
nhi n, n n thực hiện một số các quy luật s u khi thực hiện sửa chữa dữ liệu
th ng qu View.
Câu lệnh SELECT trong định nghĩ View kh ng n n chứ :
Các hàm nhóm dữ liệu (Hàm kết hợp - Aggregate functions)
Các mệnh đề TOP, GROUP BY. UNION, hoặc DISTINCT.
Cột có giá trị đƣợc suy r từ các cột khác (cột dữ liệu dẫn xuất - derived
columns)
Sau mệnh đề FROM trong câu lệnh SELECT n n có ít nhất một bảng.
Ví dụ: View s u đây kh ng thể cập nhật dữ liệu
CREATE VIEW NoTable AS SELECT Getdate() AS
CurrentDate
121
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ch ng t ch có thể cập nhật và th m dữ liệu vào 1 bảng đứng s u mệnh


đề FROM củ View. Nếu muốn cập nhật dữ liệu tr n nhiều bảng, ch ng t
phải sử dụng INSTEAD OF trigger. Ch ng t sẽ bàn đến trigger chi tiết trong
chƣơng s u.
Nếu nhƣ bảng đƣợc th m chiếu trong View chứ cột có ràng buộc NOT
NULL kh ng phải là một phần củ View th ch ng t phải gán giá trị mặc
định cho cột này để có thể th m dữ liệu cho bản ghi.
Nếu định nghĩ View có chứ lự chọn WITH CHECK, tất cả các cột
đƣợc sửa chữ phải thoả mãn điều kiện trong câu lệnh SELECT. Ví dụ, nếu
câu lệnh SELECT có chứ mệnh đề WHERE dieml n1> 8, th ch ng t kh ng
thể th m hoặc sửa l i dữ liệu trong cột dieml n1 có giá trị nhỏ hơn 8.Giới
thiệu
4.2. Bẫy sự kiện ( Trigger)
4.2.1. Định nghĩa

Trigger là 1 đối tƣợng (object) trong database cho phép ch y thủ tục lƣu
trữ (stored procedure) nào đó mỗi khi có 1 th y đổi xảy ra. Có 2 lo i Trigger:
DDL Trigger: áp dụng cho những th y đổi li n qu n đến cấu trúc của
d t b se, nhƣ: ALTER DATABASE, CREATE TABLE, …
DML Trigger: áp dụng cho những th y đổi liên quan trực tiếp đến dữ
liệu, nhƣ: UPDATE, INSERT, DELETE
Trigger là một thủ tục đƣợc thực hiện tự động để đáp ứng các sự kiện
nhất định trên một bảng hay một khung nhìn cụ thể trong cơ sở dữ liệu.
Trigger chủ yếu đƣợc sử dụng để duy trì tính toàn vẹn củ th ng tin tr n cơ sở
dữ liệu (Wikipedia).
4.2.2. Các đặc điểm của trigger

Mỗi một trigger đƣợc t o r và đƣợc gắn liền với một bảng nào đó trong
cơ sở dữ liệu. Khi dữ liệu trong bảng bị th y đổi (tức là bảng chịu tác động
của các câu lệnh INSERT, UPDATE hat DELETE) thì trigger sẽ đƣợc tự
động kích ho t.
Khi trigger đƣợc kích ho t, SQL Server t o ra một giao tác theo dõi
những th y đổi do thao tác kích ho t trigger hoặc trigger gây ra và giao tác
này cho phép dữ liệu trở về tr ng thái trƣớc đó.

122
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

SQL định nghĩ h i bảng logic INSERTED và DELETED để sử dụng


trong các trigger. Cấu trúc của hai bảng này tƣơng tự nhƣ cấu trúc của bảng
mà trigger tác động. Dữ liệu trong hai bảng này tùy thuộc vào câu lệnh tác
động lên bảng làm kích ho t trigger; cụ thể trong các trƣờng hợp sau:
Khi câu lệnh DELETE đƣợc thực thi trên bảng, các dòng dữ liệu bị xóa
sẽ đƣợc sao chép vào trong bảng DELETED. Bảng INSERTED trong trƣờng
hợp này không có dữ liệu.
Dữ liệu trong bảng INSERTED là dòng dữ liệu đƣợc bổ sung vào bảng
gây nên sự kích ho t đối với trigger bằng câu lệnh INSERT. Bảng DELETED
trong trƣờng hợp này không có dữ liệu.
Khi câu lệnh UPDATE đƣợc thực thi trên bảng, các dòng dữ liệu c chịu
sự tác động của câu lệnh sẽ đƣợc sao chép vào bảng DELETED, còn trong
bảng INSERTED sẽ là các dòng s u khi đã đƣợc cập nhật.
Trigger chia thành 2 lo i: INSTEAD OF và AFTER:
INSTEAD OF: là trigger mà thao tác kích ho t trigger sẽ bị bỏ qua và
th y vào đó là các lệnh trong trigger đƣợc thực hiện.
AFTER: là lo i trigger mặc định, trigger này thực hiện các lệnh bên
trong trigger s u khi đã thực hiện thao tác kích ho t trigger.
Ví dụ 4-3: Khi thêm thông tin (ngày nhập học) sinh viên mới hoặc ch nh
sửa ngày nhập học của sinh viên, thì ngày nhập học phải trƣớc ngày hiện t i.
T o trigger để kiểm soát công việc này nhƣ sau:
CREATE TRIGGER Insert_NamNH ON SinhVien
FOR INSERT, UPDATE
AS
If (select NgayNH from Inserted) > getdate() Begin
Print 'Ngay nhap hoc khong hop ly' ROLLBACK TRAN
End

Trong đó: Insert N mNH là t n trigger do ngƣời dùng tự đặt


Getdate() là hàm lấy ngày tháng năm hiện t i của hệ thống Rollback tran là
lệnh hủy tất cả những th y đổi về dữ liệu
4.2.3. Các trƣờng hợp sử dụng trigger

Ch ng t sử dụng Trigger khi các biện pháp bảo đảm toàn vẹn dữ liệu
khác kh ng bảo đảm đƣợc. Các c ng cụ này sẽ thực hiện kiểm tr tính toàn
123
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

vẹn hoặc các điều kiện ràng buộc trƣớc khi đƣ dữ liệu vào CSDL, còn
Trigger thực hiện kiểm tr tính toàn vẹn khi c ng việc đã thực hiện.
Khi CSDL chƣ đƣợc chuẩn hó (Norm liz tion) th có thể xảy r
trƣờng hợp dữ liệu thừ , dữ liệu đƣợc chứ ở nhiều vị trí trong CSDL th y u
cầu đặt ra là dữ liệu cần cập nhật thống nhất trong mọi nơi. Trong trƣờng hợp
này t phải sử dụng Trigger.
Khi xảy r th y đổi dây chuyền dữ liệu giữ các bảng với nhau (khi dữ
liệu bảng này th y đổi th dữ liệu trong bảng khác c ng đƣợc th y đổi theo).
4.2.4. Các khả năng của trigger

Trigger rất hữu ích khi:


Dùng trigger để kiểm soát, ngăn chặn và có thể hủy bỏ những thao tác
kh ng đ ng quy tắc trong việc th y đổi dữ liệu hoặc nhằm đảm bảo tính toàn
vẹn cho liệu và cho ra những câu thông báo thích hợp với ngƣời dùng.
Dùng trigger để tự động thực hiện hàng lo t các thao tác khác trên CSDL
ứng với một số th o tác th y đổi dữ liệu nào đó (UPDATE, INSERT hoặc
DELETE) trên một bảng hay nhiều bảng.
Dùng trigger để kiểm soát các quy tắc phức t p giữa các bảng trong
CSDL mà các Check Constraints (Database Tools) không thực hiện đƣợc.
Tuy nhiên, trigger vẫn tồn t i một số h n chế:
Trigger kh ng đƣợc kích ho t bởi một bảng t m hay bảng hệ thống
(temporary, các table có tên chứ #, ##, system t ble), nhƣng nó có thể tham
chiếu đến nội dung bên trong các bảng t m, bảng hệ thống.
Các trigger INSTEAD OF DELETE, INSTEAD OF UPDATE không thể
định nghĩ tr n các t ble có chứa khóa ngo i (đặc tính Cascade Delete
Related Records của quan hệ khóa ngo i đó đƣợc thiết lập). Nhƣng với
Truncate Table, Writetext không kích ho t đƣợc trigger định nghĩ cho th o
tác Delete.
4.2.5. Tạo Trigger

4.2.5.1. Cú pháp

Câu lệnh CREATE TRIGGER đƣợc sử dụng để định nghĩ trigger và có


cấu tr c nhƣ s u:

124
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

C A IGG < > < >


|<tên_view>
[WITH ENCRYTION]
<FOR AFTER | INSTEAD OF >
<[INSERT],[UPDATE],[DELETE]> [NOT FOR REPLICATION]
AS
[IF A < >
[A A < > A < >
l ủ

Trong đó:
WITH ENCRYTION: ngăn chặn ngƣời dùng khác xem nội dung của
trigger.
AFTER: Trigger đƣợc thực thi sau khi tất cả các câu lên trong thân
trigger đã thực thi thành công. AFTER là kiểu mặc định nếu trigger có dùng
từ khóa FOR. Kh ng định nghĩ trigger AFTER cho View.
INSTEAD OF: Trigger đƣợc thực thi thay cho các câu lệnh SQL gây ra
trigger. INSTEAD OF dùng đƣợc cho View.
{[INSERT][,][UPDATE][,][DELETE]}: Ch rõ thao tác mà trigger thực
thi trên bảng hoặc View.
NOT FOR REPLICATION: Trigger sẽ kh ng đƣợc thực hiện khi việc
đồng bộ hóa t o sự th y đổi trên các bảng, các View có liên quan.
IF UPDATE (tên_cột) dùng để ch định trigger đƣợc kích ho t khi có sự
th y đổi dữ liệu trên các cột đƣợc ch ra (tên_cột). IF UPDATE ch kiểm tra
thao tác Insert, Update (không dùng cho Delete).
Giới thiệu các bảng tạm INSERTED, DELETED
Nhƣ đã nói ở tr n, chuẩn SQL định nghĩ h i bảng logic INSERTED và
DELETED để sử dụng trong các trigger. Cấu tr c củ h i bảng này tƣơng tự
nhƣ cấu tr c củ bảng mà trigger tác động. Dữ liệu trong h i bảng này tuỳ
thuộc vào câu lệnh tác động l n bảng làm kích ho t trigger; cụ thể trong các
trƣờng hợp s u:
Khi câu lệnh DELETE đƣợc thực thi tr n bảng, các dòng dữ liệu bị xoá
sẽ đƣợc s o chép vào bảng DELETED. Bảng INSERTED trong trƣờng hợp
này kh ng có dữ liệu.

125
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Dữ liệu trong bảng INSERTED sẽ là dòng dữ liệu đƣợc bổ sung vào


bảng gây n n sự kích ho t đối với trigger bằng câu lệnh INSERT. Bảng
DELETED trong trƣờng hợp này kh ng có dữ liệu.
Khi câu lệnh UPDATE đƣợc thực thi tr n bảng, các dòng dữ liệu c chịu
sự tác động củ câu lệnh sẽ đƣợc s o chép vào bảng DELETED, còn trong
bảng INSERTED sẽ là các dòng s u khi đã đƣợc cập nhật.

Ho t động Bảng INSERTED Bảng DELETED

INSERT dữ liệu đƣợc insert kh ng có dữ liệu

DELETE kh ng có dữ liệu dữ liệu bị xó

dữ liệu đƣợc cập dữ liệu trƣớc khi cập


UPDATE nhật nhật

Ví dụ 4-4: T o trigger để thực hiện công việc sau: Khi một sinh viên
đăng k m n học mới (chƣ có trong d nh sách) vào d nh sách lớp (bảng
SinhVien) th trƣờng SiSo trong bảng Lop sẽ tự động cập.
CREATE TRIGGER SisoLop
ON DSdangkyHP
FOR INSERT AS
Begin
Declare @maHP_moi char(10) = (select MaHP from
inserted)
Declare @SiSo_moi float = (select count (*) from
DSdangkyHP where MaHP=@maHP_moi group by MaHP)
Update hocphan
SET SiSoLop= @SiSo_moi WHERE MaHP =@maHP_moi
End

Ví dụ 4-5: Ví dụ dƣới đây minh họa việc trigger đƣợc kích ho t khi th m
dữ liệu vào bảng SINHVIEN
create trigger tg_KtraHoTenSV on sinhvien for
insert as
declare @Kthuoc_HoTen int
select @Kthuoc_HoTen = len(inserted.HoTen)
from inserted
if @Kthuoc_HoTen <=1
126
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

begin
ô ợ l '
rollback tran

4.2.5.2. Các ví dụ minh họa

 INSERT TRIGGER
Ví dụ 4-6: Giả sử với cơ sở dữ liệu quản lý Sinh viên ở trên, ta t o Thêm
bảng Ds_dangky_HP gồm các thuộc tính masv, mahp. Khi một sinh vi n đăng
ký môn học mới vào bảng Ds_dangky_HP, thì trigger sẽ kiểm tra xem sinh
vi n đó đã đăng k b o nhi u học phần; Nếu chƣ đủ 10 học phần thì cho
phép đăng k b nh thƣờng còn kh ng th th ng báo đã đủ không cho phép
đăng k . (Giả sử quy định ch cho phép đăng k tối đã 10 học phần).
create TRIGGER SoHP1
ON DS_dangky_HP FOR INSERT
AS
Begin
Declare @MasvDK char (10) = (select Masv from
inserted)
Declare @SoHP float = (select count (*) from
DS_dangky_HP where Masv=@MasvDK group by Masv)
If (@SoHP > 10)
Begin
Print 'Ban da dang ky 10 HP, khong duoc DK nua'
ROLLBACK TRAN
End
End

Thực thi:
insert ds_dangky_hp values ('CTT02',4),('ctt01',4)

 UPDATE TRIGGER:
Ví dụ 4-7: Thêm cột điểm học phần (diemhp) vào bảng DIEMHP. Khi
cập nhật điểm HP thì trigger tính l i điểm HP theo công thức qui định.
CREATE TRIGGER Diem
ON DiemHP FOR UPDATE AS
Begin
Declare @MasvUP char (10) = (select Masv from
inserted)
127
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Declare @DiemHP float = (select (chuyencan * 10 +


giuaky * 20 + DIEMLAN1 * 70)/100 from Diemhp where
Masv=@MasvUP)
update Diemhp
set DIEMHP= @DiemHP where Masv=@MasvUP
End

Kiểm tra lệnh cập nhật sau:


update DiemHP1
set Diemhp= 6
where Masv='CTT02'
 DELETE TRIGGER
Ví dụ 4-8: Viết trigger sao cho khi xóa 1 sinh viên trong bảng sinhvien
th sinh vi n đó trong bảng ds_dangky_HP c ng sẽ bị xóa theo.
create trigger Delete_MH ON sinhVien
FOR DELETE AS
Begin
Declare @Masv_Delete char (10) = (select Masv from
deleted)
Delete DS_dangky_HP where masv = @Masv_Delete
End

Kiểm tra lệnh với lệnh xóa dữ liệu sau


delete sinhvien where masv='CTT04'

Ví dụ 4-9: Ví dụ này minh họ INSTEAD OF trigger. Trigger dƣới đây


sẽ kh ng cho thực hiện th o tác xó tr n bảng SINHVIEN.
create trigger t_RollbackDelete on SINHVIEN Instead
Of delete as
rollback tran

 Kết hợp INSERT và UPDATE


Ví dụ 4-10: Viết trigger thực hiện việc nếu th y đổi (thêm hoặc sửa)
điểm HP th đều phải tính l i điểm HP theo công thức quy định.
CREATE TRIGGER DiemHP_IU
ON DiemHP
FOR INSERT, UPDATE AS
128
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Begin
Declare @MasvUP char (10) = (select Masv from
inserted)
Declare @DiemHP float = (select (chuyencan * 10 +
giuaky * 20 + diemlan1 * 70)/100 from DiemHP where
Masv=@MasvUP)
update DiemHP set Diemhp= @DiemHP where
Masv=@MasvUP
End;
 TRIGGER LIÊN QUAN ĐẾN NHIỀU BẢNG
Ví dụ 4-11: Ví dụ dƣới đây minh họ trigger đƣợc kích ho t khi có sự
th y đổi m ng tính dây chuyền giữ các bảng.
Giả sử có CSDL nhƣ s u:

Với dữ liệu trong từng bảng là:

Giả sử có một khách hàng mu 10 đơn vị mặt hàng LAPTOP. Khi đó số


lƣợng LAPTOP trong bảng HANGTONKHO sẽ giảm xuống còn 90. Trigger
dƣới đây sẽ thực hiện c ng việc đó.
create trigger tg_GiamSL_TonKho on PhieuXuat
for insert
as
update HangTonKho set SLTonKho = SLTonKho -
inserted.SLXuat
from HangTonKho, inserted
where HangTonKho.MaSP = inserted.MaSP

Thực hiện th m dòng vào bảng PhieuXu t


insert into PhieuXuat values( 1,1, 10)

129
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ví dụ 3: Ví dụ này c ng minh họ trigger đƣợc kích ho t khi có sự th y


đổi m ng tính dây chuyền giữ các bảng nhƣng trong trƣờng hợp này dữ liệu
th y đổi li n qu n đến
4.2.6. Kích hoạt trigger dựa trên sự tha đổi dữ liệu trên cột

Th y v ch định một trigger đƣợc kích ho t tr n một bảng, t có thể ch


định trigger đƣợc kích ho t và thực hiện những thao tác cụ thể khi việc th y
đổi dữ liệu ch li n qu n đến một số cột nhất định nào đó củ bảng. Trong
trƣờng hợp này, t sử dụng mệnh đề IF UPDATE trong trigger. IF UPDATE
kh ng sử dụng đƣợc đối với câu lệnh DELETE.
Ví dụ 4-12: Trở l i ví dụ trong phần trigger li n qu n đến nhiều bảng:
create trigger tg_GiamSL_HangTonKho on PhieuXuat
for update as
if update(SLXuat)
update HANGTONKHO set SLTonKho = SLTonKho - (select
sum(inserted.SLXuat - deleted.SLXuat)
from deleted, inserted
where inserted.MaSP = HangTonKho.MaSP and
deleted.MaPX = inserted.MaPX)
where HangTonKho.MaSP in (select inserted.MaSP from
inserted)

Trong ví dụ này trigger sẽ đƣợc kích ho t khi có sự th y đổi dữ liệu


trong cột SLXuat củ bảng PhieuXu t. Nếu có sự th y đổi dữ liệu tr n các cột
khác th trigger sẽ kh ng đƣợc kích ho t.
Câu lệnh dƣới đây kh ng làm cho trigger kích ho t.
update PhieuXuat set MaSP = 3 where MaSP = 2
Mệnh đề IF UPDATE có thể xuất hiện nhiều lần trong phần thân củ
trigger. Khi đó, mệnh đề IF UPDATE nào đ ng th phần câu lệnh của mệnh
đề đó sẽ đƣợc thực thi khi trigger đƣợc kích ho t.

130
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4.2.7. Sử dụng trigger và Giao tác (TRANSACTION)

4.2.7.1. Khái niệm về giao tác.

Gi o tác cơ sở dữ liệu (d t b se tr ns ction) là đơn vị tƣơng tác của


một hệ quản trị cơ sở dữ liệu, mỗi gi o tác đƣợc xử lý một cách nhất quán và
tin cậy mà không phụ thuộc vào các giao tác khác. Một hệ cơ sở dữ liệu lý
tƣởng sẽ phải đảm bảo toàn bộ các tính chất ACID cho mỗi giao tác.
(Wikipedia).
Giao tác là một tiến trình xử l có xác định điểm đầu và điểm cuối, đƣợc
chia nhỏ thành các thao tác, tiến tr nh đƣợc thực thi một cách tuần tự và độc
lập các th o tác đó theo nguy n tắc hoặc tất cả đều thành công hoặc một thao
tác thất b i thì toàn bộ tiến trình thất b i. Nếu việc thực thi một thao tác nào
đó bị hỏng đồng nghĩ với việc dữ liệu phải rollback (trở l i) tr ng thái ban
đầu.
Ví dụ 4-13: Khách hàng A chuyển số tiền X từ tài khoản ATM sang tài
khoản tiết kiệm.
Giao dịch này gồm 2 thao tác:
+ Rút số tiền X trong tài khoản ATM của khách hàng A: SoDu = SoDu –
X
+ Cộng số tiền X vào tài khoản tiết kiệm của khách hàng A: SoDu =
SoDu + X Trong khi thực hiện giao dịch trên, nếu 1 trong 2 thao tác trên gặp
sự cố thì cả giao dịch phải bị hủy để đảm bảo nhất quán dữ liệu.
Ví dụ 4-14: Thêm thông tin của một sinh viên mới vào danh sách lớp nếu
lớp đó có dƣới 40 sinh viên.
Việc này đƣợc thực hiện bởi h i bƣớc:
+ Thêm thông tin của một sinh viên mới vào bảng danh sách lớp (Chèn
dữ liệu)
+ Cập nhập số lƣợng sinh viên dựa vào danh sách lớp. Nếu số lƣợng
dƣới 40 thì cho phép th m th ng tin sinh vi n, ngƣợc l i giao dịch phải bị hủy
để đảm bảo nhất quán dữ liệu. (Cập nhật dữ liệu)
Tóm l i, khi thực hiện một giao dịch gồm một dãy các th o tác, để đảm
bảo tính nhất quán dữ liệu thì hoặc là tất cả các th o tác đều thực hiện thành

131
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

công, hoặc là hủy tất cả các th o tác để phục hồi dữ liệu về tr ng thái b n đầu.
Trƣờng hợp đó ngƣời ta gọi là giao tác.
Gi o tác đƣợc định nghĩ bắt đầu bằng BEGIN TRAN và kết thúc bởi
hành động COMMIT TRAN hoặc ROLLBACK TRAN, trong thân giao tác
có thể sử dụng SELECT, DELECT, UPDATE, INSERT.
COMMIT TRAN xác định kết thúc hay hoàn tất giao tác.
ROLLBACK TRAN khi gặp chuyển tác này tất cả những phát biểu từ
khi gặp BEGIN sẽ bị huỷ bỏ.
SAVE TRAN để lƣu l i vị trí một chuyển tác.
4.2.7.2. Sử dụng trigger và Giao tác

Khi một trigger đƣợc kích ho t, SQL Server lu n t o ra một gi o tác


theo d i những th y đổi do câu lệnh kích ho t trigger hoặc do bản thân trigger
gây r . Sự theo d i này cho phép CSDL qu y trở l i tr ng thái trƣớc đó.
Ví dụ 4-15: Ví dụ dƣới đây xây dựng trigger kh ng cho phép nhập vào
một bản ghi trong bảng diemhp khi Diemhp lớn hơn diemhp đƣợc tính theo
công thức hàng thực tế còn l i trong bảng HANGTONKHO
create trigger tg_KTraSL on DIEMHP
declare @diemhp decimal(18,2), @SLTonKho
decimal(18,2)
declare @MaSV nchar(10)
select @MaSV = MaSP from inserted select @SLXuat =
SLXuat from inserted
select @SLTonKho = SLTonKho from HangTonKho where
MaSP = @MaSP
if(@SLTonKho < @SLXuat)
begin
ố l ợ lớ ố l ợ
rollback tran
end
Tiến hành th m vào bảng PhieuXu t số liệu nhƣ s u:
insert into PhieuXuat values(2, 1000)

132
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4.2.8. Trigger cho ngôn ngữ định nghĩa dữ liệu (DDL Trigger )

Đƣợc giới thiệu trong SQL Server, khác với DML trigger đƣợc kích
ho t khi có sự th y đổi dữ liệu tr n bảng, DDL trigger đƣợc thiết kế để đáp
ứng l i các sự kiện diễn r tr n server h y tr n CSDL. Một DDL trigger có thể
đƣợc kích ho t khi ngƣời dùng thực hiện các lệnh CREATE TABLE h y
DROP TABLE. Ở cấp độ server, DDL trigger có thể đƣợc kích ho t khi có
một tài khoản mới đƣợc t o r .
DDL trigger đƣợc lƣu trữ trong CSDL mà DDL trigger đƣợc định nghĩ .
Với các DDL Trigger theo d i các th y đổi ở cấp độ Server th nó đƣợc lƣu
trữ trong CSDL master.
DDL trigger đƣợc t o r c ng bằng câu lệnh CREATE TRIGGER với
cấu tr c nhƣ s u:
C A IGG
ALL A A A F l ự [
,...n ]
A l L

Trong đó:
ALL SERVER DATABASE: quy định trigger sẽ kích ho t dự tr n các
sự kiện diễn r tr n Server h y các sự kiện diễn r tr n CSDL.
Lo i sự kiện: là một sự kiện đơn ở cấp độ Server hay cấp độ CSDL làm
kích ho t DDL trigger nhƣ: CREATE TABLE, ALTER TABLE,
DROP_TABLE, ...
Ví dụ 0-15: Câu lệnh dƣới đây xây dựng một trigger đƣợc kích ho t khi
xảy r các sự kiện cấp độ CSDL. Trigger này sẽ ngăn chặn các lệnh DROP
TABLE và ALTER TABLE.
create trigger t_safety on database
for CREATE_TABLE, DROP_TABLE
as
x f ớ AL
ll

Tiến hành xó bảng dsD ngkyHP:


drop table dsDangkyHP
133
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Sẽ nhận đƣợc th ng báo là “Phải xó trigger t s fety trƣớc khi ALTER


h y DROP bảng” và bảng vẫn kh ng bị xó .
Ví dụ 0-16: Câu lệnh dƣới đây xây dựng một trigger đƣợc kích ho t khi
xảy r các sự kiện
cấp độ Server. Trigger này sẽ ngăn chặn việc t o ra một account login
mới.
CREATE TRIGGER tg_KoChoPhepTao_TaiKhoanMoi ON ALL SERVER
FOR CREATE_LOGIN
AS
I ô đ ợ ớ ll
tran

Tiến hành t o một account login mới:


create login test with password = '123456'

Sẽ nhận đƣợc th ng báo là “B n kh ng đƣợc phép t o account mới” và


ccount vẫn chƣ đƣợc t o ra.
4.2.9. Kích hoạt/ bỏ ích hoạt Trigger (ENABLE/ DISABLE TRIGGER)

Xóa TriggerTrigger cần bị v hiệu hó trong một số trƣờng hợp:


 Trigger gây r lỗi trong quá tr nh xử l CSDL.
 Quá tr nh nhập h y kh i phục những dữ liệu kh ng thỏ trigger.
V hiệu hó trigger bằng lệnh DISABLE TRIGGER có cấu tr c nhƣ s u:
I A L IGG
đố ợ A A A
Ví dụ 0-7: Ví dụ này sẽ v hiệu hó trigger t DoNotAllowCre teNewLogin:
disable trigger tg_KoChoPhepTao_TKMoi on all server

Tiến hành t o một account login mới:


create login newLogin with password = '12345'

l c này ch ng t sẽ t o ccount thành c ng.

Ví dụ 0-18: Ví dụ này sẽ kh i phục l i trigger


tg_KoChoPhepTao_TaiKhoanMoi

134
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

enable trigger tg_KoChoPhepTao_TaiKhoanMoi on all server


Tiến hành t o một account login mới:
create login newLogin1 with password = '12345'

sẽ bị hiện thị th ng báo s u và việc t o tài khoản mới kh ng thành c ng:

4.2.10. Sửa đổi Trigger

Thực hiện sử đổi trigger đã tồn t i, ta sử dụng cú pháp:


AL IGG < >
<tên_View> [WITH ENCRYPTION]
(FOR | AFTER | INSTEAD OF)
{[DELETE][,][INSERT][,][UPDATE] [NOT FOR
REPLICATION]
AS [ l ủ

Ví dụ 0-19: Trong trigger DiemHP_IU ở tr n, nhƣng quy định về tính


điểm th y đổi vì vậy trigger cập nhật điểm đƣợc sử đổi nhƣ s u.
ALTER TRIGGER DiemHP_IU
ON Diem
FOR INSERT, UPDATE AS
Begin
Declare @MasvUP char (10) = (select Masv from
inserted)
Declare @DiemHP float = (select (chuyencan * 20 +
giuaky * 30 + cuoiky * 50)/100 from Diem where
Masv=@MasvUP)
update Diem set Dhp= @DiemHP where Masv=@MasvUP
End

4.2.11. Xóa Trigger

Cú pháp:
DROP TRIGGER <tên_triger>

Ví dụ 0-20: Xóa trigger DiemHP và trigger SoHP

135
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Drop Trigger DiemHP Drop Trigger SoHP

4.3. Bài tập chƣơng 6


4.3.1. Câu hỏi ôn tập

1. Khung nhìn là gì? Cho ví dụ minh họa.


2. T i sao phải sử dụng khung nhìn?
3. So sánh sự giống và khác nhau giữa khung nhìn và bảng trong SQL
Server?
4. T o, sửa, xóa và sử dụng khung nh n nhƣ thế nào? Thực hiện các thao
tác này qua một ví dụ cụ thể?
5. Khi nào dùng trigger?
6. So sánh trigger với procedure, function.
7. Có các kiểu trigger nào?
4.3.2. Bài tập thực hành

1. Bài tập View


1.1. T o View XEM dùng để lƣu trữ các sinh viên học lớp DT18CTT01,
có địa ch Tam Kỳ.
Create view XEM
as
select masv, hoten, tenlop, DIACHI
from sinhvien, DMLOP
where SINHVIEN.MaLOP =DMLOP.Malop
and tenlop = 'DT18CTT01' AND DIACHI=N'TAM KỲ'

1.2. T o view THONGKE bao gồm các thông tin sau: Tenlop, số lƣợng
để thống kê số sinh viên theo từng lớp.
Create view THONGKE
as
select tenlop, count(masv) as N'Số l ợng sv'
from sinhvien, DMLOP
where SINHVIEN.MaLOP =DMLOP.Malop
group by tenlop

136
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

1.3. T o view SVCNTT bao gồm các thông tin: Masv, hoten, tenlop
chứa danh sách sinh viên học các lớp CNTT (sinh viên lớp cntt là trong tên
lớp có 3 ký tự giữa là CTT )
create view svcntt
as
select sinhvien.masv, hoten,tenLOP
from sinhvien, DMLOP
where SINHVIEN.MaLOP =DMLOP.Malop AND TENLOP like
'%CTT%'

1.4. T o view HOCLAI bao gồm các thông tin Masv, hoten, diemlan1,
diemhp củ các sinh vi n có điemhp < 5. Trong đó điểmhp đƣợc tính theo
công thức (chuyencan*1+giuwaky*3+diemlan1*6)/10
create view hoclai
as
select sinhvien.masv, hoten,tenhp,
(chuyencan+giuaky*3+diemlan1*6)/10 as 'diemhp'
from sinhvien, diemhp, dmhocphan
where (chuyencan+giuaky*3+diemlan1*6)/10 < 5
and SINHVIEN.MaSV =diemhp.MaSV and
DMHOCPHAN.MaHP=diemHP.MAHP

2. Bài tập Trigger


2.1. T o bẫy lỗi INSERT
a.. T o một Trigger để kiểm tra tính hợp lệ của dữ liệu đƣợc nhập vào
bảng SINHVIEN là dữ liệu MaSV là không rỗng.
Lời giải
CREATE TRIGGER INSERTSINHVIEN ON SINHVIEN
FOR INSERT AS
IF ((SELECT MaSV FROM INSERTED) = '')
BEGIN
I ã đ ợ LL AC
TRANSACTION
END

Áp dụng: Cập nhật vào bảng sinh viên bộ dữ liệu nhƣ s u:


insert into sinhvien

137
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

values ('','AN',2,'TRUE', '09/09/2004', 'TK')

b. Thực hiện việc kiểm tra ràng buộc khoá ngo i trong bảng SINHVIEN
là mã lớp phải tồn t i trong bảng DMLOP.
Lời giải
CREATE TRIGGER SV_INSERT ON SINHVIEN
FOR INSERT AS
IF NOT EXISTS(SELECT * FROM DMLOP, INSERTED
WHERE DMLOP.MaLop=INSERTED.MaLop)
BEGIN
I ã lớ ô ụ LL AC
TRANSACTION
END

c. T o một Trigger khi thêm một sinh viên trong bảng SINHVIEN ở một
lớp nào đó th cột Siso của lớp đó trong bảng DMLOP tự động tăng l n 1.
đảm bảo tính toàn ven dữ liệu khi thêm một sinh viên mới trong bảng
SINHVIEN th sinh vi n đó phải có mã lớp trong bảng DMLOP. Đảm bảo
tính toàn vẹn dữ liệu khi thêm là mã lớp phải có trong bảng DMLOP.
Lời giải:
Trƣớc hết t o thêm một cột SiSo
ALTER DMLOP
ADD SiSo int

T o Trigger:
CREATE TRIGGER Trg_SVINSERT ON SINHVIEN
FOR INSERT AS
IF NOT EXISTS(SELECT * FROM DMLOP, INSERTED WHERE
DMLOP.MaLop=INSERTED.MaLop)
ROLLBACK TRANSACTION
ELSE
UPDATE DMLOP SET DMLOP.Siso=DMLOP.Siso+1 FROM INSERTED
WHERE DMLOP.MaLop=INSERTED.MaLop

Áp dụng
INSERT INTO SINHVIEN(MaSV, Hoten, MaLop) VALUES
(‘020, ’ A ’, ‘C 11’)

138
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Khi lệnh INSERT thực thi thì một TRIGGER FOR INSERT sẽ tự động
thực hiện.
Dữ liệu Sinh viên 020 bổ sung thêm sẽ đƣợc đƣ vào bảng t m thời
INSERTED.
Thực hiện nhóm lệnh cập nhật Siso của lớp vừa thêm trong bảng
DMLOP.
2.2. T o bẫy lỗi DELETE
a. T o một Trigger không cho phép xoá các sinh viên ở lớp CT12.
CREATE TRIGGER DELETESV2 ON SINHVIEN
FOR DELETE AS
IF EXISTS(SELECT * FROM DELETED WHERE MaLop='CT12')
BEGIN
PRINT ô x lớ C 12 LL AC
TRANSACTION
END

b. T o một Trigger không cho phép xoá nhiều hơn 2 lớp trong bảng
DMLOP
Lời giải:
CREATE TRIGGER DELETE_Lop ON DMLOP
FOR DELETE AS
IF ((SELECT COUNT (*) FROM DELETED) > 2) BEGIN
PRINT ô x 2 lớ LL AC
TRANSACTION
END

c. T o một Trigger sao cho khi xóa một sinh viên mới từ bảng
SINHVIEN thì SiSo của lớp tƣơng ứng trong bảng DMLOP tự động giảm
xuống 1.
Lời giải
CREATE TRIGGER Trg_SV_DELETE ON SINHVIEN
FOR DELETE AS
UPDATE DMLOP
SET DMLOP.Siso=DMLOP.Siso-1 FROM DELETED
WHERE DMLOP.MaLop=DELETED.MaLop

Áp dụng
139
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

L F I H I WH =‘001’

Khi lệnh DELETE thực thi thì một TRIGGER FOR DELETE sẽ tự động
thực hiện:
Dữ liệu sinh viên 001 sẽ đƣợc đƣ vào bảng t m thời DELETED.
Thực hiện nhóm lệnh cập nhật Siso của lớp vừa xóa trong bảng DMLOP
2.3. Bẫy lỗi UPDATE
a. T o một Trigger kiểm tr điều kiện cho cột Điểm là <=10 Lời giải
CREATE TRIGGER DiemUPDATE ON DIEMHP
FOR UPDATE AS
IF ((SELECT DiemHP FROM INSERTED) > 10) BEGIN
PRINT l đ <=10 LL AC TRANSACTION
END

b. T o Trigger bẫy lỗi cho khoá ngo i của bảng SINHVIEN khi ch nh
sửa.
Lời giải:
CREATE TRIGGER LOP_UPDATE ON SINHVIEN
FOR UPDATE AS
IF UPDATE(MaLop) BEGIN
IF NOT EXISTS(SELECT * FROM DMLOP, INSERTED
WHERE DMLOP.MaLop=INSERTED.MaLop)
I ã lớ ô ụ LL AC
TRANSACTION
END

4.3.3. Bài tập tự giải

1. Bài tập View


1.1. T o view có tên vw_CTPNHAP bao gồm các thông tin sau: số phiếu
nhập hàng, mã vật tƣ, số lƣợng nhập, đơn giá nhập, thành tiền nhập.
1.2. T o view có tên vw_CTPNHAP_VT bao gồm các thông tin sau: số
phiếu nhập hàng, mã vật tƣ, t n vật tƣ, số lƣợng nhập, đơn giá nhập, thành
tiền nhập.

140
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

1.3. T o view có tên vw_CTPNHAP_VT_PN bao gồm các thông tin sau:
số phiếu nhập hàng, ngày nhập hàng, số đơn đặt hàng, mã vật tƣ, t n vật tƣ, số
lƣợng nhập, đơn giá nhập, thành tiền nhập.
1.4. T o view có tên vw_CTPNHAP_VT_PN_DH bao gồm các thông
tin sau: số phiếu nhập hàng, ngày nhập hàng, số đơn đặt hàng, mã nhà cung
cấp, mã vật tƣ, t n vật tƣ, số lƣợng nhập, đơn giá nhập, thành tiền nhập.
1.5. T o view có tên vw_CTPNHAP_loc bao gồm các thông tin sau: số
phiếu nhập hàng, mã vật tƣ, số lƣợng nhập, đơn giá nhập, thành tiền nhập. Và
ch liệt kê các chi tiết nhập có số lƣợng nhập > 5.
1.6. T o view có tên vw_CTPNHAP_VT_loc bao gồm các thông tin sau:
số phiếu nhập hàng, mã vật tƣ, t n vật tƣ, số lƣợng nhập, đơn giá nhập, thành
tiền nhập. Và ch liệt kê các chi tiết nhập vật tƣ có đơn vị tính là Bộ.
1.7. T o view có tên vw_CTPXUAT bao gồm các thông tin sau: số phiếu
xuất h
1.8. T o view có tên vw_CTPXUAT_VT bao gồm các thông tin sau: số
phiếu xuất hàng, mã vật tƣ, t n vật tƣ, số lƣợng xuất, đơn giá xuất.
1.9. T o view có tên vw_CTPXUAT_VT_PX bao gồm các thông tin sau:
số phiếu xuất hàng, tên khách hàng, mã vật tƣ, t n vật tƣ, số lƣợng xuất, đơn
giá xuất.
2. Bài tập Trigger
2.1. T o một trigger sao cho không cho phép xóa các thông tin của các
sinh viên học ngành CNTT.
2.2. T o một Trigger để kiểm tra tính hợp lệ của dữ liệu đƣợc nhập vào
bảng SINHVIEN là dữ liệu ngày sinh phải nhỏ hơn ngày hiện t i.
2.3. T o ra Trigger sao cho khi cập nhật MaLop một sinh viên trong
bảng SINHVIEN thì SiSo của lớp tƣơng ứng trong bảng DMLOP tự động
thay đổi.
2.4. Hãy t o ra Trigger sao cho khi sửa MaLop những sinh viên trong
bảng SINHVIEN thì SiSo của lớp tƣơng ứng trong bảng DMLOP tự động
th y đổi.
2.5. Viết trigger không cho phép xóa những sinh viên học CNTT mà có
địa ch Tam Kỳ.

141
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.6. Viết trigger cho phép cập nhật l i điểm học phần khi điểm lần 2
đƣợc cập nhật.

142
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 5: THỦ TỤC LƢU TRỮ (STORED PROCEDURE) VÀ HÀM


(FUNCTION)
Mục tiêu chƣơng 5: Trong các chƣơng trƣớc, khi truy vấn dữ liệu xong
chúng ta có thể lƣu các nhóm câu lệnh SQL vào một file văn bản (d ng *.sql)
để khi cần có thể sử dụng l i. Tuy nhi n th y v lƣu file văn bản ta có thể lƣu
vào trong SQL Server dƣới d ng thủ tục lƣu trữ (Stored Procedure). Đối với
một lập tr nh vi n đã có nhiều kinh nghiệm thƣờng sẽ sử dụng thủ tục lƣu trữ
để thực hiện thao tác dữ liệu thay vì viết câu lệnh trực tiếp (d ng văn bản).
Trong chƣơng này ch ng t i sẽ giới thiệu về thủ tục thƣờng trú – một phần
khá quan trong trong lập trình với cơ sở dữ liệu. Nội dung trình bày trong
chƣơng này gồm:
 Thủ tục lƣu trữ là gì? T i sao phải sử dụng thủ tục lƣu trữ?
 Tìm hiểu các lo i thủ tục lƣu trữ của hệ thống;
 Cách t o và sử dụng thủ tục lƣu trữ nhƣ thế nào?
 Cách khai báo biến và sử dụng biến trong thủ tục lƣu trữ.
Và trong chƣơng này giới thiệu cách xây dựng các hàm để phục vụ nhu
cầu tính toán, phát triển ứng dụng hoặc các mục đích xử lý khác nhằm mang
l i tiện lợi hơn cho ngƣời sử dụng nhƣ:
 Trình bày một cách khái quát hàm do ngƣời dùng định nghĩ , so
sánh sự khác nhau giữa hàm và thủ tục;
 Phân lo i hàm do ngƣời dùng định nghĩ và cách t o ch ng nhƣ
thế nào?
 Cách sử dụng hàm trong CSDL.
5.1. Thủ tục lƣu trữ
5.1.1. Giới thiệu

5.1.1.1. Định nghĩa thủ tục.

Thủ tục lƣu trữ là một đối tƣợng trong CSDL, b o 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 bi n dịch và lƣu trữ trong CSDL, ch ng sẽ đƣợc gọi thực thi th ng qu
một t n đ i diện.

143
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Với thủ tục lƣu trữ, khả năng hỗ trợ lập tr nh đƣợc đƣ vào ng n ngữ
SQL, nghĩ là ch ng t có thể vận dùng các cấu tr c lập tr nh để xử l dữ liệu
trong câu lệnh SQL. Thủ tục lƣu trữ có thể có các thành phần sau:

Hình 5-1: Các thành phần của thủ tục lưu trữ.
- Các cấu tr c điều khiển (IF, WHILE, FOR).
- 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.
Một tập các câu lệnh 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 th m số truyền vào c ng
nhƣ có thể trả về các giá trị th ng qu các th m số (nhƣ trong các ng n ngữ
lập tr nh). Khi một thủ tục lƣu trữ đã đƣợc định nghĩ , nó có thể đƣợc gọi
th ng qu t n của thủ tục, nhận các th m 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ị s u khi thực hiện xong.
5.1.1.2. Phân loại thủ tục:

 System Stored Procedure:


Đây là thủ tục đƣợc lƣu trữ trong CSDL Master, nó bắt đầu bằng sp_
đƣợc
sử dụng trong quản trị CSDL và an ninh bảo mật.
Ví dụ 5-1: Muốn biết tất cả các tiến tr nh đ ng thực hiện bởi user nào:
sp_who @loginame='sa'

144
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 5-2: Kết quả khi thực thi thủ tục sp_who
 Local Stored Procedure:
Đây là lo i thủ tục lƣu trữ thƣờng dùng nhất, nằm trong CSDL do ngƣời
dùng t o ra, thực hiện một công việc nào đó. Thủ tục lo i này thƣờng đƣợc
t o bởi DBA (Database Administrator) hoặc ngƣời lập trình.
 Temporary Stored Procedure:
Đây là lo i thủ tục có chức năng tƣơng tự nhƣ Loc l Stored Procedure
nhƣng thủ tục lo i này tự hủy khi kết nối t o ra nó bị ngắt hoặc SQL Server
ngƣng ho t động. Nó đƣợc t o ra trên CSDL Tempdb.
 Extended Stored Procedure:
Đây là lo i thủ tục sử dụng chƣơng tr nh ngo i vi đã đƣợc biên dịch
thành thƣ viện liên kết động DLL (Dynamic Link Library). Tên thủ tục đƣợc
bắt đầu bằng xp_. Ví dụ thủ tục xp sendm il dùng để gửi mail, thủ tục
xp cmdshell dùng để thực hiện lệnh củ DOS (xp cmdshell „dir c:\‟).
Remote Stored Procedure:
Đây là lo i thủ tục sử dụng (gọi) thủ tục của một server khác.
5.1.2. Các lợi ích khi sử dụng thủ tục lƣu trữ

Tăng tốc độ thực hiện: Một trong những lợi ích lớn nhất khi sử dụng
thủ tục lƣu trữ đó là tốc độ. Thủ tục lƣu trữ đƣợc tối ƣu hoá trong ng y ở lần
biên dịch đầu ti n, điều này cho phép chúng có thể thực hiện nh nh hơn rất
nhiều lần so với các câu lệnh Transact-SQL th ng thƣờng.
Tốc độ truy cập dữ liệu nhanh hơn: Khi thực thi một câu lệnh SQL thì
SQL Server phải kiểm tra quyền (permission) xem user gửi câu lệnh đó có
đƣợc phép thực hiện h y kh ng đồng thời kiểm tra cú pháp rồi mới t o ra một
kế ho ch thực thi và thực thi. Nếu có nhiều câu lệnh nhƣ vậy gửi qua m ng có
thể làm giảm đi tốc độ làm việc của server. SQL Server sẽ làm việc hiệu quả
hơn nếu dùng thủ tục lƣu trữ v ngƣời gửi ch gửi một câu lệnh đơn và SQL
Server ch kiểm tra một lần s u đó t o ra một kế ho ch và thực thi. Nếu thủ
tục lƣu trữ đƣợc gọi nhiều lần thì kế ho ch thực thi có thể đƣợc sử dụng l i
nên sẽ làm việc nh nh hơn. Ngoài r c pháp của các câu lệnh SQL đã đƣợc
SQL Sever kiểm tr trƣớc khi lƣu n n nó kh ng cần kiểm l i khi thực thi.

145
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Chƣơng trình đƣợc modul hoá: Một khi thủ tục lƣu trữ đƣợc t o ra nó
có thể đƣợc sử dụng l i. Ðiều này sẽ làm cho việc bảo trì dễ dàng hơn do việc
tách rời giữa những logic thể hiện bên trong thủ tục lƣu trữ với cơ sở dữ liệu.
Ví dụ nếu có một sự th y đổi nào đó về mặt logic thì ta ch việc th y đổi mã
lệnh bên trong thủ tục lƣu trữ mà thôi. Những ứng dụng dùng thủ tục lƣu trữ
này có thể sẽ không cần phải th y đổi mà vẫn tƣơng thích với những th y đổi
mới về mặt logic của thủ tục.
Nhất quán: Lợi ích nữa của thủ tục lƣu trữ là thiết lập các ràng buộc dữ
liệu để đảm bảo tính nhất quán. Ngƣời sử dụng không thể tuỳ tiện thao tác với
dữ liệu để làm mất tính nhất quán của dữ liệu.
Nâng cao khả năng bảo mật dữ liệu: Giả sử chúng ta muốn giới h n
việc truy xuất dữ liệu trực tiếp của một user nào đó tr n một số bảng, ta có thể
viết một thủ tục lƣu trữ để truy xuất dữ liệu và ch cho phép user đó đƣợc sử
dụng thủ tục lƣu trữ đã viết sẵn mà thôi chứ không thể thao tác trực tiếp trên
các bảng đó. Ví dụ, ta có thể t o ra thủ tục lƣu trữ, phân quyền EXCUTE cho
những thủ tục lƣu trữ này, và khi đó những user khác kh ng đƣợc phép trực
tiếp gọi thủ tục để làm việc với dữ liệu. Ngoài ra thủ tục lƣu trữ có thể đƣợc
mã hó (encrypt) để tăng cƣờng tính bảo mật.
SQL Server ch bi n dịch các thủ tục lƣu trữ một lần và sử dụng l i kết
quả bi n dịch này trong các lần tiếp theo trừ khi ngƣời dùng có những thiết
lập khác nhƣ sử đổi, viết l i thủ tục. Việc sử dụng l i kết quả bi n dịch nhằm
làm tăng hiệu suất của hệ thống khi thủ tục lƣu trữ đƣợc gọi li n tục nhiều lần
(bi n dịch 1 lần, gọi nhiều lần).
Thủ tục lƣu trữ đƣợc phân tích, tối ƣu và bi n dịch l c t o r n n việc
thực thi ch ng nh nh 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.
Thủ tục lƣu trữ cho phép ch ng t thực hiện cùng một y u cầu bằng một
câu lệnh đơn giản th y 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.
Th y 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, t có thể cấp phát quyền cho ngƣời
sử dụng th ng qu các thủ tục lƣu trữ, nhờ đó tăng khả năng bảo mật đối với
hệ thống.
Các thủ tục lƣu trữ trả về kết quả theo 4 cách:
146
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Sử dụng các th m số output


 Sử dụng các lệnh trả về giá trị, các lệnh này lu n trả về giá trị số
nguy n.
 Tập các giá trị trả về củ mỗi câu lệnh SELECT có trong thủ tục
lƣu trữ hoặc củ quá tr nh gọi một thủ tục lƣu trữ khác trong một
thủ tục lƣu trữ.
 Một biến con trỏ toàn cục có thể th m chiếu từ b n ngoài thủ tục.
5.1.3. Tạo thủ tục lƣu trữ

C A C C ủ ụ
[( ố) [WI H C IL ENCRYPTION /
RECOMPILE / ENCRYPTION] AS
[BEGIN]
[DECLARE ụ ủ ủ ụ
C l ủ ủ ụ [

Trong đó:
tên_thủ_tục: Tên của thủ tục lƣu trữ (s u đây gọi tắt là thủ tục) do ngƣời
dùng tự đặt (đặt theo qui tắc định danh, kh ng đƣợc vƣợt quá 128 ký tự).
danh_sách_tham_số: Các tham số của thủ tục đƣợc khai báo ngay sau
tên thủ tục và nếu thủ tục có nhiều tham số thì các khai báo cách nhau bởi dấu
phẩy. Có thể sử dụng tối đ 2100 th m số trong danh_sách_tham_số đối với
mỗi thủ tục. Dung lƣợng tối đ có mỗi thủ tục là 128 MB.
Khai báo mỗi tham số bao gồm hai phần: @tên_tham_số kiểu_dữ_liệu
tên_tham_số đƣợc bắt đầu bởi dấu @.
kiểu_dữ_liệu của tham số
Ví dụ 5-2: @manganh char(5)
RECOMPILE: Th ng thƣờng, thủ tục sẽ đƣợc phân tích, tối ƣu và dịch
sẵn ở lần gọi đầu tiên. 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:Thủ tục sẽ đƣợc mã hóa nếu tuỳ chọn WITH
ENCRYPTION đƣợc ch định. Nếu thủ tục đã đƣợc mã hóa, ta không thể
xem đƣợc nội dung của thủ tục.

147
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

DECLARE: khai báo biến phụ (nếu cần) để sử dụng trong thân thủ tục.
Các_câu_lệnh_của_thủ_tục: 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ừ khóa BEGIN...END
hoặc có thể không.
Ví dụ 1: Giả sử cần thực hiện các c ng việc theo thứ tự nhƣ s u:
– Nhập một môn học mới.
– Nhập điểm lần 1 của một môn học mới đó cho một sinh vi n có mã
SV là CT01.
Để thực hiện các c ng việc tr n ch ng t cần các câu lệnh nhƣ s u:
- Trƣớc ti n nhập một học phần mới với mã học phần tự động tăng, t n
học phần là M ng máy tính, số tín ch là 2, mã ngành CTT và đƣợc học vào
học kỳ 5.
insert into DMHOCPHAN values( N'M ng máy tính',2,
'CTT','5')
chú ý: đ , thu c tính mahp là ki u
identity nên khi nh p tự đ l 1 ặc
đ nh.

Tiếp theo nhập điểm lần 1 của học phần M ng máy tính có mã là 9 cho
một sinh vi n có mã SV là CTT01. Giả sử điểm lần 1 môn học này của sinh
viên là 8, điểm lần 2 là Null:
insert into diemhp values( 'CTT01',9, '8', null)

Cách viết nhƣ tr n có h n chế là: trong quá tr nh làm việc sẽ có rất nhiều
sinh vi n có điểm môn học này, do đó ngƣời dùng sẽ phải viết đi viết l i
những câu lệnh tƣơng tự nh u cho các sinh vi n khác nh u. Một cách giải
quyết vấn đề này là dùng thủ tục lƣu trữ và dùng th m số để nhận các th ng
tin th y đổi.
create procedure them_DIEMHP
@masv nchar(10),
@Mahp tinyint,
@diemlan1 tinyint,
@diemlan2 tinyint,
@TenHP nvarchar(50),
@sotc tinyint,
@manganh char(5),
148
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

@hocky char(2)
as
begin
insert into DMHOCPHAN values(@tenhp, @sotc,
@manganh, @hocky)
insert into diemhp values(@Masv,@mahp,@diemlan1,
@diemlan2)
end

Thực thi thủ tục trên:


exec them_DIEMHP 'CTT02',10, '8', null, N'M ng máy
tính',2, 'CTT','5'

Ví dụ 5-3: Hãy thực hiện các th o tác nhƣ s u tr n cơ sở dữ liệu


Bổ sung thêm học phần Hệ quản trị cơ sở dữ liệu SQL Server có mã
10, số tín ch là 3, thuộc mã ngành CTT và đƣợc học ở học kỳ 5 vào bảng
HOCPHAN
Lên danh sách nhập điểm thi học phần Hệ quản trị cơ sở dữ liệu SQL
Server cho các sinh viên học lớp có mã 2 (tức là bổ sung vào bảng DIEM các
bản ghi với cột MAHP nhận giá trị 16, cột MASV nhận giá trị lần lƣợt là mã
các sinh viên học lớp có mã 2, các cột điểm là NULL). Và hiển thị bảng danh
sách nhập điểm.
alter PROC sp_LenDanhSachDiem
( @mahp TINYINT,
@tenhp NVARCHAR(50),
@sotc TINYINT,
@manganh VARCHAR(10),
@hocky char(2),
@malop tinyint )
AS
BEGIN
/* chèn thêm m t môn mới*/
INSERT INTO dmhocphan VALUES(@tenhp, @sotc,
@manganh, @hocky)
/*t o danh sách nh đ m cho các sinh viên thu c
lớ đ ợc truyền vào vớ đ đều null*/
INSERT INTO diemhp(mahp,masv)
SELECT @mahp,masv FROM sinhvien WHERE malop=@malop

149
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

/* hi n th danh sách nh đ m*/


SELECT mahp,sinhvien.masv, diemlan1
FROM sinhvien inner join diemhp
on SINHVIEN.MaSV=DIEMHP.MaSV
WHERE mahp=@mahp
END
Thực thi thủ tục trên:
sp_LenDanhSachDiem @mahp='16',
@tenhp=N'H qu n tr C s d li u SQL Server',
@sotc=3, @manganh='CTT', @hocky='4', @malop='2'

Kết quả là học phần bổ sung thêm Hệ quản trị Cơ sở dữ liệu SQL Server
với mã hp tự động tăng l n là 16, số tín ch là 3 thuộc mã ngành CTT học ở
học kỳ 4.
Đồng thời thêm vào bảng DiemHP các sinh viên thuộc lớp có mã là 2,
mã học phần là 16 với lần lƣợc các điểm là null.
Hiển thị d nh sách v điểm cho các sinh viên trên:

5.1.4. Các tao thác trên thủ tục lƣu trữ

5.1.4.1. L i gọi thủ tục

Khi một thủ tục lƣu trữ đƣợc t o ra, ta có thể yêu cầu hệ quản trị cơ sở
dữ liệu thực thi thủ tục bằng lời gọi thủ tục có d ng:
tên_thủ_tục [d nh sách các đối_số]
Danh sách các đối_số (tham số thực sự) phải phù hợp với số lƣợng và
thứ tự của các tham số hình thức khi định nghĩ thủ tục.
Trong trƣờng hợp lời gọi thủ tục đƣợc thực hiện bên trong một thủ tục
khác, bên trong một trigger, thủ tục có giá trị trả về hay kết hợp với các câu
lệnh SQL khác, ta sử dụng c pháp nhƣ s u:

150
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

EXECUTE tên_thủ_tục [d nh sách các đối_số]


Nếu thứ tự củ các đối số đƣợc truyền cho thủ tục (tham số thực sự)
không theo thứ tự của các tham số hình thức nhƣ khi định nghĩ thủ tục thì tất
cả các đối số phải đƣợc viết dƣới d ng:
@tên_tham_số = giá_trị
Ví dụ: thực thi các thủ tục đã viết ở trên
1. exec them_DIEMHP 'CTT02',10, '8', null, N'M ng
máy tính',2, 'CTT','5'
2. sp_LenDanhSachDiem @mahp='16',
@tenhp=N'H qu n tr C s d li u SQL Server',
@sotc=3, @manganh='CTT', @hocky='4', @malop='2'

5.1.4.2. Biến trong thủ tục lưu trữ

Ngoài những tham số đƣợc truyền cho thủ tục, bên trong thủ tục còn có
thể sử dụng các biến nhằm lƣu trữ các giá trị tính toán đƣợc hoặc truy xuất
đƣợc từ cơ sở dữ liệu. Các biến trong thủ tục đƣợc khai báo bằng từ khóa
DECLARE theo c pháp nhƣ sau:
DECLARE @tên_biến kiểu_dữ_liệu
tên_biến phải bắt đầu bởi ký tự @ và tuân theo qui tắc về định danh.
Ví dụ 5-4: Trong định nghĩ của thủ tục dƣới đây sử dụng các biến để
chứa các giá trị truy xuất đƣợc từ cơ sở dữ liệu.
create PROCEDURE sp_Vidu
(@malop1 int,
@malop2 int)
as
begin
DECLARE @tenlop1 NVARCHAR(50)
DECLARE @manganh1 nCHAR(10)
DECLARE @tenlop2 NCHAR(50)
DECLARE @manganh2 nCHAR(10)
SELECT @tenlop1=tenlop,@manganh1=manganh
FROM DMLOP
WHERE malop=@malop1
SELECT @tenlop2=tenlop,@manganh2=manganh
FROM dmlop

151
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

WHERE malop=@malop2
IF @manganh1=@manganh2
PRINT N'Hai lớp cùng thu c m t ngành'
else
PRINT N'Hai lớp khác ngành'
End

5.1.4.3. iá trị trả về trong thủ tục lưu trữ

Trong các ví dụ trƣớc, nếu đối số truyền cho thủ tục khi có lời gọi đến
thủ tục là biến, những th y đổi giá trị của biến trong thủ tục sẽ kh ng đƣợc
giữ l i khi kết th c quá tr nh thực hiện thủ tục.
Ví dụ 5-5: Có thủ tục lƣu trữ nhƣ s u
create procedure sp_TestOutput
@a int, @b int, @c int
as
select @c = @a + @b

Thực thi thủ tục:

Declare @tong int


set @tong = 0
exec sp_TestOutput 100, 200, @tong
select @tong

Kết quả là 0, v biến tổng kh ng đƣợc tính toán khi truyền vào lời gọi thủ
tục mà nó vẫn chứ giá trị b n đầu.
Do đó, để lấy kết quả tính toán sau khi xữ l một thủ tục, ch ng t sử
dụng th m số OUTPUT.
Chú ý: Có 2 lo i tham số hình thức:
- Tham số nhập
- Tham số xuất: có thêm từ khó DECLARE trƣớc tên biến trong lời gọi
và thêm chữ OUTPUT sau tên kiểu trong thủ tục.
Trong trƣờng hợp cần phải giữ l i giá trị củ đối số s u khi kết th c thủ
tục, t phải kh i báo th m số của thủ tục theo c pháp nhƣ s u:
ố l u OUTPUT

Ví dụ tr n đƣợc viết l i nhƣ s u:


152
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

create procedure sp_TestOutput


@a int, @b int, @c int output
as
select @c = @a + @b
ự ủ ụ :
Declare @tong int
set @tong = 0
exec sp_TestOutput 100, 100, @tong output select
@tong

Kết quả là 200.


5.1.4.4. Sử ụng lệnh RETURN

Tƣơng nhự nhƣ việc sử dụng th m số OUTPUT, câu lệnh RETURN trả
về giá trị cho đối tƣợng thực thi stored procedure.
Ví dụ 5-6:
create procedure sp_TestReturn
as begin
declare @out int
select @out = count(*) from KhachHang
return @out
end

Thực thi thủ tục lƣu trữ


declare @a int
exec @a = sp_TestReturn
select @a

5.1.4.5. Tham số với giá trị mặc định

Các th m số đƣợc kh i báo trong thủ tục có thể nhận các giá trị mặc
định. Giá trị mặc định sẽ đƣợc gán cho th m số trong trƣờng hợp kh ng
truyền đối số cho th m số khi có lời gọi đến thủ tục.
Th m số với giá trị mặc định đƣợc kh i báo theo c pháp nhƣ s u:
@t n th m số kiểu dữ liệu = giá trị mặc định
Ví dụ 5-7:
create procedure sp_TestDefault
@Masv nchar(10) = ‘C 03’
153
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

as begin
select * from sinhvien where Masv = @Masv
end

Thực thi thủ tục lƣu trữ theo giá trị mặc định củ th m số.
sp_TestDefault

Kết quả thực hiện

Thực thi thủ tục và truy ền giá trị cho th m số:


f l ‘ G 01’

5.1.5. Sửa đổi thủ tục

Khi một thủ tục đã đƣợc t o r , t có thể tiến hành định nghĩ l i thủ tục
đó bằng câu lệnh ALTER PROCEDURE có c pháp nhƣ s u:
ALTER PROCEDURE t n thủ tục [(d nh sách th m số)] [WITH
RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS
Các câu lệnh củ thủ tục
Câu lệnh này sử dụng tƣơng tự nhƣ câu lệnh CREATE PROCEDURE.
Việc sử đổi l i một thủ tục đã có kh ng làm th y đổi đến các quyền đã cấp
phát tr n thủ tục c ng nhƣ kh ng tác động đến các thủ tục khác hay trigger
phụ thuộc vào thủ tục này.
5.1.6. Xóa thủ tục lƣu trữ

Để xoá một thủ tục đã có, t sử dụng câu lệnh DROP PROCEDURE với
c pháp nhƣ s u:
DROP PROCEDURE t n thủ tục
Khi xoá một thủ tục, tất cả các quyền đã cấp cho ngƣời sử dụng tr n thủ
tục đó c ng đồng thời bị xoá bỏ. Do đó, nếu t o l i thủ tục, t phải tiến hành
cấp phát l i các quyền tr n thủ tục đó.

154
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

5.2. Hàm do ngƣời dùng định nghĩa ( User Defined Function)


Trong SQL Server ngoài những hàm hệ thống có sẵn nhƣ các nhóm hàm:
String Functions, Data and Time Functions, Mathematical Functions
v.v…ngƣời t c ng có thể tự xây dựng các hàm để phục vụ nhu cầu tính toán,
phát triển ứng dụng hoặc các mục đích xử lý khác nhằm mang l i tiện lợi hơn
cho ngƣời sử dụng.
5.2.1. Khái niệm

Hàm do ngƣời dùng định nghĩ về mặt nào đó th nó giống nhƣ thủ tục ở
chƣơng trƣớc mà giáo tr nh đã giới thiệu. Hàm là một đối tƣợng trong cơ sở
dữ liệu bao gồm một tập nhiều câu lệnh SQL đƣợc nhóm l i với nhau thành
một nhóm. Điểm khác biệt 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 chính vì vậy mà trong thủ tục có tham số
OUTPUT để lấy kết quả trả về. Điều này cho phép ta 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 nhƣ trong các câu lệnh truy vấn hay
các câu lệnh thực hiện cập nhật dữ liệu
5.2.2. Những hạn chế khi sử dụng hàm do ngƣời dùng định nghĩa

Các hàm do ngƣời dùng định nghĩ kh ng thể đƣợc sử dụng để thực hiện
các hành động sử đổi tr ng thái cơ sở dữ liệu.
Các hàm do ngƣời dùng định nghĩ kh ng thể trả về nhiều tập kết quả.
Nếu ta cần trả về nhiều bộ kết quả thì hãy sử dụng thủ tục lƣu trữ.
Các hàm do ngƣời dùng định nghĩ kh ng thể gọi thủ tục lƣu trữ.
Các hàm do ngƣời dùng định nghĩ có thể đƣợc lồng nh u; nghĩ là, một
hàm do ngƣời dùng định nghĩ có thể gọi hàm khác. Mức lồng nh u đƣợc
tăng l n khi hàm đƣợc gọi bắt đầu thực thi và giảm dần khi hàm đƣợc gọi kết
thúc thực hiện.
5.2.3. Phân loại

Hàm do ngƣời dùng định nghĩ đƣợc chia làm 3 lo i:


- Sc l r (hàm v hƣớng): đƣợc sử dụng để trả về một giá trị duy nhất dựa
trên tham số truyền vào.
- Inline table-valued (hàm nội tuyến): hàm trả về một bảng dựa trên một
câu lệnh SQL duy nhất định nghĩ các dòng và các cột trả về.

155
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

- Multi -statement table-valued (hàm bao gồm nhiều câu lệnh SQL bên
trong, trả về giá trị d ng bảng): hàm c ng trả về kết quả là một tập hợp giá trị
d ng bảng dựa trên nhiều câu lệnh SQL.
Hàm v hƣớng - Scalar UDF
Sc rl r UDF đƣợc t o r bằng câu lệnh CREATE FUNCTION có cấu
tr c nhƣ s u:
C A F C I ([ ố )
( ề ủ )
AS BEGIN
l ủ
END

Ví dụ 5-8: (Trƣờng hợp hàm không có Danh_Sach_Cac_Tham_So)


Câu lệnh dƣới đây định nghĩ hàm tính ngày trong tuần (thứ trong tuần)
của một giá trị kiểu ngày:
Create function f_thu(@ngay datetime)
returns nvarchar(10) as
begin
declare @st nvarchar(10)
l = ( , ) 1
ủ 2 ứ 3 ứ
4 ứ 5 ứ 6
ứ l ứ
( ) * ề ủ *
end

Sau khi ch y thành c ng, hàm trở thành một đối tƣợng trong CSDL và
có thể đƣợc truy xuất nhƣ các hàm đƣợc xây dựng sẵn trong SQL Server.

Hình 5-3: Kết quả tạo hàm

156
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Ví dụ 5-9: cho biết các sinh vi n có ngày sinh tƣơng ứng với thứ nào
trong tuần trong đó sử dụng hàm f thu đã xây dựng ở trên.
select HoTen, convert(varchar, ngaysinh,103) as
N'Ngày sinh', dbo.f_thu(NgaySinh)as N'Thứ'
from Sinhvien

Ví dụ 5-10: (Trƣờng hợp hàm có sử dụng tham số trong


Danh_Sach_Cac_Tham_So). Hàm sẽ trả về số ngày củ tháng, năm do ngƣời
dùng truyền vào. Với năm nhuận th tháng 2 có 29 ngày, các năm khác có 28
ngày.
CREATE FUNCTION getnumday ( @Thang Int, @Nam
Int) RETURNS int
AS BEGIN
DECLARE @Ngay Int
IF @Thang = 2 BEGIN
IF ((@Nam % 4 = 0 AND @Nam % 100 <> 0)
OR (@Nam % 400 = 0))
SET @Ngay = 29 ELSE
SET @Ngay = 28 END
ELSE
SELECT @Ngay = CASE @Thang
WHEN 1 THEN 31
WHEN 3 THEN 31
WHEN 5 THEN 31
WHEN 7 THEN 31
WHEN 8 THEN 31
WHEN 10 THEN 31
WHEN 12 THEN 31

WHEN 4 THEN 30
WHEN 6 THEN 30
WHEN 9 THEN 30
WHEN 11 THEN 30
157
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

END
RETURN @Ngay
END

5.2.3.2. Hàm nội tuyến - Inline UDF

Hàm nội tuyến đƣợc định nghĩ bằng lệnh CREATE FUNCTION.
CREATE FUNCTION t n hàm ([d nh sách th m số]) RETURNS
TABLE AS
RETURN (câu lệnh_select)
C pháp của hàm nội tuyến phải tuân theo các qui tắc s u:
- Kiểu trả về củ hàm phải đƣợc ch định bởi mệnh đề RETURNS
TABLE.
- Trong phần thân củ hàm ch có duy nhất một câu lệnh RETURN xác
định giá trị trả về củ hàm th ng qu duy nhất một câu lệnh SELECT. Ngoài
r , 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.
Ví dụ 5-11: Ví dụ dƣới đây lấy r các sinh vi n tùy thuộc vào giá trị mã
sinh vi n truyền vào cho th m số.
create function f_ChonSinhvien (@MaSV nchar(10))
returns table as return (select * from Sinhvien where
MaSV = @MaSV)

Việc gọi các hàm nội tuyến c ng tƣơng tự nhƣ việc gọi các hàm v
hƣớng.
Ví dụ 5-12:
select *
from f_ChonSinhvien('CTT01')

Ví dụ 5-13: T o hàm để xem danh sách sinh viên của một Khoa nào đó?
CREATE FUNCTION func_XemSV(@makhoa char(10))
RETURNS TABLE
AS
RETURN(SELECT masv,hoten,ngaysinh FROM dmnganh
inner join dmlop on dmlop.manganh =dmnganh.manganh inner
join dmkhoa on dmnganh.makhoa=dmkhoa.makhoa inner join
sinhvien on dmlop.malop = sinhvien.malop

158
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

WHERE dmkhoa.makhoa=@makhoa)

Thực thi hàm


Ví dụ 5-14: Xem danh sách các sinh viên khoa Toán Tin.
SELECT * FROM f X (‘ ’)

5.2.3.3. Hàm bao gồm nhiều câu lệnh bên trong – Multi statement UDF

Hàm này c ng đƣợc định nghĩ bằng lệnh CREATE FUNCTION


C A F C I ([ ố )
A L đ A
GI l
RETURN
END

Lƣu :
- s u từ khó RETURNS là một biến bảng đƣợc định nghĩ . Và s u từ
khó RETURN ở cuối hàm kh ng có th m số nào đi kèm
- Cấu trúc của bảng trả về bởi hàm đƣợc xác định dự vào định nghĩ của
bảng trong mệnh đề RETURNS. Biến @biến_bảng trong mệnh đề
RETURNS có ph m vi sử dụng trong hàm và đƣợc sử dụng nhƣ là 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à @biếnbảng
đƣợc định nghĩ trong mệnh đề RETURNS
Ví dụ 5-15: Nếu ngƣời dùng cho biết mã ngành thì lấy danh sách sinh
viên thuộc mã ngành đó. Ngƣợc l i, nếu ngƣời dùng không biết mã ngành thì
hiển thị danh sách tất cả sinh viên. Viết hàm để thực hiện yêu cầu trên?
CREATE FUNCTION func_DSSV(@manganh nchar(10))
RETURNS @bang table (masv nchar(10),hoten
nvarchar(50))
AS BEGIN
if @manganh=' '
insert into @bang
select masv,hoten from dmnganh inner join dmlop on
dmlop.manganh =dmnganh.manganh

159
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

inner join dmkhoa on dmnganh.makhoa=dmkhoa.makhoa


inner join sinhvien on dmlop.malop = sinhvien.malop
else
insert into @bang select masv, hoten from dmnganh
inner join dmlop on dmlop.manganh =dmnganh.manganh
inner join dmkhoa on dmnganh.makhoa=dmkhoa.makhoa
inner join sinhvien on dmlop.malop = sinhvien.malop
where dmnganh.manganh=@manganh
RETURN END

Thực thi hàm: Hiển thị danh sách sinh viên ngành CNTT (CTT)
select * from func_DSSV('CTT')

hoặc hiển thị tất cả các sinh viên của tất cả các ngành
select * from func_DSSV('')

5.2.4. Tha đổi hàm

Dùng lệnh ALTER FUNCTION để th y đổi định nghĩ hàm. Cấu tr c


củ câu lệnh ALTER FUNCTION tƣơng tự nhƣ CREATE FUNCTION
5.2.5. Xóa hàm

Dùng lệnh Drop Function để xó hàm. Cấu tr c lệnh Drop Function nhƣ
sau:
F C I

Ví dụ 5-16:
drop function f_thu

Tƣơng tự nhƣ thủ tục lƣu trữ, khi hàm bị xó th các quyền cấp cho
ngƣời dùng tr n hàm đó c ng bị xó . Do đó khi định nghĩ l i hàm này, t
phải cấp l i quyền cho các ngƣời dùng.
5.3. Bài tập chƣơng 5
5.3.1. Câu hỏi ôn tập

1. Thủ tục là gì? T i sao phải viết thủ tục?


2. Có mấy lo i thủ tục lƣu trữ?
3. Có mấy lo i tham số hình thức? Cho ví dụ.

160
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4. Local Stored Procedure (thủ tục lƣu trữ ngƣời dùng t o ra) có mấy
d ng? Cho ví dụ.
5. Hàm do ngƣời dùng định nghĩ là g ? Phân biệt hàm với thủ tục?
6. Có mấy lo i hàm do ngƣời dùng định nghĩ ? Cho ví dụ?
5.3.2. Bài tập thực hành

Sử dụng csdl QLSinhvien đã t o trong chƣơng 3 để thực hiện:


1. Bài tập thủ tục
1.1. T o thủ tuc cập nhật, bổ sung , xoá dữ liệu.
a. Viết thủ tục tính điểm trung bình chung theo từng học kỳ với mã lớp
ch định.
Lời giải
alter PROCEDURE TinhDTBC
@HocKy char(2),@MaLop tinyint
AS
IF NOT EXISTS (SELECT * FROM SINHVIEN
WHERE MaLop=@MaLop)
BEGIN
PRINT N'Lớp này không có sinh viên'
RETURN -1
END
SELECT HocKy, SINHVIEN.MaSV, HoTen,
SUM(Diemlan1*SOTC)/SUM(sotc) AS N'diemTBC'
FROM DIEMHP INNER JOIN DMHOCPHAN
ON DIEMHP.MaHP=DMHOCPHAN.MAHP
INNER JOIN SINHVIEN ON SINHVIEN.MaSV=DIEMHP.MaSV
WHERE MaLop=@MaLop AND HocKy=@HocKy
GROUP BY HocKy, SINHVIEN.MaSV, HoTen
ORDER BY HocKy
GO

Thực hiện gọi thủ tục


exec TinhDTBC '1', '2'

b. T o thủ tục bổ sung dữ liệu cho bảng SINHVIEN.


Lời giải:

161
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CREATE PROCEDURE INSERT_SINHVIEN


@MaSV nchar(10), @HoTen nvarchar(50), @MaLop
tinyint, @GioiTinh bit, @NgaySinh smalldatetime, @DiaChi
nvarchar(100)
AS
BEGIN
IF EXISTS(SELECT * FROM SINHVIEN WHERE MaSV=@MaSV)
BEGIN
I đã , ã
RETURN -1
END
IF NOT EXISTS (SELECT * FROM DMLOP WHERE
MaLop=@MaLop)
BEGIN
I L ô ụ
RETURN -1
END
INSERT INTO SINHVIEN
VALUES (@MaSV, @HoTen, @MaLop, @GioiTinh,
@NgaySinh, @DiaChi)
END

Thực hiện gọi thủ tục


EXEC INSERT_SINHVIEN
01, , 13, ,
12 12 1989 ,

1.2. Viết thủ tục xoá sinh viên có mã ch định.


CREATE PROCEDURE DELETE_SINHVIEN
@MaSV varchar(11) as
BEGIN
IF NOT EXISTS (SELECT * FROM SINHVIEN
WHERE MaSV=@MaSV)
BEGIN
PRINT N'Sinh viên này không có'
RETURN -1
END
DELETE FROM SINHVIEN WHERE MaSV=@MaSV
PRINT N'Xoá thành công'
END
162
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Thực thi thủ tục


DELETE_SINHVIEN 'ctt05'

1.3. Cập nhật l i điểm lần 2 cho các b n sinh vi n đã học l i có mã ch


định.
CREATE PROCEDURE UpDate_DIEM
@MaSV nchar(10), @MaHP tinyint, @diemlan2 tinyint
as BEGIN
IF NOT EXISTS (SELECT * FROM SINHVIEN
WHERE MaSV=@MaSV)
BEGIN
I ô ồ
RETURN -1
END
IF NOT EXISTS (SELECT * FROM DMHOCPHAN
WHERE MaHP=@MaHP)
BEGIN
I H ầ ô ụ
RETURN -1
END
UPDATE DIEMHP SET Diemlan2=@Diemlan2 WHERE
MaSV=@MaSV AND MaHP=@maHP
END

Thực hiện gọi thủ tục


EXECUTE UPDATE_Diem 'CTT02',2,7

1.4. Viết đo n chƣơng tr nh phân lớp thành 2 lớp A,B và lƣu trữ ở 2
bảng khác nhau, với điều kiện là: Nếu Mã sinh viên là số l thì là lớp A, nếu
Mã sinh viên là chẵn thì là lớp B
Lời giải
ALTER PROCEDURE Phan2lop
@MaLop varchar(10) AS
IF NOT EXISTS (SELECT * FROM SINHVIEN
WHERE MaLop=@MaLop)
BEGIN
PRINT N'Lớp này không có sinh viên'
RETURN -1
END
163
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

select masv, hoten, MaLop, case when


(convert(int,substring(sinhvien.MaSV,4,2))%2) = 0 then
'A'
end as 'phân lớp'
into lopA1
from sinhvien
where
convert(int,substring(sinhvien.MaSV,4,2))%2=0
select masv, hoten, MALOP, case when
(convert(int,substring(sinhvien.MaSV,4,2))%2) = 1 then
'B' end as 'phân lớp'
into lopB
from sinhvien
where
convert(int,substring(sinhvien.MaSV,4,2))%2=1

Thực thi câu lệnh:


Phan2lop 2
SELECT * FROM LOPA
SELECT * FROM LOPb

Kết quả

1.5. T o thủ tục hiển thị dữ liệu với các điều kiện ch định.
a. T o thủ tục: Hiển thị danh sách gồm MaSV, HoTen, , MaLop, MaHP,
Diemlan1, của những sinh viên có Diemlan1 nhỏ hơn số ch định, nếu không
có thì hiển thị thông báo không có sinh viên nào.
Lời giải
CREATE PROCEDURE HIENTHI_Diem
@Diemlan1 varchar(5) AS
IF NOT EXISTS (SELECT * FROM DIEMHP
WHERE Diemlan1 < @Diemlan1) PRINT N'không có sinh
viên nào'

164
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

ELSE
SELECT SINHVIEN.MaSV, HoTen, MaLop, MaHP, Diemlan1
FROM DIEMHP
INNER JOIN SINHVIEN ON DIEMHP.MaSV = SINHVIEN.MaSV
WHERE DIEMHP.Diemlan1 < @Diemlan1
GO

Thực hiện gọi thử tục


exec HIENTHI_Diem 6

b. T o thủ tục: Hiển thị danh sách gồm: MaSV, HoTen, MaLop,
NgaySinh (dd/mm/yyyy), GioiTinh (Nam, Nữ),Tuổi của những sinh viên có
tuổi trong khoảng ch định. Nếu không có thì hiển thị thông báo không có sinh
viên nào
Lời giải:
CREATE PROCEDURE HIENTHI_Tuoi
@tuoi1 tinyint, @tuoi2 tinyint AS
IF NOT EXISTS (SELECT * FROM SINHVIEN WHERE
YEAR(GETDATE())-YEAR(Ngaysinh) BETWEEN @tuoi1 AND
@tuoi2)
PRINT 'không có sinh viên nào'
ELSE
SELECT
MaSV,HoTen,MaLop,CONVERT(char(10),NgaySinh,103),
CASE gioitinh WHEN 0 THEN N'N 'ELSE N'Nam' END,
YEAR(GETDATE())-YEAR(Ngaysinh) AS 'Tuổi'
FROM SINHVIEN
WHERE YEAR(GETDATE())-YEAR(Ngaysinh)

Thực hiện gọi thử tục


EXECUTE HIENTHI_tuoi 16,25

c. T o thủ tục: Hiển thị MaLop,TenLop, Tổng số SV mỗi lớp của khoa
có mã ch định, Kiểm tr điều kiện MaKhoa có trong bảng Danh mục không,
Nếu không có thì hiển thị thông báo Không có lớp này.
Lời giải

CREATE PROCEDURE HIENTHI_KHOA2

165
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

@MaKhoa varchar(6) AS
IF NOT EXISTS (SELECT * FROM DMKHOA
WHERE MaKhoa=@MaKhoa)
BEGIN
I ô lớ
RETURN -1
END
SELECT DMLOP.MaLop,TenLop, COUNT(MaSV) AS SoLuong
FROM SINHVIEN INNER JOIN DMLOP
ON SINHVIEN.MaLop=DMLOP.MaLop
INNER JOIN DMNGANH ON DMNGANH.MaNganh=DMLOP.MaNganh
WHERE MaKhoa=@MaKhoa
GROUP BY DMLOP.MaLop,TenLop

Thực hiện gọi thủ tục


EXECUTE HIENTHI_KHOA2 'CTT'

d. T o thủ tục: Tính điểm trung bình chung từng học kỳ theo từng sinh
viên của lớp có mã ch định.
Lời giải
CREATE PROCEDURE HIENTHI_DTBC
@MaLop varchar(5) AS
SELECT DIEMlan1.MaSV, HocKy,
SUM(Diemlan1*Solan1)/SUM(Sotc) AS Đ TBC'
FROM DIEMHP INNER JOIN DMHOCPHAN
ON DIEMHP.MaHP=DMHOCPHAN.MaHP
INNER JOIN SINHVIEN ON DIEMHP.MaSV=SINHVIEN.MaSV
WHERE MaLop=@MaLop
GROUP BY DIEMHP.MaSV, HocKy
GO

Thực hiện gọi thủ tục


EXECUTE HIENTHI_DTBC 2

e. T o thủ tục, cho biết Hoten sinh vi n KHÔNG có điểm HP <5 ở lớp
có mã ch định, Kiểm tra Mã lớp ch định có trong danh mục không, Nếu
không thì hiển thị thông báo.
Lời giải
CREATE PROCEDURE KIEMTRA_LOP
166
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

@MaLop varchar(6) AS
IF NOT EXISTS (SELECT * FROM DMLOP WHERE
MaLop=@MaLop)
I Lớ ô h ụ
ELSE
SELECT MaSV, HoTen FROM SINHVIEN
WHERE MaLop=@MaLop AND MaSV NOT IN(SELECT MaSV FROM
DIEMHP
WHERE Diemlan1<5)
GO

Thực hiện gọi thủ tục: EXECUTE KIEMTRA_LOP 2


2. Bài tập Hàm
2.1. Hiển thị danh sách gồm: MaSV, DiemTBC, Xếp Lo i của mỗi sinh
viên. Trong đó viết hàm xếp lo i dự vào điểm
Lời giải:
+ T o hàm xếp lo i
CREATE FUNCTION XEPLOAI
(@Diem float) RETURNS nvarchar(10) AS
BEGIN
DECLARE @d nvarchar(10) SET @d=CASE
WHEN @Diem>=8 THEN N'Giỏi' WHEN @Diem>=7 THEN
N'Khá'
WHEN @Diem>=5 THEN N'Trung bình' ELSE N'Y u'
END
RETURN @d
End

+ Hiển thị danh sách gồm: MaSV, DiemTBC, Xếp Lo i của mỗi sinh
viên
SELECT MaSV, SUM(DiemHP*Sotc)/SUM(Sotc) AS
N'DiemTBC',
dbo.XEPLOAI(SUM(DiemHP*Sotc)/SUM(Sotc)) AS N'X p
lo i'
FROM DMHOCPHAN INNER JOIN DIEMHP ON
DMHOCPHAN.MaHP=DIEMHP.MaHP
GROUP BY MaSV

167
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

2.2. Hiển thị danh sách sinh viên gồm: MaSV, HoTen, MaLop,
NgaySinh (dd/mm/yyyy), GioiTinh (Nam, Nữ) đƣợc sắp xếp theo thứ tự ƣu
tiên MaLop, Tên sinh viên.
+ Viết hàm tách tên từ chuỗi Họ tên
CREATE FUNCTION TACHTEN(@ht nvarchar(30))
RETURNS nvarchar(10) AS
BEGIN
DECLARE @ten varchar(10), @L int, @i int,@j
int,@kt varchar(10)
SET @L=LEN(@ht) SET @i=1
WHILE @i<=@L BEGIN
SET @kt=SUBSTRING(@ht,@i,1) IF @kt='' SET @j=@i
SET @i=@i+1
END
SET @ten=SUBSTRING(@ht,@j+1,10) RETURN @ten
END
+ Ứng dụng
Hiển thị danh sách sinh viên gồm: MaSV, HoTen, MaLop, NgaySinh
(dd/mm/yyyy), GioiTinh (Nam, Nữ) đƣợc sắp xếp theo thứ tự ƣu ti n M Lop,
Tên sinh viên.
SELECT MaSV, HoTen, MaLop,
C ( (10), ,103) A ’ ’, CASE
G WH 1 H L A ’G ớ
’, Y A ( ) A ’ ’
FROM SINHVIEN
ORDER BY MaLop, dbo.TACHTEN(HoTen) ASC

Lƣu : Cần xây dựng hàm tách tên, nếu không sẽ sắp xếp theo họ và tên.
2.3. Viết hàm đọc điểm nguyên ra thành chữ tƣơng ứng
Lời giải
CREATE FUNCTION DOCDIEMNGUYEN(@diem int)
RETURNS nvarchar(10) AS
BEGIN
DECLARE @diemChu nvarchar(10) SET @diemChu=CASE
WH =0 H ô WH =1 H
WHEN @diem=2 THEN N'Hai' WHEN @diem=3 THEN N'Ba' WHEN

168
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

=4 H ố WH =5 H WH
=6 H WH =7 H WH
@diem=8 THEN N'Tám' WHEN @diem=9 THEN N'Chín' WHEN
=10 H
RETURN @diemchu
end

2.4. Hiển thị danh sách gồm M SV, HoTen, M HP, DiemHP, Điểm chữ
và xuất ra bảng BANGDIEM. Trong đó viết hàm đọc điểm 1 chữ số thập
phân ra thành chữ tƣơng ứng.
Lời giải:
+ Viết hàm đọc điểm 1 chữ số thập phân ra thành chữ tƣơng ứng
CREATE FUNCTION DOC_DIEMTP(@Diemtp numeric(4,1))
RETURNS nvarchar(20)
AS
BEGIN
DECLARE @pn tinyint, @ptp tinyint, @kq
nvarchar(20) SET @pn=FLOOR(@Diemtp)
SET @ptp=(@Diemtp*10)%10
= C I G Y ( )+ ẩ
'+dbo.DOCDIEMNGUYEN(@ptp)
RETURN @kq
END

+ Hiển thị danh sách gồm M SV, HoTen, M HP, DiemHP, Điểm chữ.
SELECT MaSV, HoTen, MaHP, DiemHP,
C I ( H ) A ‘Đ ’ A G I
FROM SINHVIEN
INNER JOIN DIEMHP ON SINHVIEN.MaSV=DIEMHP.MaSV

169
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

5.3.3. Bài tập tự giải

1. T o thủ tục bổ sung dữ liệu cho bảng DIEMHP.


2. Cập nhật l i dữ liệu cho khoa có mã ch định.
3. Viết đo n chƣơng tr nh phân lớp thành A,B,C,D,.. bất kỳ với số lƣợng
lớp ch định. Phân lớp đƣợc quy định nhƣ s u:
- Nếu Mã sinh viên chia cho số lớp dƣ 0 là lớp „A‟
- Nếu Mã sinh viên chia cho số lớp dƣ 1 là lớp „B‟
4. T o thủ tục: Hiển thị Hoten sinh viên CHƢA học học phần có mã ch
định, Kiểm tra Mã học phần ch định có trong danh mục không, Nếu không có
thì hiển thị thông báo không có học phần này.
5. T o thủ tục:Cho biết MaKhoa, Tên Khoa, tổng số sinh viên của Khoa
ch định. Kiểm tr điều kiện Mã khoa có trong bảng danh mục không
6. T o thủ tục: Hiển thị danh sách gồm: MaSV, HoTen, MaLop,
MaKhoa, NgaySinh (dd/mm/yyyy),GioiTinh (Nam, Nữ) của những sinh viên
ở Khoa có mã ch định, Nếu không có thì hiển thị thông báo Không có sinh
viên nào.
7. T o thủ tục: Hiển thị danh sách gồm: MaSV, HoTen, MaLop,
NgaySinh (dd/mm/yyyy), GioiTinh(Nam, Nữ), của những sinh viên học lớp
có mã ch định. Kiểm tra MaLop ch định có tồn t i trong bảng không, nếu
không có thì hiển thị thông báo Không có lớp đó.
8. Viết hàm tính điểm trung bình chung của sinh viên có mã ch định ở
học kỳ bất kỳ.
9. Viết hàm tính tổng số đơn vị học trình của các học phần điểm <5 của
sinh viên có mã ch định.
10. Viết hàm đếm số sinh vi n có điểm HP <5 của học phần ch định.
11. Viết hàm đếm số học phần có điểm HP <5 của sinh viên ch định.

170
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 6: BẢO MẬT & PHÂN QUYỀN NGƢỜI DÙNG TRONG


SQL SERVER
Mục tiêu củ chƣơng 6:
Cơ sở dữ liệu (CSDL) trong một tổ chức có thể chứ các dữ liệu quan
trọng và cần giữ bí mật. V thế, việc bảo mật CSDL là rất cần thiết đối với
một Hệ quản trị CSDL. Trong chƣơng này ch ng t sẽ bàn về các nguy n tắc
bảo mật c ng nhƣ việc phân quyền ngƣời dùng trong Hệ quản trị CSDL SQL
Server và cách thực hiện nó.
SQL Server ch cho phép truy cập vào hệ thống qua xác thực đăng nhập.
Ch khi ta có quyền h n ở mức độ nhất định thì ta mới có thể t o thêm những
login khác. Trong SQL Server Management Studio, có thể xem tất cả các
login bằng cách mở rộng những node Security/Logins. Những Login này ch
có quyền truy cập vào Server chứ chƣ thể vào đƣợc d t b se (cơ sở dữ liệu)
ở bên trong. Với mỗi cơ sở dữ liệu l i duy trì một danh sách những ngƣời
dùng, các ngƣời dùng này luôn luôn gắn với một login ở mức độ Server. Nếu
đăng nhập vào SQL Server qua login này, ta sẽ có quyền truy cập vào cơ sở
dữ liệu theo quyền h n mà ngƣời dùng tƣơng ứng với nó đƣợc cung cấp. Ta
có thể xem những ngƣời dùng này bằng cách mở rộng Security/Users củ cơ
sở dữ liệu tƣơng ứng. Trong chƣơng này sẽ cho chúng ta biết bảo mật dữ liệu
SQL Server là gì? Cách bảo mật và quản trị ngƣời dùng thực hiện nhƣ thế
nào.
6.1. Bảo mật trong SQL Server
6.1.1. Khái niệm

Bảo mật thông tin là bảo vệ thông tin, dữ liệu ch cho phép những cá
nhân, tổ chức có nhiệm vụ, quyền sử dụng đƣợc phép truy cập, không cho
phép những ngƣời kh ng đƣợc cho phép đánh cắp, th y đổi thông tin, dữ liệu.
Bảo mật thông tin là duy trì tính bảo mật, tính toàn vẹn dữ liệu và tính
sẵn sàng cho toàn bộ thông tin.
- Tính bảo mật: đảm bảo th ng tin đó là duy nhất, những ngƣời muốn
truy cập phải đƣợc cấp phát quyền truy cập.
- Tính toàn vẹn, chính xác: bảo vệ sự hoàn ch nh toàn diện, chính xác
thông tin của hệ thống thông tin.

171
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

- Tính sẵn sàng: việc bảo mật phải luôn sẵn sàng, đƣợc thực hiện bất kì
lúc nào, ở đâu.
Bảo mật cơ sở dữ liệu trong SQL Server cho phép những ngƣời quản trị
cơ sở dữ liệu thiết lập quyền h n cho ngƣời dùng hoặc nhóm ngƣời dùng khai
thác CSDL. Ngƣời dùng hoặc nhóm ngƣời dùng s u khi đƣợc cấp quyền, có
thể đăng nhập vào hệ thống và thực hiện quyền h n mà m nh đƣợc cấp.
Th ng qu tính năng bảo mật, SQL Server cho phép xác định ngƣời sử
dụng nào đ ng truy cập dữ liệu. Mỗi cơ sở dữ liệu có một tập hợp ngƣời sử
dụng riêng, mỗi ngƣời có quyền h n ri ng để truy cập CSDL. Các quyền này
cho phép ngƣời sử dụng đƣợc truy cập, th y đổi dữ liệu hoặc xó các đối
tƣợng dữ liệu.
6.1.2. Giới thiệu về cơ chế bảo mật trong SQL Server

Bảo mật trong SQL Server đƣợc thực hiện th ng qu 3 mức từ thấp đến
c o nhƣ s u:

Hình 6-1: Các mức bảo mật CSDL trong SQL Server
Mức ngoài cùng là mức xác thực ngƣời dùng đối với hệ quản trị CSDL
SQL Server. Nhƣ ch ng t đã biết trong các chƣơng trƣớc, SQL Server cho
phép h i cơ chế chứng thực ngƣời dùng, đó là chứng thực cùng với hệ điều
hành Windows NT, nghĩ là những i có quyền đăng nhập vào Windows là có
quyền đăng nhập vào SQL Server; cách chứng thực thứ h i là chứng thực trực
tiếp vào SQL Server bằng một tài khoản do SQL Server quản l .
Mức thứ h i là mức kiểm tra xem ngƣời dùng đã đăng nhập vào hệ thống
có quyền sử dụng một h y nhiều CSDL cụ thể nào đó h y kh ng, v kh ng
phải i đăng nhập vào SQL Server là có thể truy cập đến mọi thứ b n trong
172
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

SQL Server, điều này li n qu n đến việc phân quyền mà ch ng t sẽ khảo sát
trong phần sau.
Mức trong cùng (mức thứ 3) là mức xác định quyền củ ngƣời dùng s u
khi đƣợc phép truy cập vào CSDL có đƣợc phép truy cập, đƣợc phép thực
hiện các câu lệnh SQL tr n những đối tƣợng cụ thể (chẳng h n nhƣ một bảng
h y một Store Procedure cụ thể nào đó) củ CSDL đó h y kh ng. Mức bảo
mật này c ng li n qu n đến việc phân quyền mà ch ng t sẽ khảo sát trong
các phần tiếp theo.
6.1.3. Mã hóa dữ liệu trong SQL Server

Mã hoá là một phƣơng pháp qu n trọng nhằm bảo mật dữ liệu. Những
dữ liệu nh y cảm nhƣ số chứng minh nhân dân, số th tín dụng, mật khẩu...
cần phải đƣợc bảo vệ trƣớc v vàn mối nguy hiểm tấn c ng hiện n y. Trong
SQL Server từ phi n bản 2000 trở về trƣớc, ch ng t có thể tự t o các hàm
củ ri ng m nh hoặc sử dụng các thƣ vi n li n kết động (dll) ngoài để mã hoá
dữ liệu. Trong SQL Server phi n bản 2005 trở về s u, các hàm và phƣơng
thức hỗ trợ cho việc mã hó dữ liệu đƣợc cung cấp sẳn để đáp ứng các y u
cầu về mã hó dữ liệu.
SQL Server cung cấp các kỹ thuật s u để mã hoá dữ liệu:
- Mã hoá bằng mật khẩu.
- Mã hoá khoá đối xứng.
- Mã hoá khoá kh ng đối xứng.
- Mã hoá chứng nhận.
Trong phần này, ch ng t sẽ khảo sát cách sử dụng các kỹ thuật mã hoá
bằng mật khẩu và phƣơng pháp giải mã nó, các kỹ thuật còn l i ch ng t để
dành cho mục thảo luận và t m hiểu củ Sinh vi n.
SQL Server cung cấp 2 hàm cho việc mã hoá: một cho việc mã hoá và
một cho việc giải mã. “Mã hoá bằng mật khẩu” là phƣơng pháp mã hoá dữ
liệu cơ bản th ng qu mật khẩu. Dữ liệu có thể đƣợc giải mã nếu nhập đ ng
mật khẩu đã sử dụng khi mã hoá. Ch ng t sẽ thử một ví dụ về việc mã hoá và
giải mã dữ liệu bằng kỹ thuật mã hoá th ng qu mật khẩu.
select DulieuMahoa
=EncryptByPassPhrase('MAK','123456789' )

173
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả:

Giờ ch ng t sẽ thực thi 3 lần hàm Encryptbyp ssphr se tr n theo ví dụ


sau:
declare @count int, @SoCMND char(9), @password
varchar(12)
set @count =1
while @count<=3
begin
set @SoCMND = '123456789'
set @Password = 'MAK'
select CMNDMahoa = EncryptByPassPhrase(@password,
@SoCMND) set @count=@count+1
end

Kết quả

Kết quả củ Encryptbyp ssphr se s u mỗi lần thực thi hàm là khác nh u.
Tuy nhi n, khi giải mã dữ liệu th nó vẫn r kết quả nhƣ b n đầu trƣớc khi mã
hoá.
Bây giờ ch ng t sẽ thử giải mã dữ liệu đã đƣợc mã hoá ở tr n với hàm
DecryptByPassPhrase
select
convert(varchar(100),DecryptByPassPhrase('MAK',
0x01000000CBB7EE45B5C1460D6996B149CE16B76C7F7CD598DC5636
4D106B05D47B930093))

select
convert(varchar(100),DecryptByPassPhrase('MAK',

174
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

0x010000005E884D30C8FF7E4723D4E70A03B0B07F877667BAF1DA9B
E1E116434842D11B99))
select
convert(varchar(100),DecryptByPassPhrase('MAK',
0x01000000C508FB0C4FC7734B47B414D2602A71A338417DD6852291
73684D319334A084CD))

Kết quả:

Thử giải mã dữ liệu đã đƣợc mã hoá với một mật khẩu khác. Thực thi
theo câu lệnh sau:
select
convert(varchar(100),DecryptByPassPhrase('test',
0x01000000C508FB0C4FC7734B47B414D2602A71A338417DD6852291
73 684D319334A084CD))

Kết quả:

Kết quả cho thấy SQL Server trả l i giá trị NULL nếu mật khẩu s i.
Giờ ch ng t sẽ thử t o một bảng chứ số th tín dụng và số CMND, s u
đó sẽ mã hoá dữ liệu này th ng qu phƣơng pháp mã hoá mật khẩu.
create database [QLKhachHang] go
use [Customer DB] go
create table tblKhachHang (MaKH int, SoTheTinDung
bigint, SoCMND bigint)
go
insert into tblKhachHang values (1, 5678910, 1234567)
insert into tblKhachHang values (2, 5678911, 1234568)
insert into tblKhachHang values (3, 5678912, 1234569)
insert into tblKhachHang values (4, 5678913, 1234570)
insert into tblKhachHang values (4, 5678914, 1234571) go

T o hai cột để lƣu dữ liệu đã đƣợc mã hoá


175
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

use QLKhachHang go
alter table tblKhachHang add SoTheMahoa
varbinary(MAX) go alter table tblKhachHang add CMNDMahoa
varbinary(MAX) go

Cập nhật dữ liệu đã đƣợc mã hoá vào h i cột vừ t o:


use QLKhachHang go
update tblKhachHang set SoTheMahoa =
EncryptByPassPhrase('TTD',
convert(varchar(100),SoTheTinDung)) go
update tblKhachHang set CMNDMahoa =
EncryptByPassPhrase(CMND',
convert(varchar(100),SoCMND)) go

Truy vấn bảng bằng câu lệnh s u sẽ đƣợc kết quả nhƣ h nh b n dƣới
select * from tblKhachHang

Kết quả:

Xoá bỏ cột chứ dữ liệu chƣ đƣợc mã hoá:


alter table tblKhachHang drop column SoTheTinDung
go alter table tblKhachHang drop column SoCMND go

Thực thi l i câu lệnh truy vấn t có kết quả nhƣ h nh b n dƣới.
select * from tblKhachHang go

Kết quả:
Giải mã dữ liệu củ bảng tr n th ng qu hàm Decryptbyp ssphr se nhƣ
sau:
select MaKH, convert(bigint, convert(varchar(100),
decryptbypassphrase('TTD', SoTheMahoa))) as
SoTheTinDung, convert(bigint,convert(varchar(100),
decryptbypassphrase('CMND', CMNDMahoa) )) as SoCMND from
tblKhachHang

176
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Kết quả:

6.1.4. Các lỗ hổng bảo mật thƣờng gặp trong SQL Server

SQL injection là một kỹ thuật điền vào những đo n mã SQL bất hợp
pháp cho phép kh i thác một lỗ hổng bảo mật tồn t i trong CSDL của một
ứng dụng. Lỗ hổng bảo mật này có thể xuất hiện khi ứng dụng kh ng có đo n
mã kiểm tr chuỗi k tự nh ng trong câu truy vấn SQL, do một số lỗi phát
sinh khi tràn kiểu dữ liệu tính toán h y do lỗi c pháp SQL của lập tr nh vi n
khiến cho một đo n mã có thể xử l theo cách ngoài muốn của lập tr nh
vi n. Kh i thác lỗ hổng bảo mật SQL injection có thể đƣợc hiểu là h nh thức
tấn c ng (phá ho i) bằng cách chèn bất hợp pháp các đo n mã SQL và câu
lệnh SQL ban đầu.
Ch ng t có các trƣờng hợp làm phát sinh lỗi SQL Injection nhƣ s u:
Kh ng kiểm tr k tự thoát truy vấn:
Đây là d ng lỗi SQL injection xảy r khi thiếu đo n mã kiểm tra dữ liệu
đầu vào trong câu truy vấn SQL. Kết quả là ngƣời dùng cuối có thể thực hiện
một số truy vấn kh ng mong muốn đối với CSDL củ ứng dụng. Dòng mã
s u sẽ minh họ lỗi này:
statement = "SELECT * FROM users WHERE name = '" + userName +
"';"
Câu lệnh này đƣợc thiết kế để trả về các bản ghi t n ngƣời dùng cụ thể từ
bảng những ngƣời dùng. Tuy nhi n, nếu biến userN me đƣợc nhập chính
xác theo một cách nào đó bởi ngƣời dùng ác , nó có thể trở thành một câu
truy vấn SQL với mục đích khác hẳn so với mong muốn củ tác giả đo n mã
tr n. Ví dụ, ta nhập vào giá trị củ biến userN me nhƣ s u:
a' or 't'='t

Khiến câu truy vấn có thể đƣợc hiểu nhƣ s u:


SELECT * FROM users WHERE name = 'a' OR 't'='t';
177
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Nếu đo n mã tr n đƣợc sử dụng trong một thủ tục xác thực th ví dụ tr n


có thể đƣợc sử dụng để bắt buộc lự chọn một t n ngƣời dùng hợp lệ bởi t = t
lu n đ ng. Nhƣ vậy, ngƣời dùng sẽ lu n đăng nhập hoặc lu n lấy dữ liệu
đƣợc với bất kỳ tài khoản đăng nhập nào.
Trong khi đó, hầu hết các hệ quản trị SQL server cho phép thực hiện
nhiều truy vấn cùng l c ch với một lần gọi. Do vậy, một trƣờng hợp xấu hơn
là khi ngƣời dùng cố gán giá trị cho biến “userN me” những giá trị có thể
làm xó hoàn toàn dữ liệu có trong CSDL. Ch ng t khảo sát ví dụ s u:
Ngƣời dùng gán cho biến userN me giá trị nhƣ s u:
a';DROP TABLE users; SELECT * FROM data WHERE 't' =
't

Điều này đƣ tới c pháp cuối cùng củ câu truy vấn tr n nhƣ s u:
SELECT * FROM users WHERE name = 'a';DROP TABLE
users; SELECT * FROM DATA WHERE 't' = 't';

Nhƣ vậy, ngƣời sử dụng đã có thể xó đƣợc mọi dữ liệu trong bảng D t ,
và tƣơng tự cho các bảng khác.
Xử l kh ng đ ng kiểu
Lỗi SQL injection d ng này thƣờng xảy r do lập tr nh vi n h y ngƣời
dùng định nghĩ kiểu dữ liệu đầu vào kh ng r ràng hoặc thiếu bƣớc kiểm tra
và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy r khi một cột có kiểu dữ liệu
kiểu số đƣợc sử dụng trong truy vấn SQL nhƣng lập tr nh vi n l i thiếu bƣớc
kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà ngƣời dùng nhập
vào có phải là số h y kh ng. Ví dụ nhƣ s u:
:= L C * F WH = +
+ ;

T có thể nhận thấy một cách r ràng định củ tác giả đo n mã tr n là


nhập vào một số tƣơng ứng với cột id – cột dữ liệu kiểu số. Tuy nhi n, ngƣời
dùng cuối, th y v nhập vào một số, họ có thể nhập vào một chuỗi k tự, và
do vậy có thể trở thành một câu truy vấn SQL hoàn ch nh mới mà bỏ qu k
tự thoát. Ví dụ, t thiết lập giá trị củ biến t n biến là:
1;DROP TABLE users

Khi đó, nó sẽ thực hiện th o tác xó bảng users r khỏi cơ sở dữ liệu, v


câu truy vấn hoàn ch nh đã đƣợc hiểu là:
178
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

SELECT * FROM DATA WHERE id=1;DROP TABLE users;


Blind SQL injection
Lỗi SQL injection d ng này là d ng lỗi tồn t i ng y trong ứng dụng
nhƣng hậu quả củ ch ng l i kh ng hiển thị trực qu n cho ngƣời dùng. Nó có
thể gây r sự s i khác khi hiển thị nội dung của một trang chứ lỗi bảo mật
này, hậu quả củ sự tấn c ng SQL injection d ng này khiến cho lập tr nh vi n
h y ngƣời dùng phải mất rất nhiều thời gi n để phục hồi chính xác từng bit dữ
liệu. Những k tấn c ng còn có thể sử dụng một số c ng cụ để dò t m lỗi d ng
này và tấn c ng với những th ng tin đã đƣợc thiết lập sẵn.
Th y đổi giá trị điều kiện truy vấn
D ng lỗi này khiến cho k tấn c ng có thể th y đổi giá trị điều kiện trong
câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứ lỗi này.
SELECT TenSach FROM tblSach WHERE MaSach = 'B01'
AND 1=1;

Sẽ hiển thị một cách b nh thƣờng, trong khi đó ch ng t xem xét câu
lệnh sau:
SELECT TenSach FROM tblSach WHERE MaSach = 'B01' AND 1=2;
Câu lệnh tr n sẽ hiển thị một nội dung khác, hoặc kh ng hiển thị g nếu
ứng dụng có chứ lỗi SQL injection d ng này. Lỗ hổng d ng này còn cho
phép tin tặc kh ng ch gây ảnh hƣởng tới bảng h y dữ liệu hiện t i mà còn
ảnh hƣởng tới những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ
liệu h y bảng hiện t i.
Điều kiện lỗi
Lỗi SQL injection d ng này dẫn tới việc buộc cơ sở dữ liệu ch đƣợc
phép đánh giá khi mà giá trị củ câu lệnh WHERE là đ ng. Ví dụ:
SELECT 1/0 FROM users WHERE username='ABC';

Phép chi cho 0 ch đƣợc đánh giá là lỗi khi mà ngƣời dùng có t n
ABC tồn t i trong cơ sở dữ liệu.
Thời gi n trễ
Lỗi SQL injection d ng này tồn t i khi thời gi n xử l của một h y nhiều
truy vấn SQL phụ thuộc vào dữ liệu logic đƣợc nhập vào hoặc quá tr nh xử l
truy vấn của SQL engine cần nhiều thời gi n. Tin tặc có thể sử dụng lỗi SQL
179
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

injection d ng này để xác định thời gi n chính xác mà tr ng cần tải khi giá trị
nhập vào là đ ng.
6.2. Phân quyền ngƣời dùng trong SQL Server
6.2.1. Tài khoản đăng nhập vào SQL Server

SQL Server kiểm tra việc chứng thực ngƣời dùng theo h i mức:
 Login uthentic tion: Xác thực đăng nhập.
 Permissions validation on user database: Kiểm tr quyền củ
ngƣời dùng.
 Xác thực đăng nhập (Login Authentication)
Ngƣời dùng phải có tài khoản đăng nhập để kết nối với SQL Server.
SQL Server xác nhận ngƣời dùng bằng 3 cơ chế:
 SQL Server Authentication: Khi dử dụng SQL Server
Authentic tion, ngƣời sử dụng phải nhập t n đăng nhập và mật
khẩu đã đƣợc cấp.
 Windows NT Authentication: Khi sử dụng Windows NT
Authentic tion, SQL Serber sẽ xác minh l i cùng với WinNT để
kiểm tr xem có trùng khớp h y kh ng, nếu đ ng th cho phép
đăng nhập.
 Mixed Mode Authentication: Ngƣời sử dụng có thể đăng nhập sử
dụng SQL Server Authentication hoặc Windows NT
Authentication.
Cơ chế này quy định từ khi t o Login trong SQL server. Khi t o một
Login mới, SQL Server sẽ yêu cầu ngƣời dùng chọn cơ chế xác thực
Windown Authentication hay SQL server Authentic tion cho Login đó.
- Nếu chọn Windown Authentication, hệ thống yêu cầu cung cấp
một Window Account và SQL Server ch lƣu t n củ Login đó
trong danh sách Login.
- Nếu chọn SQL Server Authentication, hệ thống yêu cầu cung cấp
Login Name và Password và cả h i th ng tin đƣợc lƣu trong SQl
Server.

180
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Khi đăng nhập chúng ta phải chọn một trong h i cơ chế xác thực. Nếu
chọn Windows chính Account hiện đ ng đăng nhập vào Windows đƣợc dùng,
và nếu chọn cơ chế SQL Server Authentication thì hệ thống sẽ kiểm tra xem
Login và Password có trong danh sách hay không mới cho phép đăng nhập
hoặc từ chối.
Kiểm tr quyền (Permission)
Với mỗi CSDL, ngƣời dùng đƣợc cấp một số quyền tr n đó, và họ ch
đƣợc thực thiện các thao tác trong giới h n quyền của họ. SQL Server thực
hiện những bƣớc sau trong khi kiểm tr quyền:
- Khi ngƣời dùng thực hiện một th o tác, ví dụ nhƣ thực thi câu lệnh
T-SQL hoặc lự chọn c ng việc tr n th nh c ng cụ của cử sổ
quản l (EM), câu lệnh T-SQL sẽ đƣợc gởi tới SQL Server.
- Khi SQL Server nhận câu lệnh T-SQL, nó kiểm tr quyền củ
ngƣời dùng tr n những đối tƣợng li n qu n trong câu lệnh T-SQL.
 Nếu ngƣời dùng kh ng đƣợc phép, SQL Server sẽ
báo lỗi.
 Ngƣợc l i, nó thực hiện và trả về kết quả.
6.2.2. Quản lý ngƣời dùng

Một trong những lý do quan trọng để sử dụng SQL Server là khả năng
quản lý nhiều ngƣời sử dụng truy cập đến cùng CSDL t i một thời điểm. Có
nhiều vấn đề mà hệ quản trị CSDL phải thực hiện khi có nhiều ngƣời truy cập
đồng thời nhƣ: quyền ƣu ti n truy cập dữ liệu củ ngƣời sử dụng, h i ngƣời
cùng cập nhật một mẫu tin t i một thời điểm,... SQL Server đã hỗ trợ nhiều
chức năng cho phép giải quyết đ số các vấn đề phức t p này.
SQL Server cho phép t o và quản lý hai lo i ngƣời dùng:
- Login là ngƣời dùng hệ thống (System User). Mỗi Login dùng để truy
cập vào hệ thống SQL Server, các lo i Login ch có quyền truy cập vào
Server chứ chƣ hẳn có quyền truy cập vào các Database trên Server, các
quyền truy cập vào D t b se thƣờng đƣợc gắn liền với các ngƣời dùng CSDL
(Users).
- User là ngƣời dùng CSDL (Database User). Mỗi Database có một danh
sách ngƣời dùng đƣợc phép truy cập CSDL của mình, mỗi user lu n đƣợc gắn

181
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

với một Login ở mức Server. Ví dụ, khi đăng nhập vào SQL Server thông qua
Login có t n Login1, khi đó User có t n Ulogin1 tƣơng ứng có quyền truy cập
vào Database theo quyền h n mà Ulogin1 đƣợc cấp. Mỗi Login có thể gắn với
một hoặc nhiều User với quyền h n khác nhau trên các Database.
Khi cài đặt SQL Server, hệ quản trị mặc định t o sẵn một account SA -
System Administrator. SA có toàn quyền trên hệ quản trị CSDL nhƣ ccount,
user, back up và khôi phục CSDL, cấp phát, thu hồi quyền,…. SA là ccount
của quản trị viên hệ thống SQL Server.
Mỗi tài khoản ngƣời dùng có một định d nh ngƣời dùng (User Identifier
– ID) xác định một ngƣời dùng trong CSDL. Tất cả các quyền truy cập và
quyền sở hữu các đối tƣợng trong CSDL đƣợc xác định bằng tài khoản ngƣời
dùng. Tài khoản ngƣời dùng đƣợc xác định cho từng CSDL. Ví dụ: Tài khoản
ngƣời dùng ABC trong CSDL Book khác với tài khoản ABC trong CSDL
Customer
Quan hệ giữ tài khoản ngƣời dùng CSDL với tài khoản đăng nhập:
Ngƣời dùng trong CSDL đƣợc xác định bằng user ID, chứ kh ng phải
login ID. Bản thân login ID kh ng cấp bất cứ quyền nào cho ngƣời dùng truy
cập vào các đối tƣợng trong CSDL. Ví dụ: s là tài khoản đăng nhập (login
account – login ID) ánh x tới ngƣời dùng với user ccount h y User ID đặc
biệt có t n là dbo (d t b se owner) trong bất kỳ CSDL nào.
Quản l t n ngƣời dùng (Usern me) và t n đăng nhập (Login name)
Ví dụ s u đây ch r quá tr nh cấp quyền đăng nhập cho một ngƣời dùng
củ Windows có quyền đăng nhập vào SQL Server và s u đó tiếp tục cấp
quyền truy cập đến CSDL cho phép ngƣời dùng này truy cập vào CSDL
BOOKS.
USE master GO
l ‘ ¥ ’ G
f l l =’ ¥ ’,
f =’ ’ G G
‘ ¥ ’, ‘ ’ G
‘ ¥ ’, ‘ ’ G

Trong đó:

182
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 sp gr ntlogin: cho phep ngƣời dùng hoặc nhóm ngƣời dùng củ


Windows đƣợc phép đăng nhập vào SQL Server bằng Windows
Authentication.
 sp def ultdb: th y đổi CSDL mặc định cho việc đăng nhập.
 sp gr ntdb ccess: th m tài khoản ngƣời dùng CSDL và cấp quyền
truy cập cho nó.
 sp revokedb ccess: xó tài khoản ngƣời dùng CSDL.
6.2.3. Tạo ngƣời dùng

6.2.3.1. Tạo Login

- T o Login với cơ chế bảo mật Windows


Bƣớc 1: Mở cửa sổ Object Explorer, Chọn mục Security\Login\New
Login

Hình 6-2: Cửa sổ Object Explorer


Bƣớc 2: Ở mục Login Name, chọn nút lệnh Search  Hộp tho i Select
User or Group, chọn nút Advanced và tiếp tục chọn Find Now  Danh sách
các Account trong Windows hiện ra, và chọn một Account muốn t o dùng để
đăng nhập vào SQL.

183
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Hình 6-3: Mục Login Name


Bƣớc 3: Chọn nút lệnh OK
- T o Login với cơ chế bảo mật SQL Server Authentication:
Bƣớc 1: Mở cửa sổ Object Explorer, Chọn mục Security\Login\New
Login

Hình 6-4: Mở cửa sổ Object Explorer


Bƣớc 2: Ở mục Login Name, gõ tên Login muốn đặt.

Hình 6-5:Đặt tên Login Name

184
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Bƣớc 3: Chọn option SQL Server


Authentication
Bƣớc 4: Ở mục P ssword đặt
P ssword đăng nhập
Bƣớc 5: Ở mục Default Database
chọn Database cho phép Login truy cập.
Bƣớc 6: Chọn nút lệnh OK
Chúng ta muốn Server cho phép
đăng nhập Login với cơ chế Windows
hoặc cả h i cơ chế, chúng ta thiết lập ở
thuộc tính củ Server nhƣ s u:

Hình 6-6: Thiết lập hai cơ chế bảo mật


Ở mục Server Authentication:
Chọn Windows Authentication mode: Server ch cho phép Login đăng
nhập cơ chế Windows.
Chọn SQL Server and Windows Authentication mode: Server cho phép
Login đăng nhập bằng một trong h i cơ chế Windows hoặc SQL.
6.2.3.2. Tạo USER

Khi t o User, User đƣợc t o sẽ làm việc với một Database cụ thể. Các
bƣớc t o User nhƣ s u:
Bƣớc 1: Vào Database muốn t o User, mở mục Security\ Users, nhấp
chuột phải lên mục Users, chọn New Users. Xuất hiện cửa sổ Database Users

185
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

nhƣ s u:

Hình 6-7: Tạo User


Bƣớc 2: Ở mục General, t i text box User n me, điền t n User nhƣ h nh

sau:
Hình 6-8: Đặt tên User
Bƣớc 3: Mở mục Owned Schemas, cấp các quyền thao tác cho User trên
D t b se đó.

Hình 6-9: Cấp quyền cho các User


186
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Bƣớc 4: Nhấn chọn OK


6.2.4. Cấp phát quyền cho ngƣời dùng

Dùng T-SQL:
USE <DB name>
GRAN <permission name> ON <Object name> TO <User
name>

Giải thích: Lệnh này thực hiện phân quyền permission name cho ngƣời
dùng User name tr n đối tƣợng Object name thuộc DB name.
Ví dụ 6-1: Phân quyền db owner cho ngƣời dùng Troly trên bảng
tbl_diem của database QL_sinhvien
USE <QL_sinhvien>
GRAN <db_owner> ON <tbl_Diem> TO <Troly>

Trong quản lý dữ liệu, bảo mật là một việc không thế thiếu, nó ảnh
hƣởng đến sự sống còn của dữ liệu. SQL Server đã hỗ trợ tốt việc này thông
qua các mức bảo mật và công cụ cấp phát quyền ngƣời dùng.
6.2.5. Quản lý Role

Roles rất quan trọng trong hệ quản trị CSDL v nó là cách chính để cung
cấp quyền (phân quyền) cho ngƣời dùng. Quyền có thể đƣợc cấp cho ngƣời
dùng bằng cách cấp trực tiếp cho từng ngƣời dùng, cách này làm cho ngƣời
quản trị hệ thống làm việc rất mất thời gi n và nhàm chán v phải cấp chi tiết
từng quyền cho từng ngƣời dùng. Một cách đơn giản và hiệu quả hơn, đó là
cấp quyền th ng qu Role – nó tƣơng tự nhƣ khái niệm group (nhóm ngƣời
dùng) trong các hệ thống khác. Ch ng t gán quyền cho Role và s u đó ngƣời
dùng đƣợc xếp vào Role đó. Nhƣ vậy, c ng việc củ ngƣời quản trị hệ thống
trở n n dễ dàng hơn rất nhiều.
SQL Server có 4 mức bảo mật khác nhau tùy theo mức độ cho phép
ngƣời dùng ở mức nào:
- Mức Hệ điều hành: ngƣời dùng đƣợc phép đăng nhập vào hệ thống và
đƣợc sử dụng một số quyền thuộc nhóm quyền Server Role.
- Mức SQL Server: ngƣời dùng có thể đƣợc cấp phát quyền ở mức SQL.
Trong đó quyền mặc định Login nào c ng có là Role Public, hoặc có thể đƣợc
cấp quyền cao nhất Sysadmin.
187
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

- Mức D t b se: ngƣời dùng có thể truy cập hoặc xử lý CSDL nếu ngƣời
dùng đó đƣợc cấp phát quyền thao tác trên CSDL đó.
- Mức đối tƣợng (bảng, view, store procedure,..): để truy xuất vào đối
tƣợng nếu ngƣời dùng đƣợc cấp phát quyền tr n đối tƣợng đó.
SQL Server có D t b se Roles và Server Roles. D t b se Roles đƣợc sử
dụng để cung cấp các mức khác nh u để truy cập vào một CSLD nào đó cụ
thể. Server Roles đƣợc sử dụng để cho phép hoặc h n chế ngƣời sử dụng thực
hiện các th o tác (oper tions) tr n các CSDL.
Database Roles
Có một kiểu Database Role rất đặc biệt, đó là public role, nó có các đặc
điểm sau:
 Có trong tất cả các D t b se.
 Kh ng thể xó .
 Tất cả các ngƣời dùng đều thuộc về Public role, b o gồm cả tài
khoản s .
 Nhóm các quyền thực hiện trên Database:
 db owner: Đây là role c o nhất mà ngƣời dùng có thể có. Role
này cho phép ngƣời dùng có mọi quyền tr n CSDL. Ngƣời dùng
s nằm trong nhóm Role này.
 db security dmin: Cho phép ngƣời
dùng quản l mọi Roles và nhóm
ngƣời dùng torng role.
 db_accessadmin: Cung cấp cho ngƣời
dùng quyền th m hoặc xó những
ngƣời dùng khác trong CSDL.
 db ddl dmin: Cho phép ngƣời dùng
thực thi mọi nhiệm vụ tr n mọi đối
tƣợng
 trong CSDL: ngƣời dùng có thể t o,
sử , xó các đối tƣợng.

188
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 db b ckupoper tor: Cho phép ngƣời dùng thực thiện việc s o lƣu
dữ liệu.
 db d t re der: Cho phép ngƣời dùng xem dữ liệu tr n các bảng
của CSDL.
db denyd t writer: Ngăn cản ngƣời dùng sửa bất kỳ dữ liệu nào tr n
bảng.
Hình 6-10: Database
Roles
 db denyd t re der: Ngăn cản ngƣời dùng xem bất kỳ dữ liệu nào
tr n bảng.
Server Roles:
Server roles trong SQL Server đƣợc chi thành các
lo i sau:
 Sys dmin: Có đầy đủ mọi quyền tr n SQL
Server.
 Security dmin: Cho phép t o và quản l
việc đăng nhập cho Server.
 Server dmin: Cho phép thiết lập cấu h nh
củ các inst nce tr n SQL Server.
Hình 6-11: Server
Roles

 Setup dmin: Có khả năng quản l các thủ tục khởi động và các
server li n kết.
 Process dmin: Có khả năng quản l các tiến tr nh đăng ch y tr n
SQL Server.
 Disk dmin: Có thể quản l các file tr n đĩ .
 Dbcre tor: Cho phép t o, sử và xó CSDL.

189
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

6.2.6. Thêm thành viên cho Role

Để th m Role mới, ch ng t có thể thực hiện bằng cử sổ quản l trực


quan (EM) hoặc sử dụng thủ tục sp ddrole, và để th m thành vi n cho Role,
ch ng t sử dụng thủ tục sp_addrolemember.
Ví dụ 6-2: Cách t o Role và th m các thành vi n cho role.
l ‘ ’ G -- l
l ‘ ’ G -- l ent
l ‘ ’ G -- l
StudentTeacher

-- th m tài khoản ngƣời dùng vào role


l ‘ ’ ‘ ¥ ’ G

-- th m tài khoản ngƣời dùng vào role


l ‘ ’ ‘ ¥ ’
G l ‘ ’ ‘ ¥ ’ G

- Cấp quyền truy vấn dữ liệu tr n bảng B ngDiem cho role Student
GRANT SELECT ON BangDiem TO Student GO

- Cấp quyền truy vấn và sử dữ liệu bảng Luong cho role Te cher
GRANT SELECT, UPDATE ON Luong TO Teacher
GO

6.2.7. Đối tƣợng và quyền trên đối tƣợng ( Database Objects and Object
Permission)

6.2.7.1. Đối tượng

Các đối tƣợng trong CSDL: T ble, Column, Row, D t type, Constr int,
Default, Rule, Index, Views, Stored Procedure, Trigger
6.2.7.2. Quyền

Các quyền tr n đối tƣợng (Object Permissions): Điều khiển i có thể truy
cập và thao tác với dữ liệu tr n bảng (t bles) và khung nh n (views) và i có
thể đƣợc ch y các thủ tục lƣu trữ (stored procedures).
Các quyền tr n các phát biểu (Statement Permissions): Điều khiển ngƣời
dùng nào có thể xó và t o đối tƣợng trong CSDL.
190
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Lo i đối tƣợng Hành động


Table SELECT, UPDATE, DELETE, INSERT, REFFERENCE
Column SELECT, UPDATE
View SELECT, UPDATE, INSERT, DELETE
Stored procedure EXECUTE
6.2.8. Cho phép và hủy bỏ quyền trên đối tƣợng

Ngƣời dùng t o r các đối tƣợng trong CSDL đƣợc gọi là object owner
(ngƣời sở hữu đối tƣợng). V thế những ngƣời dùng này phải có quyền để t o
ra những đối tƣợng trong CSDL đó.
SQL Server sử dụng lệnh GRANT, REVOKE và DENY để quản l
quyền:
GRANT: Cho phép ngƣời dùng thực hiện th o tác nhƣ SELECT,
UPDATE, INSERT, DELETE hoặc EXECUTE tr n các đối tƣợng.
6.3. Bài tập chƣơng 6
6.3.1. C u hỏi ôn tập

1. SQL Server có các mức bảo mật nào, ch ng khác nh u nhƣ thế nào?
2. Server Role, Database Role là gì?
3. Hãy n u các bƣớc t o ngƣời dùng.
4. Ngƣời dùng có thể có các quyền g tr n cơ sở dữ liệu.
6.3.2. Bài tập thực hành

T o và phân quyền cho ngƣời dùng. Đăng nhập SQL từ ngƣời dùng vừa
t o.

191
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CHƢƠNG 7: KẾT NỐI VÀO SQL SERVER TỪ CÁC NGÔN NGỮ


LẬP TRÌNH ĐỂ XÂY DỰNG CÁC ỨNG DỤNG LIÊN QUAN ĐẾN
CSDL
Mục ti u chƣơng 7:
Mục ti u cuối cùng của việc học Hệ quản trị CSDL Microsoft SQL
Server là ngƣời học biết cách dùng hệ quản trị này trong việc xây dựng các
CSDL cho các ứng dụng quản l trong thực tế. Đồng thời, biết cách sử dụng
các c ng cụ trong Microsoft SQL Server để quản trị CSDL củ m nh.
Trong chƣơng này hƣớng dẫn cách cấu hình Microsoft SQL Server,
cách kết nối vào SQL Server trong các ngôn ngữ lập trình nhƣ C#.
7.1. Cấu hình Microsoft SQL Server
Nhƣ đã nói trong các chƣơng trƣớc, Microsoft SQL Server sử dụng hai
kiểu chứng thực ngƣời dùng, đó là Windows Authentic tion và SQL Server
Authentication.
Windows Authentic tion: thích hợp trong việc xây dựng các ứng dụng
quản l tr n máy đơn (nghĩ là SQL Server và ứng dụng quản l ch y tr n
cùng một máy). Những ứng dụng này thƣờng có CSDL khá nhỏ và tốc độ
tăng trƣởng củ CSDL kh ng c o.
SQL Server Authentic tion: thích hợp trong việc xây dựng các ứng dụng
quản l có CSDL lớn, nhiều ngƣời dùng cùng l c. Trong các ứng dụng này,
CSDL đƣợc đặt tr n D t b se Server, ứng dụng tr n các máy tr m sẽ thực
hiện các kết nối vào D t b se Server này và thực hiện các th o tác tr n
CSDL. Các kết nối này đƣợc gọi là các kết nối từ x (remote connection).
Tuy nhi n, khi kết nối một máy tính đến một thể hiện (instance) của
Microsoft SQL Server để t o một kết nối từ x , ngƣời dùng có thể nhận một
th ng báo lỗi nhƣ s u: “Microsoft SQL Native Client: An error has occurred
while establishing a connection to the server. When connecting to SQL
Server, this failure may be caused by the fact that under the default settings
SQL Server does not allow remote connections.” Lỗi này xảy r v Microsoft
SQL Server chƣ đƣợc cấu h nh để chấp nhận các kết nối từ x .
Mặc định, phi n bản SQL Server Express Edition và phi n bản SQL
Server Developer Edition kh ng cho phép các kết nối từ x . Để cấu h nh SQL
Server chấp nhận các kết nối từ x cần thực hiện các bƣớc sau:

192
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

 Cho phép tiếp nhận các kết nối từ x tr n thể hiện củ SQL Server
mà các ứng dụng máy tr m cần kết nối.
 Kích ho t dịch vụ SQL Server Browser
 Cấu h nh tƣờng lử cho phép các dữ liệu li n qu n đến SQL
Server và dịch vụ
 SQL Server Browser đƣợc lƣu th ng tr n m ng.
7.1.1. Cho phép tiếp nhận các kết nối từ xa trên SQL Server

Ch ng t kích ho t chức năng quản l cấu h nh của SQL Server là SQL


Server Surface Area Configuration (Click Start -> Programs -> Microsoft
SQL Server 2019 -> Configuration Tools -> SQL Server Surface Area
Configuration).
Trong trang SQL Server 2019 Surf ce Are Configur tion, kích n t
Surface Area Configuration for Services and Connections, trong trang Surface
Area Configuration for Services and Connections, mở n t D t b se Engine,
nhấn n t Remote Connections, nhấn n t Loc l nd remote connections và
chọn gi o thức thích hợp (gi o thức này đƣợc lự chọn dự tr n gi o thức
thực tế đƣợc dùng trong m i trƣờng làm việc), s u đó nhấn n t Apply. Trong
m i trƣờng học tập, ch ng t thƣờng dùng gi o thức TCP/IP. Lƣu : nhấn OK
khi nhận đƣợc th ng báo: “Changes to Connection Settings will not take effect
until you restart the Database Engine service.”.
Trong trang Surface Area Configuration for Services and Connections,
mở n t D t b se Engine, nhấn n t Service và chọn Stop, đợi đến khi dịch vụ
MSSQLSERVER dừng l i, s u đó click St rt để khởi động l i dịch vụ
MSSQLSERVER. Lƣu : nếu ch ng t kh ng cần sử dụng SQL Server
thƣờng xuy n, t có thể để chế độ khởi động củ dịch vụ MSSQLSERVER là
m nu l (nghĩ là khi nào cần dùng th sẽ kích ho t) nhằm giảm bớt thời gi n
khởi động Windows và tiết kiệm tài nguy n hệ thống.
7.1.2. Kích hoạt dịch vụ SQL Server Browser

Nếu ch ng t th o tác tr n SQL Server bằng việc sử dụng t n thể hiện


(inst nce n me) và kh ng ch định một cổng gi o tiếp (port) cụ thể trong
chuỗi kết nối (ch ng t sẽ nói về chuỗi kết nối kỹ hơn trong phần kết nối các
ng n ngữ lập tr nh với SQL Server) th ch ng t phải kích ho t dịch vụ SQL
Server Browser để cho phép các kết nối từ x . Ch ng t ch cần kích ho t dịch
193
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

vụ SQL Server Browser một lần bất kể ch ng t có b o nhi u thể hiện củ


SQL Server đ ng đƣợc sử dụng (running). Để kích ho t dịch vụ SQL Server
Browser, cần làm theo các bƣớc sau: Vào Start -> Program -> Microsoft SQL
Server 2019 -> Configuration Tools, click SQL Server Surface Area
Configuration.
Trong trang SQL Server 2019 Surface Area Configuration, nhấn n t
Surface Area Configuration for Services and Connections, trong trang Surface
Area Configuration for Services and Connections, nhấn n t SQL Server
Browser, s u đó chọn Automatic for Startup type và nhấn n t Apply.
Lƣu : tƣơng tự nhƣ dịch vụ MSSQLSERVER, nếu chọn st rtup type là
Autom tic th dịch vụ SQL Server Browser sẽ đƣợc khởi động khi Windows
khởi động.
Kiểm tr t nh tr ng dịch vụ trong Service st tus. S u đó nhấn n t St rt
nếu dịch vụ này đ ng bị Stop.
7.1.3. Tạo các ngoại lệ trên Windows Firewall

Nếu tƣờng lử đƣợc sử dụng tr n máy tính cài đặt SQL Server , các kết
nối từ b n ngoài sẽ bị chặn trừ khi SQL Server và SQL Serve Browser có thể
li n l c xuy n qu tƣờng lử . Ch ng t phải t o ra các ngo i lệ cho mỗi thể
hiện củ SQL Server (muốn thể hiện nào tiếp nhận kết nối từ x th ch ng t
phải t o ngo i lệ cho thể hiện đó) và một ngo i lệ cho dịch vụ SQL Server
Browser. Việc t o ngo i lệ theo các bƣớc sau: Vào Start -> Programs ->
Microsoft SQL Server 2019 -> Configuration Tools -> SQL Server
Configuration Manager.
Trong trang SQL Server Configuration Manager, nhấn n t SQL Server
Services, nhấn chuột phải l n t n thể hiện, và nhấn n t Properties.
Trong trang SQL Server Browser Properties, chọn th Adv nced, xác
định inst nceID trong d nh sách thuộc tính, và nhấn n t OK.
Lƣu : Ch ng t có thể có nhiều thể hiện SQL Server, do đó ch ng t
phải xác định đ ng inst nceID nào ch ng t muốn t o ngo i lệ.
Để mở Windows Firewall, ch ng t vào St rt -> Run, g “firew ll.cpl”,
và nhấn OK. T o ngo i lệ cho SQL Server 2019 trong Windows Firew ll
ch ng t làm nhƣ s u: Trong Windows Firew ll, chọn th Exceptions, s u đó
nhấn n t Add Progr m. Trong cử sổ Add Progr m window, nhấn n t
194
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Browse và chọn đến tập tin s u: “C:¥Progr m Files¥Microsoft SQL


Server¥MSSQL.1¥MSSQL¥Binn¥sqlservr.exe”, nhấn n t Open, s u đó nhấn
n t OK.
Lƣu : Đƣờng dẫn có thể khác nh u tùy thuộc vào thƣ mục cài đặt của
SQL Server 2019. MSSQL.1 là nơi lƣu trữ cho inst nceID ch ng t thu đƣợc
trong bƣớc tr n.
Lặp l i các bƣớc tr n cho mỗi thể hiện của SQL Server 2019 cần thiết
lập ngo i lệ. Để t o ngo i lệ cho dịch vụ SQL Server Browser trong Windows
Firew ll, ch ng t làm nhƣ s u: Trong cử sổ Windows Firewall, chọn th
Exceptions và nhấn n t Add Progr m. Trong cử sổ Add Progr m, nhấn n t
Browse và chọn tập tin s u: “C:/Progr m Files/Microsoft SQL Server
140/Sh red/sqlbrowser.exe”, nhấn n t Open và s u nhấn n t OK.
Lƣu : Đƣờng dẫn có thể th y đổi tùy thuộc vào thƣ mục cài đặt của
SQL Server.
7.2. Kết nối vào SQL Server trong các ngôn ngữ lập trình
7.2.1. Kết nối vào SQL Server trong các ngôn ngữ lập trình C#

Tùy thuộc vào việc sử dụng .NET Data Provider (tập các đối tƣợng phục
vụ việc tr o đổi dữ liệu) nào trong .NET Framework và việc sử dụng h nh
thức chứng thực đăng nhập (Authentic tion) nào để truy xuất dữ liệu trong
SQL Server, ch ng t sẽ có các cách khác nh u để kết nối đến SQL Server.
Trong phần tr nh bày này sẽ sử dụng thƣ viện System.Data.SqlClient là một
D t Provider phổ biến để kết nối với SQL Server.
Trong C#:
public void ConnectToSql () {
System.Data.SqlClient.SqlConnection ();

// Xây dựng chuỗi kết nối


conn.ConnectionString = "integrated = ;”
+
= L ; +
f =F l ;” +
l l = C L ;
try{
conn.Open();

195
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

// Xây dựng code để tƣơng tác với CSDL ở đây


}
catch (Exception ex) {
x ( L ố CSDL");
}
finally {
conn.Close();
}
}
Trong C#:
= ;
= L ; +
f =F l ; l l = C L ;

Trong đó:
 Intergrated security = true: sử dụng Windows Authentication
 d t source: ch định t n thể hiện củ SQL Server mà ch ng t
muốn kết nối.
 persist security info: Thiết lập mặc định cho từ khó persist
security info là f lse. Thiết lập s ng giá trị true sẽ cho phép các dữ
liệu nh y cảm b o gồm UserID và p ssword có thể đƣợc truy xuất
khi kết nối đƣợc mở.
 initi l c t log: T n CSDL mà ch ng t muốn tƣơng tác.
Ví dụ 7-1: Chuỗi kết nối sử dụng Windows Authentication:
"integrated security=true; data
source=.//SQLExpress" + "persist security
info=False;initial catalog=myDB";

Ví dụ chuỗi kết nối sử dụng SQL Server Authentication:


f =F l ; I = *****;
= ***** + l l = ;
= L ;

196
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

7.2.2. Xây dựng lớp (class) truy cập vào CSDL trong ngôn ngữ C#

Khi xây dựng một ứng dụng có sử dụng CSDL th số lần truy cập vào
CSDL thƣờng rất nhiều, việc truy cập thƣờng xuy n ở nhiều đo n mã khác
nh u làm ch ng t lặp đi lặp l i việc kết nối vào CSDL, điều này làm cho mã
code củ ch ng t phức t p và dài dòng. Chính v vậy, việc xây dựng sẳn một
lớp kết nối để từ đó, khi cần ch ng t có thể gọi thực thi việc truy cập vào
CSDL là hết sức cần thiết, điều này gi p ch ng t kiểm soát mã tốt hơn, làm
giảm c ng sức lập tr nh và mã code củ ch ng t c ng đỡ dài dòng gi p dễ
đọc hơn.
S u đây là mã nguồn minh họa của lớp truy cập CSDL đƣợc viết bằng
ng n ngữ C#:
public class DataServices {
private static SqlConnection myConnection; private
SqlDataAdapter myDataAdapter;
l () H
() H ủ
* ứ ự ố C L,
ề ố ô ,
ợ l ề f l *
public bool OpenDB (string myComputer, string
myDatabase,
string myUser,string myPass){
string strConnection = "Data Source='" + myComputer
+ "';" + "Initial Catalog='" + myDatabase + "'; Persist
Security Info=True; User ID='" + myUser + "';Password='"
+myPass + "'; Connect Timeout =120";
if ((myConnection != null) &&
(myConnection.State == ConnectionState.Open))
return true;
try{
myConnection = new SqlConnection(strConnection);
myConnection.Open();
}
catch (SqlException ex)
{
DisplayError(ex);
myConnection = null;

197
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

return false;
}
return true;
}
ứ đ ố C L l
CloseDB( ) {
if (myConnection != null) {
if (myConnection.State == ConnectionState.Open) {
try {
myConnection.Close();
}
catch (Exception) {} myConnection = null;
}
}
}
ứ l ứ
private void DisplayError(SqlException ex) { string
message;
switch (ex.Number) {
case 17:
= ô đ ; ; 4060:
= C l u ô đ ; ;
18456:
= ô đ ẩ ;
break;
case 547:
= ; ; 2627:
case 2601:
= ; ;
8152:
= li u nh ; ; f l :
message = ex.Message; break;
}
x ( , L : +
ex.Number.ToString());
}

/* Hàm thực thi câu truy vấn, trả kết quả về dƣới d ng một D t T ble
làm nguồn dữ liệu cho các đối tƣợng chứ dữ liệu củ ng n ngữ lập tr nh (C#)
*/
198
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

public DataTable RunQuery(string QueryString,


string TableName)
{
DataSet myDataSet = new DataSet(); myDataAdapter =
new SqlDataAdapter(); try{
myDataAdapter.SelectCommand =
new SqlCommand(QueryString, myConnect);
SqlCommandBuilder myCommandBuilder =
new SqlCommandBuilder(myDataAdapter); if
(TableName.Trim().Length > 0)
myDataAdapter.Fill(myDataSet, TableName); else
myDataAdapter.Fill(myDataSet);
}
catch (SqlException ex) {
DisplayError(ex);
return null;
}
return myDataSet.Tables[TableName];
}

Phƣơng thức cập nhật dữ liệu từ D t T ble vào CSDL


public void Update(DataTable myDataTable){
try { myDataAdapter.Update(myDataTable);
}
catch (SqlException ex) { DisplayError(ex);
}
}

/* Phƣơng thức thực thi các câu lệnh SQL thực hiện việc th m, xó , sử
dữ liệu (câu SQL NonQuery) */
public void ExecuteNonQuery(string cmdText) {
SqlCommand myCommand = new SqlCommand(cmdText,
myConnection);
try {
myCommand.ExecuteNonQuery();
}
catch (SqlException ex) {
DisplayError(ex);
}
}
199
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

7.3. Bài tập chƣơng 7


7.3.1. Câu hỏi ôn tập

1. Khi Microsof SQL Server chƣ cấu h nh để chấp nhận các kết nối từ
x th lỗi nào thƣờng xảy ra?
2. Kích ho t dịch vụ SQL Server Browser để làm gì?
7.3.2. Bài tập thực hành

Sử dụng ngôn ngữ lập trình C# và csdl Quản l sinh vi n đã đề cập


trong các bài thực hành củ các chƣơng trƣớc để thực hiện các bài thực hành
sau:
1. T o Form kết nối

Code
namespace Quanly_diemsv
{
public partial class Form_Ketnoi : Form
{
public Form_Ketnoi()
{
InitializeComponent();
}
lC ;
l lớ ố lC

200
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

private static String ConnectString = "Data


Source=MOBI-E2D6A25F65;Initial Catalog=QLSV;Integrated
Security=True";
C l

private void button1_Click(object sender, EventArgs
e)
{
try
{
ớ đố ợ ố C L
conn = new SqlConnection(ConnectString);

// Mở kết nối MessageBox.Show("Kết nối thành công");


conn.Open();
// Nút button2 sáng lên sáng lên
button2.Enabled = true;
// Nút button3
button3.Enabled =true;
}
catch (Exception ex)
{
x ( ố ấ );
}
}
private void button2_Click(object sender, EventArgs
e)
{
String strStatus = "Closed";

// Định nghĩ biến strStatus kiểu String nhận chuỗi „Closed‟


if (conn.State==ConnectionState.Open)
strStatus="Openned";
MessageBox.Show("Thông tin ố
là" + strStatus + " Tên Server là:
" +
conn.DataSource);
}
private void button3_Click(object sender, EventArgs
e)
201
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

{
conn.Close();
x ( C L L đ );
}
}
}

2. T o Form hiển thị danh sách sinh viên Các lớp sử dụng trong đo n
chƣơng tr nh:
Connection: Lớp kết nối CSDL Sql
Command: Lớp chứa lệnh SQL
DataAdapter: Lớp chứa dữ liệu có kết nối
DataSet: Lớp chứa dữ liệu không kết nối

Application
DataAdapter

Data DataSet
Source Dữ liệu
(CSDL) Dữ liệu

202
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

CODE
SqlConnection conn = new SqlConnection("Data
Source=MOBI-E2D6A25F65;Initial
Catalog=QLSV;Integrated Security=True");
ớ đố ợ ố
public GetAll_sv_lop()
{
InitializeComponent();
}
private void btnGetData_Click(object sender,
EventArgs e)
{
try
{
(); ố lC =
SqlCommand(
"GetALL_Sinhvien",conn);
ớ đố ợ lC đ
ự ụ ụ G ALL C L
Cmd.CommandType = CommandType.StoredProcedure;
x đ C ủ đố ợ
l ủ ụ
SqlDataAdapter da = new SqlDataAdapter(cmd);
lớ l A
l ừ đồ ợ ( đ )
DataSet ds = new DataSet();
// lớ l C L
ô ố ớ L
da.Fill(ds, "SV");
‘ ’ ứ l ủ đố ợ
da vào Dataset ds
dataGridView1.DataSource = ds.Tables["SV"];
Đ l l đố ợ
dataGridView1 trong Form
Cl (); Đ ố
}
catch (Exception ex)
203
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

{
throw new Exception(ex.Message.ToString());
}
}
}

3. T o Form Lọc danh sách sinh viên theo lớp

CODE:
SqlConnection conn = new SqlConnection("Data
Source=MOBI- E2D6A25F65;Initial Catalog=QLSV;Integrated
Security=True");
public GetAll_sv_lop()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs
e)
{
conn);
conn.Open(); try
{
SqlCommand cmd = new SqlCommand("GETALL_SinhVien",
ớ đố ợ

204
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

lC đ ự ủ ụ
usp_GETALL_SinhVien trong csdl
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@maLop",
txtmalop.Text.Trim()));
L x
ề ố ủ đố ợ
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "SV"); dataGridView1.DataSource =
ds.Tables["SV"];
}
conn.Close();
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
conn.Close();
}
}

4. T o Form nhập dữ liệu cho bảng SINHVIEN

CODE:
public partial class Capnhat_sv : Form

205
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

{
SqlConnection conn = new SqlConnection("Data
Source=MOBI-E2D6A25F65;Initial Catalog=QLSV;Integrated
Security=True");
public Capnhat_sv()
{
InitializeComponent();
}
private void txtThem_Click(object sender, EventArgs
e)
{
txtMaSV.Text = " "; txtMaLop.Text = " ";
txtHoTen.Text = " "; txtNgaysinh.Text = " ";
txtGioitinh.Text = " ";
txtMaSV.Focus();
}
private void txtLuu_Click(object sender, EventArgs
e)
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand
("usp_Insert_SinhVien", conn);// ten proc trong
csdl
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter TBao = new SqlParameter();
TBao.ParameterName = "@tbloi"; TBao.SqlDbType =
SqlDbType.NVarChar;
TBao.Direction = ParameterDirection.Output;
cmd.Parameters.Add(TBao);
cmd.Parameters.Add(new SqlParameter("@MaSV",
txtMaSV.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@MaLop",
txtMaLop.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@HoTen",
txtHoTen.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@Ngaysinh",
txtNgaysinh.Text.Trim()));

206
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

cmd.Parameters.Add(new SqlParameter("@Gioitinh",
txtGioitinh.Text.Trim()));
x (); x ( L : " +
TBao.Value); cmd.Dispose();
conn.Close(); RefreshDataGrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void RefreshDataGrid()
{
try
{
conn.Open(); SqlCommand cmd = new
SqlCommand("usp_GetALL_Sinhvien", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet(); da.Fill(ds, "SV");
dataGridView1.DataSource = ds.Tables["SV"];
conn.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
private void Capnhat_sv_Load(object sender,
EventArgs e)
{
RefreshDataGrid();
}}

207
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

PHỤ LỤC
BÀI TẬP THỰC HÀNH
BÀI TOÁN: CƠ SỞ DỮ LIỆU QUẢN LÝ BÁN HÀNG
Dữ liệu vào
- Danh sách các mặt hàng bán l t i các cửa hàng (chẳng h n nhƣ Si u
thị) gồm các th ng tin Mã hàng, T n hàng và đơn giá bán hiện t i.
- Danh sách các khách hàng Thành viên và VIP gồm các thông tin Họ
t n, Địa ch , Số điện tho i.
- Danh sách các mặt hàng của từng hoá đơn.
Dữ liệu ra
- Hoá đơn bán hàng cho mỗi khách hàng và theo dõi quá trình mua hàng
của mỗi khách hàng để có những ƣu đãi thích hợp.
- Theo dõi từng mặt hàng bán theo tháng, qu và năm. Những mặt hàng
mức tiêu thụ cao, tiêu thu thấp để điều ch nh giá phù hợp.
- Tổng hợp doanh thu của từng mặt hàng theo từng tháng, quý và năm.
- Tổng hợp tiền mua của từng khách hàng trong mỗi năm, tích điểm và in
chiết khấu.
1. CƠ SỞ DỮ LIỆU QUAN HỆ

Trong đó:
208
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Bảng SANPHAM lƣu trữ dữ liệu về các mặt hàng hiện có trong công ty.
Bảng NHANVIEN có dữ liệu là các thông tin về nhân viên làm việc
trong công ty
Bảng KHACHHANG đƣợc sử dụng để lƣu trữ các thông tin về khách
hàng của công ty.
Bảng HOADON: Mỗi một hó đơn phải do một nhân viên của công ty
lập
Thông tin chi tiết củ hó đơn (đặt mua mặt hàng gì, số lƣợng, giá cả,…)
đƣợc lƣu trữ trong bảng CTHD.
2. BẢNG DỮ LIỆU CHI TIẾT
Bảng KHACHHANG

Bảng HANGHOA

209
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

Bảng HOADON Bảng CHITIETHD

3. YÊU CẦU THỰC HÀNH


1. T o CSDL trên và tất cả các bảng với kiểu dữ liệu và các ràng buộc
cho từng thuộc tính. ( Ngƣời học tự chọn kiểu dữ liệu và ràng buộc cho phù
hợp với từng thuộc tính theo bảng dữ liệu đã cho).
2. Dùng câu lệnh SQL, nhập dữ liệu đầy đủ với dữ liệu đã cho ở trên vào
tất cả các bảng dữ liệu.
3. Thêm các ràng buộc và thuộc tính theo các yêu cầu sau:
a. Bảng Kh chh ng: trƣờng dientho i, em il kh ng đƣợc trùng dữ liệu
b. Thêm thuộc tính số lƣợng hiện có vào bảng Hàng hóa với ràng buộc
trƣờng soluong >=0.
c. Thêm ràng buộc Check cho thuộc tính đơn giá phải lớn hơn 0 và
không đƣợc để rỗng.
d. Thêm ràng buộc Check vào bảng Chitiethoadon với thuộc tính số
lƣợng bán lớn hơn 0 và số lƣợng bán phải nhỏ hơn số lƣợng hiện có trong bản
Hàng hóa.
DẠNG 1: CÂU LỆNH TRUY VẤN CÓ ĐIỀU KIỆN
1. Cho biết danh sách gồm MaKH, TenKH, NgaySinh, GioiTinh của
khách hàng thành viên.
2. Cho biết danh sách gồm MaKH, TenKH, NgaySinh, GioiTinh của
khách hàng nữ ở Quy Nhơn.

210
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

3. Cho biết danh sách gồm MaKH, TenKH, NgaySinh, GioiTinh của
khách hàng VIP ở Quy Nhơn hoặc Tuy Phƣớc.
4. Cho biết số lƣợng hoá đơn xuất vào tháng 8.
5. Cho biết danh sách các mặt hàng có giá bán từ 20 ngh n đến 50 nghìn.
6.Cho biết MaHD, MaH, SoLuong có số lƣợng bán >10.
7. Cho biết MaHD, MaH, TenH, DonGia, SoLuong, ThanhTien của hoá
đơn 001.
8. Cho biết MaHD, MaH, TenH, DonGia, SoLuong, ThanhTien có
Thành tiền từ 1 triệu đến 2 triệu.
9. Cho biết thông tin khách hàng không mua hàng vào tháng 6.
DẠNG 2: CÂU LỆNH TRUY VẤN CÓ PHÂN NHÓM
1. Cho biết MaKH, TenKH, Tổng Thành tiền của từng khách hàng.
2. Cho biết MaKH, TenKH, Tổng Thành tiền của khách hàng VIP.
3. Cho biết MaKH, TenKH, Tổng Thành tiền của từng khách hàng có
Tổng thành tiền mu đƣợc >=20 triệu.
4. Cho biết MaH, TenH, Tổng số lƣợng của từng mặt hàng.
5. Cho biết MaHD, Tổng thành tiền của những hoá đơn có tổng thành
tiền lớn hơn 5 triệu.
6. Cho biết hoá đơn bán ít nhất hai mặt hàng H001 và H002
7. Cho biết MaKH mua tất các các mặt hàng bánh.
8. Đếm số hoá đơn của mỗi khách hàng.
9. Cho biết Cho biết MaHD, Tổng thành tiền, Khuyến mãi 5% cho
những hoá đơn có tổng thành tiền lớn hơn 500 nghìn.
10. Cho biết thông tin khách hàng VIP có tổng thành tiến trong năm
2018 nhỏ hơn 20 triệu.
11. Cho biết hoá đơn có tổng trị giá lớn nhất gồm các thông tin: Số hoá
đơn, ngày bán, t n khách hàng, địa ch khách hàng, tổng trị giá củ hoá đơn.
12. Cho biết hoá đơn có tổng trị giá lớn nhất trong tháng 5/2000 gồm các
thông tin: Số hoá đơn, ngày, t n khách hàng, địa ch khách hàng, tổng trị giá
của hoá đơn.
13. Cho biết hoá đơn có tổng trị giá nhỏ nhất gồm các thông tin: Số hoá
đơn, ngày, t n khách hàng, địa ch khách hàng, tổng trị giá của hoá đơn.

211
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

14. Cho biết các thông tin của khách hàng có số lƣợng hoá đơn mu
hàng nhiều nhất.
15. Cho biết các thông tin của khách hàng có số lƣợng hàng mua nhiều
nhất.
16. Cho biết các thông tin về các mặt hàng mà đƣợc bán trong nhiều hoá
đơn nhất.
17. Cho biết các thông tin về các mặt hàng mà đƣợc bán nhiều nhất.
18. Cho biết MaHD, NgayLapHD, MaHK, TenH, DonGia, SoLuong,
ThanhTien bán vào tháng 6
19. Cho biết danh sách các mặt hàng đã bán đƣợc.
DẠNG 3: CÂU LỆNH TRUY VẤN VỚI CẤU TRÚC LỒNG NHAU
1. Cho biết M H, TenH chƣ đƣợc bán.
2. Cho biết th ng tin khách hàng chƣ mu hàng vào tháng 5
3. Cho biết thông tin mặt hàng chƣ đƣợc bán vào tháng 2.
4. Cho biết TenKH có mua mặt hàng BÁNH.
DẠNG 4: CÂU LỆNH TRUY VẤN VỚI LƢỢNG TỪ ALL, ANY,
EXISTS
1 .Những mặt hàng nào chƣ từng đƣợc khách hàng mu tính đến thời
điểm này.
2. Tổng số tiền mà khách hàng phải trả cho mỗi hó đơn là b o nhiêu
3. Trong năm 2018 những mặt hàng nào đặt mu đ ng một lần.
4. Tính trị giá của mỗi hóa đơn.
5. Tính doanh số mua hàng của mỗi khách hàng.
6. Thống kê số lƣợng hàng tồn của công ty
7. Tính tổng số tiền lời mà c ng ty thu đƣợc từ mỗi mặt hàng trong năm
2021
8. Đơn đặt hàng nào có số lƣợng hàng đƣợc đặt mua ít nhất
9. Số tiền nhiều nhất mà khách hàng đã từng bỏ r để đặt hàng trong các
đơn đặt hàng là bao nhiêu
10. Mỗi đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền của
đơn đặt hàng

212
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

11. Mỗi một lo i hàng bao gồm những mặt hàng nào, tổng số lƣợng của
mỗi lo i và tổng số lƣợng của tất cả các mặt hàng hiện có trong công ty
DẠNG 5: VIEW
Yêu cầu: Hãy viết View cho các truy vẫn sau:
1. Nhật Bản đã cung cấp những mặt hàng nào
2. Mặt hàng Điện thoại i động do nƣớc nào sản xuất
3. Những khách hàng nào có doanh số mua hàng cao nhất
4. Đơn hàng số 1 do i đặt và do nhân viên nào lập, thời gian và trị giá
bao nhiêu
5. Hãy cho biết tổng số lƣợng mặt hàng do Việt Nam sản xuất
6. Trong đơn hàng số 3 đặt mua những mặt hàng nào và tổng số tiền là
bao nhiêu
7. Hãy cho biết có những khách hàng nào chƣ có số điện tho i
10. Cho biết những mặt hàng có số lƣợng ít hơn 10
DẠNG 6: HÀM
Yêu cầu: Thực hành t o hàm trả về giá trị, hàm trả về biến bảng. Vận
dụng gọi hàm trong thao tác với CSDL.
1. Viết hàm TACHHODEM dùng để tách họ đệm từ chuỗi Họ tên.
Chẳng h n: Nguyễn Thị Thuỳ -> Nguyễn Thị
2. Viết hàm TACHHO dùng để tách họ từ chuỗi Họ tên, Chẳng h n:
Nguyễn Thị Thuỳ -> Nguyễn
3. Viết hàm đọc số có 3 chữ số thành chữ tƣơng ứng
4. Viết hàm đọc số có 12 chữ số thành chữ tƣơng ứng.
5. Viết hàm tính doanh thu cuả năm ch định
6. Viết hàm tính doanh thu cuả tháng ch định
7. Viết hàm tính doanh thu của khách hàng ch định
8. Viết hàm tính tổng số lƣợng bán đƣợc cho từng mặt hàng ch định và
tháng ch định, nếu tháng không nhập vào tức là tính tất cả các tháng.
9. Viết hàm trả về tổng tiền (trị giá) mà khách hàng phải trả trên mỗi hóa
đơn
10. Viết hàm trả về tình tr ng bán của các mặt hàng. Nếu soluong các
mặt hàng (trong bảng CTHD) >100 thì bán ch y, ngƣợc l i là bán chậm.
213
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

11. Viết hàm trả về một bảng gồm các thông tin Mamh, tenhang và
soluong của các mặt hàng hiện có trong công ty.
12. Viết hàm trả về một bảng gồm danh sách khách hàng có doanh số
mua hàng cao nhất tính đến thời điểm này.
13. Viết hàm trả về số lƣợng mặt hàng bán ch y nhất trong tháng 6/2021.
DẠNG 7: THỦ TỤC
Yêu cầu: Thực hành t o thủ tục thƣờng trú
1. Hiển thị d nh các khách hàng đã mu hàng trong ngày ch định (ngày
là tham số truyền vào)
2. Hiển thị danh sách 5 khách hàng có tổng trị giá các đơn hàng lớn nhất.
3. Hiển thị danh sách 10 mặt hàng có số lƣợng bán lớn nhất.
4. Cập nhật cột Khuyến mãi nhƣ s u: Khuyến mãi 5% thành tiền nếu
SoLuong >100, 10% thành tiền nếu SoLuongL >500.
5. Tính trị giá cho mỗi hoá đơn.
6. Cập nhật cho cột Lo i khách hàng: là VIP nếu tổng thành tiền trong
năm lớn hơn hoặc bằng 20 triệu.
7. Viết thủ tục để xem doanh số mua hàng của khách hàng có mã X nào
đó (X là th m số của thủ tục)
8. Viết thủ tục để xem mah và tenhang của các mặt hàng có giá trị lớn
hơn x và số lƣợng hiện có ít hơn y (x,y là th m số)
9. Viết thủ tục để xem những mặt hàng nào đã đƣợc mua với số lƣợng
nhiều nhất
DẠNG 8: TRIGGER
Yêu cầu: Thực hành t o Trigger
1. T o Trigger ràng buộc soluong trong bảng Sanpham >= soluong nhập
vào bảng CTHD (cùng mã hàng)
2. T o Trigger không cho phép nhập vào bảng Sanpham những mặt hàng
có số lƣợng <=10
3. T o trigger khi sửa giá cho một (hoặc nhiều) mah thì in ra:
+ Danh sách các mah vừ đƣợc sửa giá.
+ Danh sách các masp vừ đƣợc sử cùng giá c và giá mới

214
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

4. T o Trigger không cho phép xóa những nhân viên có thâm niên trên
10 năm
5. T o trigger sao cho khi nhập soluong mua hàng ở bảng CTHD thì
Trigia ở bảng Hoadon và doanhso ở bảng Khachhang tự động cập nhật theo.
6. T o Trigger có nhiệm vụ sửa l i giaban trong bảng CTHD sao cho
giaban=1.3*gia (gia trong bảng mathang)
7. T o trigger thực hiện việc kiểm tra rằng buộc khoá ngo i ở bảng
HOADON và CHITIETHD.
8. Không cho phép cascade delete trong các rằng buộc khoá ngo i. Ví dụ
không cho phép xoá các CTHOADON nào có SOHD còn trong bảng
HOADON.
9. Không cho phép nhập vào hai mặt hàng có cùng tên.
10. Khi đặt hàng thì KHUYENMAI là 5% nếu SL >100, 10% nếu SL
>500.
11. Không cho phép xoá một lúc nhiều hơn một mặt hàng.
12. Ch bán mặt hàng BÁNH với số lƣợng là bội số của 10.
DẠNG 9: KẾT NỐI CƠ SỞ DỮ LIỆU TRONG C#
Sử dụng ngôn ngữ lập trình C# và csdl Quản l bán hàng đã đề cập
trong bài thực hành tr n để thực hiện các bài thực hành sau:
1. T o FORM NHẠP THÔNG TIN KHÁCH HÀNG
2. T o FORM tìm kiếm thông tin các mặt hàng.

215
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019

PHẦN KẾT LUẬN – KIẾN NGHỊ


Sản phẩm sẽ là tài liệu cần thiết cho việc giảng d y và học tập chuy n ngành
Đ i học C ng nghệ th ng tin t i trƣờng Đ i học Quảng N m.
Kiến nghị các đơn vị li n qu n t o điều kiện để tác giả thực hiện đề tài thuận lợi.

PHẦN TÀI LIỆU THAM KHẢO


[1] Dƣơng Qu ng Thiện (2010), SQL Server và Lập trình T-SQL, NXB Văn hoá
[2] Huỳnh Tấn Khải (2019), Bài giảng Hệ quản trị CSDL SQL Server, ĐHQN.
[3] Ph m Hữu Khang (2010), Quản trị SQL Server 2005, NXB Thống kê
[4] V Tuyết Trinh, Microsoft SQL Server 2008, ĐH Bách Kho Hà Nội
[5]Trần Thiên Thành, Giáo trình Hệ quản trị CSDL SQL Sereve, 2019, ĐH Quy
Nhơn
- Khác: các tài liệu trên m ng

216

You might also like