HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

advertisement
TRƢỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
BÀI GIẢNG
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
TÊN HỌC PHẦN
MÃ HỌC PHẦN
TRÌNH ĐỘ ĐÀO TẠO
DÙNG CHO SV NGÀNH
: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
: 17402
: ĐẠI HỌC CHÍNH QUY
: CÔNG NGHỆ THÔNG TIN
HẢI PHÒNG - 2011
2
MỤC LỤC
Chƣơng 1. Giới thiệu
5
1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server
5
1.2. Các thành phần cơ bản trong Microsoft SQL Server
18
1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL)
24
Chƣơng 2. Tạo và quản lý cơ sở dữ liệu
26
2.1. Các tệp tin cơ sở dữ liệu (Database files)
26
2.2. Tạo cơ sở dữ liệu (Database)
26
2.3. Quản lý cơ sở dữ liệu
30
2.4. Xóa cơ sở dữ liệu
32
Chƣơng 3. Tạo và quản lý các bảng
35
3.1. Tạo bảng (Tables)
35
3.2. Định nghĩa các cột (Columns)
36
3.3. Định nghĩa các ràng buộc (Constrains)
37
3.4. Sửa bảng (ALTER TABLE)
38
3.5. Xóa bảng (DROP TABLE)
39
3.6. Thêm bản ghi mới (INSERT)
39
3.7. Cập nhật bản ghi (UPDATE)
41
3.8. Xóa bản ghi (DELETE)
42
Chƣơng 4. Truy vấn dữ liệu
44
4.1. Truy vấn cơ bản
44
4.2. Truy vấn từ nhiều bảng
51
4.2.1. Inner Joins
51
4.2.2. Outer Joins
51
4.3. Truy vấn lồng nhau (Subqueries)
51
Chƣơng 5. Tạo và quản lý các chỉ mục
54
5.1. Các kiểu chỉ mục (Indexes)
54
5.2. Tạo các chỉ mục
54
5.3. Quản lý các chỉ mục
58
5.4. Xóa các chỉ mục
58
Chƣơng 6. Tạo và quản lý khung nhìn
60
6.1. Định nghĩa
60
6.2. Tạo các khung nhìn (Views)
60
6.3. Quản lý các khung nhìn
61
3
6.4. Xóa các khung nhìn
61
Chƣơng 7. Tạo và quản lý các thủ tục thƣờng trú
62
7.1. Tạo các thủ tục thường trú (Stored procedures)
62
7.2. Thực thi các thủ tục thường trú
64
7.3. Xem và sửa các thủ tục thường trú
64
7.4. Tham số vào và ra (Parameters)
65
7.5. Các thủ tục thường trú của hệ thống
65
Chƣơng 8. Tạo và quản lý hàm ngƣời dùng định nghĩa
68
8.1. Các kiểu hàm người dùng định nghĩa (User-defined functions)
68
8.2. Tạo hàm người dùng định nghĩa
68
8.3. Quản lý hàm người dùng định nghĩa
69
Chƣơng 9. Tạo và quản lý các Trigger
70
9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers)
70
9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers)
70
9.3. Sử dụng các Trigger lồng nhau (Nested Triggers)
71
9.4. Sử dụng các Trigger đệ quy (Recursive Triggers)
74
Một số đề thi mẫu
76
4
Tên học phần: Hệ quản trị Cơ sở dữ liệu
Loại học phần: 4
Bộ môn phụ trách giảng dạy: Hệ thống Thông tin
Khoa phụ trách: CNTT.
Mã học phần: 17402
Tổng số TC: 4
Tổng số tiết
Lý thuyết
Thực hành/ Xemina
Tự học
Bài tập lớn
Đồ án môn học
90
45
30
0
có
không
Học phần học trƣớc: Không yêu cầu.
Học phần tiên quyết: Không yêu cầu.
Học phần song song: Không yêu cầu.
Mục tiêu của học phần:
Cung cấp cho sinh viên những kiến thức cơ bản về hệ quản trị cơ sở dữ liệu; Các chức năng
và công cụ cần thiết để quản trị cơ sở dữ liệu cho người phát triển hệ thống.
Nội dung chủ yếu:
Giới thiệu về hệ quản trị cơ sở dữ liệu; Tạo và quản lý cơ sở dữ liệu; Tạo và quản lý các
bảng; Truy vấn dữ liệu; Tạo và quản lý các chỉ mục; Tạo và quản lý các khung nhìn; Tạo và quản lý
các thủ tục thường trú; Tạo và quản lý các hàm người dùng định nghĩa; Tạo và quản lý các Trigger.
Nội dung chi tiết:
PHÂN PHỐI SỐ TIẾT
TÊN CHƢƠNG MỤC
Chƣơng 1. Giới thiệu
TS
LT
BT
TH
5
3
2
10
6
4
15
9
6
1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server (2005)
1.2. Các thành phần cơ bản trong Microsoft SQL Server (2005)
1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL)
Chƣơng 2. Tạo và quản lý cơ sở dữ liệu
2.1. Các tệp tin cơ sở dữ liệu (Database files)
2.2. Tạo cơ sở dữ liệu (Database)
2.3. Quản lý cơ sở dữ liệu
2.4. Xóa cơ sở dữ liệu
Chƣơng 3. Tạo và quản lý các bảng
3.1. Tạo bảng (Tables)
3.2. Định nghĩa các cột (Columns)
3.3. Định nghĩa các ràng buộc (Constrains)
3.4. Sửa bảng (ALTER TABLE)
3.5. Xóa bảng (DROP TABLE)
3.6. Thêm bản ghi mới (INSERT)
KT
5
PHÂN PHỐI SỐ TIẾT
TÊN CHƢƠNG MỤC
TS
LT
BT
TH
3.7. Cập nhật bản ghi (UPDATE)
3.8. Xóa bản ghi (DELETE)
Chƣơng 4. Truy vấn dữ liệu
20
12
8
5
3
2
5
3
2
5
3
2
5
3
2
4.1. Truy vấn cơ bản
4.1.1. Mệnh đề SELECT
4.1.2. Mệnh đề FROM
4.1.3. Mệnh đề WHERE
4.1.4. Mệnh đề GROUP BY và HAVING
4.1.5. Mệnh đề ORDER BY
4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhau
4.2. Truy vấn từ nhiều bảng
4.2.1. Inner Joins
4.2.2. Outer Joins
4.3. Truy vấn lồng nhau (Subqueries)
Chƣơng 5. Tạo và quản lý các chỉ mục
5.1. Các kiểu chỉ mục (Indexes)
5.2. Tạo các chỉ mục
5.3. Quản lý các chỉ mục
5.4. Xóa các chỉ mục
Chƣơng 6. Tạo và quản lý khung nhìn
6.1. Định nghĩa
6.2. Tạo các khung nhìn (Views)
6.3. Quản lý các khung nhìn
6.4. Xóa các khung nhìn
Chƣơng 7. Tạo và quản lý các thủ tục thƣờng trú
7.1. Tạo các thủ tục thường trú (Stored procedures)
7.2. Thực thi các thủ tục thường trú
7.3. Xem và sửa các thủ tục thường trú
7.4. Tham số vào và ra (Parameters)
7.5. Các thủ tục thường trú của hệ thống
Chƣơng 8. Tạo và quản lý hàm ngƣời dùng định nghĩa
8.1. Các kiểu hàm người dùng định nghĩa (User-defined
functions)
KT
6
PHÂN PHỐI SỐ TIẾT
TÊN CHƢƠNG MỤC
TS
LT
BT
TH
KT
8.2. Tạo hàm người dùng định nghĩa
8.3. Quản lý hàm người dùng định nghĩa
Chƣơng 9. Tạo và quản lý các Trigger
5
3
2
9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers)
9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers)
9.3. Sử dụng các Trigger lồng nhau (Nested Triggers)
9.4. Sử dụng các Trigger đệ quy (Recursive Triggers)
Nhiệm vụ của sinh viên:
Tham dự các buổi học lý thuyết và thực hành, làm các bài tập được giao, làm các bài thi
giữa học phần và bài thi kết thúc học phần theo đúng quy định.
Tài liệu học tập:
1. Dương Quang Thiện, SQL Server 2000: Lập trình T - SQL, NXB Văn hóa Sài Gòn, 2007.
2. Ray Rankins, Paul Bertucci, Chris Gallelli, Alex T.Silverstein, Microsoft SQL Server 2005
Unleashed, Sams Publishing, 2007.
3. Brian Knightet al, Professional SQL Server 2005 Administration, Wrox Press, 2007.
4. Paul Turley & Dan Wood, Beginning Transact-SQL with SQL Server 2000 and 2005, Wrox
Press, 2006.
Hình thức và tiêu chuẩn đánh giá sinh viên:
 Hình thức thi: thi viết hoặc vấn đáp.
 Tiêu chuẩn đánh giá sinh viên: căn cứ vào sự tham gia học tập của sinh viên trong các buổi
học lý thuyết và thực hành, kết quả làm các bài tập được giao, kết quả của các bài thi giữa
học phần và bài thi kết thúc học phần.
Thang điểm: Thang điểm chữ A, B, C, D, F.
Điểm đánh giá học phần: Z = 0,4X + 0,6Y.
Bài giảng này là tài liệu chính thức và thống nhất của Bộ môn Hệ thống Thông tin,
Khoa Công nghệ Thông tin và được dùng để giảng dạy cho sinh viên.
Ngày phê duyệt:
Trƣởng Bộ môn
/
/
7
Chƣơng 1. Giới thiệu
1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server
1.1.1.Khái niệm về CSDL và CSDL quan hệ
A. Khái niệm về cơ sở dữ liệu (Database)
Cơ sở dữ liệu là một tập hợp có tổ chức các dữ liệu có liên quan luận lý với nhau. Nói cách khác
đó là một hệ thống các thông tin có cấu trúc được lưu trữ trên các thiết bị lưu trữ thông tin thứ cấp,
ví dụ như: đĩa từ, băng từ, bộ nhớ flash,… nhằm mục đích thỏa mãn yêu cầu tổ chức dữ liệu để
giúp cho việc khai thác dữ liệu được nhanh chóng và chính xác. Cơ sở dữ liệu phải được thiết kế
sao cho có thể cho phép nhiều người dùng và nhiều ứng dụng khác nhau cùng khai thác.
Hình 1: Sơ đồ tổng quát về một hệ cơ sở dữ liệu
B. Khái niệm về cơ sở dữ liệu quan hệ
Cơ sở dữ liệu quan hệ là cơ sở dữ liệu được tổ chức dựa trên mô hình của đại số quan hệ
(Relational Model). Trong đó, dữ liệu được tổ chức thành các bảng dữ liệu (tables). Mỗi bảng dữ
liệu gồm có các cột (column) hay còn gọi là các trường (field) và các dòng (row) hay còn gọi là các
bản ghi (record). Ví dụ:
Mã Sinh viên
Tên Sinh viên
Lớp
HHA01
Lê Hoàng Long
KTB48ĐH1
HHA02
Trần Bình Minh
KTB48ĐH1
8
Về phương diện toán học, một bảng dữ liệu gồm có n cột: A1, A2, A3…, An có thể coi là một
tập con R của tích Đề các dom(A1) x dom(A2)…x dom(An):
R

