Professional Documents
Culture Documents
Giao Trinh HQTCDL in
Giao Trinh HQTCDL in
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
3
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
7
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.
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
Trong mô hình client/server, ứng dụng tr o đổi với SQL Server theo sơ
đồ sau:
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:
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
14
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
16
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
17
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
20
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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
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.
25
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
26
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
- Sau khi cấu hình xong, restart l i service của SQL Server.
27
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
30
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
31
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
32
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
33
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
34
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
35
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
Để 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-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.
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.
39
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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-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:
Để 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
44
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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:
45
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
46
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
47
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
Tên tập tin và đƣờng dẫn của transaction log E:\HoTenSV\ QLNV _Log.ldf
49
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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)
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
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:
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
55
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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ả:
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ả:
59
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
select getdate()
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.
Qu qq, q
60
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
Tháng mm, m
Ngày dd, d
Tuần wk, ww
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ả:
CAST ( ứ A l u
[đ l u])
C ( l [đ , ứ [
, đ )
62
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
3 =, >, <, >=, <=, <>, =, >, < (Các phép toán so sánh)
7 = (Phép gán)
63
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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
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
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))
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
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)
)
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
)
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()
)
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
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ụ 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)
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
75
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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 ‘% ỳ%’
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)
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 >
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
l ( ) ’ ổ ố l ợ ’
From sinhvien, DMLop, DMNganh
Where sinhvien.malop = Dmlop.malop and
l = = ‘C ’
83
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
GI I I H = 1 A l
from KhachHang
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
84
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
Toán tử nghĩ
= Bằng
<> Khác
85
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
Mệnh đề nghĩ
86
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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)
K tự
đ i diện nghĩ
_ Một k tự bất k
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
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
89
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
COUNT([ALL|DISTINCT]
biểu thức) Đếm số các giá trị trong biểu thức.
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
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
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
subtoltal
toltal
91
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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]]
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í 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
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.
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
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 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.
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.
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
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
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)
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
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
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.
104
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
- Bảng DMNganh
- Bảng DMLOP
- DMHOCPHAN
- SINHVIEN
105
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
- DIEMHP
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
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
107
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
109
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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)
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
b.
SELECT MaSV, HoTen
FROM SINHVIEN
WHERE NOT EXISTS(SELECT * FROM DIEMHP
WHERE SINHVIEN.MaSV=DIEMHP.MaSV)
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')
113
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
114
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
4.1.2.1. Tạo khung nhìn bằng công cụ có sẳn của SQL Server 2019
Trong đó:
116
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
117
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
- Đặ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
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
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
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
4.2.5.1. Cú pháp
124
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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
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:
129
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
130
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
134
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
Cú pháp:
DROP TRIGGER <tên_triger>
135
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
137
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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:
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
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
149
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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:
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
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
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
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
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
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
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
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
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
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.
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
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
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)
5.2.3.3. Hàm bao gồm nhiều câu lệnh bên trong – Multi statement UDF
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
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('')
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
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
161
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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
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
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)
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
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
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
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
+ 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
170
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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ả:
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
use QLKhachHang go
alter table tblKhachHang add SoTheMahoa
varbinary(MAX) go alter table tblKhachHang add CMNDMahoa
varbinary(MAX) 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ả:
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
Đ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 = +
+ ;
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
183
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
184
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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:
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 đó.
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
- 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)
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
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
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
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
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 ();
195
Ths. NGUYỄN THỊ MINH CHÂU GIÁO TRÌNH SQL SERVER2019
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";
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
/* 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
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
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
{
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());
}
}
}
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();
}
}
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
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
216