dom(A1) x dom(A2)…x dom(An)
Người ta gọi đó là quan hệ R xác định trên tập thuộc tính {A1, A2,…, An}. Trong đó dom(Ai) là ký
hiệu miền giá trị (domain) của cột Ai.
Giữa các cột trong bảng có những mối quan hệ ràng buộc phụ thuộc lẫn nhau gọi là các phụ
thuộc hàm. Ví dụ: Trong bảng sinh viên có phụ thuộc hàm:
Mã Sinh Viên → Tên Sinh Viên, Lớp
Trong một bảng dữ liệu, có thể có một cột (hoặc một số tối thiểu các cột) mà giá trị trên mỗi
dòng của nó là duy nhất. Ta gọi đó là khóa (Key). Khi biết giá trị của trường khóa ta có thể suy ra
các trường còn lại. Ví dụ: Trong bảng Sinh Viên thì Mã Sinh Viên là khóa. Khi biết Mã Sinh Viên ta
có thể tra cứu ra các thuộc tính như Tên Sinh Viên và Lớp.
Giữa hai bảng trong cơ sở dữ liệu cũng tồn tại các mối quan hệ ràng buộc lẫn nhau (bắt nguồn
từ mô hình ER):
Quan hệ 1 – 1: Một bản ghi thuộc bảng này tương ứng với một và chỉ một bản ghi ở bảng kia và
ngược lại. Trong trường hợp này người ta thường nhập 2 bảng vào làm một.
Quan hệ 1 – n: Một bản ghi thuộc bảng này tương ứng với n bản ghi ở bảng kia (n ≥ 0) nhưng
ngược lại một bản ghi ở bảng kia chỉ tương ứng với không quá 1 bản ghi ở bảng này. Bảng ở phía
ứng với ứng số nhiều n gọi là bảng con (child) còn bảng ở phía ứng với ứng số 1 gọi là bảng cha
(parents). Bảng cha phải có một trường khóa gọi là khóa chính (PK - Primary Key) còn bảng con
phải có một trường tham chiếu đến khóa chính của bảng cha gọi là khóa ngoại (FK - Foreign Key).
Hình 2: Quan hệ 1- 1
9
Hình 3: Quan hệ 1 - n
Quan hệ n – n: Quan hệ n – n không được biểu diễn tường minh trong CSDL. Người ta thường
tách quan hệ n – n về thành các quan hệ 1 – n dựa trên mô hình thực thể liên kết (ER).
1.1.2. Khái niệm về hệ quản trị Cơ sở dữ liệu
A. Hệ quản trị CSDL là gì?
Hệ quản trị cơ sở dữ liệu là một tập hợp chương trình giúp cho người sử dụng tạo ra, duy trì và
khai thác một cơ sở dữ liệu. Đó là một hệ thống phần mềm phổ dụng, cung cấp môi trƣờng và
công cụ giúp cho việc định nghĩa, xây dựng và thao tác cơ sở dữ liệu cho các ứng dụng khác nhau
một cách dễ dàng.
Định nghĩa một cơ sở dữ liệu là đặc tả các kiểu dữ liệu, các cấu trúc, các ràng buộc cho các dữ
liệu sẽ được lưu trữ.
Xây dựng cơ sở dữ liệu là lưu trữ dữ liệu lên các phương tiện lưu trữ được hệ quản trị cơ sở dữ
liệu kiểm soát.
Thao tác trên một cơ sở dữ liêu là quá trình truy vấn cơ sở dữ liệu để lấy ra các dữ liệu cụ thể,
cập nhật cơ sở dữ liệu, tạo ra các báo cáo từ dữ liệu.
10
Hình 4: Mô hình Hệ quản trị cơ sở dữ liệu
Mỗi hệ quản trị cơ sở dữ liệu có một ngôn ngữ định nghĩa dữ liệu riêng (DDL - Data
Definition Languague). Đây là ngôn ngữ dùng để định nghĩa, khai báo cấu trúc của của cơ sở dữ
liêu. Những người thiết kế và quản trị cơ sở dữ liệu thực hiện các công việc khai báo cấu trúc cơ sở
dữ liệu. Các chương trình khai báo cấu trúc CSDL được viết bằng ngôn ngữ DDL mà hệ quản trị
CSDL cho phép.
Các chương trình ứng dụng được viết bằng các ngôn ngữ lập trình C++/C#/Java/Delphi… kết
hợp với các ngôn ngữ thao tác dữ liệu (DML - Data Manipulation Language) thông qua các thư
viện hoặc đối tượng kết nối CSDL được ngôn ngữ lập trình hỗ trợ: ODBC, RDO, ADO,…
Các hệ quản trị cơ sở dữ liệu quan hệ ngày nay phổ biến sử dụng các ngôn ngữ DDL và DML
dựa trên ngôn ngữ SQL.
Đối với hệ quản trị cơ sở dữ liệu SQL Server thì ngôn ngữ dùng để tương tác với cơ sở dữ liệu
là T – SQL. Đây là một phiên bản của ngôn ngữ SQL. Ngôn ngữ T – SQL trên SQL Server bao gồm
nhiều câu lệnh khác nhau, có thể chia thành 2 nhóm:
o Nhóm ngôn ngữ định nghĩa dữ liệu DDL: với các lệnh cho phép tạo, thay đổi cấu trúc và xóa
các đối tượng CSDL: database, table, view,…
o Nhóm
ngôn
ngữ
thao
tác
dữ
liệu
DML:
với
các
lệnh
như
SELECT/INSERT/UPDATE/DELETE cho phép lấy về dữ liệu cụ thể, thay đổi giá trị của dữ
liệu.
11
Hình 5: Tương tác với hệ quản trị Cơ sở dữ liệu
B. Hoạt động của hệ quản trị cơ sở dữ liệu
Hình 6: Hoạt động của hệ quản trị cơ sở dữ liệu
Các yêu cầu của chương trình ứng dụng được chuyển tới hệ quản trị CSDL (theo con đường số 1).
Tại đây hệ quản trị CSDL sẽ tham khảo các từ điển dữ liệu (Meta DataBase) để tìm kiếm các ánh
xạ cấu trúc ngoài với cấu trúc quan niệm và cấu trúc vật lý (các ngõ a, b và c). Tại đây hệ quản trị
12
CSDL có thể sẽ tham khảo tới vùng đệm của nó để xác định xem câu trả lời đã có sẵn ở đó chưa,
nếu có thì trả lại cho chương trình ứng dụng thông qua con đường số 8b; ngược lại sẽ yêu cầu hệ
điều hành truy xuất thông tin theo con đường số 2. Tới đây hệ điều hành sẽ gửi yêu cầu truy xuất
thông tin trong CSDL thông qua hệ thống xuất nhập của HĐH (các con đường số 3 và 5). Nếu việc
truy xuất không thành công nó sẽ trả lại yêu cầu về cho hệ quản trị CSDL (có thể thông qua các mã
lỗi) qua con đường số 6; nếu thành công thì dữ liệu sẽ được chuyển vào vùng đệm của hệ quản trị
CSDL. Qua xử lý, hệ quản trị CSDL sẽ chuyển dữ liệu vào vùng đệm của chương trình ứng dụng đề
nó xử lý (qua con đường 8a) và cho ra kết quả trả lời của chương trình ứng dụng qua con đường số
10.
1.1.3. Giới thiệu về SQL Server và mô hình Client/Server
1.1.3.1. Khái niệm về mô hình Client/Server
Hình 7: Mô hình Client/Server
Mô hình client/server hay còn gọi là mô hình khách/chủ là một mô hình nổi tiếng trong mạng máy
tính, được áp dụng rất rộng rãi. Ý tưởng của mô hình này là máy trạm (hay còn gọi là máy khách)
gửi yêu cầu (request) cho máy chủ (đóng vai trò người cung ứng dịch vụ), máy chủ sẽ xử lý và trả
kết quả về cho máy khách.
Client/Server là mô hình mang tính tổng quát. Trên thực tế thì một server có thể được nối tới nhiều
server khác nhằm làm việc hiệu quả và nhanh hơn. Khi nhận được 1 yêu cầu từ client, server này có
thể gửi tiếp yêu cầu vừa nhận được cho server khác ví dụ như database server vì bản thân nó không
thể xử lý yêu cầu này được. Máy server có thể thi hành các nhiệm vụ đơn giản hoặc phức tạp. Ví
dụ như một máy chủ trả lời thời gian hiện tại trong ngày, khi một máy client yêu cầu lấy
thông tin về thời gian nó sẽ phải gửi một yêu cầu theo một tiêu chuẩn do server định
13
ra, nếu yêu cầu được chấp nhận thì máy server sẽ trả về thông tin mà client yêu cầu. Có rất nhiều
các dịch vụ server trên mạng nhưng nó đều hoạt động theo nguyên lý là nhận các yêu cầu từ client
sau đó xử lý và trả kết quả cho client yêu cầu. Thông thường chương trình server và client được thi
hành trên hai máy khác nhau. Cho dù lúc nào server cũng ở trạng thái sẵn sàng chờ nhận yêu cầu từ
client nhưng trên thực tế một tiến trình liên tác qua lại (interaction) giữa client và server lại bắt đầu
ở phía client, khi mà client gửi tín hiệu yêu cầu tới server. Các chương trình server thường đều thi
hành ở mức ứng dụng (tầng ứng dụng của mạng). Sự thuận lợi của phương pháp này là nó có thể
làm việc trên bất cứ một mạng máy tính nào có hỗ trợ giao thức truyền thông chuẩn cụ thể ở đây là
giao thức TCP/IP. Với các giao thức chuẩn này cũng giúp cho các nhà sản xuất có thể tích hợp
nhiều sản phẩm khác nhau của họ lên mạng mà không gặp phải khó khăn gì. Với các chuẩn này thì
các chương trình server cho một dịch vụ nào đấy có thể thi hành trên một hệ thống chia sẻ thời gian
(timesharing system) với nhiều chương trình và dịch vụ khác hoặc nó có thể chạy trên chính một
máy tính các nhân bình thường. Có thể có nhiều chương trình server cùng làm một dịch vụ, chúng
có thể nằm trên nhiều máy tính hoặc một máy tính. Với mô hình trên chúng ta nhận thấy rằng mô
hình client/server chỉ mang đặc điểm của phần mềm không liên quan gì đến phần cứng mặc dù trên
thực tế yêu cầu cho một máy server là cao hơn nhiều so với máy client. Lý do là bởi vì máy server
phải quản lý rất nhiều các yêu cầu từ các clients khác nhau trên mạng. Ưu và nhược điểm chính Có
thể nói rằng với mô hình client/server thì mọi thứ dường như đều nằm trên bàn của người sử dụng,
nó có thể truy cập dữ liệu từ xa (bao gồm các công việc như gửi và nhận file, tìm kiếm thông tin, ...)
với nhiều dịch vụ đa dạng mà mô hình cũ không thể làm được. Mô hình client/server cung cấp một
nền tảng lý tưởng cho phép tích hợp các kỹ thuật hiện đại như mô hình thiết kế hướng đối tượng, hệ
chuyên gia, hệ thông tin địa lý (GIS) ... Một trong những vấn đề nảy sinh trong mô hình này đó là
tính an toàn và bảo mật thông tin trên mạng. Do phải trao đổi dữ liệu giữa 2 máy ở 2 khu vực khác
nhau cho nên dễ dàng xảy ra hiện tượng thông tin truyền trên mạng bị lộ.
1.1.3.2. SQL Server và mô hình Client/Server
14
Hình 8a: SQL Server và mô hình Client/Server
Hình 8b: Dùng các công cụ của SQL Server để truy xuất từ máy khách
SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ hoạt động trên môi trường mạng theo mô hình
khách/chủ. Phía máy chủ chạy các dịch vụ cần thiết mà quan trọng nhất là dịch vụ cơ sở dữ liệu
SQL Server Service. Máy chủ lắng nghe các yêu cầu kết nối đến từ các máy khách và đáp ứng các
yêu cầu này. Các ứng dụng phía máy khách kết nối vào các dịch vụ cơ sở dữ liệu có thể là những
phần mềm quản lý được viết bởi các ngôn ngữ lập trình có sử dụng các thư viện đối tượng truy xuất
CSDL như ADO, ADO.Net, RDO, ODBC, JDBC,... hoặc có thể là chính các công cụ của SQL
Server như: Service Manager, Enterprise Manager hay Query Analyzer.
Trong môi trường SQL Server, các yêu cầu từ phía máy khách sẽ nằm dưới dạng các lệnh T-SQL.
SQL Server sẽ xử lý các lệnh này rồi trả về một resultset cho ứng dụng client với những thông tin
được yêu cầu hoặc chỉ xác nhận là công việc được hoàn thành mỹ mãn. Nhiều ứng dụng client hoặc
người sử dụng có thể song hành đưa ra cùng lúc những yêu cầu và SQL Server có thể xử lý chúng
song song. Một ứng dụng client có thể cung cấp một "cấp độ thoải mái" khác nhau cho người sử
dụng. Các công cụ đơn giản nhất (nhưng không dễ dùng) cho phép người sử dụng đưa vào một yêu
cầu dưới dạng lệnh T-SQL rồi nhận được những resultset dưới dạng văn bản hoặc table. Còn các
công cụ tinh vi hơn sẽ cho ra những biểu mẫu, báo cáo, biểu đồ,... cũng như các đối tượng màn hình
thân thiện hơn.
Cũng như đã trình bày ở trên, để thiết lập kết nối vật lý với một server CSDL và chuyển những yêu
cầu cũng như nhận về kết quả (resultset), các ứng dụng phía client có thể sử dụng nhiều đối tượng
hoặc các thư viện truy xuất cơ sở dữ liệu khác nhau.(data access objects hoặc data access API).
Những đối tượng truy xuất cơ sở dữ liệu thông dụng hiện nay bao gồm:
o ADO (ActiveX Database Object)
o RDO (Remote Database Object)
o DB - Library
o ODBC (Open Database Connectivity)
15
o OLE DB (Object Linking and Embbeding Database)
o DAO (Data Access Object)
Các nhà phát triển ứng dụng dùng các đối tượng kể trên hoặc các hàm API để truy cập các đối
tượng cơ sở dữ liệu và dữ liệu được lưu trữ trong các đối tượng này để triển khai những ứng dụng
trong các ngôn ngữ lập trình chẳng hạn VB, C/C++, Java, VB.Net, C#,...
1.1.3.4. Mô hình Client/Server cục bộ
Nếu trình ứng dụng truy xuất CSDL và hệ quản trị CSDL SQL Server được cài đặt trên cùng một
máy tính vật lý thì ta có mô hình Client/Server cục bộ. Lúc này, vai trò của SQL Server không khác
với các hệ quản trị CSDL truyền thống như Foxpro hay MS Access. SQL Server che dấu sự khác
biệt giữa kết nối cục bộ và kết nối qua mạng. Người dùng không nhận thấy sự khác biệt ngoài việc
tốc độ truyền thông trên mạng chậm hơn tốc độ truyền thông cục bộ.
Hình 9: Mô hình Client/Server cục bộ
1.1.3.5. SQL Server và mô hình cơ sở dữ liệu phân tán
Cơ sở dữ liệu phân tán là tập hợp các dữ liệu thuộc về cùng một hệ thống, có liên quan logic với
nhau và được trải ra trên hệ thống mạng. Hệ quản trị cơ sở dữ liệu phân tán là tập các phần mềm
quản trị một cơ sở dữ liệu phân tán, làm cho việc phân tán trở nên trong suốt với người dùng. Khái
niệm trong suốt ở đây được hiểu là chủ đích che dấu sự phân tán đối với người sử dụng, làm cho
người sử dụng sử dụng cơ sở dữ liệu phân tán như là cơ sở dữ liệu tập trung.
SQL Server là hệ quản trị cơ sở dữ liệu hỗ trợ cơ sở dữ liệu phân tán. Nó cho phép tạo ra các view
từ các bảng dữ liệu trên các Server khác nhau được kết nối (linked server), thực thi các truy vấn hay
chuyển tác phân tán trải dài trên nhiều Server,...
16
Hình 10: Mô hình cơ sở dữ liệu phân tán
1.1.3.6. Kiến trúc đa tầng
Hình 11: Mô hình phân lớp hệ thống
SQL Server là hệ quản trị cơ sở dữ liệu hoạt động trên môi trường mạng theo mô hình client/server,
cho nên khi nên khi phát triển các ứng dụng cơ sở dữ liệu người ta có thể sử dụng các kiến trúc
phân lớp (phân chia hệ thống thành các components hay layer), các lớp có thể được thực thi một
phần ở server, một phần ở client (kiến trúc nhị tầng) và có thể trên một số trạm trung gian nữa nếu
cần thiết (kiến trúc tam tầng).
A. Kiến trúc nhị tầng Fat Client
Đây là kiểu kiến trúc client/server phổ biến. Phía client của một hệ thống như thế sẽ bao gồm các
lớp:
17
o User interface: lớp giao diện người sử dụng.
o Presentation service: lớp dịch vụ trình bày.
o Business services: lớp thi công các quy tắc nghiệp vụ của hệ thống.
o Data services: lớp truy cập và xử lý dữ liệu.
Hình 12: Kiến trúc nhị tầng Fat Client
Trong khi đó, Data Storage (lớp lưu trữ và quản lý dữ liệu), thường là hệ thống cơ sở dữ liệu
(database system), sẽ được đặt tại server. Vì Business services và Data services được thực thi hoàn
toàn ở phía client, còn phía server chỉ thực thi các chức năng lưu trữ và quản trị dữ liệu nên sức
nặng của hệ thống dồn về phía client. Người ta gọi kiến trúc phân tâng như vậy là Fat Client (Client
"béo": chức năng xử lý dồn về phía client) (xem hình 12).
B. Kiến trúc nhị tầng Fat Server
Ngoài kiểu thực thi hệ thống như trên, người ta có thể cho thực thi toàn bộ Data Services và một
phần Business services ở phía server, ví dụ dưới dạng các thủ tục thường trú (stored procedure).
Loại kiến trúc như thế thường được gọi là Fat Server. Kiến trúc này giúp san sẻ một phần sức nặng
xử lý từ client lên server để giảm tải cho client, tận dụng hiệu năng xử lý phía server.
18
Hình 13: Kiến trúc nhị tầng Fat Server
C. Kiến trúc tam tầng
Để cải tiến xa hơn hệ thống, ta có thể sử dụng kiến trúc tam tầng, theo đấy các lớp Data services,
Business services và Presentation services sẽ nằm trên những tầng khác nhau một cách chặt chẽ.
Người ta bổ sung thêm một tầng trung gian (middleware component), Business services sẽ được
thực thi trên tầng trung gian này. Biện pháp này giúp giảm tải cho cả server và client, tăng hiệu
năng xử lý của hệ thống. Trong mô hình thực tế, tầng trung gian có thể bao gồm một số các máy
tính chuyên dụng để chạy các dịch vụ Business Services (xem hình 14)
Hình 14: Kiến trúc tam tầng
19
1.2. Các thành phần cơ bản trong Microsoft SQL Server
1.2.1. Cài đặt và cấu hình SQL Server
Bƣớc 1:
Khi cửa sổ cài đặt xuất hiện ta thấy có các mục để lựa chọn:

Install Database Server tức là cài đặt các thành phần cơ bản và quan trọng nhất của hệ quản
trị CSDL SQL Server bao gồm các dịch vụ chạy trên server, các công cụ quản lý như
Services Manager, Enterprise Manager, Query Analyzer,...

Install Analysis Services là cài đặt các dịch vụ phân tích phục vụ cho khai phá dữ liệu (data
mining).

Install English Query là cài đặt công cụ cho phép thực thi các truy vấn bằng cách sử dụng
ngôn ngữ tự nhiên (tiếng Anh) thay vì sử dụng ngôn ngữ SQL.
Ta chọn Install Database Server để cài đặt các thành phần của hệ quản trị. Các lựa chọn cài đặt
Install Analysis Services và Install English Query trước mắt chưa cần quan tâm đến, khi nào cần
dùng đến chúng ta sẽ cài đặt bổ sung.
Bƣớc 2:
Cửa sổ Computer Name xuất hiện. Tại đây cho phép ta điền vào tên máy tính mà ta muốn cài đặt
SQL Server. Nếu ta chọn cài đặt trên Local Computer thì tên máy tính hiện hành sẽ tự động được
điền vào. Nếu ta chọn Remote Computer tức là cài đặt SQL Server lên máy tính khác (có kết nối
mạng với máy tính hiện hành) thì ta phải chỉ rõ tên máy đó.
Trong trường hợp của ta, chọn Local Computer và nhấn Next để cài lên máy tính hiện hành.
20
Bƣớc 3:
Cửa sổ Installation Selection xuất hiện cho phép ta lựa chọn chế độ cài đặt:

Create a new instance of SQL Server, or install Client Tools: Chọn mục này nếu ta muốn
cài mới hoàn toàn một phiên bản (hay còn gọi là "thể hiện" - instance) của SQL Server hoặc
muốn cài đặt các công cụ phía Client cho phép truy xuất, quản lý Server.

Upgrade, remove or add components to an existing instance of SQL Server: Chọn mục
này nếu ta muốn nâng cấp, thêm bớt một số components của một phiên bản SQL Server đã
được cài đặt trước đó trên máy tính.

Advanced options: Một số tùy chọn cài đặt nâng cao, với các tùy chọn cài đặt ở mức hết
sức chi tiết dành cho những người dùng có kinh nghiệm.
Trong trường hợp của ta, chọn mục đầu tiên: Create a new instance of SQL Server, or install
Client Tools và nhấn Next để sang bước tiếp theo.
21
Bƣớc 4:
Cửa sổ User Information xuất hiện yêu cầu ta nhập các thông tin cơ bản về người dùng và công ty
sử dụng sản phầm SQL Server.
Bƣớc 5:
Hộp thoại Software License Agreement xuất hiện, yêu cầu ta chấp nhận các điều khoản về License.
Nhấn Next để tiếp tục.
22
Bƣớc 6:
Hộp thoại Installation Definition xuất hiện cho phép ta chỉ định các thành phần cài đặt với các tùy
chọn:

Client Tools Only: Chỉ cài đặt các công cụ truy xuất và quản trị phía Client chứ không cài
đặt các thành phần dịch vụ của Database Server lên máy tính hiện hành. Tùy chọn này dùng
khi ta đã đặt Server dữ liệu trên một máy khác và giờ ta muốn ngồi ở máy hiện hành để truy
xuất, điều khiển, cấu hình Server dữ liệu từ xa.

Server and Client Tools: Cài đặt tất cả các thành phần bao gồm Database Server, các công
cụ phía Server và Client lên máy tính hiện hành.

Conectivity Only: Chỉ cài đặt các thư viện kết nối để hỗ trợ các ứng dụng trên máy Client
có thể kết nối với SQL Server.
Trong trường hợp của ta, chọn mục Server and Client Tools và nhấn Next để tiếp tục.
23
Bƣớc 7:
Cửa sổ Setup Type xuất hiện cho ta lựa chọn một số thông số cài đặt. Có mấy tùy chọn sau:

Typical: Cài đặt với các tùy chọn thông dụng nhất.

Minimum: Cài đặt với các tùy chọn tối thiểu (yêu cầu cấu hình thấp nhất).

Custom: Cho phép người dùng tự mình lựa chọn và loại bỏ những thành phần có thể được
cài đặt.
Trong trường hợp của ta, chọn mục Typical. Ở phần Destination Folder gồm hai mục:

Program Files: Cho phép chỉ định nơi cài đặt SQL Server

Data Files: Chỉ định nơi lưu trữ mặc định các tệp tin cơ sở dữ liệu của SQL Server.
Sau khi đã thiết lập xong các thông số, nhấn Next để tiếp tục.
Bƣớc 8:
24
Hộp thoại Services Account xuất hiện yêu cầu ta thiết lập một số thông số ban đầu liên quan tới
tài khoản người dùng dùng để đăng nhập vào SQL Server. Có hai tùy chọn cơ bản:

Use the same account for each service. Auto start SQL Server Service: Dùng chung một
account cho tất cả các dịch vụ của SQL Server. Dịch vụ SQL Server Service sẽ tự động
được khởi động nếu cần thiết.

Customize the setting for each service: Thay vì dùng chung, mỗi dịch vụ sẽ có tùy chọn
riêng. Lựa chọn này có tính bảo mật cao nhưng khá phiền phức.
Trong trường hợp của ta, chọn mục Use the same account for each service. Auto start SQL
Server Service.
Ở phần Service Setting có hai tùy chọn:

Use the Local System account: Sử dụng tài khoản hệ thống trên máy tính hiện hành làm tài
khoản đăng nhập vào SQL Server.

User a Domain User Account: Sử dụng tài khoản Domain User để đăng nhập vào SQL
Server nếu máy tính hiện hành đang làm việc trong môi trường Domain của Windows
Server 2000/2003.
Trong trường hợp của ta, chọn mục Use the Local System account. Nhấn Next để tiếp tục
Bƣớc 9:
Hộp thoại Authentication Mode xuất hiện cho phép chúng ta thiết lập chế độ xác thực người
dùng của SQL Server. Có hai lựa chọn:

Windows Authentication Mode: Xác thực dựa trên account của Windows. Chỉ những
người dùng có account đăng nhập của hệ điều hành Windows (những account Windows này
phải được đăng ký trước với SQL Server) thì mới có thể đăng nhập vào hệ thống SQL
Server.
25

Mixed Mode: Chế độ xác thực hỗn hợp. Chế độ này cho phép cả những người dùng có
account của Windows và những người dùng có account riêng của SQL Server đều có thể
đăng nhập hệ thống. Trong trường hợp này, tài khoản sa - tài khoản quản trị hệ thống mặc
định của SQL Server trở nên có hiệu lực, SQL Server gợi ý người dùng nên nhập password
cho account này để đảm bảo tính bảo mật cho hệ thống.
Trong trường hợp của ta, chọn chế độ Mixed Mode, account của sa để trống sau đó nhấn Next để
tiếp tục cài đăt.
Các bước tiếp theo không có gì đặc biệt. Cứ nhấn Next để tiếp tục quá trình cài đặt. Việc cài đặt
diễn ra nhanh hay chậm tùy thuộc vào từng máy tính. Quá trình cài đặt xong xuôi, nhấn Finish để
kết thúc.
1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL)
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 đ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ệ.
Tên gọi ngôn ngữ hỏi có cấu trúc phần nào làm chúng ta 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. Thực sự mà nói, khả năng của SQL vượt xa so với
một công cụ truy xuất dữ liệu, mặc dù đây là mục đích ban đầu khi SQL được xây dựng nên và truy
xuất dữ liệu vẫn còn là một trong những chức năng quan trọng của 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:
• Định nghĩa dữ liệu: SQL cung cấp khả năng định nghĩa các cơ sở dữ liệu, các cấu trúc
lưu trữ và tổ chức dữ liệu cũng như 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.
26
• Điều khiển truy cập: SQL có thể được sử dụng để cấp phát và kiểm soát các thao
tác của người sử 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ĩa 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++, Java,... 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++, Java,... 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.
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ư sau:
• 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 qua SQL, người quản trị cơ sở dữ
liệu có thể quản lý được cơ sở dữ liệu, định nghĩa 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 khách/chủ (client/server): Trong các hệ thống cơ
sở dữ liệu khách/chủ, 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.
Bài tập
Câu 1: Trình bày khái niệm về cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ có những điểm khác
biệt gì so với hệ thống xử lý file truyền thống?
27
Câu 2: Trình bày khái niệm về hệ quản trị cơ sở dữ liệu quan hệ.
Câu 3: Trình bày về mô hình Client/Server và kiến trúc phân tầng.
Câu 4: Nêu các thành phần cơ bản của hệ quản trị CSDL SQL Server.
Câu 3: Trình bày những đặc điểm cơ bản của ngôn ngữ vấn tin SQL.
28
Chƣơng 2. Tạo và quản lý cơ sở dữ liệu
2.1. Các tệp tin cơ sở dữ liệu (Database files)
Trong SQL Server, một user database có thể bao gồm hai hay nhiều tập tin (mặc định là 2). Các
tập tin trong một database có thể chia làm 3 loại:

Primary Data File: Mỗi database phải có ít nhất một tập tin Primary data file với phần mở
rộng là .MDF. Tập tin này ngoài nhiệm vụ cất trữ dữ liệu thuần túy còn nhiệm vụ lưu trữ
thông tin liên quan đến cấu trúc và đặc điểm của chính database đó (lưu trong các system
tables). Ta tuyệt đối không nên can thiệp vào các system tables này vì việc này có thể phá
hỏng database.

Secondary Data File: Mỗi database có thể không có hoặc có nhiều Secondary Data File.
Các tập tin này chỉ thuần túy lưu trữ dữ liệu và có phần mở rộng là .NDF.

Log File: Mỗi database phải có ít nhất một transaction log file (có phần mở rộng là .LDF).
Log file làm nhiệm vụ lưu trữ thông tin liên quan các giao dịch (transaction) thực hiện trên
database đó. Thông tin này một phần phục vụ cho thao tác Roll Back khi có lỗi giao dịch
xảy ra.
Mỗi tập tin trong CSDL (.MDF,.NDF,.LDF) đêu có 5 thuộc tính:

NAME: Tên logic của tập tin.

FILENAME: Đường dẫn đầy đủ (tên vật lý).

SIZE: Kích thước ban đầu của tập tin (KB, MB, GB, TB).

MAXSIZE: Kích thước tối đa cho phép của tập tin (KB, MB, GB,TB).

FILEGROWTH : Tốc độ gia tăng kích thước của tập tin (KB, MB, GB, TB,%).
Các tập tin CSDL được tổ chức thành các nhóm gọi là file group theo nguyên tắc:

Một CSDL có thể có một hay nhiều file group. Trong đó bắt buộc phải có một file group
chính gọi là PRIMARY.

Mỗi file group có thể chứa một hay nhiều tập tin dữ liệu (.MDF, .NDF). Trong đó phải có ít
nhát 1 tập tin Primary Data File (.MDF) nằm trong group chính PRIMARY.

Các tập tin Log không thuộc về một file group nào cả.
2.2. Tạo cơ sở dữ liệu (Database)
2.2.1. Sử dụng lệnh CREATE DATABASE
CREATE DATABASE <tên CSDL>
[ ON
29
PRIMARY
<Khai báo tập tin .MDF>,
[<Khai báo tập tin .NDF>,]
...]
[ FILEGROUP <tên file group>
<Khai báo tập tin .NDF>,
[<Khai báo tập tin .NDF>,]
...]
...
[LOG ON
<Khai báo tập tin .LDF>,
[<Khai báo tập tin .LDF>,]
...]
[COLLATE <tên collation>]
[FOR ATTACH]
Cú pháp đơn giản hay được sử dụng hơn cả là:
CREATE DATABASE <tên CSDL>
ON
PRIMARY
<Khai báo tập tin .MDF>
LOG ON
<Khai báo tập tin .LDF>
Hoặc thậm chí đơn giản hơn nữa
CREATE DATABASE <tên CSDL>
Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần:
( [NAME = <tên logic của tập tin>,]
FILENAME = <tên vật lý (đường dẫn)>,
[SIZE = <kích thước ban đầu>,]
[MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED],
[FILEGROWTH = <Tỷ lệ gia tăng kích thước>])
Chú ý:
Khi không chỉ rõ kích thước ban đầu (SIZE) của tập tin thì:

Đối với tập tin .MDF, SQL Server sẽ lấy kích thước của tập tin .MDF trong Model
Database.

Đối với các tập tin .NDF, .LDF, SQL Server tự khởi tạo giá trị mặc định là 1MB.

Đơn vị mặc định của SIZE và MAXSIZE là MB.
30
2.1.2. Sử dụng Enterprise Manager để tạo CSDL
31
32
2.3. Quản lý cơ sở dữ liệu
2.3.1. Sử dụng lệnh ALTER DATABSE
ALTER DATABASE <tên CSDL>
[ ADD FILE <Khai báo tập tin .MDF,.NDF> [, . . .] [ TO FILEGROUP <Tên File Group>] ]
[ADD LOG FILE <Khai báo tập tin .LDF> [, . . .]]
[ADD FILEGROUP <Tên File Group>]
[REMOVE FILE <Tên logic của tập tin>]
[REMOVE FILEGROUP <Tên File Group>]
[MODIFY NAME = <Tên mới cho Database>]
[MODIFY FILE <Khai báo tập tin>]
[MODIFY FILEGROUP <Tên File Group> <Thuộc tính File Group>|NAME = <Tên mới>]
[COLLATE <Tên collation>]
Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần:
( NAME = <tên logic của tập tin>,
[NEWNAME = <tên logic mới cho tập tin>,]
[FILENAME = <tên vật lý (đường dẫn)>],
[SIZE = <kích thước ban đầu>,]
[MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED],
[FILEGROWTH = <Tỷ lệ gia tăng kích thước>])
Chú ý: Riêng NEWNAME chỉ dùng khi MODIFY FILE
<Thuộc tính File Group> bao gồm:

READONLY: Khi một file group bị đánh dấu READONLY thì mọi thao tác cập nhật dữ
liệu trên các tập tin thuộc file group này đều không thể thực hiện được. Không được phép áp
dụng thuộc tính này cho Primary Group.

READWRITE: Ngược lại với READONLY

DEFAULT: Đánh dấu file group như là file group mặc định của database hiện thời.
33
2.3.2. Sửa đổi cơ sở dữ liệu bằng Enterprise Manager
34
2.4. Xóa cơ sở dữ liệu
2.4.1. Sử dụng lệnh DROP DATABASE trên Query Analyzer
DROP DATABASE <tên CSDL>
2.4.2. Xóa CSDL sử dụng Enterprise Manager
2.5. Các system database đặc biệt
Ngay sau khi SQL Server mới được cài đặt xong, có 6 database tự động được cung cấp. Người ta
gọi những database này là các system database để phân biệt với các database do người dùng tự tạo
ra sau này (user database). Các system database bao gồm:

Model database

Master database

Msdb database

Tempdb database
35

Pubs database

Northwind database
A. Master database
Bao gồm tất cả các system table lưu trữ dữ liệu theo dõi việc cài đặt Server về mặt tổng thể cũng
như theo dõi tất cả các user database được tạo ra về sau. Cụ thể hơn, Master database có chứa
những system catalog lưu trữ thông tin liên quan đến:

Khoảng trống đĩa (space disk).

Cấp phát tập tin.

Cài đặt để cấu hình toàn hệ thống.

Tài khoản đăng nhập.

Sự hiện hữu của các database khác.

Sự hiện hữu của các SQL Server khác (trong các giao dịch phân tán).
Mỗi khi tạo một database mới, thay đổi cấu hình, tài khoản đăng nhập,… tất cả thông tin đều
được cập nhật vào Master database.
B.Model database
Đóng vai trò như một khuôn mẫu (template). Mỗi lần người dùng tạo mới một user database thì
SQL Server sẽ dùng Model database làm “khuôn mẫu” cho việc tạo mới user database. Mỗi user
database lúc mới tạo sẽ kế thừa các thuộc tính và có cấu trúc giống như Model database. Nếu ta
muốn mỗi user database lúc mới tạo ra đã có sẵn một số đặc điểm nào đấy, ta có thể thiết lập các
đặc điểm đó trên Model database. Các user database được tạo ra sau này sẽ tự động được kế thừa
các đặc điểm đó.
C. Tempdb database
Là một database để lưu trữ dữ liệu tạm thời (tempotary). Nó được dùng để lưu trữ:

Những dữ liệu tam thời (bảng tạm) do người dùng tạo ra

Những kết quả trung gian phục vụ cho quá trình xử lý của nội bộ SQL Server: xử lý các câu
truy vấn (Query), sắp xếp (Sorting),…
Mặc định mỗi khi SQL Server được khởi động thì Tempdb database được tái tạo lại, mới hoàn toàn,
mọi dữ liệu (bảng tạm) do người dùng lưu trữ lên Tempdb database trước đó sẽ biến mất
D. Msdb Database
Là một database phục vụ cho hoạt động SQL Server Agent service. Nó lưu trữ thông tin liên
quan đến việc hoạch định tác vụ (Task Shedule) cho các hoạt động như: backup dữ liệu, tạo thứ bản
(replication),…
E. Pubs database và Northwind database
Đây là hai CSDL được dùng làm thí dụ mẫu trong SQL Server book và các tài liệu hướng dẫn
về SQL Server.
Chú ý
36

Tuyệt đối không được tự ý xóa hay can thiệp trực tiếp vào các cơ sở dữ liệu Master và
Msdb. Việc này có thể làm ảnh hưởng nghiêm trọng đến hoạt động của Server.

Không nên tự ý sửa đổi CSDL dữ liệu Model nếu không có lý do chính đáng.

Các CSDL Northwind và Pubs có thể xóa được nhưng không nên làm thế vì chúng là những
ví dụ hay về CSDL rất nên tham khảo.
Bài tập:
Câu 1: Trình bày về tổ chức tập tin trong cơ sở dữ liệu SQL Server. Phân loại tập tin trong SQL
Server. Cách khai báo đặc tả tập tin trong SQL Server (5 thuộc tính).
Câu 2: Nêu chức năng các cơ sở dữ liệu hệ thống trong SQL Server.
Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE DATABASE và giải thích ý nghĩa các tham số.
37
Chƣơng 3. Tạo và quản lý các bảng
3.1. Tạo bảng (Tables)
3.1.1. Sử dụng lệnh CREATE TABLE
CREATE TABLE <Tên bảng dữ liệu>
(
<Cột 1> <Kiểu dữ liệu> [<Thuộc tính nếu có>],
<Cột 2> <Kiểu dữ liệu> [<Thuộc tính nếu có>],
...
<Cột n> <Kiểu dữ liệu> [<Thuộc tính nếu có>],
[Các ràng buộc nếu có]
)
[ON <Tên file group> | DEFAULT]
3.1.2. Sử dụng Enterprise Manager

Vào mục Tables trong CSDL muốn tạo

Chọn New Table
38
3.2. Định nghĩa các cột (Columns)
A. Thuộc tính NULL và NOT NULL
 Thuộc tính NULL
o Khi một cột được xác lập thuộc tính là NULL giá trị tại cột đó được phép để trống (mang giá
trị null)
o Thuộc tính NULL là thuộc tính mặc định. Khi một cột không có khai báo gì thêm thì mặc
định thuộc tính của cột đó NULL.
39
 Thuộc tính NOT NULL
Khi một cột được xác lập thuộc tính là NOT NULL thì giá trị tại cột đó không được phép để trống.
Khai báo: <Tên cột> <Kiểu dữ liệu> NULL | NOT NULL
B. Thuộc tính IDENTITY
o Thuộc tính này cho phép ta chỉ định một cột kiểu số nguyên như là một cột định danh
(Identity Comlumn) của table (gần giống như cột STT trong các bảng dữ liệu trên giấy).
o Ta không phải nhập dữ liệu cho cột này mà các giá trị trên cột được tự đông phát sinh bắt
đầu từ một giá trị khởi tạo và tăng dần theo một công sai nào đó được chỉ định, đồng thời
đảm bảo tính duy nhất một cách tuyệt đối (không có hai giá trị nào trùng nhau).
o Mục đích: có thể dùng cho việc tạo khóa tự động
Khai báo: <Tên cột> <Kiểu dữ liệu> … Identity(seed, increment)
Với: seed: giá trị khởi tạo, increment: mức tăng
Ví dụ: Khai báo cột STT tăng tự động từ 1
STT bigint Identity(1,1) NOT NULL
C. Thuộc tính ROWGUICOL
o Thuộc tính này cho phép ta chỉ định một cột kiểu UniqueIdentifier như là cột mã định danh
quốc tế duy nhất gọi là GUID (Gloabal Unique Identifier)
o Tương tự như Identity, ROWGUICOL có thể dùng để tạo khóa tự động bằng cách sử dụng
hàm hệ thống NEWID() như là giá trị mặc định cho cột.
Khai báo:
<Tên cột> UniqueIdentifier ROWGUICOL NOT NULL DEFAULT NEWID()
3.3. Định nghĩa các ràng buộc (Constrains)
A. Ràng buộc khóa chính PRIMARY KEY
Khi muốn chỉ định một cột làm khóa chính, ta sử dụng ràng buộc PRIMARY KEY trên cột đó theo
cú pháp:
Constraint <Tên ràng buộc> Primary Key(<Tên cột>)
B. Ràng buộc khóa ngoại FOREIGN KEY
Khi muốn chỉ định một cột làm khóa ngoại tham chiếu đến bảng cha, ta sử dụng ràng buộc
FOREIGN KEY theo cú pháp:
Constraint <Tên ràng buộc> Foreign Key(<Tên cột>)
References <Tên bảng cha>(<Khóa chính>)
C. Ràng buộc kiểm tra CHECK
Khi muốn dữ liệu nhập vào phải thỏa mãn một biểu thức điều kiện nào đó ta có thể sử dụng ràng
buộc kiểm tra CHECK với cú pháp
Constraint <Tên ràng buộc> CHECK(<Biểu thức điều kiện>)
40
D. Ràng buộc mặc định DEFAULT
Khi muốn khởi tạo giá trị mặc định cho một cột nào đó của bảng, ta khai báo ràng buộc DEFAULT
ngay bên cạnh khai báo cột
<Tên cột> <Kiểu dữ liệu> … DEFAULT <Giá trị mặc định>
3.4. Sửa bảng
3.4.1. Dùng lệnh ALTER TABLE
ALTER TABLE <Tên bảng>
[ADD <Tên cột> <Kiểu dữ liệu> [<Thuộc tính nếu có>],…]
[ADD <Định nghĩa ràng buộc>,…]
[ALTER COLUMN <Tên cột>
[<Tên kiểu dữ liệu mới>] [NULL | NOT NULL]
[ADD | DROP ROWGUIDCOL]
[DROP COLUMN <Tên cột>,…]
[DROP CONSTRAINT <Tên ràng buộc> ,…]
[NOCHECK | CHECK CONSTRAINT <Tên ràng buộc>]
Chú ý:
NOCHECK dùng để tạm thời vô hiệu hóa một ràng buộc chứ không xóa bỏ nó khỏi CSDL.
3.4.2. Sửa đổi bảng dữ liệu sử dụng Enterprise Manager

Click chuột phải lên bảng muốn sửa đổi.

Chọn Design Table
41
3.5. Xóa bảng (DROP TABLE)
3.5.1. Sử dụng lệnh DROP TABLE
DROP TABLE <Tên bảng dữ liệu>
3.5.2. Sử dụng Enterprise Manager
3.6. Thêm bản ghi mới (INSERT)
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, ta sử dụng câu lệnh INSERT. Hầu hết các hệ quản trị CSDL dựa trên SQL cung
cấp các cách dưới đây để thực hiện thao tác bổ sung dữ liệu cho bảng:
42
• Bổ sung từng dòng dữ liệu với mỗi câu lệnh INSERT. Đây là các sử dụng thường
gặp nhất trong giao tác SQL.
• Bổ sung 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.
Bổ sung từng dòng dữ liệu với lệnh INSERT
Để bổ sung một dòng dữ liệu mới vào bảng, ta sử dụng câu lệnh INSERT với cú pháp như sau:
INSERT INTO tên_bảng[(danh_sách_cột)]
VALUES(danh_sách_trị)
Trong câu lệnh INSERT, danh sách cột ngay sau tên bảng không cần thiết phải chỉ định nếu giá trị
các trường của bản ghi mới được chỉ định đầy đủ trong danh sách trị. Trong trường hợp này, thứ tự
các giá trị trong danh sách trị phải bằng với số lượng các trường của bảng cần bổ sung dữ liệu cũng
như phải tuân theo đúng thứ tự của các trường như khi bảng được định nghĩa.
Ví dụ: Câu lệnh dưới đây bổ sung thêm một dòng dữ liệu vào bảng KHOA
INSERT INTO khoa
VALUES(„DHT10‟,‟Khoa Luật‟,‟054821135‟)
Trong trường hợp chỉ nhập giá trị cho một số cột trong bảng, ta phải chỉ định danh sách các
cột cần nhập dữ liệu ngay sau 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.
Ví dụ: Câu lệnh dưới đây bổ sung một bản ghi mới cho bảng SINHVIEN
INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop)
VALUES(„0241020008‟,„Nguyễn Công‟,‟Chính‟,1,‟C24102‟)
câu lệnh trên còn có thể được viết như sau:
INSERT INTO sinhvien
VALUES(„0241020008‟,„Nguyễn Công‟,‟Chính‟,
NULL,1,NULL,‟C24102‟)
Bổ sung nhiều dòng dữ liệu từ bảng khác
Một cách sử dụng khác của 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 qua 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à thay 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ư sau:
INSERT INTO tên_bảng[(danh_sách_cột)] câu_lệnh_SELECT
Ví dụ: Giả sử ta có bảng LUUSINHVIEN bao gồm các trường HODEM, TEN, NGAYSINH. Câu
lệnh dưới đây bổ sung vào bảng LUUSINHVIEN các dòng dữ liệu có được từ câu truy vấn
SELECT:
43
INSERT INTO luusinhvien
SELECT hodem,ten,ngaysinh
FROM sinhvien
WHERE noisinh like „%Huế%‟
Khi bổ sung dữ liệu theo cách này cần lưu ý một số điểm sau:
•
Kết quả của 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.
•
Trong câu lệnh SELECT được sử dụng mệnh đề COMPUTE ... BY
3.7. Cập nhật bản ghi (UPDATE)
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ư sau:
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 danh_sách_bảng]
[WHERE điều_kiện]
Sau UPDATE là tên của 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 danh sách tên cột và biểu thức tương ứng sau từ khoá SET.
Mệnh đề WHERE trong câu lệnh UPDATE thường được sử dụng để chỉ định các dòng dữ liệu chịu
tác động của câu lệnh (nếu không chỉ định, phạm vi tác động của câu lệnh được hiểu là toàn bộ các
dòng trong bảng)
Ví dụ 2.51: Câu lệnh dưới đây cập nhật lại số đơn vị học trình của các môn học có số đơn vị học
trình nhỏ hơn 2
UPDATE monhoc
SET sodvht = 3
WHERE sodvht = 2
Sử dụng cấu trúc CASE trong câu lệnh UPDATE
Cấu trúc CASE có thể được sử dụng trong biểu thức khi cần phải đưa ra các quyết định khác nhau
về giá trị của biểu thức
Ví dụ Giả sử ta có bảng NHATKYPHONG sau đây
Sau khi thực hiện câu lệnh:
44
UPDATE nhatkyphong
SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100
WHEN loaiphong='B' THEN 70
ELSE 50
END
Dữ liệu trong bảng sẽ là:
Điều kiện cập nhật dữ liệu liên quan đến nhiều bảng
Mệnh đề FROM trong câu lệnh UPDATE được sử dụng khi cần chỉ định các điều kiện liên quan
đến các bảng khác với bảng cần cập nhật dữ liệu. Trong truờng hợp này, trong mệnh đề WHERE
thường có điều kiện nối giữa các bảng.
Ví dụ: Giả sử ta có hai bảng MATHANG và NHATKYBANHANG như sau:
Câu lệnh dưới đây sẽ cập nhật giá trị trường THANHTIEN của bảng NHATKYBANHANG theo
công thức THANHTIEN = SOLUONG × GIA
UPDATE nhatkybanhang
SET thanhtien = soluong*gia
FROM mathang
WHERE nhatkybanhang.mahang = mathang.mahang
3.8. Xóa bản ghi (DELETE)
Để xoá dữ liệu trong một bảng, ta sử dụng câu lệnh DELETE. Cú pháp của câu lệnh này như sau:
DELETE FROM tên_bảng
[FROM danh_sách_bảng]
[WHERE điều_kiện]
Trong câu lệnh này, tên của bảng cần xoá dữ liệu được chỉ định sau DELETE FROM. Mệnh đề
WHERE trong câu lệnh được sử dụng để chỉ định điều kiện đối với các dòng dữ liệu cần xoá. Nếu
câu lệnh DELETE không có mệnh đề WHERE thì toàn bộ các dòng dữ liệu trong bảng đều bị xoá.
Ví dụ 2.55: Câu lệnh dưới đây xoá khỏi bảng SINHVIEN những sinh viên sinh tại Huế
DELETE FROM sinhvien
45
WHERE noisinh LIKE „%Huế%‟
Xoá dữ liệu khi điều kiện liên quan đến nhiều bảng
Nếu điều kiện trong câu lệnh DELETE liên quan đến các bảng không phải là bảng cần xóa
dữ liệu, ta phải sử dụng thêm mệnh đề FROM và sau đó là danh sách tên các bảng đó. Trong trường
hợp này, trong mệnh đề WHERE ta chỉ định thêm điều kiện nối giữa các bảng
Ví dụ: Câu lệnh dưới đây xoá ra khỏi bảng SINHVIEN những sinh viên lớp Tin K24
DELETE FROM sinhvien
FROM lop
WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24'
Sử dụng truy vấn con trong câu lệnh DELETE
Một câu lệnh SELECT có thể được lồng vào trong mệnh đề WHERE trong câu lệnh DELETE để
làm điều kiện cho câu lệnh tương tự như câu lệnh UPDATE.
Ví dụ: Câu lệnh dưới đây xoá khỏi bảng LOP những lớp không có sinh viên nào học
DELETE FROM lop
WHERE malop NOT IN (SELECT DISTINCT malop
FROM sinhvien)
Xoá toàn bộ dữ liệu trong bảng
Câu lệnh DELETE không chỉ định điều kiện đối với các dòng dữ liệu cần xoá trong mệnh đề
WHERE sẽ xoá toàn bộ dữ liệu trong bảng. Thay vì sử dụng câu lệnh DELETE trong trường hợp
này, ta có thể sử dụng câu lệnh TRUNCATE có cú pháp như sau:
TRUNCATE TABLE tên_bảng
Bài tập
Câu 1: Phân biệt user table và system table trong cơ sở dữ liệu SQL Server. Các system table
thường lưu trữ những thông tin gì?
Câu 2: Liệt kê và phân loại các kiểu dữ liệu mà SQL Server 2000 hỗ trợ.
Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE TABLE và giải thích chức năng của từng tham
số.
Câu 4: Tạo cơ sở dữ liệu với các bảng dữ liệu sau đây:
KhachHang(MaKH, TenKH, DiaChi)
NhaCungCap(MaNCC, TenNCC, DiaChi)
MatHang(MaMH,TenMH,DonViTinh, DonGia, MaNCC)
HoaDon(MaHD, MaKH, NgayGiaoDich)
ChiTietHoaDon(MaHD, MaMH, SoLuong)
(Sinh viên tự xác định kiểu dữ liệu và mối liên kết giữa các bảng)
46
Chƣơng 4. Truy vấn dữ liệu
4.1. Truy vấn cơ bản
4.1.1. Mệnh đề SELECT
Câu lệnh SELECT được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều
bảng, khung nhìn. Câu lệnh này có thể dùng để thực hiện phép chọn (tức là truy xuất một tập con
các dòng trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay
nhiều bảng) và phép nối (tức là 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 chung của câu lệnh SELECT có dạng:
SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn
[INTO tên_bảng_mới]
FROM danh_sách_bảng/khung_nhìn
[WHERE điều_kiện]
[GROUP BY danh_sách_cột]
[HAVING điều_kiện]
[ORDER BY cột_sắp_xếp]
[COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]
Điều cần lưu ý đầu tiên đối với câu lệnh này là các thành phần trong câu lệnh SELECT nếu
được sử dụng phải tuân theo đúng thứ tự như trong cú pháp. Nếu không, câu lệnh sẽ được xem là
không hợp lệ. Câu lệnh SELECT được sử dụng để tác động lên các bảng dữ liệu và kết quả của câu
lệnh cũng được hiển thị dưới dạng bảng, tức là một tập hợp các dòng và các cột (ngoại trừ trường
hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE).
4.1.2. Mệnh đề FROM
Mệnh đề FROM trong câu lệnh SELECT được sử dung nhằm chỉ định các bảng và khung nhìn cần
truy xuất dữ liệu. Sau FROM là danh sách tên của các bảng và khung nhìn tham gia vào truy vấn,
tên của các bảng và khung nhìn được phân cách nhau bởi dấu phẩy.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các khoa trong trường
SELECT * FROM khoa
kết quả câu lệnh như sau:
47
Ta có thể sử dụng các bí danh cho các bảng hay khung nhìn trong câu lệnh SELECT. Bí
danh được gán trong mệnh đề FROM bằng cách chỉ định bí danh ngay sau tên bảng.
Ví dụ 2.3: câu lệnh sau gán bí danh là a cho bảng khoa
SELECT * FROM khoa a
4.1.3. Mệnh đề WHERE
Mệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối với việc
truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dòng dữ liệu nào thoả
mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học có số đơn vị học trình lớn hơn 3
SELECT * FROM monhoc WHERE sodvht>3
Trong mệnh đề WHERE thường sử dụng:
• Các toán tử kết hợp điều kiện (AND, OR)
• Các toán tử so sánh
• Kiểm tra giới hạn của dữ liệu (BETWEEN/ NOT BETWEEN)
• Danh sách
• Kiểm tra khuôn dạng dữ liệu.
• Các giá trị NULL
a. Các toán tử so sánh
Toán tử ý nghĩa
=
Bằng
>
Lớn hơn
<
Nhỏ hơn
>=
Lớn hơn hoặc bằng
<=
Nhỏ hơn hoặc bằng
<>
Khác
!>
Không lớn hơn
!<
Không nhỏ hơn
48
Ví dụ: Câu lệnh:
SELECT masv,hodem,ten,ngaysinh
FROM sinhvien
WHERE (ten='Anh')
AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)
cho biết mã, họ tên và ngày sinh của các sinh viên có tên là Anh và có tuổi nhỏ hơn hoặc bằng 20.
b. Kiểm tra giới hạn của dữ liệu
Để kiểm tra xem giá trị dữ liệu nằm trong (ngoài) một khoảng nào đó, ta sử dụng toán tử
BETWEEN (NOT BETWEEN) như sau:
Cách sử dụng
Ý nghĩa
giá_trị BETWEEN a AND b
a ≤ giá_trị ≤ b
giá_trị NOT BETWEEN a AND b (giá_trị < a) AND (giá_trị>b)
Ví dụ: Câu lệnh dưới đây cho biết họ tên và tuổi của các sinh viên có tên là Bình và có tuổi nằm
trong khoảng từ 20 đến 22
SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bình' AND
YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22
c. Danh sách (IN và NOT IN)
Từ khoá IN được sử dụng khi ta cần chỉ định điều kiện tìm kiếm dữ liệu cho câu lệnh
SELECT là một danh sách các giá trị. Sau IN (hoặc NOT IN) có thể là một danh sách các giá trị
hoặc là một câu lệnh SELECT khác.
Ví dụ: Để biết danh sách các môn học có số đơn vị học trình là 2, 4 hoặc 5, thay vì sử dụng câu
lệnh
SELECT * FROM monhoc
WHERE sodvht=2 OR sodvht=4 OR sodvht=5
ta có thể sử dụng câu lệnh
SELECT * FROM monhoc
WHERE sodvht IN (2,4,5)
d. Toán tử LIKE và các ký tự đại diện
49
Từ khoá LIKE (NOT LIKE) sử dụng trong câu lệnh SELECT nhằm mô tả khuôn dạng của dữ
liệu cần tìm kiếm. Chúng thường được kết hợp với các ký tự đại diện sau đây:
Ký tự đại ý nghĩa
diện
%
Chuỗi ký tự bất kỳ gồm không hoặc nhiều ký tự
_
Ký tự đơn bất kỳ
[]
Ký tự đơn bất kỳ trong giới hạn được chỉ định (ví dụ [a-f]) hay một tập
(ví dụ [abcdef])
[^]
Ký tự đơn bất kỳ không nằm trong giới hạn được chỉ định ( ví dụ [^af] hay một tập (ví dụ [^abcdef]).
Ví dụ : Câu lệnh dưới đây
SELECT hodem,ten FROM sinhvien
WHERE hodem LIKE 'Lê%'
cho biết họ tên của các sinh viên có họ là Lê và có kết quả như sau
Câu lệnh:
SELECT hodem,ten FROM sinhvien
WHERE hodem LIKE 'Lê%' AND ten LIKE '[AB]%'
Có kết quả là:
e. Giá trị NULL
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 sau:
Nếu không có dữ liệu được nhập cho cột và không có mặc định cho cột hay kiểu
dữ liệu trên cột đó.
50
• Người sử dụng trực tiếp đưa giá trị NULL vào cho cột đó.
• Một cột có kiểu dữ liệu là kiểu số sẽ chứa giá trị NULL nếu giá trị được chỉ định
gây tràn số.
Trong mệnh đề WHERE, để kiểm tra giá trị của một cột có giá trị NULL hay 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
4.1.4. Mệnh đề GROUP BY và HAVING
Ngoài khả năng thực hiện các yêu cầu truy vấn dữ liệu thông thường (chiếu, chọn, nối,…)
như đã đề cập như ở các phần trước, câu lệnh SELECT còn cho phép thực hiện các thao tác truy vấn
và tính toán thống kê trên dữ liệu như: cho biết tổng số tiết dạy của mỗi giáo viên, điểm trung bình
các môn học của mỗi sinh viên,…
Mệnh đề GROUP BY sử dụng trong câu lệnh SELECT nhằm phân hoạch các dòng dữ liệu trong
bảng thành các nhóm dữ liệu, và trên mỗi nhóm dữ liệu thực hiện tính toán các giá trị thống kê như
tính tổng, tính giá trị trung bình,...
Các hàm gộp được sử dụng để tính giá trị thống kê cho toàn bảng hoặc trên mỗi nhóm dữ liệu.
Chúng có thể được sử dụng như là các cột trong danh sách chọn của câu lệnh SELECT hoặc xuất
hiện trong mệnh đề HAVING, nhưng không được phép xuất hiện trong mệnh đề WHERE
SQL cung cấp các hàm gộp dưới đây:
Hàm gộp
Chức năng
SUM([ALL | DISTINCT] biểu_thức)
Tính tổng các giá trị.
AVG([ALL | DISTINCT] biểu_thức)
Tính trung bình của các giá trị
COUNT([ALL | DISTINCT] biểu_thức) Đếm số các giá trị trong biểu thức.
COUNT(*)
Đếm số các dòng được chọn.
MAX(biểu_thức)
Tính giá trị lớn nhất
MIN(biểu_thức)
Tính giá trị nhỏ nhất
Trong đó:
• 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ỏ qua các giá trị NULL khi tính toán.
• Hàm COUNT(*) không bỏ qua các giá trị NULL.
Mặc định, các hàm gộp thực hiện tính toán thống kê trên toàn bộ dữ liệu. Trong trường hợp
cần loại bỏ bớt các giá trị trùng nhau (chỉ giữ lại một giá trị), ta chỉ định thêm từ khoá DISTINCT ở
trước biểu thức là đối số của hàm.
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
51
SELECT. Mệnh đề HAVING thường không thực sự có nghĩa 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à trong điều kiện của
WHERE không được có các hàm gộp trong khi HAVING lại cho phép sử dụng các hàm gộp trong
điều kiện của mình.
Ví dụ: Để biết trung bình điểm thi lần 1 của các sinh viên có điểm trung bình lớn hơn hoặc bằng 5,
ta sử dụng câu lệnh như sau:
SELECT sinhvien.masv,hodem,ten,
SUM(diemlan1*sodvht)/sum(sodvht)
FROM sinhvien,diemthi,monhoc
WHERE sinhvien.masv=diemthi.masv AND
diemthi.mamonhoc=monhoc.mamonhoc
GROUP BY sinhvien.masv,hodem,ten
HAVING sum(diemlan1*sodvht)/sum(sodvht)>=5
4.1.5. Mệnh đề ORDER BY
Mặc định, các dòng dữ liệu trong kết quả của câu truy vấn tuân theo thứ tự của 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ó chỉ mục). Trong trường hợp muốn
dữ liệu được sắp xếp theo chiều tăng hoặc giảm của giá trị của một hoặc nhiều trường, ta 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 đa 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.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học và sắp xếp theo chiều giảm dần của số
đơn vị học trình
SELECT * FROM monhoc
ORDER BY sodvht DESC
Nếu sau 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 qua
phải.
Ví dụ 2.21: Câu lệnh
SELECT hodem,ten,gioitinh,
YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bình'
ORDER BY gioitinh,tuoi
có kết quả là:
Thay vì chỉ định tên cột sau ORDER BY, ta 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ư sau:
52
SELECT hodem,ten,gioitinh,
YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi
FROM sinhvien
WHERE ten='Bình'
ORDER BY 3, 4
4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhau
Phép hợp được sử dụng trong trường hợp ta cần gộp kết quả của hai hay 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ư sau
Câu_lệnh_1
UNION [ALL] Câu_lệnh_2
[UNION [ALL] Câu_lệnh_3]
...
[UNION [ALL] Câu_lệnh_n]
[ORDER BY cột_sắp_xếp]
[COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]
Trong đó
Câu_lệnh_1 có dạng
SELECT danh_sách_cột
[INTO tên_bảng_mới]
[FROM danh_sách_bảng|khung_nhìn]
[WHERE điều_kiện]
[GROUP BY danh_sách_cột]
[HAVING điều_kiện]
và Câu_lệnh_i (i = 2,..,n) có dạng
SELECT danh_sách_cột
[FROM danh_sách_bảng|khung_nhìn]
[WHERE điều_kiện]
[GROUP BY danh_sách_cột]
[HAVING điều_kiện]
Ví dụ: Giả sử ta có hai bảng Table1 và Table2 lần lượt như sau:
câu lệnh
SELECT A,B FROM Table1
UNION
SELECT D,E FROM table2
Cho kết quả như sau:
53
Mặc định, nếu trong các truy vấn thành phần của phép hợp xuất hiện những dòng dữ liệu giống
nhau thì trong kết quả truy vấn chỉ giữ lại một dòng. Nếu muốn giữ lại các dòng này, ta phải sử
dụng thêm từ khoá ALL trong truy vấn thành phần.
Ví dụ: Câu lệnh
SELECT A,B FROM Table1
UNION ALL
SELECT D,E FROM table2
Cho kết quả như sau
Khi sử dụng toán tử UNION để thực hiện phép hợp, ta cần chú ý các nguyên tắc sau:
• 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 bản thân 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 bản thân 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. Nguyên nhân là do phép hợp so sánh các cột từng
cột một theo thứ tự được cho trong mỗi truy vấn.
• Khi các kiểu dữ liệu khác nhau đượ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 cao hơn (nếu có thể đượ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.
4.2. Truy vấn từ nhiều bảng
4.2.1. Inner Joins
Điều kiện để thực hiện phép nối trong được chỉ định trong mệnh đề FROM theo cú pháp như sau:
tên_bảng_1 [INNER] JOIN tên_bảng_2 ON điều_kiện_nối
54
Ví dụ 2.31: Để hiển thị họ tên và ngày sinh của các sinh viên lớp Tin K24, thay vì sử dụng câu
lệnh:
SELECT hodem,ten,ngaysinh
FROM sinhvien,lop
WHERE tenlop='Tin K24' AND
sinhvien.malop=lop.malop
ta có thể sử dụng câu lệnh như sau:
SELECT hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE tenlop='Tin K24'
4.2.2. Outer Joins
SQL2 cung cấp các phép nối ngoài sau đây:
• Phép nối ngoài trái (LEFT OUTER JOIN)
• Phép nối ngoài phải (RIGHT OUTER JOIN)
• Phép nối ngoài đầy đủ (FULL OUTER JOIN)
Cũng tương tự như phép nối trong, điều kiện của phép nối ngoài cũng được chỉ định ngay trong
mệnh đề FROM theo cú pháp:
tên_bảng_1 LEFT|RIGHT|FULL [OUTER] JOIN tên_bảng_2
ON điều_kiện_nối
Ví dụ: Giả sử ta có hai bảng dữ liệu như sau:
Bảng DONVI Bảng NHANVIEN
Phép nối ngoài trái giữa hai bảng NHANVIEN và DONVI được biểu diễn bởi câu lệnh:
SELECT *
FROM nhanvien LEFT OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
có kết quả là:
Câu lệnh:
SELECT *
FROM nhanvien RIGHT OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
thực hiện phép nối ngoài phải giữa hai bảng NHANVIEN và DONVI, và có kết quả là:
Nếu phép nối ngoài trái (tương ứng phải) hiển thị trong kết quả truy vấn cả những dòng dữ liệu
không thoả điều kiện nối của bảng bên trái (tương ứng phải) trong phép nối thì phép nối ngoài đầy
55
đủ hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của cả hai
bảng tham gia vào phép nối.
Ví dụ: Với hai bảng NHANVIEN và DONVI như ở trên, câu lệnh
SELECT *
FROM nhanvien FULL OUTER JOIN donvi
ON nhanvien.madv=donvi.madv
cho kết quả là:
Một đặc điểm nổi bật của SQL2 là cho phép biểu diễn phép nối trên nhiều bảng dữ liệu một cách rõ
ràng. Thứ tự thực hiện phép nối giữa các bảng được xác định theo nghĩa kết quả của phép nối này
được sử dụng trong một phép nối khác.
Ví dụ: Câu lệnh dưới đây hiển thị họ tên và ngày sinh của các sinh viên thuộc Khoa Công nghệ
Thông tin
SELECT hodem,ten,ngaysinh FROM (sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop)
INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa=N'Khoa công nghệ thông tin'
Trong câu lệnh trên, thứ tự thực hiện phép nối giữa các bảng được chỉ định rõ ràng: phép nối giữa
hai bảng sinhvien và lop được thực hiện trước và kết quả của phép nối này lại tiếp tục được nối với
bảng khoa.
Bài tập
Câu 1: Trình bày cú pháp chung của câu lệnh truy vấn SELECT. Chỉ ra sự tương đương giữa câu
lệnh SELECT và biểu thức đại số quan hệ.
Câu 2: Phân biệt các phép kết nối bảng dữ liệu: các dạng Join (Inner Join, Outer Join, Cross Join).
Câu 3: Trình bày về phép toán Union. Điều kiện để thực hiện được phép toán này là gì?
Câu 4: Trình bày chức năng các hàm thống kê: COUNT, SUM, MAX, MIN, AVG đi kèm với
GROUP BY.
56
Chƣơng 5. Tạo và quản lý các chỉ mục
5.1. Các kiểu chỉ mục (Indexes)
CLUSTERED
 Sắp xếp lại dữ liệu về mặt vật lý.
 Chỉ có duy nhất một clustered trong một bảng
 Yêu cầu ít nhất 120% kích thước của bảng cóthể sử dụng trong vùng tạm.
 Khoảng trống vùng tạm tồn tại trong CSDL tạo chỉ mục mà chúng ta tạo chỉ mục.
NON - CLUSTERED
 Thứtự các dòng trong bảng không sắp xếp về mặt vật lý giống Clustered
 Đây là kiểu điển hình để tạo chỉmục cho cột liên kết các cột khác. Các giá trị có thể được
thay đổi thường xuyên
 SQL server sử dụng mặc định khi tạo chỉ mục là non – clustered
 Chúng ta cóthểtạo 249 non–clustered cho mỗi bảng
5.2. Tạo các chỉ mục
Có thể sử dụng lệnh CREATE INDEX:
CREATE [UNIQUE] INDEX tengọi khoá INDEX ON tên bảng
( Namefield1 [ASC/DESC],Namefield2 [ASC/DESC],....) WITH PRIMARY
[ DISALLOW NULL ]/ [ IGNORE NULL ]
Hoặc sử dụng Wizard:
57
58
59
60
5.3. Quản lý và gỡ bỏ các chỉ mục
DROP INDEX
{ <drop_relational_or_xml_or_spatial_index> [ ,...n ]
| <drop_backward_compatible_index> [ ,...n ]
}
<drop_relational_or_xml_or_spatial_index> ::=
index_name ON <object>
[ WITH ( <drop_clustered_index_option> [ ,...n ] ) ]
<drop_backward_compatible_index> ::=
[ owner_name. ] table_or_view_name.index_name
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
}
<drop_clustered_index_option> ::=
{
MAXDOP = max_degree_of_parallelism
61
| ONLINE = { ON | OFF }
| MOVE TO { partition_scheme_name ( column_name )
| filegroup_name
| "default"
}
[ FILESTREAM_ON { partition_scheme_name
| filestream_filegroup_name
| "default" } ]
}
Bài tập
Câu 1: Trình bày khái niệm và vai trò của chỉ mục trong cơ sở dữ liệu.
Câu 2: Khái niệm về B-Tree và tổ chức chỉ mục trong SQL Server 2000.
Câu 3: Trình bày cú pháp đầy đủ của lệnh tạo chỉ mục và giải thích ý nghĩa từng tham số.
62
Chƣơng 6. Tạo và quản lý khung nhìn
6.1. Định nghĩa
Khung nhìn là một lược đồ dữ liệu được lấy ra từ một lược đồ dữ liệu khác đã có.
6.2. Tạo các khung nhìn (Views)
Câu lệnh CREATE VIEW như sau:
CREATE VIEW tên_khung_nhìn[(danh_sách_tên_cột)] AS
câu_lệnh_SELECT
Ví dụ: Câu lệnh dưới đây tạo khung nhìn có tên DSSV từ câu lệnh SELECT truy vấn từ hai bảng
SINHVIEN và LOP
CREATE VIEW dssv AS
SELECT masv,hodem
FROM sinhvien,lop
WHERE sinhvien.malop=lop.malop
thựiện câu lệnh:
SELECT * FROM dssv
ta có được kết quả như sau:
6.3. Quản lý các khung nhìn
Câu lệnh ALTER VIEW được sử dụng để định nghĩa lại khung nhìn hiện có nhưng không làm
thay đổi các quyền đã được cấp phát cho người sử dụng trước đó. Câu lệnh này sử dụng tương tự
như câu lệnh CREATE VIEW và có cú pháp như sau:
ALTER VIEW tên_khung_nhìn [(danh_sách_tên_cột)]
AS
63
Câu_lệnh_SELECT
Ví dụ: Ta định nghĩa khung nhìn như sau:
CREATE VIEW viewlop
AS
SELECT malop,tenlop,tenkhoa
FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa='Khoa Vật lý‟
và có thể định nghĩa lại khung nhìn trên bằng câu lệnh:
ALTER VIEW view_lop
AS
SELECT malop,tenlop,hedaotao
FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa
WHERE tenkhoa='Khoa Công nghệ thông tin'
6.4. Xóa các khung nhìn
Khi một khung nhìn không còn sử dụng, ta có thể xoá nó ra khỏi cơ sở dữ liệu thông qua câu
lệnh:
DROP VIEW tên_khung_nhìn
Nếu một khung nhìn bị xoá, toàn bộ những quyền đã cấp phát cho người sử dụng trên khung
nhìn cũng đồng thời bị xoá. Do đó, nếu ta tạo lại khung nhìn thì phải tiến hành cấp phát lại quyền
cho người sử dụng.
Ví dụ: Câu lệnh dưới đây xoá khung nhìn VIEW_LOP ra khỏi cơ sở dữ liệu
DROP VIEW view_lop
Bài tập
Câu 1:
Trình bày khái niệm về view (bảng ảo). View giúp tăng tính bảo mật cho cơ sở dữ liệu như thế nào?
Câu 2:
Trình bày các lệnh tạo, sửa đổi và xóa view.
Câu 3:
Cập nhật dữ liệu thông qua view như thế nào?
Câu 4:
Nếu ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo view.
64
Chƣơng 7. Tạo và quản lý các thủ tục thƣờng
trú
7.1. Tạo các thủ tục thƣờng trú (Stored procedures)
Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau:
CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
AS
Các_câu_lệnh_của_thủ_tục
Trong đó:
tên_thủ_tục
Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và 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 phân cách nhau bởi dấu phẩy. Khai báo của
mỗi một tham số tối thiểu phải bao gồm hai phần:
• tên tham số được bắt đầu bởi dấu @.
• kiểu dữ liệu của tham số
Ví dụ:
@mamonhoc nvarchar(10)
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
RECOMPILE
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ã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ
định. Nếu thủ tục đã được mã hoá, ta không thể xem được nội dung
của 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ừ khoá BEGIN...END hoặc có thể không.
Ví dụ 5.1: Giả sử ta cần thực hiện một chuỗi các thao tác như sau trên cơ sở dữ liệu
1. Bổ sung thêm môn học cơ sở dữ liệu có mã TI-005 và số đơn vị học trình là 5 vào
bảng MONHOC
65
2. Lên danh sách nhập điểm thi môn cơ sở dữ liệu cho các sinh viên học lớp có mã
C24102 (tức là bổ sung thêm vào bảng DIEMTHI các bản ghi với cột
MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị lần lượt là mã các sinh
viên học lớp có mã C24105 và các cột điểm là NULL).
Nếu thực hiện yêu cầu trên thông qua các câu lệnh SQL như thông thường, ta phải thực thi hai câu
lệnh như sau:
INSERT INTO MONHOC
VALUES('TI-005','Cơ sở dữ liệu',5)
INSERT INTO DIEMTHI(MAMONHOC,MASV)
SELECT „TI-005‟,MASV
FROM SINHVIEN
WHERE MALOP='C24102'
Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số
vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau:
CREATE PROC sp_LenDanhSachDiem(
@mamonhoc NVARCHAR(10),
@tenmonhoc NVARCHAR(50),
@sodvht SMALLINT,
@malop NVARCHAR(10))
AS
BEGIN
INSERT INTO monhoc
VALUES(@mamonhoc,@tenmonhoc,@sodvht)
INSERT INTO diemthi(mamonhoc,masv)
SELECT „TI-005‟,MASV
FROM SINHVIEN
WHERE MALOP='C24102'
Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số
vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau:
CREATE PROC sp_LenDanhSachDiem(
@mamonhoc NVARCHAR(10),
@tenmonhoc NVARCHAR(50),
@sodvht SMALLINT,
@malop NVARCHAR(10))
AS
66
BEGIN
INSERT INTO monhoc
VALUES(@mamonhoc,@tenmonhoc,@sodvht)
INSERT INTO diemthi(mamonhoc,masv)
SELECT @mamonhoc,masv
FROM sinhvien
WHERE malop=@malop
END
Khi thủ tục trên đã được tạo ra, ta có thể thực hiện được hai yêu cầu đặt ra ở trên một cách đơn giản
thông qua lòi gọi thủ tục:
sp_LenDanhSachDiem 'TI-005','Cơ sở dữ liệu',5,'C24102'
7.2. Thực thi các thủ tục thƣờng trú
Như đã thấy ở ví dụ ở 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 [danh_sách_các_đối_số]
Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của các tham số
khi định nghĩa 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
hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau:
EXECUTE tên_thủ_tục [danh_sách_các_đối_số]
Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo thứ tự của các tham
số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới dạng:
@tên_tham_số = giá_trị
Ví dụ 5.2: Lời gọi thủ tục ở ví dụ trên có thể viết như sau:
sp_LenDanhSachDiem @malop='C24102',
@tenmonhoc='Cơ sở dữ liệu',
@mamonhoc='TI-005',
@sodvht=5
7.3. Xem và sửa các thủ tục thƣờng trú
Khi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng câu lệnh
ALTER PROCEDURE có cú pháp như sau:
ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
AS
67
Các_câu_lệnh_Của_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ửa đổi lại một thủ
tục đã có không làm thay đổ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.
7.4. Tham số vào và ra (Parameters)
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 giữ 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ừ khoá 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ụ dưới đây minh hoạ việc
sử dụng biến trong thủ tục
Ví dụ 5.3: Trong định nghĩa của thủ tục dưới đây sử dung 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 NVARCHAR(10),
@malop2 NVARCHAR(10))
AS
DECLARE @tenlop1 NVARCHAR(30)
DECLARE @namnhaphoc1 INT
DECLARE @tenlop2 NVARCHAR(30)
DECLARE @namnhaphoc2 INT
SELECT @tenlop1=tenlop,
@namnhaphoc1=namnhaphoc
FROM lop WHERE malop=@malop1
SELECT @tenlop2=tenlop,
@namnhaphoc2=namnhaphoc
FROM lop WHERE malop=@malop2
PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)
print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)
IF @namnhaphoc1=@namnhaphoc2
PRINT 'Hai lớp nhập học cùng năm'
ELSE
PRINT 'Hai lớp nhập học khác năm'
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 thay
đổ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.
68
Ví dụ 5.4: Xét câu lệnh sau đây
CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT)
AS
SELECT @c=@a+@b
Nếu sau khi đã tạo thủ tục với câu lệnh trên, ta thực thi một tập các câu lệnh như sau:
DECLARE @tong INT
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong
SELECT @tong
Câu lệnh “SELECT @tong” cuối cùng trong loạt các câu lệnh trên sẽ cho kết quả là: 0
Trong trường hợp cần phải giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta phải khai báo tham
số của thủ tục theo cú pháp như sau:
@tên_tham_số kiểu_dữ_liệu OUTPUT
hoặc:
@tên_tham_số kiểu_dữ_liệu OUT
và trong lời gọi thủ tục, sau đối số được truyền cho thủ tục, ta cũng phải chỉ định thêm từ khoá
OUTPUT (hoặc OUT)
Ví dụ 5.5: Ta định nghĩa lại thủ tục ở ví dụ 5.4 như sau:
CREATE PROCEDURE sp_Conghaiso(
@a INT,
@b INT,
@c INT OUTPUT)
AS
SELECT @c=@a+@b
và thực hiện lời gọi thủ tục trong một tập các câu lệnh như sau:
DECLARE @tong INT
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong OUTPUT
SELECT @tong
thì câu lệnh “SELECT @tong” sẽ cho kết quả là: 300
Tham số với giá trị mặc định
Các tham số được khai 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 tham số trong trường hợp không truyền đối số cho tham số khi có lời gọi đến thủ tục.
Tham số với giá trị mặc định được khai báo theo cú pháp như sau:
@tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định
Ví dụ 5.6: Trong câu lệnh dưới đây:
69
CREATE PROC sp_TestDefault(
@tenlop NVARCHAR(30)=NULL,
@noisinh NVARCHAR(100)='Huế')
AS
BEGIN
IF @tenlop IS NULL
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh
ELSE
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh AND
tenlop=@tenlop
END
thủ tục sp_TestDefault được định nghĩa với tham số @tenlop có giá trị mặc định là NULL và tham
số @noisinh có giá trị mặc định là Huế. Với thủ tục được định nghĩa như trên, ta có thể thực hiện
các lời gọi với các mục đích khác nhau như sau:
• Cho biết họ tên của các sinh viên sinh tại Huế:
sp_testdefault
• Cho biết họ tên của các sinh viên lớp Tin K24 sinh tại Huế:
sp_testdefault @tenlop='Tin K24'
• Cho biết họ tên của các sinh viên sinh tại Nghệ An:
sp_testDefault @noisinh=N'Nghệ An'
• Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng:
sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'
Bài tập cuối chƣơng
Câu 1: Trình bày khái niệm về thủ tục thường trú.
Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa thủ tục thường trú. Giải thích ý nghĩa các tham
số.
Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo thủ tục.
Câu 4: Thực thi thủ tục như thế nào? Thủ tục trong SQL Server có thể được gọi từ các ngôn ngữ
lập trình ngoài không?
70
Chƣơng 8. Tạo và quản lý hàm ngƣời dùng
định nghĩa
8.1. Các kiểu hàm ngƣời dùng định nghĩa (User-defined
functions)
Hàm là đối tượng cơ sở dữ liệu tương tự như thủ tục. Điểm khác biệt giữa hàm và thủ tục là
hàm trả về một giá trị thông qua tên hàm còn thủ tục thì không. Điều này cho phép ta sử dụng hàm
như là một thành phần của một biêu thức (chẳng hạn trong danh sách chọn của câu lệnh SELECT).
Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, người sử dụng có thể định nghĩa
thêm các hàm nhằm phục vụ cho mục đích riêng của mình.
8.2. Tạo hàm ngƣời dùng định nghĩa
Hàm được định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp như sau:
CREATE FUNCTION tên_hàm ([danh_sách_tham_số])
RETURNS (kiểu_trả_về_của_hàm)
AS
BEGIN
các_câu_lệnh_của_hàm
END
Ví dụ 5.7: Câu lệnh dưới đây định nghĩa hàm tính ngày trong tuần (thứ trong tuần) của một giá trị
kiểu ngày
CREATE FUNCTION thu(@ngay DATETIME)
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @st NVARCHAR(10)
SELECT @st=CASE DATEPART(DW,@ngay)
WHEN 1 THEN 'Chu nhật'
WHEN 2 THEN 'Thứ hai'
WHEN 3 THEN 'Thứ ba'
WHEN 4 THEN 'Thứ tư'
WHEN 5 THEN 'Thứ năm'
WHEN 6 THEN 'Thứ sáu'
ELSE 'Thứ bảy'
END
71
RETURN (@st) /* Trị trả về của hàm */
END
Một hàm khi đã được định nghĩa có thể được sử dụng như các hàm do hệ quản trị cơ sở dữ liệu
cung cấp (thông thường trước tên hàm ta phải chỉ định thêm tên của người sở hữu hàm)
Ví dụ 5.8: Câu lệnh SELECT dưới đây sử dụng hàm đã được định nghĩa ở ví dụ trước:
SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh
FROM sinhvien
WHERE malop=‟C24102‟
có kết quả là:
8.3. Quản lý hàm ngƣời dùng định nghĩa
Thay đổi cấu trúc hàm, dùng lệnh ALTER FUNCTION
ALTER FUNCTION tên_hàm ([danh_sách_tham_số])
RETURNS (kiểu_trả_về_của_hàm)
AS
BEGIN
các_câu_lệnh_của_hàm
END
Bài tập
Câu 1: Trình bày khái niệm về hàm người dùng.
Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa hàm người dùng. Giải thích ý nghĩa các tham
số.
Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo hàm người dùng.
Câu 4: Gọi hàm người dùng như thế nào? Hàm người dùng trong SQL Server có thể được gọi từ
các ngôn ngữ lập trình ngoài không?
72
Chƣơng 9. Tạo và quản lý các Trigger
9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers)
Một trigger là một đối tượng gắn liền với một bảng và được tự động kích hoạt khi xảy ra những
giao tác làm thay đổi dữ liệu trong bảng. Định nghĩa một trigger bao gồm các yếu tố sau:
• Trigger sẽ được áp dụng đối với bảng nào?
• Trigger được kích hoạt khi câu lệnh nào được thực thi trên bảng: INSERT, UPDATE,
DELETE?
• Trigger sẽ làm gì khi được kích hoạt?
Câu lệnh CREATE TRIGGER được sử dụng để đinh nghĩa trigger và có cú pháp như sau:
CREATE TRIGGER tên_trigger
ON tên_bảng
FOR {[INSERT][,][UPDATE][,][DELETE]}
AS
[IF UPDATE(tên_cột)
[AND UPDATE(tên_cột)|OR UPDATE(tên_cột)]
...]
các_câu_lệnh_của_trigger
Ví dụ: Ta định nghĩa các bảng như sau:
Bảng MATHANG lưu trữ dữ liệu về các mặt hàng:
CREATE TABLE mathang
(
mahang NVARCHAR(5) PRIMARY KEY, /*mã hàng*/
tenhang NVARCHAR(50) NOT NULL, /*tên hàng*/
soluong INT, /*số lượng hàng hiện có*/
)
Bảng NHATKYBANHANG lưu trữ thông tin về các lần bán hàng
CREATE TABLE nhatkybanhang
(
stt INT IDENTITY PRIMARY KEY,
ngay DATETIME, /*ngày bán hàng*/
nguoimua NVARCHAR(30), /*tên người mua hàng*/
mahang NVARCHAR(5) /*mã mặt hàng được bán*/
FOREIGN KEY REFERENCES mathang(mahang),
73
soluong INT, /*giá bán hàng*/
giaban MONEY /*số lượng hàng được bán*/
)
Câu lệnh dưới đây định nghĩa trigger trg_nhatkybanhang_insert. Trigger này có chức năng tự động
giảm số lượng hàng hiện có khi một mặt hàng nào đó được bán (tức là khi câu lệnh INSERT được
thực thi trên bảng NHATKYBANHANG).
CREATE TRIGGER trg_nhatkybanhang_insert
ON nhatkybanhang
FOR INSERT
AS
UPDATE mathang
SET mathang.soluong=mathang.soluong-inserted.soluong
FROM mathang INNER JOIN inserted
ON mathang.mahang=inserted.mahang
Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng MATHANG là:
thì sau khi ta thực hiện câu lênh:
INSERT INTO nhatkybanhang
(ngay,nguoimua,mahang,soluong,giaban)
VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200)
dữ liệu trong bảng MATHANG sẽ như sau:
Trong câu lệnh CREATE TRIGGER ở ví dụ trên, sau mệnh đề ON là tên của bảng mà
trigger cần tạo sẽ tác động đến. Mệnh đề tiếp theo chỉ định câu lệnh sẽ kích hoạt trigger (FOR
INSERT). Ngoài INSERT, ta còn có thể chỉ định UPDATE hoặc DELETE cho mệnh đề này, hoặc
có thể kết hợp chúng lại với nhau. Phần thân của trigger nằm sau từ khoá AS bao gồm các câu lệnh
mà trigger sẽ thực thi khi được kích hoạt.
9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers)
Thay vì chỉ định một trigger được kích hoạt trên một bảng, ta có thể chỉ định trigger được kích hoạt
và thực hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ liên quan đến một số cột nhất định
nào đó của cột. Trong trường hợp này, ta sử dụng mệnh đề IF UPDATE trong trigger. IF UPDATE
không sử dụng được đối với câu lệnh DELETE.
74
Ví dụ: Xét lại ví dụ với hai bảng MATHANG và NHATKYBANHANG, trigger dưới đây được
kích hoạt khi ta tiến hành cập nhật cột SOLUONG cho một bản ghi của bảng
NHATKYBANHANG (lưu ý là chỉ cập nhật đúng một bản ghi)
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
UPDATE mathang
SET mathang.soluong = mathang.soluong –
(inserted.soluong-deleted.soluong)
FROM (deleted INNER JOIN inserted ON
deleted.stt = inserted.stt) INNER JOIN mathang
ON mathang.mahang = deleted.mahang
Với trigger ở ví dụ trên, câu lệnh:
UPDATE nhatkybanhang
SET soluong=soluong+20
WHERE stt=1
sẽ kích hoạt trigger ứng với mệnh đề IF UPDATE (soluong) và câu lệnh UPDATE trong trigger sẽ
được thực thi. Tuy nhiên câu lệnh:
UPDATE nhatkybanhang
SET nguoimua='Mai Hữu Toàn'
WHERE stt=3
lại không kích hoạt trigger này.
Mệnh đề IF UPDATE có thể xuất hiện nhiều lần trong phần thân của trigger. Khi đó, mệnh đề IF
UPDATE nào đúng thì phần câu lệnh của mệnh đề đó sẽ được thực thi khi trigger được kích hoạt.
Ví dụ 5.14: Giả sử ta định nghĩa bảng R như sau:
CREATE TABLE R
(
A INT,
B INT,
C INT
)
và trigger trg_R_update cho bảng R:
CREATE TRIGGER trg_R_test
ON R
75
FOR UPDATE
AS
IF UPDATE(A)
Print 'A updated'
IF UPDATE(C)
Print 'C updated'
Câu lệnh:
UPDATE R SET A=100 WHERE A=1
sẽ kích hoạt trigger và cho kết quả là:
A updated
và câu lệnh:
UPDATE R SET C=100 WHERE C=2
cũng kích hoạt trigger và cho kết quả là:
C updated
còn câu lệnh:
UPDATE R SET B=100 WHERE B=3
hiển nhiên sẽ không kích hoạt trigger
9.3. Sử dụng các Trigger lồng nhau (Nested Triggers)
Một trigger có khả năng nhận biết được sự thay đổi về mặt dữ liệu trên bảng dữ liệu, từ đó có thể
phát hiện và huỷ bỏ những thao tác không đảm bảo tính toàn vẹn dữ liệu. Trong một trigger, để huỷ
(1)
bỏ tác dụng của câu lệnh làm kích hoạt trigger, ta sử dụng câu lệnh :
ROLLBACK TRANSACTION
Ví dụ 5.15: Nếu trên bảng MATHANG, ta tạo một trigger như sau:
CREATE TRIGGER trg_mathang_delete
ON mathang
FOR DELETE
AS
ROLLBACK TRANSACTION
Thì câu lệnh DELETE sẽ không thể có tác dụng đối với bảng MATHANG. Hay nói cách khác, ta
không thể xoá được dữ liệu trong bảng.
Ví dụ 5.16: Trigger dưới đây được kích hoạt khi câu lệnh INSERT được sử dụng để bổ sung một
bản ghi mới cho bảng NHATKYBANHANG. Trong trigger này kiểm tra điều kiện hợp lệ của dữ
liệu là số lượng hàng bán ra phải nhỏ hơn hoặc bằng số lượng hàng hiện có. Nếu điều kiện này
không thoả mãn thì huỷ bỏ thao tác bổ sung dữ liệu.
CREATE TRIGGER trg_nhatkybanhang_insert
76
ON NHATKYBANHANG
FOR INSERT
AS
DECLARE @sl_co int /* Số lượng hàng hiện có */
DECLARE @sl_ban int /* Số lượng hàng được bán */
DECLARE @mahang nvarchar(5) /* Mã hàng được bán */
SELECT @mahang=mahang,@sl_ban=soluong
FROM inserted
SELECT @sl_co = soluong
FROM mathang where mahang=@mahang
/*Nếu số lượng hàng hiện có nhỏ hơn số lượng bán
thì huỷ bỏ thao tác bổ sung dữ liệu */
IF @sl_co<@sl_ban
ROLLBACK TRANSACTION
/* Nếu dữ liệu hợp lệ
thì giảm số lượng hàng hiện có */
ELSE
UPDATE mathang
SET soluong=soluong-@sl_ban
WHERE mahang=@mahang
9.4. Sử dụng các Trigger đệ quy (Recursive Triggers)
Trong các ví dụ trước, các trigger chỉ thực sự hoạt động đúng mục đích khi các câu lệnh kích
hoạt trigger chỉ có tác dụng đối với đúng một dòng dữ liêu. Ta có thể nhận thấy là câu lệnh
UPDATE và DELETE thường có tác dụng trên nhiều dòng, câu lệnh INSERT mặc dù ít rơi vào
trường hợp này nhưng không phải là không gặp; đó là khi ta sử dụng câu lệnh có dạng INSERT
INTO ... SELECT ... Vậy làm thế nào để trigger hoạt động đúng trong trường hợp những câu lệnh
có tác động lên nhiều dòng dữ liệu?
Có hai giải pháp có thể sử dụng đối với vấn đề này:
• Sử dụng truy vấn con.
• Sử dụng biến con trỏ.
Ta hình dung vấn đề này và cách khắc phục qua ví dụ dưới đây:
Ví dụ: Ta xét lại trường hợp của hai bảng MATHANG và NHATKYBANHANG như sơ đồ dưới
đây:
77
Trigger dưới đây cập nhật lại số lượng hàng của bảng MATHANG khi câu lệnh UPDATE
được sử dụng để cập nhật cột SOLUONG của bảng NHATKYBANHANG.
CREATE TRIGGER trg_nhatkybanhang_update_soluong
ON nhatkybanhang
FOR UPDATE
AS
IF UPDATE(soluong)
UPDATE mathang
SET mathang.soluong = mathang.soluong –
(inserted.soluong-deleted.soluong)
FROM (deleted INNER JOIN inserted ON
deleted.stt = inserted.stt) INNER JOIN mathang
ON mathang.mahang = deleted.mahang
Với trigger được định nghĩa như trên, nếu thực hiện câu lệnh:
UPDATE nhatkybanhang
SET soluong = soluong + 10
WHERE stt = 1
thì dữ liệu trong hai bảng MATHANG và NHATKYBANHANG sẽ là:
Bài tập
Câu 1: Trình bày khái niệm về Trigger? So sánh sự khác biệt giữa Trigger và ràng buộc (constraint)
Câu 2: Trình bày cú pháp đầy đủ của các lệnh tạo, sửa, xóa Trigger và giải thích ý nghĩa của các
tham số.
Câu 3: Thế nào là Trigger đệ quy? Hãy đưa ra một ví dụ cài đặt Trigger đệ quy.
78
MỘT SỐ ĐỀ THI MẪU
79
Trường Đại Học Hàng Hải Việt Nam
Khoa Công nghệ Thông tin
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
THI KẾT THÚC HỌC PHẦN
Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
Năm học
: 2009 - 2010
Đề thi số:
Ký duyệt đề:
1
Thời gian: 60 phút
Câu 1: (3 điểm)
Viết các lệnh T-SQL để tạo cơ sở dữ liệu QLYBAIXE gồm các bảng dữ liệu sau đây:
ChuXe(MaCX, TenCX, DiaChi)
LoaiXe(MaLoai, TenLoai)
Xe(SoXe, MaCX, MaLoai)
NhatKyBai(SoXe, NgayVao, NgayRa)
Trong đó bảng NhatKyBai lưu giữ thông tin thời gian lưu bãi của xe. Một xe có thể vào bãi nhiều
lần. Xe nào chưa ra khỏi bãi thì có có trường NgayRa = NULL.
Câu 3: (4 điểm)
Viết các câu lệnh truy vấn trên cơ sở dữ liệu QLYBAIXE để thực hiện các nhiệm vụ sau:
1. Thống kê xem mỗi chủ xe sở hữu bao nhiêu loại xe khác nhau:
MaCX
TenCX
SoLoaiXe
2. Thống kê các xe hiện đang nằm trên bãi và số ngày lưu bãi tính từ lần vào gần nhất cho
đến thời điểm hiện tại
SoXe
SoNgayLuu
3. Thống kê các xe ra khỏi bãi vào tháng 10/2009 và tổng số ngày lưu bãi của các xe này qua
các lần ra vào bãi (tính từ lần vào đầu tiên cho tới lần ra cuối cùng)
SoXe
TongSoNgay
4. Thống kê số lần vào bãi của mỗi loại xe
MaLoai
TenLoai
SoLan
Câu 4: (3 điểm)
Viết một thủ tục thường trú có tên sp_ThemXe làm nhiệm vụ thêm một bản ghi mới vào bảng Xe
trong cơ sở dữ liệu QLYBAIXE. Biết xe mới thêm vào phải thỏa mãn các điều kiện:
o
Không có SoXe trùng với một xe nào đó đã có trên bảng.
o
Xe này phải thuộc sở hữu của một chủ xe có MaCX nằm trong bảng ChuXe
o
Xe này phải thuộc về một loại xe có MaLoai nằm trong bảng LoaiXe
80
Trường Đại Học Hàng Hải Việt Nam
Khoa Công nghệ Thông tin
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
THI KẾT THÚC HỌC PHẦN
Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
Năm học
: 2009 - 2010
Đề thi số:
Thời gian: 75 phút
Ký duyệt đề:
2
Câu 1: (3 điểm)
Hãy viết lệnh T-SQL tạo cơ sở dữ liệu có tên HDANDETAI gồm các bảng dữ liệu sau đây:
GiangVien(MaGV, TenGV)
DeTai(MaDT, TenDT)
SinhVien(MaSV, TenSV, Lop, MaDT, MaGVHD, MaGVPB)
Trong đó mỗi sinh viên chỉ được nhận một đề tài. Các sinh viên có thể nhận đề tài giống nhau. Mỗi
sinh viên có một giáo viên hướng dẫn và một giáo viên phản biện.
Câu 2: (4 điểm)
Viết các câu lệnh truy vấn trên cơ sở dữ liệu HDANDETAI thực hiện những công việc sau:
o
Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu sinh viên:
MaGV
o
SoSVPhanBien
TenGV
SoDeTaiHD
SoDeTaiPB
Hãy thống kê xem mỗi lớp nhận bao nhiêu đề tài khác nhau:
Lop
o
SoSVHuongDan
Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu đề tài khác nhau:
MaGV
o
TenGV
SoDeTai
Hãy thống kê xem mỗi giáo viên hướng dẫn sinh viên đến từ bao nhiêu lớp khác nhau:
MaGV
TenGV
SoLopHuongDan
Câu 3: (3 điểm)
Hãy xây dựng một hàm người dùng UDF để tính tổng các giai thừa:
F(n) = 1! + 2! + 3! + ... + n!
81
Trường Đại Học Hàng Hải Việt Nam
Khoa Công nghệ Thông tin
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
THI KẾT THÚC HỌC PHẦN
Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
Năm học
: 2009 - 2010
Thời gian: 60 phút
Đề thi số:
Ký duyệt đề:
3
Câu 1: (3 điểm)
Viết các lệnh T-SQL để cơ sở dữ liệu QLYNHANSU bao gồm các bảng dữ liệu sau:
PhongBan(MaPB, TenPB)
ChuyenMon(MaCM, TenCM)
NhanVien(MaNV, TenNV, MaPB, MaCM, LaTruongPhong)
Chú ý:
Mỗi phòng ban có một và chỉ một nhân viên giữ vị trí trưởng phòng. Nhân viên nào giữ vị trí
trưởng phòng thì trường LaTruongPhong = 1, còn bình thường mặc định LaTruongPhong = 0.
Câu 3: (3 điểm)
Hãy viết các câu lệnh truy vấn làm nhiệm vụ:
1. Thống kê ra mã nhân viên và tên của các vị trưởng phòng của những phòng ban có ít nhân
viên nhất
MaNV
TenNV
TenPB
2. Thống kê xem ứng với mỗi một phòng ban thì nhân viên phòng ban đó có bao nhiêu chuyên
môn khác nhau:
MaPB
TenPB
SoLuongCMBiet
3. Thống kê xem ứng với mỗi loại chuyên môn thì có bao nhiêu phòng ban có nhân viên biết
chuyên môn đó:
MaCM
TenCM
SoLuongPB
Câu 4: (4 điểm)
1. Tạo một view làm nhiệm vụ thống kê số lượng nhân viên của mỗi phòng ban:
MaPB
TenPB
SoLuongNV
2. Tạo một Trigger làm nhiệm vụ kiểm soát quá trình Insert và Update trên bảng NhanVien nhằm
đảm bảo sao cho ứng với mỗi phòng ban chỉ có một nhân viên được thiết lập là trưởng phòng
(có trường LaTruongPhong = 1).
82
Trường Đại Học Hàng Hải Việt Nam
Khoa Công nghệ Thông tin
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
THI KẾT THÚC HỌC PHẦN
Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
Năm học
: 2009 - 2010
Thời gian: 60 phút
Đề thi số:
Ký duyệt đề:
4
Câu 1: (3 điểm)
Viết các lệnh T-SQL tạo cơ sở dữ liệu QLYBANHANG gồm các bảng dữ liệu sau đây:
LoaiHang(MaLoai, TenLoai)
NhaCungCap(MaNCC, TenNCC, DiaChi, DienThoai)
HangNhap(MaHN, MaLoai, MaNCC, SoLuong, DonGia)
Câu 3: (3 điểm)
1. Thống kê xem mỗi nhà cung cấp đã cung cấp bao nhiêu loại hàng khác nhau:
MaNCC
TenNCC
SoLoaiHang
2. Thống kê xem mỗi loại hàng được cung cấp bởi bao nhiêu nhà cung cấp khác nhau:
MaNCC
TenNCC
SoLoaiHang
3. Thống kê số tiền phải thanh toán cho mỗi nhà cung cấp, biết số tiền phải thanh toán ứng với
mỗi MaHN là SoLuong * DonGia:
MaNCC
TenNCC
SoTien
Câu 4: (4 điểm)
1. Viết lệnh T-SQL định nghĩa một thủ tục thường trú có tên sp_AddHangNhap làm nhiệm vụ
thêm một bản ghi mới vào bảng hàng nhập. Dữ liệu nhập vào phải thỏa mãn tất cả các điều
kiện sau đây:

Có @MaHN không trùng với một MaHN nào đã có trong bảng

Có @MaLoai phải nằm trong số các MaLoai có mặt trong bảng LoaiHang

Có @MaNCC nằm trong số các MaNCC có mặt trong bảng NhaCungCap
Nếu thêm thành công, thủ tục trả về giá trị 1. Nếu dữ liệu không hợp lệ, thủ tục trả về giá trị 0.
2. Giả sử người ta không tạo ràng buộc khóa chính trên cột MaHN, hãy tạo một Trigger làm
nhiệm vụ kiểm soát việc Insert, Update trên bảng HangNhap để đảm bảo tính không trùng lặp
của dữ liệu nhập vào cột MaHN và dữ liệu điền vào cột SoLuong luôn phải thỏa mãn điều kiện
10 < SoLuong < 30.
83
Trường Đại Học Hàng Hải Việt Nam
Khoa Công nghệ Thông tin
BỘ MÔN HỆ THỐNG THÔNG TIN
-----***-----
THI KẾT THÚC HỌC PHẦN
Đề thi số:
Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
Năm học
: 2009 - 2010
Ký duyệt đề:
5
Thời gian: 60 phút
Câu 1: (3 điểm)
Viết các lệnh T-SQL tạo cơ sở dữ liệu CHOTHUEXE gồm các bảng dữ liệu sau đây:
LoaiXe(MaLoai, TenLoai, DonGiaTheoNgay)
KhachHang(MaKhach, TenKhach, DiaChi, DienThoai)
Xe(SoXe, MaLoai, TinhTrang)
NhatKyThue(SoXe, MaKhach, TuNgay, DenNgay)
Câu 3: (4 điểm)
Viết các câu lệnh truy vấn làm nhiệm vụ sau đây:
1. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu loại xe khác nhau:
MaKhach TenKhach
SoLoaiXeDaThue
2. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu chiếc xe khác nhau:
MaKhach TenKhach
SoLuongXeDaThue
3. Thống kê xem mỗi loại xe đã được bao nhiêu khách hàng khác nhau thuê:
MaLoai
TenLoai
SoKhachHang
4. Thống kê xem mỗi xe đã được bao nhiêu khách hàng khác nhau thuê:
SoXe
SoKhachHang
Câu 4: (3 điểm)
1. Hãy viết lệnh T-SQL định nghĩa ra một view thống kê số tiền mà khách phải trả cho mỗi lần
thuê xe:
SoXe
MaKhach
TuNgay DenNgay
SoNgayThue
DonGiaTheoNgay ThanhTien
Biết SoNgayThue = DenNgay - TuNgay, ThanhTien = SoNgayThue * DonGiaTheoNgay
2. Hãy viết lệnh T-SQL để định nghĩa một Trigger kiểm soát việc Insert, Update trên bảng
NhatKyThue sao cho luôn đảm bảo trên các trường TuNgay và DenNgay thì ngày bắt đầu luôn
phải có giá trị nhỏ ngày kết thúc (TuNgay < DenNgay).
Download