You are on page 1of 141

1

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


2

PHẦN A .................................................................................................................... 8
KIẾN THỨC CƠ BẢN .......................................................................................................... 8
Chương 1............................................................................................................................ 9
TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU ............................................................. 9
I. Khái niỆm chung .................................................................................... 9
1. Mở đầu ............................................................................................... 9
2. Định nghĩa cơ sở dữ liệu ..................................................................... 9
3. Định nghĩa môn Cơ sơ dữ liệu ......................................................... 10
4. Đặc tính của môi trường tập tin cổ điển ............................................ 10
5. Ưu điểm của CSDL .......................................................................... 10
II. Khung nhìn dỮ liỆu (view of data) ...................................................... 11
1. Sự trừu tượng hóa dữ liệu .............................................................. 11
2. Thể hiện và lược đồ của CSDL ...................................................... 13
3. Tính độc lập dữ liệu (data independence) .......................................... 14
III. HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ...................................................... 14
1. Định nghĩa........................................................................................ 14
2. Cách thức hoạt động tổng quát.......................................................... 15
IV. Các mô hình cỦa CSDL ..................................................................... 15
1. Mô hình hóa trong tin học................................................................. 15
2. Mô hình mạng (network model/ modèle réseaux) ............................. 16
3. Mô hình phân cấp ............................................................................. 17
4. Mô hình quan hệ............................................................................... 18
V. Ngôn NGỮ THAO TÁC DỮ LIỆU ..................................................... 19
1. Khái niệm về ngôn ngữ..................................................................... 19
2. Ngôn ngữ tự nhiên và ngôn ngữ hình thức ........................................ 19
3. Ngôn ngữ con định nghĩa dữ liệu ...................................................... 19
4. Ngôn ngữ con sử dụng dữ liệu .......................................................... 20
5. Các dạng thể hiện của ngôn ngữ ....................................................... 22
VI. QuẢn lý các GIAO TÁC/ giao DỊCH (transaction) ............................ 23
1. Giao tác ............................................................................................ 23
2. Các bộ phận phụ trách giao tác của HQTCSDL ................................ 23
VII. QUẢN LÝ BỘ NHỚ CỦA CSDL..................................................... 24
VIII. NGƯỜI QUẢN TRỊ CSDL ............................................................ 24
IX. NGƯỜI SỬ DỤNG CSDL ................................................................. 25
1. Người lập trình ứng dụng (application programmer) ......................... 25
2. Người sử dụng thành thạo (sophisticated user) .................................. 25
3. Người sử dụng theo chuyên ngành (specialized user) ........................ 25

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


3

4. Người sử dụng sơ cấp (naive user) .................................................... 25


X. CẤu trúc HQTCSDL ........................................................................... 25
Chương 2.......................................................................................................................... 28
MÔ HÌNH QUAN HỆ ................................................................................. 28
I. CÁC ĐỊNH NGHĨA ............................................................................. 28
1. Miền giá trị và thuộc tính .................................................................. 28
2. Quan hệ, bộ ...................................................................................... 28
3. Bậc (arity / arité, degree/ degré) ........................................................ 29
4. Sơ đồ quan hệ ................................................................................... 29
5. Bảng (table/ tableau)......................................................................... 29
6. Khóa của quan hệ (key/ clé).............................................................. 30
II. RÀNG BUỘC TOÀN VẸN TRÊN CSDL QUAN HỆ ......................... 31
1. Khái niệm chung .............................................................................. 31
2. Ràng buộc về khóa ........................................................................... 31
3. Ràng buộc về trị ............................................................................... 31
4. Ràng buộc về tính duy nhất của thuộc tính (unicity of attribute)........ 31
5. Ràng buộc về khóa ngoài/ ràng buộc tham chiếu .............................. 32
6. Ràng buộc toàn vẹn về luận lý .......................................................... 34
7. DML và việc hợp lệ hóa các ràng buộc ............................................. 38
8. Sự kích hoạt và sự thời hóa các ràng buộc ........................................ 39
III. CÁC THAO TAC CẬP NHẬT TRÊN CSDL QUAN HỆ................... 39
1. Thêm một bộ vào một quan hệ ...................................................... 39
2. Xóa một bộ ra khỏi một quan hệ .................................................... 40
3. Sửa đổi trị một số thuộc tính .......................................................... 40
IV. sỰ THÔNG THƯƠNG GIỮA CÁC QUAN HỆ ................................ 41
Chương 3.......................................................................................................................... 45
ĐẠI SỐ QUAN HỆ ..................................................................................... 45
I. GIỚI THIỆU ......................................................................................... 45
II. MỘT SỐ KHÁI NIỆM ........................................................................ 45
1. Đại số hệ .......................................................................................... 45
2. Đại số quan hệ .................................................................................. 45
3. Biểu thức quan hệ ............................................................................. 46
III. CÁC PHÉP TOÁN CƠ BẢN ............................................................. 46
1. Phép chọn ......................................................................................... 46
2. Phép chiếu (projection) ..................................................................... 47
4. Quan hệ tương thích (compatible relations) ...................................... 48
5. Phép trừ (substraction, [set] difference) ............................................ 48

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


4

6. Phép hội/ hợp (union) ....................................................................... 49


7. Phép lấy tích Đề- các (Cartesian product/ produit cartésien) ............. 50
8. Phép đặt tên lại biểu thức quan hệ ..................................................... 51
III. CÁC PHÉP TOÁN KHÁC ................................................................. 53
1. Phép giao (intersection) .................................................................... 53
2. Phép chia (division) .......................................................................... 54
3. Phép kết nối bình thường (join, inner join) ........................................ 56
4. Phép kết nối tự nhiên (natural join) ................................................... 58
5. Phép kết nối mở rộng (outer join) ..................................................... 59
6. Các hàm kết tập (aggregate functions) ............................................. 61
Chương 4.......................................................................................................................... 66
NGÔN NGỮ HỎI SQL ................................................................................ 66
I. GIỚI THIỆU NGÔN NGỮ SQL ........................................................... 66
1. Sự cần thiết của ngôn ngữ hỏi SQL................................................... 66
2. Sự xuất hiện của SQL ....................................................................... 66
3. Ưu điểm của SQL ............................................................................. 67
4. Các tiện ích của SQL ........................................................................ 67
5. Phạm vi trình bày SQL trong bài giảng ............................................. 68
II. CÁC LỆNH DDL ĐỊNH NGHĨA VÀ CẬP NHẬT SƠ ĐỒ CSDL Trong
SQL-99 ................................................................................................................ 69
1. Tạo bảng .......................................................................................... 69
2. Định nghĩa ràng buộc toàn vẹn trên nhiều bảng ................................ 71
3. Định nghĩa miền giá trị ..................................................................... 71
4. Sửa sơ đồ quan hệ............................................................................. 71
5. Xóa một quan hệ .............................................................................. 72
6. Tạo khung nhìn ................................................................................ 72
III. CÁC LỆNH DDL ĐỊNH NGHĨA VÀ CẬP NHẬT SƠ ĐỒ CSDL
TRONG SQL SERVER 2008 .............................................................................. 72
1. Tạo CSDL ........................................................................................ 72
2. Tạo bảng .......................................................................................... 73
3. Kiểu dữ liệu trong SQL Server ......................................................... 76
b. Giải thích.......................................................................................... 77
5. Xóa một quan hệ .............................................................................. 86
6. Tạo khung nhìn ................................................................................ 87
IV. CÁC LỆNH CẬP NHẬT DỮ LIỆU ................................................... 89
1. Sửa dữ liệu ....................................................................................... 89
2. Xóa một số dòng .............................................................................. 90

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


5

3. Xóa tất cả các dòng .......................................................................... 90


4. Thêm vào bảng một bộ cụ thể ........................................................... 90
5. Thêm vào bảng một số dòng từ mảng trong bộ nhớ........................... 91
V. CÁC LỆNH DML CHO TÌM KIẾM ................................................... 92
1. Giới thiệu chung về lệnh SELECT.................................................... 92
2. Lệnh SELECT trong SQL Server...................................................... 92
3. Lệnh SELECT trong Oracle9i........................................................... 93
4. Tìm kiếm đơn giản (SELECT ... FROM ... ) ..................................... 94
5. Tìm kiếm phần tử duy nhất ............................................................... 96
6. Tìm kiếm tất cả các cột ..................................................................... 96
7. Tìm kiếm theo điều kiện ................................................................... 97
8.Tìm kiếm dựa trên hằng ..................................................................... 98
9. Tìm kiếm có sắp xếp......................................................................... 99
10. Tìm kiếm sử dụng ánh xạ lồng nhau (2 mức lồng) ........................ 100
11. Tìm kiếm đồng thời từ nhiều bảng ................................................ 104
12. Tìm kiếm có chứa GROUP BY, HAVING ................................... 107
13. Tìm kiếm có chứa phép tính tập hợp (UNION, INTERSECT, MINUS)
...................................................................................................................... 109
14. Tìm kiếm có chứa một bộ đã được liệt kê ..................................... 110
IV. CÁC HÀM KẾT TẬP ...................................................................... 111
1. SUM .............................................................................................. 111
2. AVG .............................................................................................. 111
3. COUNT.......................................................................................... 111
4. MAX .............................................................................................. 112
5. MIN ............................................................................................... 112
6. STDDEV ........................................................................................ 113
7. VARIANCE ................................................................................... 113
IX. CÁC LỆNH KHÁC TRONG SQL ................................................... 114
A. Lệnh tìm kiếm ............................................................................... 114
B. Các lệnh định nghĩa và cập nhật CSDL .......................................... 115
C. Các phép tính về an ninh, an toàn dữ liệu ....................................... 116
PHẦN B ................................................................................................................ 118
LÝ THUYẾT VỀ ............................................................................................................... 118
THIẾT KẾ.......................................................................................................................... 118
CSDL QUAN HỆ .............................................................................................................. 118
Chương 5........................................................................................................................ 119
CÁC LOẠI PHỤ THUỘC DỮ LIỆU ......................................................... 119

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


6

I. GIỚI THIỆU VẤN ĐỀ ....................................................................... 119


1. Tình hình thực tế và nhu cầu........................................................... 119
2. Sự phụ thuộc dữ liệu ....................................................................... 119
3. Các vấn đề nảy sinh đối với một CSDL không tốt ........................... 119
II. PHỤ THUỘC HÀM .......................................................................... 121
1. Định nghĩa...................................................................................... 121
2. Một số tính chất của phụ thuộc hàm................................................ 121
III. BAO ĐÓNG (closure) ...................................................................... 122
1. Định nghĩa suy diễn theo logic........................................................ 122
2. Bao đóng của tập các phụ thuộc hàm .............................................. 122
3. Bao đóng của tập các thuộc tính đối với tập các phụ thuộc hàm ...... 122
IV. CÁC HỆ TIÊN ĐỀ ........................................................................... 123
1. Hệ tiên đề Amstrong ....................................................................... 123
2. Các hệ tiên đề khác ......................................................................... 124
3. Bổ đề 2 ........................................................................................... 124
4. Định lý 1 ........................................................................................ 124
5. Định nghĩa khác của bao đóng của tập các phụ thuộc hàm .............. 124
6. Định nghĩa khác của bao đóng của tập các thuộc tính .................... 124
V. THUẬT TOÁN TÌM BAO ĐÓNG .................................................... 125
1. Giới hạn vấn đề .............................................................................. 125
2. Giải thuật 1..................................................................................... 125
3. Ví dụ .............................................................................................. 125
4. Định lý 2 ........................................................................................ 126
VI. PHỦ CỦA CÁC PHỤ THUỘC HÀM .............................................. 126
1. Sự tương đương giữa các tập phụ thuộc hàm- Phủ của tập phụ thuộc hàm
...................................................................................................................... 126
2. Bổ đề 3 ........................................................................................... 126
3. Tập phụ thuộc hàm tối tiểu ............................................................. 127
4. Định lý 3 ..................................................................................... 127
5. Ví dụ ........................................................................................... 127
VII. PHỤ THUỘC ĐA TRỊ .................................................................... 128
1. Định nghĩa...................................................................................... 128
2. Ví dụ .............................................................................................. 129
3. Sự liên quan giữa phụ thuộc hàm và phụ thuộc đa trị ...................... 130
Chương 6........................................................................................................................ 132
CHUẨN HÓA SƠ ĐỒ QUAN HỆ ............................................................. 132
I. KHÓA CỦA SƠ ĐỒ QUAN HỆ......................................................... 132

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


7

1. Khóa (key) ..................................................................................... 132


2. Siêu khóa (superkey) ...................................................................... 133
II. CÁC DẠNG CHUẨN CỦA CÁC SƠ ĐỒ QUAN HỆ ....................... 133
1. Thuộc tính nguyên tố, không nguyên tố .......................................... 133
2. Các dạng phụ thuộc hàm................................................................. 133
3. Sự chuẩn hóa một quan hệ .............................................................. 134
4. Dạng chuẩn thứ nhất (1NF) ............................................................ 135
5. Dạng chuẩn thứ hai (2NF) .............................................................. 136
6. Dạng chuẩn thứ ba (3NF) ............................................................... 136
7. Dạng chuẩn Boyce-Codd (BCNF) .................................................. 137
8. Dạng chuẩn thứ tư (4NF) ................................................................ 137
III. LỢI ÍCH CỦA VIỆC CHUẨN HÓA ................................................ 138
1. Tầm quan trọng của các phụ thuộc hàm .......................................... 138
2. Nhược điểm của phụ thuộc từng phần ............................................. 138
3. Nhược điểm của phụ thuộc truyền .................................................. 138
4. Lợi ích của các dạng chuẩn ............................................................. 139

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


8

PHẦN A

KIẾN THỨC CƠ BẢN

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


9

Chương 1
TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU

I. KHÁI NIỆM CHUNG


1. Mở đầu
a. Ví dụ 1
Xét các hoạt động đào tạo trong một trường đại học. Các thông tin cần chứa gồm
có:
- danh sách các bộ môn trong trường
- hồ sơ lý lịch của từng sinh viên
- hồ sơ lý lịch của từng CBGD và công việc của họ (gồm cả các bộ môn liên
quan và các môn học họ có giảng dạy)
- danh sách các môn học ứng với từng bộ môn
- v.v...
Phòng Tổ chức quan tâm hồ sơ lý lịch của CBGD mà không quan tâm hồ sơ lý
lịch SV; còn Phòng Đào tạo lại theo dõi quá trình học tập của SV mà không cần biết
chi tiết công việc CBGD.
b. Ví dụ 2
Xét các hoạt động mua bán của một công ty thương nghiệp. Các thông tin cần
chứa gồm có:
- danh sách các mặt hàng
- danh sách các cửa hàng
- danh sách các nhân viên ở từng cửa hàng
- danh sách các đại lý
- danh sách các nhà cung cấp
- ...
Cô nhân viên cửa hàng chỉ theo dõi các thông tin về các mặt hàng (mã hàng, tên
hàng, đơn giá, đơn vị tính...), không để ý ai là nhà cung cấp hàng cho công ty.
c. Nhận xét
Nếu dùng từ "xí nghiệp" (enterprise) như là một thuật ngữ chung để chỉ nơi xảy
ra những hoạt động thương mại, hoặc khoa học, kỹ thuật, hoặc hoạt động khác có qui
mô đủ lớn, và giả sử sử xí nghiệp này được tin học hóa, ta có nhận xét như sau:
* Các thông tin trên được chứa trên các bộ nhớ ngoài, như một kho dữ liệu.
Kho này không quan tâm đến dữ liệu vào và dữ liệu ra, mà chỉ gồm các dữ liệu liên
quan hoạt động của xí nghiệp.
* Chúng được một bộ chương trình ứng dụng truy xuất.
* Ở mỗi lĩnh vực của xí nghiệp có một nhóm người sử dụng một phần nhỏ của
kho dữ liệu nói trên mà không bận tâm đến cấu trúc lưu trữ bên trong. Họ cũng không
chú ý đến các dữ liệu khác cũng trong kho nhưng không liên quan đến hoạt động của
mình; nghĩa là mỡi người sư dụng chỉ được nhìn vào kho dữ liệu như qua một cái
khung và họ có cảm tưởng như kho dữ liệu chỉ dành cho họ thôi.
2. Định nghĩa cơ sở dữ liệu
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
10

(database/ bases de données):


Cơ sở dữ liệu là một tập hợp các dữ liệu có cấu trúc được ghi trên các bộ nhớ
ngoài của máy tính, về các đối tượng và hoạt động trong thế giới thực của một xí
nghiệp (nói chung), và được các hệ ứng dụng của xí nghiệp này sử dụng một cách có
chọn lọc và đúng lúc.
3. Định nghĩa môn Cơ sơ dữ liệu
Môn Cơ sở dữ liệu là lĩnh vực của tin học chuyên nghiên cứu các cơ chế,
nguyên lý, phương pháp tổ chức các nhóm dữ liệu trên các bộ nhớ ngoài (các loại đĩa
từ, đĩa quang...) nhằm phục vụ cho việc khai thác dữ liệu trong các hệ thống tin học
ứng dụng như các hệ lưu trữ và tra cứu thông tin, các hệ quản lý xí nghiệp hoặc ngành...
4. Đặc tính của môi trường tập tin cổ điển
- Dễ xảy ra tình trạng dữ liệu bị trùng lắp, phân tán, thiếu nhất quán:
* Trong phần lớn các hệ thống không tổ chức dữ liệu thành CSDL, mỗi lĩnh
vực ứng dụng trong cùng xí nghiệp lại có những tập tin riêng về cùng một thông tin.
Điều đó thường dẫn đến sự dư thừa đáng kể về dữ liệu lưu trữ và kết quả của nó là sự
lãng phí bộ nhớ. Ví dụ, trong trường Đại học, kết quả học tập của SV được lưu ở Phòng
Đào tạo, đồng thời cũng được lưu ở Phòng Tài vụ để căn cứ vào đó mà phát học bổng
cho SV.
* Thường xảy ra trường hợp nhiều người cùng thao tác trên một thông tin về
một đối tượng của thế giới thực.
Nếu đối tượng này lại được miêu tả thành 2 mục riêng biệt, thì khi nó có sự thay
đổi, 2 mục này thường bị cập nhật không đồng thời hoặc 1 mục bị quên không cập
nhật. Khi đó, sẽ xảy ra sự không nhất quán trong miêu tả thông tin của xí nghiệp. Ví
dụ, kết quả học tập của một SV đã bị sút giảm, do đó em này đáng lý không còn được
nhận học bổng như trước nữa. Nhưng Phòng Tài vụ không cập nhật kịp thời thông tin
trên, nên vẫn tiếp tục phát học bổng cho em.
- Chương trình ứng dụng làm chủ những cách tổ chức số liệu nên nó bị phụ
thuộc dữ liệu. Hơn nữa, phí tổn viết và bảo trì chương trình cao.
- Số lượng dữ liệu tăng nhanh.
- Sự chia sẻ dữ liệu bị hạn chế
Nếu đối tượng vẫn được tổ chức thành 1 mục, nhưng mục dữ liệu bị cập nhật bởi
2 thao tác gần giống nhau xảy ra đồng thời một cách không hợp lý, sẽ có thể sinh ra kết
quả không chấp nhận được. Ví dụ, có 2 khách hàng cùng lúc yêu cầu dành 1 chỗ trên
một chuyến bay. Bình thường, chương trình sẽ dành 1 ghế trống cho khách, và trừ số
ghế còn trống đi cho 1. Lần này, thay vì số ghế còn trống phải bị trừ đi 2, nó chỉ bị trừ đi
1 và có thể 2 người khách trên lại được dành cho cùng 1 chỗ.
- Cùng một loại dữ liệu nhưng tập tin thường trực khác với tập tin biến động
- Các mối liên hệ giữa những thông tin không được chú trọng
5. Ưu điểm của CSDL
a. Có thể giảm bớt sự dư thừa dữ liệu lưu trữ
Khi có hai hệ ứng dụng khác nhau thực chất cùng đòi hỏi những tập dữ liệu
như nhau, người quản trị (database manager) sẽ hợp nhất hai tập này lại, chỉ lưu trữ
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
11

một lần và dùng chung cho cả hai hệ nói trên


b. Có thể tránh được sự không nhất quán trong dữ liệu lưu trữ
Hệ quản trị CSDL sẽ cho cách bảo vệ chống lại tính không nhất quán như vừa
nói.
c. Dữ liệu lưu trữ có thể được sử dụng chung
Trong CSDL, các tập tin dữ liệu được gom lại để có thể được dùng chung cho
tất cả các ứng dụng, cả cho các chương trình ứng dụng mới.
d. Có thể bảo đảm được sự tuân thủ các tiêu chuẩn thống nhất
CSDL giúp bảo đảm tuân thủ các nguyên tắc về biểu diễn dữ liệu của hệ thống
ban ngành của xí nghiệp (Ví dụ, các báo biểu trong ngành tài chánh hay ngân hàng) hay
của trung tâm tính toán. Như vậy, việc bảo trì và trao đổi dữ liệu giữa các nơi liên
quan sẽ dễ dàng
e. Có thể áp dụng được các biện pháp an toàn dữ liệu
Không phải người sử dụng nào cũng có thể được truy xuất đến toàn bộ dữ liệu.
Người quản trị CSDL có thể:
* Chỉ cho phép một số người nào đó được quyền truy xuất tới một số tập tin nào
đó thôi, bằng một mật mã đã được người quản trị định trước.
* Kiểm tra các ý đồ truy xuất đến dữ liệu mật.
f. Có thể giữ được sự toàn vẹn dữ liệu
CSDL chỉ được chứa các dữ liệu đúng. Nhờ sự quản lý tập trung, nó cho phép
người quản trị định ra các thủ tục kiểm tra cần thiết khi thực hiện các thao tác cập
nhật.
Dễ kiểm tra nhất là các tính chất về giá trị (ví dụ, số lượng hàng bán không thể
vượt quá số lượng hàng đang tồn). Khó kiểm tra hơn khi đề cập đến các yêu cầu mang
tính cấu trúc, chẳng hạn không thể gán hai chiếc máy bay cho cùng một chuyến bay.
g. Có thể cân bằng được các yêu cầu đối lập nhau
Nhờ biết được tất cả các yêu cầu của toàn bộ xí nghiệp, người quản trị có thể thiết
kế CSDL theo cách thức làm cho mọi người đều cảm thấy thỏa mãn, chứ không để rơi
vào tình trạng "cát cứ" kiểu "sứ quân" như trước.
h. Ý nghĩa của từng liên hệ giữa các loại dữ liệu được nổi bật
i. Có thể đảm bảo tính độc lập dữ liệu cao
Đây là hệ quả của các ưu điểm trên, nhưng lại là ưu điểm rất quan trọng.
II. KHUNG NHÌN DỮ LIỆU (VIEW OF DATA)
1. Sự trừu tượng hóa dữ liệu
Vì những người sử dụng không phải luôn thành thạo về máy tính, các nhà tin học
phải che dấu họ sự phức tạp về biẻu diễn bên trong của dữ liệu trong máy, thông qua
nhiều mức trừu tượng hóa dữ liệu để làm đơn giản hóa sự tương tác giữa người sử dụng
và hệ thống:
a. Mức vật lý (physical level)
Mức thấp nhất của sự trừu tượng hóa, mô tả cách thức dữ liệu được lưu trữ thực
sự.
Ví dụ, các mẫu tin được lưu như một khối các vị trí lưu trữ liên tiếp nhau (byte, từ
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
12

nhớ, .. .). Trình biên dịch che dấu các chi tiết này không cho người lập trình thông tường
biết, trừ các người quản trị CSDL.
b. Mức luận lý (logical level)
Mức trung gian, mô tả những dữ liệu nào được lưu trữ trong CSDL và mối liên
kết (relationship) giữa chúng. Người quản trị CSDL (database administrator ) và các
nhà lập trình thường xuyên làm việc ở mức này.
c. Mức quan niệm (conceptual level) hay còn gọi là mức khung nhìn (view level)
Mức cao nhất của việc trừu tượng hóa, gồm các khung nhìn mô tả chỉ một phần
của tòan bộ CSDL. Mặc dù đã các cấu trúc đã được đơn giản đi nhờ mức luận lý, nhưng
do CSDL có kích thước lớn, nó vẫn còn phức tạp. Nhiều người sử dụng sẽ cần truy xuất
chỉ một phần CSDL và không thấy liên quan gì đến các phần khác. Như vậy khung nhìn
được đặt ra để che bớt đi các chi tiết không cần thiết đối với một nhóm người sử dụng
nào đó, giúp làm đơn giản hóa đi sự tương tác giữa họ với hệ thống. Ngoài ra, khung
nhìn cũng cung cấp cơ chế an tòan để ngăn ngừa người sử dụng truy xuất trái phép các
phần thẩm quyền.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


13

Hệ quản
Nhóm người Khung nhìn 1 trị CSDL
sử dụng 1

Nhóm người Khung nhìn 2 CSDL quan niệm CSDL vật lý


sử dụng 2

.
.. Anh xạ
trong
Nhóm Khung nhìn n
người sử Anh xạ
dụng n ngoài

Mức quan niệm Mức logic Mức vật lý


Cài đặ trên các
Khung nhçn Định nghĩa và ánh Định nghĩa và ánh
thiết bị vật lý
xạ viết theo ngôn xạ viết theo ngôn
ngữ định nghĩa ngữ định nghĩa
dữ liệu cho sơ đồ dữ liệu
con

Hình 1. Các mức trừu tượng hóa dữ liệu

Ví dụ: Nhân viên bán hàng chỉ thấy được dữ liệu về doanh số của cửa hàng, chứ
không thấy được dữ liệu về nhân sự (lương bổng, lý lịch ...).

2. Thể hiện và lược đồ của CSDL


(database instance & database schema)
a. Thể hiện của CSDL
CSDL luôn thay đổi mỗi khi thông tin được thêm vào hay bị xóa đi. Tập hợp các
thông tin lưu trữ trong CSDL tại một thời điểm nào đó được gọi là một thể hiện của
CSDL.
b. Lược đồ của CSDL
Thiết kế tổng quan của CSDL được gọi là lược đồ (hay sơ đồ) của CSDL. Lược
đồ CSDL ít khi bị thay đổi. Trong một ngôn ngữ lập trình, nó tương ứng với tập các định
nghĩa của các kiểu dữ liệu (kiểu mẫu tin, kiểu bảng, .. .)
HQTCSDL có nhiều lược đồ, được phân chia tùy theo mức độ trừu tượng:
thường là một lược đồ vật lý, một lược đồ luận lý và nhiều lược đồ con (subschemas).
c. Liên quan giữa khung nhìn và lược đồ

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


14

Mỗi khung nhìn (view) chính là một lược đồ con, là sự trừu tượng hoá một phần
của CSDL quan niệm.
Nhiều HQTDL cung cấp các "ngôn ngữ định nghĩa dữ liệu cho lược đồ con"
(subscheme data definition language) để khai báo các khung nhìn và các "ngôn ngữ sử
dụng dữ liệu cho lược đồ con" (subscheme data manipulation language) để biểu diễn
các câu hỏi và các toán tử trên các khung nhìn.
3. Tính độc lập dữ liệu (data independence)
a. Sự phụ thuộc dữ liệu của các hệ ứng dụng hiện nay
Một hệ ứng dụng được gọi là phụ thuộc dữ liệu khi không thể thay đổi được cấu
trúc lưu trữ hoặc chiến lược truy xuất mà không ảnh hưởng đến chương trình ứng dụng.
lý tập tin, chứ không liên quan gì đến vấn đề mà hệ ứng dụng viết ra để giải
quyết.
b. Yêu cầu của các hệ ứng dụng (applications)
* Các hệ ứng dụng khác nhau cần có những cái nhìn khác nhau đối với nhũng
dữ liệu như nhau. Ví dụ, chương trình tính toán của cửa hàng thì cho vùng "số lượng
hàng bán" theo kiểu số nguyên, trong khi hệ ứng dụng của Phòng kế toán lại muốn
vùng này phải theo kiểu số thực (có số thập phân) để dễ theo dạng thống nhất của ngành
Tài chánh.
* Người quản trị CSDL phải có khả năng thay đổi cấu trúc lưu trữ hoặc chiến
lược truy xuất để đáp ứng các yêu cầu thay đổi mà không cần phải sửa đổi các chương
trình ứng dụng hiện có.
c. Định nghĩa tính độc lập dữ liệu
Tính độc lập dữ liệu là tính bất biến của các hệ ứng dụng đối với các thay đổi
trong cấu trúc lưu trữ và chiến lược truy xuất.
d. Phân loại tính độc lập dữ liệu
* Độc lập dữ liệu ở mức vật lý
Các thay đổi về cách tổ chức vật lý của CSDL có thể ảnh hưởng đến tính hiệu
quả của các chương trình ứng dụng, nhưng chúng không bao giờ yêu cầu viết lại các
chương trình đó.
* Độc lập dữ liệu ở mức logic
Khi sử dụng CSDL, có thể thay đổi sơ đồ quan niệm, như thêm thông tin vào
các kiểu khác nhau của thực thể, hay xóa bớt thông tin về các thực thể đang hiện hữu.
Nhiều thay đổi của sơ đồ quan niệm không làm ảnh hưởng đến các sơ đồ con đang có,
hoặc có thể thực hiện bằng cách định nghĩa lại ánh xạ từ sơ đồ con đến sơ đồ quan
niệm. Do đó, không cần phải sửa đổi lại các chương trình ứng dụng.
III. HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
(DBMS: Database management system
/ SGBD: Système de Gestion de Bases de Données)
1. Định nghĩa
Hệ quản trị cơ sở dữ liệu (HQTCSDL) là một hệ thống phần mềm nhằm cung
cấp cho người sử dụng một môi trường vừa thích hợp, vừa hiệu quả để khai thác CSDL
theo 3 chức năng mô tả, lưu trữ, tìm kiếm, và cập nhật dữ liệu.
Như vậy, HQTCSDL phải được thiết kế sao cho quản trị đuợc một khối lượng

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


15

lớn dữ liệu. Công việc quản trị này bao gồm:


 định nghĩa các cấu trúc để lưu trữ thông tin
 cung cấp cơ chế để sử dụng thông tin
 tạo sự an tòan cho dữ liệu, cho dù có bất trắc cho hệ thống
2. Cách thức hoạt động tổng quát
Jeffrey D. Ullmann đưa ra một mô hình như sau trong quyển “Principles of
database systems”, 1982.

Cáu hoíi Q2 Cáu hoíi Q1 Så âäö


cuía CT æï.duûng cuía ngæåìi sæí CSDL
duûng

Trçnh xæí lyï Trçnh biãn dëch


cáu hoíi DDL

Cáu hoíi Q2’


âaî biãn dëch

Ngæåìi quaín trë Mä taí


CSDL CSDL

Hãû quaín lyï


táûp tin

CSDL
váût lyï

Hình 2. Mô hình Hệ quản trị cơ sở dữ liệu

Ta thấy HQTCSDL như một trình diễn dịch của một ngôn ngữ lập trình cấp cao,
cho phép người sử dụng đặc tả những gì phải làm, ít hoặc không bận tâm đến các giải
thuật chi tiết hay sự biểu diễn dữ liệu trong hệ thống máy tính.
HQTCSDL là một trong những phần mềm phức tạp nhất hiện nay.
IV. CÁC MÔ HÌNH CỦA CSDL
1. Mô hình hóa trong tin học
Mô hình hóa là sự lập tương quan giữa các đặc trưng, thuộc tính của đối tượng
với các phần tử của một tập cho trước, sao cho thông tin về động thái của các phần tử
trong tập này thể hiện được sự vận động của đối tượng được mô hình hóa.
Trong tin học, một mô hình dữ liệu bao gồm 2 thành phần:
a. Một khái niệm toán học cho việc biểu diễn dữ liệu và các mối liên hệ.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
16

b. Các toán tử trên dữ liệu để biểu diễn các câu hỏi và các sử dụng dữ liệu khác.
Ví dụ:

Gọi x: thực thể sinh viên vào tháng 7/93


x': ------------------------------ 7/94
t: hàm thời gian đã biến đổi x:
x'=t(x)
m: hàm liệt kê thông tin của x năm 93
y=m(x)
P: cơ chế để cập nhật thông tin
y'=P(y)=P(m(x))
năm 94: y''=m(x')
Cơ chế <m, P> làm việc đúng thì:
y'=y''
 P(m(x)) = m(t(x)) (*)
(*) là điều kiện giao hoán của mô hình <m, P>.

7/1993
7/1994
x t
x’

m
m
P(m(x))=m(t(x))

y=m(x) P
y’’
y’

Hình 3. Mô hình hóa trong tin học

Có 4 mô hình dữ liệu: mạng, phân cấp, quan hệ và CSDL hướng đối tượng.
Ở đây, ta chỉ xét 3 mô hình đầu tiên. CSDL hướng đối tượng được trình bày trong
một chuyên đề riêng, không nằm trong khuôn khổ của giáo trình này.
Mặt khác, về mặt tổ chức, thêm vào CSDL dạng tập trung là CSDL phân tán, sẽ
được giới thiệu trong một chương sau này.
2. Mô hình mạng (network model/ modèle réseaux)
a. Khái niệm chung
Nói chung, mô hình dữ liệu kiểu mạng là mô hình cho phép dùng một mô hình đồ
thị trực tiếp và đơn giản cho dữ liệu. Hơn nữa, việc cài đặt các liên kết cũng đơn giản
hơn.
b. Các thành phần của cấu trúc mạng
Mô hình mạng được xây dựng dựa trên các đơn thể (module) cơ sở xác định bởi:
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
17

* 2 kiểu mẫu tin (record type) là:


. mẫu tin chủ (owner)
. và mẫu tin thành viên (member).
* Một kiểu liên kết (set type) đi từ mẫu tin chủ đến mẫu tin thành viên {,
tương ứng với liên kết một-nhiều trong mô hình thực thể.}
Ta còn có các khái niệm sau:
- mẫu tin: là một thể hiện (insntance/ occurrence) của kiểu mẫu tin, mang
giá trị cụ thể
- liên kết:là một thể hiện của kiểu liên kết, chứa các con trỏ để nối kết
giữa mẫu tin chủ và mẫu tin thành viên.
- vùng (field): là thành phần của kiểu mẫu tin, mỗi giá trị cụ thể của vùng
được gọi là thể hiện của vùng. Một mẫu tin gồm nhiều thể hiện của vùng.
c. Ví dụ

KHÁCH HÀNG NHÀ CUNG CẤP

S S
1 S 3
ĐẶT HÀNG HÀNG HÓA
2

Hình 4. Ví dụ về mô hình mạng

Trong ví dụ trên:
- S1, S2, S3 là các liên kết
- NHÀ CUNG CấP, KHÁCH HÀNG là các mẫu tin chủ của các liên kết
S1 và S3 theo thứ tự.
- ĐặT HÀNG là mẫu tin thành viên của cả hai liên kết S2 và S3
- HÀNG HÓA là mẫu tin thành viên của S3, đồng thời là mẫu tin chủ của
S2.
3. Mô hình phân cấp
(hierarchical model/ modèle hiérarchique)
a. Khái niệm
Mô hình phân cấp khá phù hợp với những hình thức tổ chức phân cấp trong xã
hội. Thường gặp trong các hệ thống máy tính là mô hình quản lý thư mục.
b. Các thành phần của mô hình phân cấp:
Là mô hình mạng đặc biệt mang dạng "rừng", trong đó:
- các nút tương ứng với các kiểu mẫu tin, khái niệm "kiểu mẫu tin" vẫn như cũ,
- giữa hai kiểu mẫu tin có không quá một cung, tương ứng với kiểu liên kết và
liên kết này tuân thủ trật tự từ trên xuống dưới.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


18

Đặc điểm nổi bật trong các thủ tục truy xuất đến một đối tượng trong mô hình
phân cấp là đường dẫn đi từ gốc đến phần tử cần xét trong cây phân cấp.
c. Ví dụ

TỈNH

HUYỆN 1 HUYỆN 2 HUYỆN n


.
..

. X X . X .
.. Ã1 Ã2 .. Ãn ..
Hình 5. Ví dụ về mô hình phân cấp

4. Mô hình quan hệ
(relational model/ modèle relationnel)
a. Khái niệm
Là một mô hình có nguồn gốc trực tiếp từ lý thuyết toán học về quan hệ. Được đề
xuất từ năm 1970 từ Codd, một nhân viên của hãng IBM, nó nhanh chóng phát triển và
được nhiều người quan tâm nhờ có nhiều ưu điểm:
- Cơ sở toán học chặt chẽ cho phép áp dụng rộng rãi các công cụ đại số và logic
- Khá tự nhiên, gần gũi với ngôn ngữ thông thường
- Ngôn ngữ thao tác trong sáng và có khả năng tổ hợp cao
- Dễ đảm bảo tính an toàn dữ liệu
- Dễ cập nhật đến các đơn vị dữ liệu
- Dễ đảm bảo tính độc lập dữ liệu
b. Các thành phần của mô hình
Mô hình quan hệ gồm nhiều quan hệ (relation). Mỗi quan hệ là một tập con của
tích Đề- các giữa một hay nhiều miền giá trị (domain/ domaine). Mỗi phần tử của quan
hệ được gọi là bộ (tuple/ uplet).
Quan hệ có hình ảnh trực quan là bảng (table/ tableau). Một bảng gồm nhiều
dòng tương ứng với các bộ và nhiều cột tương ứng với các thuộc tính (attribute). Tập
hợp gồm tên của các thuộc tính được gọi là sơ đồ quan hệ (relation scheme).
c. Ví dụ

HÀNG HÓA MÃ HÀNG TÊN HÀNG ĐƠN VỊ TÍNH


A01 Vải soie mét
A02 Vải silk mét

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


19

Quan hệ Hàng hóa được mô tả bằng bảng như trên, với:


 MÃ HÀNG, TÊN HÀNG, ĐƠN Vị TÍNH là các thuộc tính, biểu thị qua
các cột trong bảng
 Hàng hóa = (mã hàng, tên hàng, đơn vị tính) là sơ đồ quan hệ
 (A01, Vải soie, mét) là một bộ của quan hệ, biểu thị qua dòng thứ hai
trong bảng
 Miền giá trị của TÊN HÀNG là D1= tập các chuỗi ký tự có chiều dài bất
kỳ
 Miền giá trị của ĐƠN Vị TÍNH là D2= D1
 Miền giá trị của MÃ HÀNG là D3= tập các chuỗi ký tự có chiều dài là 3,
ký tự đầu là mẫu tự in hoa và 2 ký tụ2 sau là số tù2 0 đến 9.
V. NGÔN NGỮ THAO TÁC DỮ LIỆU
1. Khái niệm về ngôn ngữ
Ngôn ngữ là phương tiện để giao tiếp giữa người- người, người- máy hoặc máy-
máy.
2. Ngôn ngữ tự nhiên và ngôn ngữ hình thức
a. Ngôn ngữ tự nhiên (natural language)
Là ngôn ngữ của những bộ tộc người, được phát triển và hoàn thiện kể từ khi
xuất hiện con người nguyên thủy đầu tiên. Ngôn ngữ tự nhiên được thể hiện qua tiếng
nói, chữ viết, hoặc động tác và tuân theo những qui tắc nhất định gọi là ngữ pháp.
b. Ngôn ngữ hình thức (informal language)
Là tập các ký hiệu và qui định do con người đặt ra. Trong tin học, ngôn ngữ hình
thức là công cụ để giao tiếp giữa người- máy hoặc máy- máy.
Các HQTCSDL bao giờ cũng cung cấp một ngôn ngữ hình thức làm công cụ để
giao tiếp giữa người và hệ thống. Đó là ngôn ngữ cơ sở dữ liệu (database language).
Trong các ngôn ngữ lập trình bình thường, các mệnh đề khai báo và khai thác
đều là các thành phần của một ngôn ngữ. Nhưng về mặt CSDL, thường tách ra hai chức
năng khai báo và tính toán riêng thành hai ngôn ngữ phân biệt. Cơ chế để giải thích sự
khác nhau đó là:
- Ở một chương trình bình thường, các biến của chương trình vẫn tồn tại trong
khi trong khi chương trình đang chạy
- Còn trong hệ CSDL, thì dữ liệu tồn tại "mãi mãi", nó chỉ có thể được khai báo
một lần cho suốt về sau; do đó việc tách ra định nghĩa riêng là điều thích hợp.
Ngôn ngữ dữ liệu thường bao gồm 2 lớp ngôn ngữ con:ngôn ngữ con mô tả dữ
liệu và ngôn ngữ con sử dụng dữ liệu.
3. Ngôn ngữ con định nghĩa dữ liệu
(DDL: Data Definition Language/ Data Description Language
LDD: Langage de Définiton de Données)
a. Định nghĩa
Ngôn ngữ con định nghĩa dữ liệu giúp đặc tả lược đồ CSDL, giúp cho người sử
dụng:
- Khai báo tên đối tượng, cấu trúc của đối tượng và các quan hệ của đối tượng với
các đối tượng khác trong sơ đồ quan niệm.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
20

- Đổi tên, đổi kiểu của các đối tượng đã khai báo
- Thêm, xóa, sửa một số thành phần vào cấu trúc đã có
b. Đặc điểm
- Mỗi DDL thuộc về một HQTDL riêng, và nói theo ngôn từ của mô hình dữ liệu
tương ứng.
- DDL được dùng khi thiết kế CSDL, và khi thiết kế đó bị thay đổi. Nó không
được dùng cho việc nhận hay sửa đổi dữ liệu.
- DDL hầu như bất biến.
- Trong đa số HQTDL, DDL thường có một bộ phận đặc biệt gọi là ngôn ngữ lưu
trữ và định nghĩa dữ liệu (data storage and definition language) là một tập các định
nghĩa chính xác về cách thức dữ liệu lưu trữ trên các bộ nhớ ngoài, và cách truy xuất
chúng. Thiết kế chi tiết của CSDL vật lý (thường được che đi đối với người sử dụng)
được thực hiện bởi các khối chương trình con (routines) của HQTCSDL, sau khi các
khối này "biên dịch" các mệnh đề trong DDL.
Các ngôn ngữ định nghĩa dữ liệu cho sơ đồ con (SDDL) như đã nói ở “khung
nhìn" thường hoàn toàn tương tự vói DDL, mặc dù trong một số trường hợp, SDDL có
thể dùng một mô hình dữ liệu khác với của DDL. Thật vậy, có thể có nhiều SDDL khác
nhau, mỗi ngôn ngữ dùng một mô hình dữ liệu khác nhau.
Kết quả của việc biên dịch các lệnh DDL là một tập các metadata, tức các dữ liệu
về dữ liệu, lưu trong một tập tin đặc biệt. Tập tin này được gọi là từ điển dữ liệu (data
dictionary), được tham khảo đến trước khi dữ liệu hiện có trong CSDL được đọc hoặc
được sửa đổi.
c. Ví dụ
create table DE_TAI
(MA_DE_TAI integer not null,
TEN_DE_TAI char(50),
CHU_NHIEM char(30),
KINH_PHI numeric(6,2),
primary key (MA_DE_TAI))
4. Ngôn ngữ con sử dụng dữ liệu
(DML: Data Manipulation Language/
LMD: langage de Manipulation de Données)
a. Định nghĩa:
Ngôn ngữ con sử dụng dữ liệu dùng để thực hiện các chức năng sau (sau khi sơ
đồ chung và các sơ đồ con đã được định nghĩa xong):
- Tìm dữ liệu thỏa mãn điều kiện nào đó: Phần ngôn ngữ của DML phụ trách
khâu này được gọi là ngôn ngữ hỏi (query language) để trả lời cho các câu hỏi (query).
Do chức năng này quan trọng nhất nên người ta vẫn hay có thói quen đồng nhất DML
với ngôn ngữ hỏi, mặc dù biết như thế là không đúng về mặt kỹ thuật.
- Thêm, xóa, sửa dữ liệu trong CSDL
- Thực hiện các phép tính số học và logic
- Kết nối các chuỗi thao tác tùy theo các khái niệm (principles) cơ sở của các giải
thuật
- Gán và nhận các kết quả để in, hoặc để xây dựng các đối tượng mới
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
21

Ở mức vật lý, chúng ta phải định ra các giải thuật để truy xuất hiệu quả dữ liệu. Ở
mức trừu tượng cao hơn, ta nhấn mạnh đến sự dễ dễ sử dụng. Mục đích là nhằm làm sao
cung cấp được một sự tương tác hiệu quả giữa người và máy.
b. Cách dùng DML
Các lệnh của DML được dùng theo nhiều cách:
b1. Trực tiếp
Tương tác trực tiếp với HQTDL. Đôi khi, cũng có một đơn thể (module) giúp
hưóng dẫn người sử dụng thông qua các menu. Trong trường hợp này, người sử dụng
chọn lựa trên các menu và HQTDL sẽ dịch thành các lệnh tương ứng. Tiếp theo, nếu
mục được chọn đơn giản, HQTDL sẽ thực hiện và thông báo kết quả ngay. Nếu không,
tức là mục vừa chọn lại chứa nhiều khả năng, HQTDL lại phơi ra một menu thứ hai để
người sử dụng lại tiếp tục chọn những mục mịn hơn.
b2. Thông qua một ngôn ngữ "tự chủ" (autonome)
DML gồm các lệnh truy xuất cơ bản và các cấu trúc sơ cấp của việc thảo
chương. Ngôn ngữ này hoàn toàn phụ thuộc vào HQTDL.
b3. Thông qua chương trình ứng dụng:
Ngôn ngữ dùng để lập các chương trình ứng dụng được gọi là ngôn ngữ chủ
(host language). Khi đó, phải trải qua một giai đoạn tiền biên dịch (pré-compilation).
Các lệnh của DML được chương trình gọi lên dùng theo 2 cách, tùy vào đặc thù
của HQTDL:
* Các lệnh của DML được gọi lên bởi các lệnh gọi thủ tục của ngôn ngữ chủ, đến
các thủ tục viết sẵn của HQTDL. Các thủ tục được gọi sẽ làm việc như một bộ xử lý câu
hỏi (query processor) và sẽ lại gọi đến các mức thấp hơn của HQTDL (người quản trị
CSDL và người quản lý tập tin: database et file managers).
* Các lệnh là các mệnh đề thuộc về một ngôn ngữ vốn là phần mở rộng của ngôn
ngữ chủ. Do ngữ pháp của DML thường khác với của ngôn ngữ chủ, các lệnh gọi DML
phải có một ký tự đặc biệt đứng trước sao cho mã tương ứng được sinh ra. Một trình tiền
xử lý (preprocessor) đặc biệt, được gọi là trình tiền biên dịch của DML (DML
precompiler) sẽ chuyển các lệnh DML sang các lời gọi thủ tục bình thường trong ngôn
ngữ chủ.
Các lệnh của DML do đó sẽ được chuyển sang các lệnh gọi đến các thủ tục của
HQTDL và sẽ trở về cách tiếp cận như trên. . Chương trình sinh ra do đó sẽ chạy, thông
qua trinh biên dịch của ngôn ngữ chủ vốn là người đã tạo ra mã đối tượng (object code)
thích hợp.
c. Ví dụ

Chương trình Chương trình


dùng ngôn ngữ lập trình dùng ngôn ngữ lập trình
bình thường mở rộng
A:=B+C A:=B+C
CALL GET(...) ##GET(...)
CALL STORE(...) ##STORE(...)

d. Dữ liệu nhìn dưới góc độ của chương trình ứng dụng


Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
22

Việc chuyển dữ liệu giữa vùng làm việc của chương trình và cơ sở dữ liệu được
thực hiện bởi các lệnh sử dụng dữ liệu, và các lệnh này lại được gọi lên bởi chương trình
ứng dụng. Việc chuyển dữ liệu và tính toán bên trong vùng làm việc được các chỉ thị của
chương trình ứng dụng thực hiện, như trong tình huống chương trình bình thường.
5. Các dạng thể hiện của ngôn ngữ
a. Kiểu đại số
(algebraic language/ langage algébrique)
Ngôn ngữ kiểu đại số sử dụng rộng rãi các biểu thức đại số và logic. Ví dụ, câu
hỏi "cho biết mã và tên của các mặt hàng có đơn vị tính là mét" được viết dưới dạng đại
số như sau:
hàng hóa (đơn vị tính="mét") [mã hàng, tên hàng]
Nghĩa là, chọn những bộ trong quan hệ hàng hoá thỏa điều kiện đơn vị
tính="mét", sau đó, với những bộ đã chọn, chỉ lấy các giá trị tương ứng với hai thuộc
tính mã hàng và tên hàng.
b. Kiểu logic
(logical language/ langage logique)
Sử dụng các vị từ logic (logical predicate). Ví dụ, "có hay không một mặt hàng
có mã hàng là B05 ?" được viết:
? t hàng hóa: t.mã hàng="B05"
c. Kiểu thủ tục
(procedural language/ langage procedural)
Ngôn ngữ kiểu thủ tục yêu cầu người sử dụng chỉ rõ dữ liệu nào đang cần và làm
sao tìm kiếm đối tượng mong muốn đó.
Dùng ví dụ ở phần kiểu đại số, thủ tục cần thiết sẽ là:
1) Chọn những bộ trong quan hệ hàng hoá thỏa điều kiện đơn vị tính="mét". Các
bộ tìm được, được ghi trong một quan hệ tạm thời, tên temp chẳng hạn.
2) Từ quan hệ temp, chiếu xuống hai thuộc tính mã hàng và tên hàng để nhận
được quan hệ kết quả.
Đa số các ngôn ngữ thường gặp hiện nay (Pascal, C, C++, FoxPro, Acess, ...)
thuộc lọai này.
d. Kiểu phi thủ tục (ngôn ngữ khai báo)
(non-procedural language/ langage non-procedural)
Thường được gọi là kiểu mô tả. Câu hỏi thuộc lớp ngôn ngữ này chỉ mô tả
những gì cần có chứ không mô tả cách thức đạt đến những cái đó
Ngôn ngữ phi thủ tục thường dễ học và dễ dùng hơn loại ngôn ngữ thủ tục. Tuy
nhiên, do người sử dụng không phải đặc tả làm thế nào có được dữ liệu, các ngôn ngữ
phi thủ tục có thể sinh ra các code (mã lệnh) không hiệu quả bằng ngôn ngữ thủ tục. Cơ
chế tìm kiếm dĩ nhiên do HQTDL đảm nhiệm dựa trên cấu trúc của CSDL, nên
HQTCSDL sẽ phải áp dụng kỹ thuật tối ưu hóa.
Điển hình của lớp ngôn ngữ phi thủ tục là PROLOG.
e. Ngôn ngữ tự nhiên
Một hướng nghiên cứu quan trọng hiện nay của tin học là cài ngôn ngữ tự nhiên
cho hệ thống. Hướng này có liên quan chặt chẽ với lĩnh vực phân tích và tổng hợp tiếng
nói.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
23

Một vài ngôn ngữ tựa tự nhiên gần đây đã sử dụng bàn phím- màn hình để hổ trợ
sự giao tiếp giữa hệ thống và người sử dụng, thông qua chữ viết. Ví dụ, đoạn:
SELECT mã hàng, tên hàng FROM hàng hóa WHERE đơn vị tính="mét"
thể hiện cho câu hỏi ở ví dụ phần ngôn ngữ kiểu đại số.
VI. QUẢN LÝ CÁC GIAO TÁC/ GIAO DỊCH (TRANSACTION)
1. Giao tác
a. Định nghĩa
Một giao tác là một tập các thao tác thực hiện một chức năng logic trong một
trình ứng dụng.
b. Ví dụ
Gọi T1 là giao tác chuyển $50 từ tài khoản A sang tài khoản B. T1 được viết như
sau:
T1:
read(A);
A:=A-50;
Write(A);
Read(B);
B:=B+50;
Write(B);
c. Tính chất
Giao tác phải đảm bảo 4 tính chất, thường được gọi tắt là ACID:
* Tính nguyên tố (atomicity): Giao tác phải được thực hiện hòan tòan hoặc không
được thực hiện gì cả (“tất cả hoặc không có gì “: all-or-none)
* Tính nhất quán (consistency) : Giao tác phải đảm bảo tính nhất quán của
CSDL. Nếu CSDL đã nhất quán khi giao tác bắt đầu, nó vẫn phải nhất quán sau khi giao
tác chấm dứt.
* Tính riêng biệt (isolation): Mặc dù nhiều giao tác có thể được khai thác cạnh
tranh nhau, nhưng phải đảm bảo đối với mỗi cặp giao tác Ti và Tj, hoặc là Tj phải khai
thác xong trước khi Ti bắt đầu, hoặc là Tj phải bắt đầu khai thác sau khi Ti đã được khai
thác xong.
* Tính bền vững (durability): Kết quả của một giao tác đã hòan tất phải luôn
được bảo lưu, cho dù hệ thống có thể bị trục trặc nào đó
d. Trạng thái của giao tác
Để đảm bảo 4 tính chất này, giao tác có 3 trạng thái:
* Hoàn tất (commit): sau khi thực hiện giao tác xong, HQTCSDL kiểm tra thấy
thỏa các ràng buộc tòan vẹn và các ràng buộc khác, giao tác được xác nhận là đúng.
CSDL sẽ ở trạng thái mới, nhận những kết quả do giao tác đem lại.
* Thoái bộ (roll back/ rollback): các ràng buộc không được thỏa, hoặc do người
sử dụng không muốn chấp nhận giao tác nên mặc dù giao tác đã thực hiện xong, CSDL
phải trở về trạng thái ban đầu.
* Thất bại (fail): giao tác không thực hiện được trọn vẹn.
2. Các bộ phận phụ trách giao tác của HQTCSDL
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
24

a. Bộ phận quản lý giao tác


(transaction-management component)
Tùy theo kiểu hỏng hóc của hệ thống, một giao tác có thể không thực hiện được
thành công. Muốn đảm bảo tính nguyên tố của giao tác, một giao tác thất bại như vậy
phải không được gây ảnh hưởng gì đến tình trạng của CSDL. Do đó, CSDL phải được
trả lại trạng thái ban đầu trước khi giao tác đó được khai thác.
b. Bộ phận điều kiểm cạnh tranh
(concurrency-control manager)
Khi nhiều giao tác cập nhật CSDL một cách “cạnh tranh nhau”, tính nhất quán
của CSDL có thể không được bảo tòan, mặc dù mỗi giao tác đều thực hiện đúng. Bộ
phận kiểm sóat cạnh tranh phải kiểm sóat và điều khiển tương tác giữa các giao tác cạnh
tranh.
c. Ngọai lệ
Các HQTCSDL thiết kế cho các máy tính cá nhân có thể không có đầy đủ các
tiện ịh nói trên. Chẳng hạn, một số hệ bắt buộc chỉ một người sử dụng được trũy xuất dữ
liệu tại một thời điểm. Số khác thì để nhiệm vụ backup và phục hồi cho người sử dụng
thực hiện. Việc cài đặt (setup) như thế cho phép việc quản trị dữ liệu nhẹ nhàng hơn, với
yêu cầu về thiết bị ít hơn, đặc biệt là bộ nhớ chính. Tuy nhiên, mặc dù có giá thành thấp,
cách tiếp cận ít tiện ích như vậy chỉ đủ cho các CSDL cá nhân, nó không đủ để đáp ứng
cho nhu cầu của các xí nghiệp cỡ vừa và lớn.
VII. QUẢN LÝ BỘ NHỚ CỦA CSDL
Các CSDL đúng nghĩa thường yêu cầu khá nhiều dung lượng lưu trữ, thường là
tính trên gigabyte (khỏang 1 tỷ bytes) hoặc terabyte (1000 tỷ bytes). Do đó, thông tin
phải được lưu trên đĩa. Tốc độ chuyển dữ liệu giữa đĩa và bộ nhớ chính khá chậm so với
tốc độ của CPU, nên HQTCSDL cần phải tạo cấu trúc dữ liệu sao cho giảm thiểu thấp
nhất việc chuyển dữ liệu giữa đĩa và bộ nhớ chính.
Tính hòan thiện của HQTCSDL phụ thuộc vào độ hiệu quả về không gian nhớ và
thời gian khi biểu diễn dữ liệu, lẫn vào độ hiệu quả của một kiểu thao tác này khi so sánh
với một kiểu thao tác khác trên các dữ liệu đó.
Trình quản trị bộ nhớ (storage manager) là một module chương trình:
 cung cấp giao diện giữa dữ liệu cấp thấp được lưu trong CSDL và các
chương trình ứng dụng, các câu hỏi đưa cho hệ thống.
 tương tác với trình quản lý tập tin (file manager) của hệ điều hành.
 Dịch các lệnh DML thành các lệnh cấp thấp của hệ thống tập tin.
Như vậy, trình quản trị bộ nhớ chịu trách nhiệm lưu trữ, tìm kiếm và cập nhật dữ
liệu trong CSDL.
VIII. NGƯỜI QUẢN TRỊ CSDL
(DBA: database administrator)
Người quản trị CSDL là người có quyền điều kiểm tập trung trên tòan bộ hệ
thống, về cả dữ liệu lẫn các chương trình truy xuất các dữ liệu đó.
Chức năng của người quản trị CSDL bao gồm:
 Định nghĩa lược đồ
 Tạo cấu trúc lưu trữ và định nghĩa phương pháp truy xuất, bằng cách viết một
tập các định nghĩa, và các định nghĩa này sẽ được dịch bởi trình biên dịch
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc
25

DDL.
 Sửa đổi lược đồ và tổ chức vật lý
 Gán quyền truy xuất dữ liệu cho người sử dụng
 Đặc tả các ràng buộc tòan vẹn
IX. NGƯỜI SỬ DỤNG CSDL
Có 4 kiểu người sử dụng CSDL, phân lọai theo cách thức họ muốn tương tác với
hệ thống:
1. Người lập trình ứng dụng (application programmer)
Là các nhà tin học chuyên nghiệp tương tác với hệ thống thông qua các lệnh gọi
của DML. Các lệnh này được nhúng trong một ngôn ngữ chủ.
2. Người sử dụng thành thạo (sophisticated user)
Tương tác với hệ thống mà không viết chương trình, nhưng tự tạo ra các yêu cầu
bằng ngôn ngữ hỏi CSDL. Mỗi câu hỏi như thế được đưa cho trình xử lý câu hỏi (query
processor), là trình có chức năng “bẻ “ các lệnh DML thành các chỉ thị mà trình quản trị
bộ nhớ hiểu được. Thường là các nhà phân tích viên thuộc loại này.
3. Người sử dụng theo chuyên ngành (specialized user)
Là các người sử dụng thành thạo nhưng viết được các trình ứng dụng cho CSDL
chuyên ngành: hệ CAD (computer aided design), hệ tri thức và hệ chuyên gia, hệ dùng
dữ liệu hình ảnh và âm thanh, v.v..
4. Người sử dụng sơ cấp (naive user)
Cấp thấp nhất, tương tác với hệ thống bằng cách kích họat một chương trình ứng
dụng đã được người khác viết trước đó.
X. CẤU TRÚC HQTCSDL
Ngoài ra, năm 1997, các tác giả của quyển Database system concepts đưa ra mô
hình khác phức tạp hơn như trong trang sau.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


26

Naive users Application Sophisticated Database


u
programmers users administrator
sers

Application Application query Database


interfaces programs schemas

Embedded DML DDL


DML compiler interpreter
precompiler
Query
processor
Application
programs
Query
object code
evaluation
engine

DBMS

Transaction Buffer manager


manager Storage
manager

File manager

Indices Statistical data


Disk storage

Data files Data dictionary

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


28

Chương 2
MÔ HÌNH QUAN HỆ

I. CÁC ĐỊNH NGHĨA


1. Miền giá trị và thuộc tính
(domain/ domaine, attribute/ attribut)
* Một giá trị được gọi là sơ cấp (hay nguyên tố: atomic/ atomique) khi nó
không thể tách ra thêm được nữa (indivisible), trong ngữ cảnh đang xét.
Ví dụ:
+ Nếu ngày sinh luôn được hiểu gồm ngày, tháng và năm sinh, thì trị
{25/01/1975} kiểu Date là sơ cấp.
+ Nếu khi xử lý, có lúc chỉ cần năm sinh thôi thì giá trị trên không là sơ
cấp, mà nên tách ra thành 3 trị sơ cấp 25, 1 và 1975 tương ứng với ngày, tháng và
năm sinh (kiểu nguyên).
* Cho một nhóm các tập hợp Di (i=1..n), mỗi tập hợp chứa các trị sơ cấp.
Ai được gọi là một thuộc tính khi nó là một biến lấy trị trong Di; Di được gọi là
miền giá trị của thuộc tính Ai. Ta viết:
Di= dom(Ai) i=1,...,n
Các Di (i=1..n) không nhất thiết phải khác nhau, có nghĩa là các thuộc
tính khác nhau có thể lấy trị trên cùng một miền giá trị. Miền giá trị không chứa
giá trị trống (null), một trị có thể gặp trong thực tế cài đặt CSDL. Giá trị này phải
được xử lý đặc biệt.
Ví dụ:
Cho:
D1= tập các số nguyên
D2= tập các chuỗi ký tư có chiều dài bất kỳ
D3= tập các chuỗi 4 chữ số
D4=D2
STT = thuộc tính có miền giá trị là D1, tức D1= dom(STT)
HOTEN D2= dom(HOTEN)
NAMSINH D3= dom(NAMSINH)
ĐIACHI D4= dom(ĐIACHI)
2. Quan hệ, bộ
(relation, tuple/ n-uplet)
* Cho một tập các thuộc tính U={A1, A2,..., An}, một quan hệ R xác định
trên U là một tập con của tích Đề- các D1 x D2 x ...x Dn.. Chú ý rằng các miền
giá trị không nhất thiết phải khác nhau.
* Mỗi phần tử (d1, d2, ..., dn) của quan hệ được gọi là bộ .
* Gọi t là một bộ và A là một thuộc tính của R. Giá trị của t tại A được ký
hiệu t[A]. Như vậy: t[A]  dom(A).
Ví dụ:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


29

Dùng quan hệ NHANVIEN nói trên, với :


NHANVIEN= { (1, “Nguyễn Quang Sáng”, “1932”, “Chợ Mới Long
xuyên”),
(2, “Văn Cao”, “1922”, “Hà nội”),
(3, “Trịnh Cung”, “1947”, “TP HCM”) }
thì
(1, “Nguyễn Quang Sáng”, “1932”, “Chợ Mới Long xuyên”)
là một bộ của NHANVIEN.
3. Bậc (arity / arité, degree/ degré)
Số thuộc tính n được gọi là bậc của R. Khi n=1, R được gọi là quan hệ
nhất phân; n=2 thì R là nhị phân,...
Ví dụ: Dùng quan hệ NHANVIEN nói trên. Gọi :
U={STT, HOTEN, NAMSINH, ĐIACHI}
ta có NHANVIEN là một quan hệ bậc 4 xác định trên U.
4. Sơ đồ quan hệ
(relation scheme/ relation schema/ schéma de relation)
* Tập hợp gồm tên của các thuộc tính
R (A1: D1, A2: D2, ..., An: Dn)
hoặc đơn giản hơn:
R (A1,, A2, ...,An)
được gọi là sơ đồ quan hệ hay lược đồ quan hệ. Đôi khi, người ta cũng dùng sơ
đồ quan hệ hoặc tập các từ viết tắt của tên thuộc tính thay cho tên quan hệ.
Ví dụ:
Dùng quan hệ NHANVIEN nói trên.
NHANVIEN= (STT, HOTEN, NAMSINH, DIACHI) là sơ đồ quan hệ
Ví dụ:
KHÁCH_HÀNG (MÃ_KH, HỌTÊN_KH, ĐỊA_CHỈ, TEL) (1)
là sơ đồ quan hệ của KHÁCH_HÀNG, và cũng có thể được viết bằng:
MHDT (2)
Và cả (1) và (2) đều có thể dùng thay cho quan hệ KHÁCH_HÀNG.
5. Bảng (table/ tableau)
* Quan hệ có hình ảnh trực quan là bảng; nói đúng hơn, bảng để lưu trữ
thông tin của quan hệ. Một bảng gồm 2 phần:
- phần định nghĩa (definition): một tập hợp gồm tên các cột, tương ứng sơ
đồ quan hệ
- phần mở rộng (extension) các dòng để chứa thông tin, tương ứng với các
bô, mỗi dòng gồm nhiều giá trị tương ứng với các thuộc tính. Số dòng trên bảng
được gọi là lực lượng (quantum/ cardinalité) của R. Không được có hai dòng
giống nhau trên cùng một bảng.
Ví dụ:
Tương ứng với quan hệ NHANVIEN ở trên, ta có bảng sau:

NHANVIEN STT HOTEN NAMSINH DIACHI


Phần 1Nguyễn Quang Sáng 1932 Chợ Mới- Long Xuyên

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


30

mở 2 Văn Cao 1922 Hà Nội


rộng 3 Trịnh Cung 1947 TP HCM

* Thứ tự của các dòng cũng như của các cột trong bảng là không quan
trọng như của các thuộc tính trong sơ đồ quan hệ, tuy nhiên ta phải biết sự tương
ứng giữa các thuộc tính trong sơ đồ quan hệ với các cột trong bảng để có thể viết
đúng các bộ.
* Mặt khác, sự thay đổi thứ tự tên thuộc tính trong sơ đồ quan hệ phải kéo
theo sự thay đổi thứ tự các giá trị tương ứng trên các bộ, và sự thay đổi thứ tự cột
trong bảng phải kéo theo sự thay đổi thứ tự các giá trị tương ứng trên các dòng.
6. Khóa của quan hệ (key/ clé)
* Khóa K của R là một tập nhỏ nhất các thuộc tính mà các giá trị của các
thuộc tính này cho phép phân biệt các bộ với nhau:
 t1, t2  R: t1t2  t1(K)  t2(K) (*)
 K'  K: K' thỏa (*)
Có thể có nhiều khóa, ta gọi chung là khóa ứng viên (candidate key/ clé
candidate); trong số đó, ta chọn ra khóa chính (primary key/ clé primaire). Trong
sơ đồ quan hệ, khóa chính được đặt ở đầu và gạch dưới.
* Khóa ngoài (foreign key/ externe key/ clé etrangère) của quan hệ R là
một tập thuộc tính không phải là khóa của R, nhưng là khóa của một quan hệ S 
R. Quan hệ S được gọi là quan hệ cha. R được gọi là quan hệ con.
* Khóa không được mang trị rỗng (null). Tuy nhiên, đặc tính này không
áp dụng cho các quan hệ trung gian và tạm thời dùng trong quá trình trả lời một
câu hỏi.
* Xác định khóa cho một quan hệ là một việc quan trọng trong việc hình
thành một cơ sở dữ liệu tốt, hơn nữa sẽ giúp ta chọn ra một cấu trúc chỉ mục
chính về sau. Chú ý hai vấn đề sau:
- Không thể tìm một khóa khi chỉ đơn giản nhìn một mẫu (sample/
échantillon) các giá trị của quan hệ đang xét. Phải chú trọng đến ngữ nghĩa thực
sự của các thuộc tính trong quan hệ.
- Không có khóa nào được chọn tốt một cách tuyệt đối cả, vì ý nghĩa của
khóa phụ thuộc vào những giả thiết mà người ta đã đặt ra trên các kiểu dữ liệu
trong quan hệ.
Ví dụ:
Đối với quan hệ có sơ đồ:
THÍ_SINH (SỐ_BDANH, HỌ_TÊN, NGÀY_SINH,
PHÒNG_THI, QUÊ_QUÁN)
cho thí sinh thi Đại học, ta có hai khóa :
{SỐ_BDANH} và { HỌ_TÊN, NGÀY_SINH, PHÒNG_THI}
(giả sử không có hai người vừa trùng họ tên, vừa trùng ngày sinh lại thi chung
một phòng). Nếu chắc chắn không xảy ra trường hợp hai người vừa trùng họ tên,
vừa là đồng hương lại thi chung một phòng, thì ta có thêm một khóa nữa:
{HỌ_TÊN, PHÒNG_THI, QUÊ_QUÁN}. Trong các khóa trên, ta chọn khóa
chính là {SỐ_BDANH}.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


31

Trên đây là sơ đồ quan hệ dùng cho chỉ một kỳ thi. Nếu muốn dùng cho
nhiều lần thi, phải có thêm thuộc tính KỲ_THI trong sơ đồ quan hê:
THÍ_SINH (SỐ_BDANH, KỲ_THI, HỌ_TÊN, NGÀY_SINH,
PHÒNG_THI, QUÊ_QUÁN)
và trong tất cả các khóa:
{SỐ_BDANH, KỲ_THI}
{ KỲ_THI, HỌ_TÊN, NGÀY_SINH, PHÒNG_THI}
{ KỲ_THI , HỌ_TÊN, PHÒNG_THI, QUÊ_QUÁN}
II. RÀNG BUỘC TOÀN VẸN TRÊN CSDL QUAN HỆ
1. Khái niệm chung
Để định nghĩa một cách hình thức một quan hệ, danh sách các thuộc tính
chưa đủ. Ta còn phải kết hợp vào quan hệ một tập các ràng buộc toàn vẹn
(integrity constraint/ contrainte d'intégrité) trên các giá trị của các thuộc tính và
tập ràng buộc này sẽ được kiểm tra trên từng bộ hoặc trên tòan quan hệ. Các ràng
buộc này kiểm tra một bộ trước khi thuộc về một quan hệ, kiểm tra các thao tác
cập nhật trên một quan hệ nên chúng được gọi là các ràng buộc toàn vẹn.
Ví dụ:
NGAY_SINH không được có trị lớn hơn ngày tháng năm đang xét.
2. Ràng buộc về khóa
Như định nghĩa của khóa: Mỗi giá trị khóa đặc tả một bộ duy nhất trong
quan hệ.
3. Ràng buộc về trị
* Khóa chính hoặc một tập con của nó không được mang trị trống (null).
Do đó, về nguyên tắc, một bộ có khóa mang trị trống sẽ không được thêm vào
quan hệ.
SQL-92 tuân theo nguyên tắc này: khi có mệnh đề PRIMARY KEY, trị
trống bị từ chối. Nhưng FoxPro lại có lệnh INSERT BLANK cho phép thêm vào
một bộ tòan trị trống.
* Ta có thể đặc tả cho từng thuộc tính rằng trị của nó có chấp nhận trị
trống hay không (mặc nhiên: có chấp nhận).
4. Ràng buộc về tính duy nhất của thuộc tính (unicity of attribute)
Ràng buộc này định nghĩa trên một hoặc nhiều thuộc tính, bắt buộc không
tồn tại hai bộ khác nhau có cùng trị trên tập thuộc tính đã đặc tả, ngọai trừ tất cả
các trị trống đều được xem như khác nhau (Oracle). Tuy nhiên, SQL-92 giới hạn
lại chỉ một trị trống cho một thuộc tính.
Ví dụ:

ĐƠN_VỊ STT TÊN_ĐV ĐƯỜNG


1 Cửa hàng số 1 Trần Phú
2 Kho hàng CM tháng 8
3 Văn phòng trung tâm
4 Cửa hàng số 2
Bộ mới 5 Cửa hàng số 3 Trần Phú

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


32

Khi chỉ có 4 bộ đầu tiên, ràng buộc về tính duy nhất trên thuộc tính
ĐƯỜNG không bị vi phạm mặc dù có các giá trị trống ở thuộc tính này (trong hai
bộ 3 và 4). Tuy nhiên, khi có thêm bộ thứ 5 thì nó lại bị vi phạm, do bộ này có trị
“Trần Phú” tại thuộc tính ĐƯỜNG trùng với của bộ 1.
Nếu ràng buộc về tính duy nhất thực hiện trên hai thuộc tính TÊNĐV và
ĐƯỜNG, thì ta lại có thể thêm vào được bộ 5.
5. Ràng buộc về khóa ngoài/ ràng buộc tham chiếu
(referencing constraint/ referential constraint / contrainte d’inteïgriteï
reïfeïrentielle)
Sự tương ứng giữa khóa chính và khóa ngoài được xác định theo nhiều
kiểu khác nhau:
a. Tương ứng hoàn toàn (match full)
 Giá trị của khóa ngoài X tại cả hai quan hệ là phải hoàn toàn bằng nhau.
 Ngoại trừ toàn bộ X, tất cả các tập con của X đều không được mang trị
null.
b. Tương ứng từng phần (partial match)
Giaï trë träúng âæåüc pheïp coï màût åí mäüt táûp con cuía X, nhæng chè khi caïc thuäüc
tênh khäng mang trë träúng khaïc tæång æïng våïi mäüt trë cuía mäüt khoïa chênh trong
quan hãû cha.
c. Tự do
Trë träúng âæåüc cho pheïp âäúi våïi caïc táûp con cuía khoïa ngoìai maì khäng bàõt
buäüc caïc thuäüc tênh khäng mang trë träúng khaïc tæång æïng våïi mäüt trë cuía mäüt khoïa
chênh trong quan hãû cha.
Ví dụ
Cho 2 quan hãû:
BAO_CAO (STT_BC, TEN_BC, BC_VIEN, NGAY, BUOI, PHONG)
BUOI_HT (NGAY, BUOI, PHONG, CHUYEN_DE, NG_CHU_TRI,
SO_LG_NG_DU)

BUOI_ NGAY BUOI PHONG CHUYEN_DE NG_CHU_TRI SO_LG_


HT NG_DU
12/05/98 S 2 Thå Cuì Huy Cáûn 25
12/05/98 C 2 Nhaûc Tráön Hoaìn 32
12/05/98 S 3 Vàn Ng Q. Saïng 40

BAO_ STT_ TEN_BC BC_VIEN NGAY BUOI PHONG


CAO BC
1 Truyãûn Kiãöu Thanh Thaío 12/05/98 S 2

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


33

2 Nhaûc Vàn Cao Phuï Quang 12/05/98 C 2


3 Vàn låïp treí Ng Khaíi 12/05/98 - 3

Nãúu sæû tæång æïng âæåüc âënh nghéa laì tæìng pháön, bäü thæï 3 cuía BAÏOCAÏO
khäng vi phaûm raìng buäüc vãö khoïa ngoaìi, xeït vãö trë träúng åí thuäüc tênh BUÄØI. Tuy
nhiãn, trë 3 cuía PHOÌNG phaíi coï nàòm trong trë khoïa chênh cuía quan hãû cha
BUÄØIHT.
Viãûc thay trë träúng noïi trãn bàòng trë “C” laì khäng cháúp nháûn âæåüc vç khäng
thoía raìng buäüc vãö khoïa ngoìai (BUÄØIHT khäng coï trë khoïa chênh naìo laì (“C”,3)).
Viãút bàòng SQL (trong Oracle):
CREATE TABLE BAO_CAO
(
STT_BC integer not null,
TEN_BC varchar2(25) not null,
BUOI char(1) not null,
PHONG char(1),
primary key (STT_BC)
CONSTRAINT FK1 FOREIGN KEY (NGAY, BUOI, PHONG)
REFERENCES BUOI_HT (NGAY, BUOI, PHONG)
MATCH FULL ON DELETE CASCADE
)
Ghi chú:
Våïi thäng säú CASCADE, khi xoïa mäüt bäü trong quan hãû cha seî keïo theo
xoïa hãút caïc bäü tæång æïng trong quan hãû con.
* Trường hợp đặc biệt
Khi quan hãû cha vaì quan hãû con laì mäüt, ta coï raìng buäüc vãö khoïa ngoìai tråí
thaình raìng buäüc tæû tham chiãúu (self- referencing constraint/ contrainte
d’inteïgriteï reïfeïrentielle intrarelation). Luïc naìy, viãûc thãm vaìo caïc bäü coï thãø coï keïo
theo mäüt vaìi phiãön phæïc, nãúu nhæ khäng tuán theo mäüt nghi thæïc âàûc biãût.
Ví dụ
NV_CÁÚP_DÆÅÏI (MAÎNV, HO, TEN, MAÎNV_LÂ)
Cáu lãûnh SQL cho quan hãû naìy:
CREATE TABLE NV_CÁÚP_DÆÅÏI (
MAÎNV integer, ...,
MAÎNV_LÂ integer),
CONSTRAINT rbtv PRIMARY KEY (MAÎNV),
FOREIGN KEY rbkn (MAÎNV_LÂ)
REFERENCES NV_CÁÚP_DÆÅÏI (MAÎNV)
ON DELETE CASCADE

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


34

NV_CÁÚP_DÆÅÏI MAÎNV ... MAÎNV_LÂ


2 601 1000
1 1000 -
3 602 601
5 1000 1500
4 1500 -
603 602

Viãûc thãm vaìo mäüt bäü tæång æïng våïi mäüt nhán viãn laînh âaûo cao nháút (trë
cuía MAÎNV_LÂ laì träúng), chàóng haûn nhæ (1000, null) seî khäng gàûp váún âãö gç.
Nhæng nãúu sau âoï ngæåìi naìy laûi coï cáúp laînh âaûo cao hån, thç viãûc thãm vaìo
bäü måïi (1000, 1500) phaín aïnh sæû kiãûn naìy seî gàûp ràõc räúi, vç 2 lyï do:
+ Cuìng mäüt trë 1000 cho khoïa chênh MAÎNV laûi coï âãún 2 bäü khaïc nhau
+ Nãúu xoïa âi bäü cuî (1000, null), nhæng chæa coï bäü naìo cho vë laînh âaûo måïi
(maî 1500), cuîng seî vi phaûm raìng buäüc vãö khoïa ngoìai.
Do âoï, nãn xem xeït kyî khi nháûp dæî liãûu, phaíi coï bäü cho laînh âaûo træåïc, räöi
måïi coï bäü cho nhán viãn cáúp dæåïi sau.
Læu yï:
Mäüt caïch täøng quaït, phaíi coï bäü cho quan hãû cha træåïc, räöi måïi coï bäü cho
quan hãû con sau (khäng âæåüc “sinh con räöi måïi sinh cha” !).
6. Ràng buộc toàn vẹn về luận lý
(check constraints/ contrainte logique):
Biãøu thë bàòng mäüt biãøu thæïc luáûn lyï, âäi khi khaï phæïc taûp. Aïp duûng cho mäüt
hoàûc nhiãöu thuäüc tênh, cho tæìng bäü hoàûc cho caí quan hãû.
Ví dụ
Læång thaïng cuía mäüt nhán viãn khäng âæåüc tháúp hån 2.000.000 â
Täøng quyî læång cuía toìan bäü nhán viãn khäng âæåüc væåüt quaï 200 triãûu âäöng.
CREATE TABLE NHAÌ_MAÏY (
STT_NM number CHECK (STT_NM > 0 and STT_NM<10),
MAÎ_SP char(5) not null,
... )
Trong SQL-92, raìng buäüc luáûn lyï CHECK coï thãø chæïa mäüt cáu lãûnh
SELECT trãn mäüt quan hãû khaïc:
CREATE TABLE SAÍN_PHÁØM (
MAÎ_SP char(5) CHECK (select MAÎ_SP from NHAÌ_MAÏY a
where a. MAÎ_SP = MAÎ_SP ),
... )
Để giúp mô tả các ràng buộc toàn vẹn được đầy đủ và có hệ thống, giúp
cho việc thể hiện chúng về sau qua ngôn ngữ SQL dược dễ dàng hơn, ta dùng

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


35

một bảng như sau cho mỗi quan hệ:


Ví dụ:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc


36

BUOIHT

Stt Tên Kiểu Kích Dec Miền giá Trị mặc Min Max PK Duy nhất Null RBTV Khóa Diễn giải
thước trị nhiên luận lý ngoài
1 NGAÌY D Ngày
2 BUÄØI C 1 {‘S’, Buổi
x
‘C’}
3 PHOÌNG C 1 ‘1’ ’9’ Phòng
4 CHUYÃNÂÃÖ C 10 Chuyên đề
5 NGCHUÍTRÇ C 20 Người chủ trì
6 SÄÚLGNGDÆÛÛ N 3 >0 Số lượng người dự

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


37

BAÏOCAÏO
S Tên Kiểu Kích Dec Miền Trị Min Max P Duy Null RBTV Khóa Diễn giải
t thước giá trị mặc K nhất luận lý ngoài
t nhiên
1 STTBC N 2 1 x Số thứ tự báo cáo
2 TÃNBC C 100 Tên báo cáo
3 BCVIÃN C 20 Báo cáo viên
4 NGAÌY D Ngày
BUÄØIHT
5 BUÄØI C 1 {‘S’, Buổi
‘C’}
6 PHOÌNG C 1 ‘1’ ’9’ Phòng

- Tương ứng từng phần với quan hệ cha.


- Khi thêm cho quan hệ con BAÏOCAÏO, không được thêm kéo theo trong quan hệ cha BUÄØIHT
- Khi xóa quan hệ cha BUÄØIHT, không xóa kéo theo trong quan hệ con BAÏOCAÏO.
- Khi sửa quan hệ cha BUÄØIHT, phải sửa kéo theo trong quan hệ con BAÏOCAÏO.

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


38

7. DML và việc hợp lệ hóa các ràng buộc


Thäng thæåìng, viãûc cập nhật mäüt bäü phaíi keïo theo viãûc kiãøm tra caïc raìng
buäüc toìan veûn trãn quan hãû. Nãúu raìng buäüc bë vi phaûm, caïc thao taïc âaî âæåüc thæûc
hiãûn båíi DML seî bë vä hiãûu båíi mäüt lãûnh ROLLBACK tæû âäüng. Nhæ váûy, tênh
nguyãn täú cuía lãûnh âæåüc âaím baío.
Lệnh đơn giản (sửa trên một quan hệ)
Coï thãø coï vi phaûm taûm thåìi raìng buäüc toìan veûn, nhæng cháúp nháûn âæåüc. Kãút
quaí cuäúi cuìng váùn chàût cheî, vç viãûc håüp lãû hoïa raìng buäüc chi thæûc hiãûn luïc cháúm
dæït lãûnh DML.
Ví dụ: duìng quan hãû NV_CÁÚP_DÆÅÏI åí trãn.

NV_CÁÚP_DÆÅÏI MAÎNV MAÎNV_LÂ


601 1000
1000 -
602 601
603 602
Giaí sæí sau khi cäng ty saït nháûp nhiãöu xê nghiãûp laûi våïi nhau, hãû thäúng maî
nhán viãn cáön sæía âäøi: phaíi cäüng thãm mäüt hàòng säú 2000 vaìo maî mäùi ngæåìi.
Raìng buäüc toìan veûn âæåüc thæûc hiãûn cho toìan quan hãû, nãn seî âæåüc kiãøm tra luïc
cuäúi lãûnh cáûp nháût DML, giaí sæí laì lãûnh UPDATE (trong SQL-92):
UPDATE NV_CÁÚP_DÆÅÏI SET MAÎNV = MAÎNV + 2000,
MAÎNV_LÂ = MAÎNV_LÂ + 2000 ;
Dæåïi âáy laì vãút thæûc hiãûn (trace) cuía viãûc sæía caïc bäü trong quan hãû
NV_CÁÚP_DÆÅÏI (dáúu * âãø chè âaî cáûp nháût xong åí bäü âang xeït):

Cuäúi
Bæåïc 1 Bæåïc 2 Bæåïc 3 Bæåïc 4 lãûnh vaì
håüp lãû
hoïa
2601 3000 * 2601 3000 2601 3000 2601 3000
1000 - 3000 -* 3000 - 3000 -
602 601 602 601 2602 2601 * 2602 2601
603 602 603 602 603 602 2603 2602 *

Nãúu raìng buäüc toìan veûn âæåüc kiãøm tra sau khi sæía mäùi bäü, viãûc cáûp nháût
quan hãû tråí nãn khäng thãø âæåüc, vç bäü âáöu tiãn vi phaûm raìng buäüc vãö khoïa ngoìai.
Thæûc tãú, cuäúi lãûnh UPDATE, raìng buäüc måïi âæåüc kiãøm tra nãn âæåüc thoía.
Lệnh phức tạp (sửa trên một quan hệ và thêm vào một quan hệ khác)

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


39

Luïc naìy, cáön phaíi giaíi quyãút bàòng khaïi niãûm giao taïc (transaction), mä taí båíi
càûp lãûnh SET TRANSACTION vaì COMMIT.
Ví dụ: (SQL-92)
SET TRANSACTION;
UPDATE DMHAÌNG SET SÄÚLG = SÄÚLG - 50 WHERE MAÎ_SP = “B21” ;
INSERT INTO HAÌNG_BAÏN VALUE (“B21”, “23/09/98”, 50) ;
COMMIT;
8. Sự kích hoạt và sự thời hóa các ràng buộc
(activation & temporisation of constraints)
Khi mäüt raìng buäüc âang coï hiãûu læûc (active), khäng mäüt thao taïc naìo cuía
CSDL âæåüc cháúp nháûn nãúu kãút quaí cuäúi cuìng cuía thao taïc trãn dæî liãûu khäng thoía
raìng buäüc âoï. Caïc raìng buäüc âæåüc âàûc taí båíi ngæåìi quaín trë CSDL (DBA) nhåì caïc
thuí tuûc bãn trong hoàûc nhåì caïc trçnh kêch khåíi (trigger/ deïclencheur). Trong
HQTCSDL Oracle, mäüt raìng buäüc coï thãø coï hiãûu læûc hoàûc khäng.
Trong chuáøn SQL-92, caïc raìng buäüc âæåüc âàût tãn âãø dãù quaín lyï viãûc khai
thaïc. Traûng thaïi ban âáöu màûc nhiãn cuía raìng buäüc laì IMMEDIATE, nhæng cuîng coï
thãø âàût noï vaìo traûng thaïi DEFERRED:
IMMEDIATE (tæïc thåìi): raìng buäüc âæåüc kiãøm tra åí cuäúi mäùi lãûnh SQL
DEFERRED (hoaîn): viãûc kiãøm tra raìng buäüc âæåüc thæûc hiãûn:
+ khi raìng buäüc tråí laûi chãú âäü IMMEDIATE, nhåì mäüt lãûnh SET IMMEDIATE
+ hoàûc luïc cuäúi mäüt giao taïc, âaïnh dáúu bàòng COMMIT.
Ví dụ:
SET TRANSACTION ;
SET DEFERRED ;
UPDATE DMHAÌNG SET SÄÚLG = SÄÚLG - 50 WHERE MAÎ_SP = “B21” ;
INSERT INTO HAÌNG_BAÏN VALUE (“B21”, “23/09/98”, 50) ;
COMMIT;
SET IMMEDIATE ;
.. .
III. CÁC THAO TAC CẬP NHẬT TRÊN CSDL QUAN HỆ
Chuïng coï âàûc âiãøm chung laì coï thãø vi phaûm caïc raìng buäüc toìan veûn trãn
CSDL, hoàûc ngæåüc laûi, do phaíi tän troüng caïc raìng buäüc naìy, nãn keïo theo sæû cáûp
nháût åí mäüt säú bäü cuía mäüt säú quan hãû khaïc.
1. Thêm một bộ vào một quan hệ
Kãút quaí cuía thao taïc naìy coï thãø gáy ra mäüt säú sai soït:
- Bäü måïi thãm vaìo khäng phuì håüp våïi så âäö quan hãû cho træåïc
- Mäüt säú giaï trë cuía mäüt säú thuäüc tênh trong bäü måïi nàòm ngoaìi caïc miãön giaï
trë tæång æïng.
- Giaï trë khoïa cuía bäü måïi coï thãø laì trë träúng (null) hoàûc laì giaï trë khoïa âaî coï
trong quan hãû âang xeït.
Bài giảng CSDL GV: Phạm Thị Xuân Lộc
40

- Bäü måïi chæïa giaï trë cuía mäüt khoïa ngoại từ khóa chính của mäüt quan hãû khaïc,
nhæng thæûc tãú åí quan hãû thæï hai naìy, chæa hãö coï giaï trë khoïa nhæ váûy.
Ví dụ:
Cho quan hãû:
NVIÃN (MAÎ_NV, NGAÌY_SINH, HOÜ_TÃN, ÂCHÈ)
Thãm vaìo bäü
(“A026”, “Phan Anh Taìi”, {18/12/75}, “56/42 HoìangVàn Thuû TP CT”)
thoía maîn caïc raìng buäüc toìan veûn trãn tæìng thuäüc tênh, nhæng laûi khäng theo âuïng
så âäö quan hãû (hoaïn vë thæï tæû caïc giaï trë thuäüc tênh NGAÌY_SINH vaì HOÜ_TÃN).
Thãm vaìo bäü
(“A027”, {25/09/98}, “Lã Hoìang Thoü”, “8 Phan Vàn Trë TP CT”)
ÅÍ âáy do âaïnh nháöm ngaìy sinh 25/09/68 thaình 25/09/98 (trong khi ta
âang åí vaìo ngaìy 22/09/98 !) nãn âaî vi phaûm raìng buäüc toìan veûn vãö
NGAÌY_SINH nhæ âaî trçnh baìy åí trãn.
Thãm vaìo bäü
(“A025”, {07/10/56}, “Nguyãùn Thanh Nhaìn”, “125 Nguyãùn Huãû TX VL”)
trong khi âaî coï mäüt bäü
(“A025”, {25/12/65}, “Nguyãùn Anh Ngoüc”, “79 Træång Âënh Vuîng taìu”)
trong quan hãû naìy räöi.
Ta muäún thãm vaìo mäüt bäü:
(“A028”, {15/08/98}, “S”)
cho quan hãû
TRÆÛC (MAÎ_NV, NGAÌY_TRÆÛC, BUÄØI)
nhæng trong quan hãû NVIÃN chæa coï bäü naìo coï MA_NV laì A028 caí. Nhæ váûy, ta
phaíi giaíi quyãút theo 2 caïch: khäng thãm vaìo bäü trãn, hoàûc phaíi thãm vaìo quan hãû
NVIÃN mäüt bäü coï giaï trë khoïa MAÎ_NV laì A028.
2. Xóa một bộ ra khỏi một quan hệ
Kãút quaí cuía thao taïc naìy coï thãø gáy ra mäüt säú sai soït:
Bäü bë xoïa ngoìai yï muäún tháût sæû, chè do så soït kyî thuáût
Ví dụ:
Xoïa âi mäüt bäü trong quan hãû NVIÃN coï nghéa laì sa thaíi nhán viãn tæång æïng
khoíi cå quan. Ta phaíi kiãøm tra xem âiãöu naìy âuïng khäng træåïc khi xoïa. Nãúu thæûc
tãú âuïng nhæ váûy, ta phaíi xoïa luän caïc bäü trong caïc quan hãû coï chæïa thuäüc tênh
MAÎ_NV (nhæ quan hãû TRÆÛC chàóng haûn).
Trong SQL-92, coï caïc thäng säú SET NULL, NO ACTION, hoàûc CASCADE
âãø xæí lyï tuìy tçnh huäúng.
3. Sửa đổi trị một số thuộc tính
Kãút quaí cuía thao taïc naìy coï thãø gáy ra mäüt säú sai soït:
- Caïc trë måïi sæía khäng phuì håüp våïi caïc raìng buäüc toìan veûn cho træåïc, trong
mäúi liãn quan våïi caïc trë cuía caïc thuäüc tênh khaïc

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


41

- Mäüt säú giaï trë måïi âæåüc sæía cuía mäüt säú thuäüc tênh nàòm ngoaìi caïc miãön giaï
trë tæång æïng.
- Nãúu khoïa âæåüc sæía trë, giaï trë khoïa måïi coï thãø laì giaï trë khoïa âaî coï trong
quan hãû âaî læu træî.
IV. SỰ THÔNG THƯƠNG GIỮA CÁC QUAN HỆ
Sæïc maûnh cuía mä hçnh quan hãû seî âæåüc âaïnh giaï täút hån nãúu ta xeït caïc taïc
tæí bàõt buäüc ta phaíi âi tæì quan hãû naìy sang quan hãû khaïc. Vê duû coï cå såí dæî liãûu
chæïa caïc quan hãû sau:
SV (MAÎSV, HOÜTÃN, ÂCHÈ, TEL)
KÃÚTQUAÍ (MÄN, MAÎSV, ÂIÃØM)
TKBIÃØU (MÄN, NGAÌY, GIÅÌ)
BÄÚTRÊ (MÄN, PHOÌNG)
Ví dụ 1:
Ta coï thãø traí låìi cáu hoíi “Sinh viãn maì maî laì 12345 coï âiãøm män CSDL laì
bao nhiãu ? “ trong khi chè giåïi haûn åí quan hãû KÃÚTQUAÍ. Nhæng cáu hoíi thãú naìy
thç thæååìng gàûp hån vaì tæû nhiãn hån: “Sinh viãn H.H. Thaïm coï âiãøm män CSDL
laì bao nhiãu ? “. Roî raìng cáu hoíi naìy khäng thãø traí låìi âæåüc nãúu ta chè laìm viãûc trãn
duy nháút mäüt quan hãû KÃÚTQUAÍ.
Træåïc hãút, phaíi tham khaío quan hãû SV âãø tçm caïc maî sinh viãn tæång æïng
våïi hoü tãn H.H. Thaïm (coï thãø nhiãöu sinh viãn truìng hoü tãn nhau). Sau âoï, âäúi våïi
mäùi maî, ta tçm trong quan hãû KÃÚTQUAÍ caïc bäü chæïa maî trãn vaì coï giaï trë “CSDL“
åí thuäüc tênh MÄN. Ta coï thãøì âoüc ra giaï trë åí thuäüc tênh ÂIÃØM âãø biãöt âæåüc âiãøm
cáön tçm. Hçnh veî dæåïi âáy cho tháúy cáu hoíi âaî näúi caïc giaï trë âaî cho våïi caïc traí låìi
cáön coï ra sao:

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


42

“H.H. Thaïm“

“CSDL“ MAÎSV HOÜTÃN ÂCHÈ TEL

MÄN MAÎSV ÂIÃØM

traí låìi
Khi khäng coï chè muûc naìo âæåüc duìng, cáu traí låìi seî “ngäún “ ráút nhiãöu thåìi
gian. Giaí sæí coï n bäü trong quan hãû SV, m bäü trong quan hãû KÃÚTQUAÍ vaì coï k sinh
viãn mang tãn “H.H. Thaïm“. Ta coï giaíi thuáût tçm âiãøm män CSDL cuía caïc sinh
viãn naìy nhæ sau:
(1) våïi mäùi bäü t cuía SV, thæûc hiãûn
(2) nãúu t coï trë cuía HOÜTÃN laì “H.H. Thaïm“ thç
(3) goüi I laì giaï trë cuía MAÎSV trong bäü t;
(4) våïi mäùi bäü s cuía KÃÚTQUAÍ, thæûc hiãûn
(5) nãúu s coï trë åí MÄN laì “CSDL“ vaì trë åí MAÎSV laì I thç
(6) in ra giaï trë ÂIÃØM cuía bäü s
(7) hãút nãúu;
(8) hãút làûp;
(9) hãút nãúu;
(10) hãút làûp;
Ta duìng kyï hiãûu O(m) âãø chè “têch cuía mäüt hàòng säú våïi m“ trong viãûc æåïc
læåüng chi phê vãö thåìi gian khai thaïc chæång trçnh. ÅÍ âáy, chæång trçnh coï chi phê
laì O(n+km). Khi k=1 (chè coï 1 sinh viãn mang hoü tãn âaî cho), thåìi gian cáön thiãút
seî laì O(n+m), tyí lãû thuáûn våïi täøng kêch thæåïc hai quan hãû. Khi k>1, thåìi gian khai
thaïc seî coìn låïn hån nhiãöu.
Våïi caïc chè muûc kheïo choün, ta coï thãø traí låìi âæåüc cáu hoíi trãn chè trong mäüt
khoaíng thåìi gian trung bçnh laì O(k). Noïi caïch khaïc, chi phê thåìi gian seî tè lãû våïi säú
sinh viãn coï cuìng hoü tãn maì ta âang tçm, vaì khäng liãn quan gç âãún kêch thæåïc cuía
hai quan hãû âaî cho. Roî raìng caïc chè muûc âaî giuïp caíi thiãûn ráút nhiãöu viãûc truy tçm
dæî liãûu. Caïc chè muûc cho pheïp ta âaïnh dáúu caïc bäü våïi thåìi gian trung bçnh laì O(1)
cho mäùi bäü, nãúu duìng mäüt baíng bàm coï säú khäúi khaï âuí. Nãúu ta âàût mäüt chè muûc
trãn HOÜTÃN âäúi våïi quan hãû SV, vaì mäüt chè muûc trãn täø håüp {MÄN, MAÎSV} âäúi
våïi quan hãû KÃÚTQUAÍ, thç giaíi thuáût âãø tçm âiãøm män CSDL cuía sinh viãn H.H.
Thaïm nhæ sau:

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


43

(1) Nhåì chè muûc trãn HOÜTÃN, tçm tæìng bäü cuía quan hãû SV coï giaï trë åí
HOÜTÃN
laì “H.H. Thaïm“;
(2) våïi mäùi bäü t tçm tháúy åí (1), thæûc hiãûn
(3) goüi I laì giaï trë MAÎSV cuía bäü t;
(4) nhåì chè muûc trãn {MÄN, MAÎSV} trong quan hãû KÃÚTQUAÍ, tçm bäü
s coï giaï trë
åí MÄN laì “CSDL“ vaì trë åí MAÎSV laì I ;
(5) in ra trë ÂIÃØM cuía bäü s;
(6) hãút làûp;
Ví dụ 2:
Giaí sæí ta muäún biãút “Tçm sinh viãn H.H. Thaïm åí phoìng hoüc naìo vaìo luïc 9
giåì åí táút caí caïc buäøi saïng thæï hai ? “. Khi biãút chàõc chàõn sinh viãn trãn coï hoüc mäüt
män vaìo ngaìy giåì âoï, ta coï thãø tçm ra cáu traí låìi theo så âäö sau:

“H.H. Thaïm“

MAÎSV HOÜTÃN ÂCHÈ TEL

MÄN MAÎSV ÂIÃØM


“T2“ 9

MÄN NGAÌY GIÅÌ

MÄN PHOÌNG

traí låìi

Giaíi thuáût sau giaí thiãút ràòng chè coï duy nháút mäüt sinh viãn mang tãn H.H.
Thaïm; nãúu ngæåüc laûi, ta coï thãø nháûn âæåüc nhiãöu phoìng vaì tçm tháúy mäüt phoìng hoüc
luïc 9 giåì saïng thæï hai trong säú âoï. Cuîng giaí thiãút sinh viãn âoï khäng ghi danh
nhàòm caïc män hoüc láún giåì nhau, tæïc laì anh ta khäng phaíi hoüc nhiãöu hån mäüt män
vaìo luïc 9 giåì saïng thæï hai.

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


44

(1) Tçm maî sinh viãn cuía H.H. Thaïm, nhåì quan hãû SV. Goüi I laì con säú
naìy.
(2) Tçm trong quan hãû KÃÚTQUAÍ táút caí caïc bäü coï trë cuía MAÎSV laì I. Goüi
{c1, c2, ..., ck} laì táûp giaï trë cuía MÄN trong caïc bäü naìy.
(3) Trong quan hãû TKBIÃØU, tçm bäü coï trë cuía MÄN laì ci (laì mäüt trong caïc
trë âaî tçm tháúy åí bæåïc 1), trë cuía NGAÌY laì “T2“ vaì trë cuía giåì laì 9 (khäng âæåüc coï
nhiãöu hån mäüt bä coï tênh cháút nhæ váûy)ü.
(4) Nãúu coï mäüt bäü âæåüc tçm tháúy åí bæåïc 3, ta tçm trong quan hãû BÄÚTRÊ
phoìng âæååüc bäú trê âãø daûy män c (giaï trë cuía MÄN trong bäü naìy). Âãún âáy ta âaî coï
thãø tçm tháúy sinh viãn H.H. Thaïm åí phoìng hoüc naìo vaìo 9 giåì saïng thæï hai (ngoaûi
træì anh ta khäng nghè cuäúi tuáön quaï láu !).
Giaíi thuáût trãn khäng duìng chè muûc, trong khi chuïng chuïng laûi ráút hæîu êch
nhæ caïch thæïc caíi tiãún dæåïi âáy:
a) ÅÍ bæåïc 1 noïi trãn, ta coï thãø duìng chè muûc trãn thuäüc tênh HOÜTÃN cuía
quan hãû SV âãø tçm ra maî cuía sinh viãn H.H. Thaïm våïi thåìi gian O(1).
b) ÅÍ bæåïc 2, ta coï thãø låüi duûng chè muûc dæûa trãn MAÎSV cuía quan hãû
KÃÚTQUAÍ âãø coï âæåüc táút caí caïc män maì H.H. Thaïm theo hoüc, trong thåìi gian truy
tçm O(k), nãúu anh ta theo hoüc k män.
c) ÅÍ bæåïc 3, ta coï thãø duìng chè muûc dæûa trãn MÄN cuía quan hãû TKBIÃØU
âãø tçm âæåüc táút caí caïc láún xuáút hiãûn cuía k män væìa tçm tháúy åí bæåïc 2, våïi mäüt thåìi
gian t lãû våïi täøng säú láön xuáút hiãûn naìy. Nãúu giaí thiãút khäng coï män naìo hoüc quaï 5
láön mäüt tuáön, seî coï täúi âa 5k bäü, vaì ta coï thãø tçm tháúy chuïng trong khoaíng thåìi
gian O(k). Nãúu khäng coï chè muûc trããn MÄN, nhæng laûi coï chè muûc trãn NGAÌY
vaì/ hoàûc GIÅÌ, ta cuîng coï thãø låüi duûng noï, màûc duì säú bäü âæåüc duyãût coï thãø låïn hån
O(k) ráút nhiãöu.
d) ÅÍ bæåïc 4, ta coï thãø duìng chè muûc dæûa trãn MÄN cuía quan hãû BÄÚTRÊ.
Luïc naìy, ta tháúy âæåüc phoìng cáön tçm, trong khoaíng thåìi gian O(1).
Âiãöu cáön kãút luáûn åí âáy laì nãúu caìi âàût caïc chè muûc thêch håüp, ta coï thãø traí
låìi âæåüc cáu hoíi khaï phæïc taûp åí trãn trong thåìi gian trung bçnh laì O(k). Nãúu säú k,
säú män maì sinh viãn theo hoüc, laì nhoí (thæåìng khoaíng 5-6) thç læåüng thåìi gian trãn
khäng låïn, vaì âàûc biãût, khäng phuû thuäüc vaìo kêch thæåïc cuía quan hãû naìo cả.

Bài giảng CSDL GV: Phạm Thị Xuân Lộc


45

Chương 3
ĐẠI SỐ QUAN HỆ

I. GIỚI THIỆU
Trong chương này và chương tiếp theo, ta sẽ đề cập đến các cách tiếp cận
với thiết kế ngôn ngữ để hỏi trên các quan hệ. Khái niệm về trình bày câu hỏi
thường là phần quan trọng nhất của DML. Ngôn ngữ sử dụng dữ liệu (DML) trên
mô hình quan hệ thường được gọi tắt là "ngôn ngữ hỏi" (query language). Trong
trường hợp tổng quát nhất, các câu hỏi thường dùng một ngôn ngữ phong phú, cao
cấp để diễn đạt. Phần không dính líu hỏi đáp của ngôn ngữ hỏi thì liên quan đến
phép thêm, xóa và sửa các bộ.
Ngän ngæî hoíi chia laìm 2 loaûi chênh:
- Ngän ngæî âaûi säú (algebraic languages), trong âoï caïc cáu hoíi âæåüc biãøu
diãùn bàòng caïch aïp duûng caïc toaïn tæí âàûc biãût cho caïc quan hãû.
- Ngän ngæî tênh toaïn tán tæì (predicate calculus languages), trong âoï caïc cáu
hoíi mä taí mäüt táûp caïc bäü cáön biãút bàòng caïch âàûc taí mäüt tán tæì (predicate) maì caïc
bäü phaíi thoía maîn.
Caïc ngän ngæî hoíi træìu tæåüng naìy, táút nhiãn khi caìi âàût trong caïc HQTDL
hiãûn taûi khäng phaíi giäúng chênh xaïc nhæ miãu taí åí âáy, nhæng chuïng âæåüc duìng nhæ
mäüt thæåïc âo âãø âaïnh giaï caïc hãû âoï, vç chuïng træng ra mäüt khaí nàng täúi thiãøu phaíi
coï åí báút kyì mäüt ngän ngæî hoíi naìo âæåüc cháúp nháûn trãn mä hçnh quan hãû.
Trong chæång 3 naìy, ta seî noïi âãún âaûi säú quan hãû (relational algebra),
pháön nãön cho loaûi ngän ngæî âaûi säú.
II. MỘT SỐ KHÁI NIỆM
1. Đại số hệ
a. Định nghĩa
Âaûi säú hãû laì mäüt càûp <M, F>, trong âoï M laì mäüt táûp âæåüc goüi laì táûp nãön, F
laì mäüt táûp caïc pheïp toaïn trãn M.
Mäùi pheïp toaïn f  F laì mäüt aïnh xaû bäü pháûn:
f: Mn  M
vaì âæåüc goüi laì pheïp toaïn n ngäi.
b. Ví dụ
Våïi F={+, -, *},  = <N, F> taûo thaình mäüt âaûi säú hãû.
2. Đại số quan hệ
Táûp håüp caïc pheïp toaïn quan hãû âaî xeït, cuìng våïi mäüt CSDL cho træåïc, taûo
thaình mäüt âaûi säú hãû, goüi laì âaûi säú quan hãû.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


46

3. Biểu thức quan hệ


a. Định nghĩa
Biãøu thæïc quan hãû âæåüc xáy dæûng tæì caïc quan hãû trong mäüt CSDL cho træåïc
vaì caïc pheïp toaïn quan hãû.
b. Thứ tự ưu tiên trong biểu thức quan hệ
Thäng thæåìng, trong mäüt biãøu thæïc quan hãû, ngæåìi ta coi caïc pheïp toaïn
mäüt ngäi coï thæï tæû æu tiãn cao hån caïc pheïp toaïn hai ngäi. Ngoaìi ra, mäùi HQTDL
cuû thãø laûi coï nhæîng qui âënh riãng. Vê duû, pheïp giao coï thãø âæåüc qui âënh coï thæï tæû
æu tiãn cao hån pheïp häüi.
Ví dụ:
Tçm maî vaì tãn caïc màût haìng âæåüc nháûp vaì xuáút trong ngaìy 24/12/1997:
MAÎHAÌNG, TÃNHG ( ÂVT=”caïi” (HAÌNG)) *
(MAÎHAÌNG ( NGAÌY=”24/12/1997” (HAÌNGNHÁÛP) )
MAÎHAÌNG ( NGAÌY=”24/12/1997” (HAÌNGXUÁÚT)))
III. CÁC PHÉP TOÁN CƠ BẢN
Trong âaûi säú quan hãû, ta giaí thiãút caïc cäüt coï thãø khäng cáön âàût tãn, vaì quan
tám âãún thæï tæû caïc bäü (træåïc kia, thæï tæû cuía caïc vuìng vaì caïc cäüt khäng âaïng kãø). Nãúu
duìng säú thæï tæû thuäüc tênh trong caïc biãøu thæïc so saïnh, âãø traïình nháöm láùn, ta qui æåïc
coï dáúu $ âæïng træåïc säú thæï tæû .
Ta cuîng âaî giaí âënh moüi quan hãû âãöu hæîu haûn. Raìng buäüc vãö tênh hæîu haûn
dáùn âãún vaìi khoï khàn trong âaûi säú quan hãû vaì pheïp tênh quan hãû. Chàóng haûn,
khäng thãø cháúp nháûn pheïp toaïn buì (complementation) vç -R (táûp caïc quan hãû khäng
thuäüc R) seî sinh ra mäüt quan hãû vä haûn: khäng caïch chi liãût kã âæåüc hãút -R, cho duì
ngän ngæî hoíi cho pheïp coï mäüt biãøu thæïc nhæ váûy.
1. Phép chọn
(select operator, selection/ seïlection, restriction):
a. Mục đích
Pheïp choün laì pheïp tênh âãø xáy dæûng mäüt táûp con gäöm caïc bäü cuía quan hãû âaî
cho, thoía biãøu thæïc logic cho træåïc.
b. Giả thiết
- Cho quan hãû R trãn táûp thuäüc tênh U - kyï hiãûu R(U).
- Cho biãøu thæïc logic F phaït biãøu trãn U, gäöm coï:
i) caïc taïc täú (operands): laì caïc hàòng hoàûc caïc säú thæï tæû thuäüc tênh
ii)caïc pheïp so saïnh säú hoüc: <, , >, , =, 
iii) caïc pheïp logic:  (hoàûc),  (vaì),  (khäng).

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


47

Noïi caïch khaïc, F laì mäüt täø håüp gäöm caïc pheïp so saïnh caïc taïc täú, näúi nhau Comment [DB1]:

bàòng caïc pheïp logic. F seî cho kãút quaí "âuïng" hoàûc "sai" tuìy vaìo giaï trë cuû thãø cuía
tæìng bäü. Ta noïi bäü t thoía maîn F -kyï hiãûu F(t)- nãúu thay hãút moüi thuäüc tênh trong F
bàòng caïc giaï trë cuû thãø tæång æïng cuía bäü t thç F sinh ra kãút quaí âuïng. F âæåüc goüi laì
biãøu thæïc choün hoàûc âiãöu kiãûn choün.
c. Định nghĩa
Pheïp choün quan hãû R theo âiãöu kiãûn F cho ta quan hãû P:
P= R(F) = { t R | F(t) }
Ta cuîng coï thãø duìng kyï hiãûu F(R) thay vç R(F).
d. Ví dụ
Cho quan hãû:

MON_HOC MA_MON TEN_MON SO_DVHT CO_DE_AN


01 Cå såí dæî liãûu 5 .f.
02 Cáúu truïc dæî liãûu 4 .f.
03 Phán têch hãû thäúng 6 .f.
04 Cáúu truïc maïy tênh 4 .t.

Choün ra caïc män coï 4 âån vë hoüc trçnh vaì coï âãö aïn cho sinh viãn thæûc hiãûn.
MON_D_A= MON_HOC (SO_DVHT=4  CO_DE_AN)
hoàûc coï thãø viãút:
MON_D_A= $3=4  $4(MON_HOC)

MON MA_ TEN_MON SO_ CO_D


_D_A MON DVHT E_AN
04 Cáúu truïc maïy 4 .t.
tênh

2. Phép chiếu (projection)


a. Mục đích
Pheïp chiãúu trãn mäüt quan hãû thæûc cháút laì loaûi boí âi mäüt säú thuäüc tênh cuía
quan hãû âoï.
b. Giả thiết
Cho quan hãû R(U) n ngäi:
R=(A1, A2, ..., An) Ai  U

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


48

vaì táûp thuäüc tênh X  U:


X={ Aij } j=1,..,m ij=1,..., n
c. Định nghĩa
Pheïp chiãúu quan hãû R trãn X laì táûp håüp:
R[X]={ t[X] | t  R }
hoàûc:
R[X]= { b1b2...bm | ( a1a2...an) (j=1...m) bj= aij }
Cuîng coï thãø duìng kyï hiãûu R.X hoàûc i1, i2,...im (R) thay cho R[X].
d. Ví dụ
Duìng vê duû trãn, cho biãút maî vaì tãn caïc män hoüc.
MON_HOC_2= MON_HOC [MA_MON, TEN_MON]
= $1, $2(MON_HOC)

MON_HOC_2 MA_MON TEN_MON


01 Cå såí dæî liãûu
02 Cáúu truïc dæî liãûu
03 Phán têch hãû thäúng
04 Cáúu truïc maïy tênh

4. Quan hệ tương thích (compatible relations)


a. Âënh nghéa
Hai quan hãû âæåüc goüi laì tæång thêch våïi nhau nãúu chuïng coï cuìng så âäö
quan hãû.
b. Vê duû
Hai quan hãû MON_HOC vaì MON_D_A åí muûc 1 laì hai quan hãû tæång thêch.
c. ÆÏïng duûng
Våïi caïc quan hãû tæång thêch, ta coï thãø âënh nghéa caïc pheïp toaïn táûp håüp
nhæ giao, hiãûu vaì håüp.
5. Phép trừ (substraction, [set] difference)
a. Âënh nghéa
Hiãûu cuía hai quan hãû tæång thêch R(U) vaì S(U) laì quan hãû P(U) gäöm caïc bäü coï
trong R nhæng khäng coï trong S.
P= R  S= { t | t R  t S }
b. Vê duû

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


49

NHAN_ MA_NV HO_TEN CHUC_VU DON_VI MUC_LG


VIEN
001 Lã Vàn Syî GÂ BGÂ 550
002 Ng Chê Thanh PGÂ BGÂ 500
003 Cháu Vàn Liãm TP HCTH 480
004 Ng An Ninh PP HCTH 475
005 Phan Â. Phuìng HCTH 333
006 Ngä Gia Tæû TV 290

LANH_ MA_NV HO_TEN CHUC_ DON_VI MUC_LG


ÂAO VU
001 Lã Vàn Syî GÂ BGÂ 550
002 Ng Chê Thanh PGÂ BGÂ 500
003 Cháu Vàn Liãm TP HCTH 480
004 Ng An Ninh PP HCTH 475

NHAN_VIEN laì quan hãû chæïa caïc bäü vãö táút caí caïc nhán viãn trong cå
quan, coìn LANH_DAO chè liãn quan âãún nhæîng ngæåìi laînh âaûo. Tçm caïc nhán
viãn queìn (khäng laì laînh âaûo) trong cå quan.
NV_QUÈN= NHAN_VIEN  LANH_ÂAO

NHAN_VIEN MA_ HO_TEN CHUC_ DON_VI MUC_LG


_QUEN NV VU
005 Phan Â. Phuìng HCTH 333
006 Ngä Gia Tæû TV 290

6. Phép hội/ hợp (union)


a. Âënh nghéa
Håüp cuía hai quan hãû tæång thêch R(U) vaì S(U) laì quan hãû P(U) gäöm caïc bäü
thuäüc êt nháút mäüt trong hai quan hãû âaî cho:
P= R U S= { t | t R  t S }
b. Vê duû

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


50

BIEN_ MA_NV HO_TEN CHUC_VU DON_VI MUC_


CHE LG
001 Lã Vàn Syî GÂ BGÂ 550
002 Ng Chê Thanh PGÂ BGÂ 500
003 Cháu Vàn Liãm TP HCTH 480
004 Ng An Ninh PP HCTH 475
005 Phan Â. Phuìng HCTH 333
006 Ngä Gia Tæû TV 290

HOP_ MA_NV HO_TEN CHUC_VU DON_VI MUC


ÂONG _LG
011 Lã Vàn Taïm BV 290
012 Phaûm Vàn Âäöng BV 255
013 Ng Vàn Linh ÂTTH 310
014 Kim Âäöng ÂTTH 310

Trong cå quan, coï hai loaûi nhán viãn: biãn chãú vaì håüp âäöng. Danh saïch
chung toaìn bäü cuía cå quan laì:
NHAN_VIEN= BIEN_CHE  HOP_ÂONG

NHAN_VIEN MA_NV HO_TEN CHUC_VU DON_VI MUC_LG


001 Lã Vàn Syî GÂ BGÂ 550
002 Ng Chê Thanh PGÂ BGÂ 500
003 Cháu Vàn Liãm TP HCTH 480
004 Ng An Ninh PP HCTH 475
005 Phan Â. Phuìng HCTH 333
006 Ngä Gia Tæû TV 290
011 Lã Vàn Taïm BV 290
012 Phaûm Vàn Âäöng BV 255
013 Ng Vàn Linh ÂTTH 310
014 Kim Âäöng ÂTTH 310

7. Phép lấy tích Đề- các (Cartesian product/ produit cartésien)


a. Giaí thiãút
Cho quan hãû R(U) n ngäi có r bộ:
R=(A1, A2, ..., An) Ai  U

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


51

vaì quan hãû S(V) m ngäi có s bộ:


S=(B1, B2, ..., Bm) Bj  V
trong âoï, U vaì V khäng giao nhau:
UV=
b. Âënh nghéa
Têch Âãö-caïc cuía R vaì S laì táûp gäöm (r.s) bäü, mäùi bäü coï (n+m) thuäüc tênh, våïi
n thuäüc tênh âáöu coï daûng cuía mäüt bäü u R vaì m thuäüc tênh sau coï daûng cuía mäüt bäü
v S. Noïi caïch khaïc, mäùi bäü cuía R kãút näúi våïi moüi bäü cuía S.
R x S= { <u,v> | u R  v S }
c. Vê duû

DM_HANG MA_HANG TEN_HANG DVT


A01 Dáöu læía lêt
A02 Xàng lêt
B01 Âæåìng tràõng kg
B02 Âæåìng vaìng kg

NV_BAN NGAY MA_NV


20/09/1994 013
21/09/1994 014

DM= NV_BAN x DM_HANG

DM NGAY MA_NV MA_HANG TEN_HANG DVT


20/09/1994 013 A01 Dáöu læía lêt
20/09/1994 013 A02 Xàng lêt
20/09/1994 013 B01 Âæåìng tràõng kg
20/09/1994 013 B02 Âæåìng vaìng kg
21/09/1994 014 A01 Dáöu læía lêt
21/09/1994 014 A02 Xàng lêt
21/09/1994 014 B01 Âæåìng tràõng kg
21/09/1994 014 B02 Âæåìng vaìng kg
8. Phép đặt tên lại biểu thức quan hệ
a. Nhu cáöu âàût tãn laûi
Kãút quaí cuía caïc biãøu thæïc quan hãû khäng coï tãn âãø ta coï thãø goüi âãún chuïng dãù
daìng. Do âoï, cáön phaíi âàût tãn cho chuïng.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


52

Ta coï thãø sæí duûng nhiãöu láön cuìng mäüt quan hãû trong mäüt biãøu thæïc quan hãû (vê
duû: têch Âãö-caïc R x R), nãn coï thãø muäún âàût tãn laûi mäüt trong caïc taïc täú cuìng tãn âoï
âãø dãù duìng åí nhiãöu cäng âoaûn khaïc nhau, hoàûc âãø traïnh láùn läün, hoàûc âãø traïnh læu
noï trong nhiãöu vuìng nhåï khaïc nhau, màûc duì chè duìng mäüt vuìng læu træî cho quan hãû.
Cáön gaïn quan hãû kãút quaí tråí laûi vaìo quan hãû ban âáöu. Vê duû: P= P-1.
Khi muäún thæûc hiãûn mäüt trong caïc pheïp toaïn kết näúi, pheïp chia, pheïp giao,
pheïp hiãûu, trong khi caïc thuäüc tênh liãn quan åí caïc quan hãû laûi khaïc tãn nhau tuy
cuìng miãön giaï trë, ta coï thãø âäøi tãn thuäüc tênh cho mäüt trong caïc quan hãû âãø coï thãø
thæûc hiãûn âæåüc pheïp toaïn nhæ yï muäún.
Vê duû: R(A,C) muäún kãút näúi våïi S(B), hoàûc chia cho S(B), thç ta phaíi âäøi
tãn thuäüc tênh theo mäüt trong hai caïch sau:
R(A, C| B)
hoàûc S(B| C)
b. Âënh nghéa
Daûng 1:
Cho biãøu thæïc quan hãû E, biãøu thæïc
x (E)
traí laûi kãút quaí laì biãøu thæïc E dæåïi tãn x.
Daûng 2:
Cho biãøu thæïc quan hãû E coï báûc n. Biãøu thæïc
x (A1, A2, ..., An) (E)
traí laûi kãút quaí laì biãøu thæïc E dæåïi tãn x, vaì caïc thuäüc tênh âæåüc âàût tãn laûi laì A1, A2,
..., An.
c. Vê duû
Cho så âäö quan hãû:
NHÁNVIÃN (MAÎNV, HOÜNV, TÃNNV, MÆÏCLG, PHOÌNG, ÂÅNVË)
Tçm mæïc læång låïn nháút trong cäng ty.
Nhæ váûy, træåïc tiãn, ta seî tçm ra mäüt quan hãû taûm thåìi chæïa caïc mæï c læång
khäng phaíi laì låïn nháút trong cäng ty, räöi sau âoï seî thæûc hiãûn pheïp toïan træì giæîa 
MÆÏCLG (NHÁNVIÃN) vaì quan hãû taûm væìa tênh âæåüc.

Quan hãû taûm:


 MÆÏCLG ( NHÁNVIÃN. MÆÏCLG < d. MÆÏCLG (NHÁNVIÃN x d (NHÁNVIÃN)))
Kãút quaí:
 MÆÏCLG (NHÁNVIÃN) -
 MÆÏCLG ( NHÁNVIÃN. MÆÏCLG < d. MÆÏCLG (NHÁNVIÃN x d (NHÁNVIÃN)))
Tçm hoü tãn nhæîng nhán viãn åí cuìng phoìng vaì cuìng âån vë våïi nhán viãn coï tãn
Lan.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


53

 NHÁNVIÃN. HOÜNV, NHÁNVIÃN. TENNV


(NHÁNVIÃN. PHOÌNG = LAN. PHG  NHÁNVIÃN. ÂÅNVË = LAN. ÂV
(NHÁNVIÃN x  LAN (PHG, ÂV)
( PHOÌNG, ÂÅNVË (TENNV = “Lan” (NHÁNVIÃN)))))

III. CÁC PHÉP TOÁN KHÁC


1. Phép giao (intersection)
a. Âënh nghéa
Giao cuía hai quan hãû tæång thêch R(U) vaì S(U) laì quan hãû P(U) gäöm caïc bäü
thuäüc vãö caí hai quan hãû âaî cho:
P= R  S= { t | t R  t S }
b. Vê duû

NHA_ TEN ÂIA_CHI PHUONG QUAN


HANG
Huy Hoaìng 504 Âiãûn biãn phu 14 10
Tæång Lai 229 Ng Chê Thanh 6 5
Ngon 25 Voî Thë Saïu 9 10
Laình 130 Træång Âënh Ph. Nguî Laîo 1

KHACH_ TEN ÂIA_CHI PHUONG QUAN


SAN
Viãùn Âäng 2 Lã Låüi Bãún Ngheï 1
Huy Hoaìng 504 Âiãûn biãn phu 14 10
AÏïnh Häöng 151 Âàûng Dung 2 PN
Tæång Lai 229 Ng Chê Thanh 6 5

Tçm caïc nåi væìa laì khaïch saûn, væìa laì nhaì haìng.
NH_KS= KHACH_SAN  NHA_HANG

NH_KS TEN ÂIA_CHI PHUONG QUAN


Huy Hoaìng 504 Âiãûn biãn phu 14 10
Tæång Lai 229 Ng Chê Thanh 6 5

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


54

2. Phép chia (division)


a. Giaí thiãút
Cho hai quan hãû R(U) n ngäi vaì S(V) m ngäi, våïi VU vaì S.
Âàût X=U-V.
b. Âënh nghéa
Kãút quaí cuía pheïp chia quan hãû R cho S laì mäüt quan hãû gäöm caïc bäü t
coï (n-m) thuäüc tênh, sao cho våïi moüi bäü v trong S, thç <t,v> laì mäüt bäü thuäüc R.
R  S= { t=u[X] | u  R  (vS) (<t,v> R ) }
c. Vê duû
b1) Cho quan hãû:

DM NGAY MA_NV MA_HANG TEN_HANG DVT


20/09/1994 013 A01 Dáöu læía lêt
20/09/1994 013 A02 Xàng lêt
20/09/1994 013 B01 Âæåìng tràõng kg
20/09/1994 013 B02 Âæåìng vaìng kg
21/09/1994 014 A01 Dáöu læía lêt
21/09/1994 014 A02 Xàng lêt
21/09/1994 014 B01 Âæåìng tràõng kg
21/09/1994 014 B02 Âæåìng vaìng kg
22/09/1994 015 B01 Âæåìng tràõng kg
22/09/1994 015 B02 Âæåìng vaìng kg

HANG MA_HANG TEN_HANG DVT


A01 Dáöu læía lêt
A02 Xàng lêt
B01 Âæåìng tràõng kg
B02 Âæåìng vaìng kg

Tçm DM  HANG

DM  HANG NGAY MA_NV


20/09/1994 013
21/09/1994 014

b2) Cho quan hãû:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


55

CHUYEN MA_CH NGAY NOI_DI NOI_DEN SO_XE MA_TXE SO_HK


01 01/08 TP HCM Âaì laût 51 5025A A1 50
02 01/08 TP HCM Phan rang 50 3421H B2 18
03 01/08 TP HCM Cáön thå 65 1074A A3 52
04 02/08 Cáön thå TP HCM 65 1074A A3 56
05 03/08 Phan rang Vénh long 49 9836B I1 30
06 04/08 Âaì laût TP HCM 51 5025A A1 48
07 04/08 Âaì laût Cáön thå 54 7690B I1 48
08 05/08 Vénh long TP HCM 64 0342C I1 15

* Cáu hoíi:
Tçm caïc maî taìi xãú coï nåi âãún êt ra nhæ taìi xãú A3.
* Giaíi:
- Danh saïch nåi âãún cuía taìi xãú A3:
DS_ND= CHUYEN (MA_TXE='A3') [NOI_ÂEN]

DS_ND NOI_DEN
Cáön thå
TP HCM

- Danh saïch caïc nåi âãún keìm theo caïc taìi xãú :
TX_ND= CHUYEN [ NOI_ÂEN, MA_TXE ]

TX_ND NOI_DEN MA_TXE


Âaì laût A1
Phan rang B2
Cáön thå A3
TP HCM A3
Vénh long I1
TP HCM A1
Cáön thå I1
TP HCM I1

- Danh saïch caïc maî taìi xãú coï nåi âãún êt ra nhæ taìi xãú A3.
DS_TX= TX_ND  DS_ND

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


56

DS_TX MA_TXE
A3
I1

Ta tháúy ngoaìi taìi xãú A3 coï nåi âãún laì Cáön thå vaì TP HCM, coìn coï taìi xãú I1 laïi
xe âãún 3 nåi Vénh long, Cáön thå vaì TP HCM (räüng hån cuía A3).
3. Phép kết nối bình thường (join, inner join)
a. Âënh nghéa
Goüi  laì mäüt trong caïc pheïp so saïnh säú hoüc (<, , >, , =, ). Cho hai quan
hãû R(U) vaì S(V). Pheïp kãút näúi- giæîa quan hãû R âäúi våïi thuäüc tênh A (AU) vaì quan
hãû S âäúi våïi thuäüc tênh B (BV), âæåüc âënh nghéa nhæ sau:
R S = { <u,v> | u  R  vS  u[A]  v[B] }
AB
Pheïp näúi kãút naìy chè thæûc hiãûn âæåüc khi  thæûc hiãûn âæåüc giæîa A vaì B.
Nãúu khäng dæûa trãn pheïp so saïnh  , thç R S tråí thaình têch Âãö-caïc cuía
R vaì S. Nãúu. laì pheïp so saïnh "=", ta goüi âáy laì pheïp kãút näúi bàòng (equijoin).
Pheïp kãút näúi laì phæång tiãûn chuí yếu cho sæû thäng thæång giæîa caïc quan hãû.
b. Vê duû: Cho hai quan hãû:

GIAO_VIEN MA_GV HO_TEN SO_TIET_ÂA_DAY


01 Phaûm Thuïc Trung 200
02 Phaûm Gia Tiãún 150
03 Phaûm Xuán Laûc 280
04 Voî Vàn Chên 260

MON_HOC MA_MON TEN_MON SO_DVHT CO_DE_AN


07 Cå såí dæî liãûu 5 .F.
08 Cáúu truïc dæî liãûu 4 .F.
09 Phán têch hãû thäúng 6 .T.
10 Cáúu truïc maïy tênh 4 .T.

* Cáu hoíi:
Biãút ràòng mäùi âån vë hoüc trçnh chiãúm 15 tiãút. Haîy láûp baíng dæû kiãún
phán cäng giaíng daûy thãm caïc män trong danh saïch âaî cho, sao cho nãúu caïc giaïo
viãn coï daûy thãm thç cuîng khäng daûy væåüt quaï säú giåì chuáøn (280 tiãút).

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


57

* Giaíi:
- Træåïc tiãn, ta nháûn xeït baíng phán cäng chè cáön maî giaïo viãn, säú
giåì âaî daûy, maî män hoüc vaì säú âån vë hoüc trçnh. Nhæ váûy, noï seî laì kãút quaí cuía pheïp
kãút näúi giæîa 2 quan hãû coï så âäö sau:
GIAO_VIEN_2 (MA_GV, SO_TIET_ÂA_DAY)
MON_HOC_2 (MA_MON, SO_DVHT)
våïi âiãöu kiãûn kãút näúi laì:
SO_TIET_ÂA_DAY + SO_DVHT * 15<= 280
hay:
SO_TIET_ÂA_DAY <= 280 - SO_DVHT * 15
- Nhæ váûy, ta phaíi thæûc hiãûn caïc pheïp chiãúu trãn GIAO_VIEN vaì
MON_HOC, vç:
GIAO_VIEN_2 = GIAO_VIEN [ MA_GV, SO_TIET_ÂA_DAY ]
MON_HOC_2 = MON_HOC [ MA_MON, SO_DVHT ]

GIAO_VIEN_2 MA_GV SO_TIET_ÂA_DAY


01 200
02 150
03 280
04 260

MON_HOC_2 MA_MON SO_DVHT


07 5
08 4
09 6
10 4

- Sau âoï, thæûc hiãûn pheïp kãút näúi:


PH_CONG_DAY= GIAO_VIEN_2 MON_HOC_2
SO_TIET_ÂA_DAY <= 280 - SO_DVHT *15

PH_CONG_DAY MA_GV SO_TIET_ÂA_DAY MA_MON SO_ÂVHT


01 200 07 5
01 200 08 4
01 200 10 4
02 150 07 5

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


58

02 150 08 4
02 150 09 6
02 150 10 4

4. Phép kết nối tự nhiên (natural join)


a. Âënh nghéa
Træåìng håüp kãút näúi bàòng taûi thuäüc tênh cuìng tãn cuía hai quan hãû, vaì mäüt
trong hai thuäüc tênh âoï bë loaûi boí qua pheïp chiãúu, thç pheïp kãút näúi âæåüc goüi laì pheïp
kãút näúi tæû nhiãn, vaì sæí duûng kyï hiãûu "*".
b. Vê duû
Âaî coï mäüt lëch thi vaì baíng phán cäng chênh thæïc, haîy phán cäng dæû kiãún
cho caïc giaïo viãn gaïc män mçnh sàõp daûy hoàûc âaî daûy.

LICH_THI MA_MON NGAY PHONG


01 12/07/1994 B
02 14/07/1994 B
03 16/07/1994 B
04 17/07/1994 C
05 12/07/1994 C
06 14/07/1994 C
07 16/07/1994 D
08 17/07/1994 E
09 12/07/1994 D
10 14/07/1994 E

PH_CONG_CT MA_GV MA_MON


01 01
01 07
01 08
02 03
02 09
02 10
03 04
03 05
04 02
04 06

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


59

Ta thæûc hiãûn mäüt pheïp kãút näúi tæû nhiãn nhæ sau:
PH_CONG_GAC= LICH_THI * PH_CONG_CT

PH_CONG_GAC MA_MON NGAY PHONG MA_GV


01 12/07/1994 B 01
02 14/07/1994 B 04
03 16/07/1994 B 02
04 17/07/1994 C 03
05 12/07/1994 C 03
06 14/07/1994 C 04
07 16/07/1994 D 01
08 17/07/1994 E 01
09 12/07/1994 D 02
10 14/07/1994 E 02

5. Phép kết nối mở rộng (outer join)


a. Âënh nghéa
Pheïp toïan naìy cho pheïp laìm viãûc våïi thäng tin bë thiãúu, tæïc laì váùn thæûc hiãûn
pheïp kãút näúi tæû nhiãn trãn caïc trë träúng cuía thuäüc tênh duìng âãø kãút näúi. Nhæ váûy seî
traïnh laìm máút thäng tin nhæ trong træåìng håüp kãút näúi bçnh thæåìng.
Coï 3 loüai kãút näúi måí räüng: måí räüng traïi, måí räüng phaíi vaì måí räüng toìan bäü.

Loaûi Kyï hiãûu Âënh nghéa


Måí räüng traïi Kãút quaí = P  ( R S ), våïi:
R S
(left outer P = {<u, v> | uR, u khäng tæång æïng våïi bäü naìo
join) cuía S & vS, caïc trë cuía caïc thuäüc tênh trong v âãöu
âæåüc gaïn trë träúng }
Måí räüng Kãút quaí = Q  ( R S ), våïi:
phaíi (right R S Q = {<u, v> | vS, v khäng tæång æïng våïi bäü naìo
outer join ) cuía R & uR, caïc trë cuía caïc thuäüc tênh trong u âãöu
âæåüc gaïn trë träúng }
Måí räüng Kãút quaí = P  Q  ( R S )
toìan bä (full S
våïi P vaì Q âæåüc âënh nghéa nhæ trãn.
R
outer join)

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


60

b. Vê duû
Cho hai quan hãû:

NHÁNVIÃN MAÎNV HOÜNV TÃNNV PHAÏI PHOÌNG


A12 Lã Trçnh Nam H.chaïnh
A13 Phan Âaïn Nam K.nghiãûm
A14 Tráön Mai Næî K.nghiãûm
A15 Nguyãùn Minh Nam Thiãút bë

VÅÜCHGNV MAÎNV HOÜVC TÃNVC


A16 Täúng Âaìo
A13 Lã Lan Anh
A14 Phaûm Tuáún
A17 Lã Trang
Goüi :

TAÛM = NHÁNVIÃN VÅÜCHGNV

NHÁNVIÃN VÅÜCHGNV
TRAÏI =
NHÁNVIÃN VÅÜCHGNV
PHAÍI =
HAIBÃNN = NHÁNVIÃN VÅÜCHGNV

TAM MAÎNV HOÜNV TÃNNV PHAÏI PHOÌNG HOÜVC TÃNVC


A13 Phan Âaïn Nam K.nghiãûm Lã Lan Anh
A14 Tráön Mai Næî K.nghiãûm Phaûm Tuáún

TRAÏI MAÎNV HOÜNV TÃNNV PHAÏI PHOÌNG HOÜVC TÃNVC


A12 Lã Trçnh Nam H.chaïnh
A13 Phan Âaïn Nam K.nghiãûm Lã Lan Anh
A14 Tráön Mai Næî K.nghiãûm Phaûm Tuáún
A15 Nguyãùn Minh Nam Thiãút bë

PHAÍI MAÎNV HOÜNV TÃNNV PHAÏI PHOÌNG HOÜVC TÃNVC


A16 Täúng Âaìo
A13 Phan Âaïn Nam K.nghiãûm Lã Lan Anh

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


61

A14 Tráön Mai Næî K.nghiãûm Phaûm Tuáún


A17 Lã Trang

HAIB MAÎNV HOÜNV TÃNNV PHAÏI PHOÌNG HOÜVC TÃNVC


ÃN
A12 Lã Trçnh Nam H.chaïnh
A13 Phan Âaïn Nam K.nghiãûm Lã Lan Anh
A14 Tráön Mai Næî K.nghiãûm Phaûm Tuáún
A15 Nguyãùn Minh Nam Thiãút bë
A16 Täúng Âaìo
A17 Lã Trang

6. Các hàm kết tập (aggregate functions)


a. Caïc haìm kãút táûp bçnh thæåìng
Âënh nghéa:
Caïc haìm kãút táûp bçnh thæåìng laì caïc haìm thæûc hiãûn trãn mäüt táûp caïc giaï trë vaì
traí laûi kãút quaí laì giaï trë duy nháút. Táûp håüp âæåüc xeït coï thãø coï nhiãöu láön xuáút hiãûn cho
mäüt giaï trë vaì âæåüc goüi laì táûp bäüi (multiset); hoàûc noï cuîng coï thãø chè coï mäüt láön xuáút
hiãûn cho mäüt giaï trë, âoï laì táûp håüp ta thæåìng gàûp (set).
Nãúu xeït trãn táûp bäüi, nhæng ta muäún loüai caïc trë truìng nhau, thç phaíi thãm tæì
khoïa distinct vaìo sau tãn haìm vaì dáúu gaûch ngang.
Danh saïch haìm:

Tãn YÏ nghéa
haìm
sum Tênh täøng cuía mäüt táûp giaï trë số
avg Tênh trung bçnh cuía mäüt táûp giaï trë số
count Âãúm säú giaï trë cuía mäüt táûp håüp
max Tênh giaï trë låïn nháút cuía mäüt táûp giaï trë
min Tênh giaï trë nhoí nháút cuía mäüt táûp giaï trë

Vê duû:
Duìng quan hãû GIAO_VIEN maì ta âaî biãút:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


62

GIAO_VIEN MA_GV HO_TEN SO_TIET_ÂA_DAY


01 Phaûm Thuïc Trung 200
02 Phaûm Gia Tiãún 150
03 Phaûm Xuán Laûc 280
04 Voî Vàn Chên 260

Cáu hoíi Haìm Kãút quaí


Täøng säú tiãút caïc giaïo viãn âaî daûy sum SO_TIET_ÂA_DAY (GIAO_VIEN) 890
Trung bçnh säú tiãút âaî daûy / giaïo viãn avg SO_TIET_ÂA_DAY (GIAO_VIEN) 222.5
Täøng säú giaïo viãn âaî daûy count (GIAO_VIEN) 4
Säú tiãút âaî daûy nhiãöu nháút / giaïo viãn max SO_TIET_ÂA_DAY (GIAO_VIEN) 280
Säú tiãút âaî daûy êt nháút / giaïo viãn min SO_TIET_ÂA_DAY (GIAO_VIEN) 150

Vê duû:

LICH_THI MA_MON NGAY SÄÚ_TS PHONG


01 12/07/1994 25 B
02 14/07/1994 30 B
03 16/07/1994 50 B
04 17/07/1994 40 C
05 12/07/1994 20 C
06 14/07/1994 15 C
07 16/07/1994 65 D
08 17/07/1994 50 E
09 12/07/1994 35 D
10 14/07/1994 40 E

Cáu hoíi Haìm Kãút quaí

Säú män coï trong lëch thi count (LËCH_THI) 10


Säú phoìng âæåüc xãúp cho thi count-distinct PHONG (LËCH_THI) 4
Täøng säú thê sinh âi thi sum SÄÚ_TS (LËCH_THI) 370
Ngaìy thi trãù nháút max-distinct NGAY (LËCH_THI) 17/07/1994
Ngaìy thi såïm nháút min-distinct NGAY (LËCH_THI) 12/07/1994

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


63

b. Haìm kãút táûp trãn nhoïm caïc bäü


Nhu cáöu:
Coï nhæîng træåìng håüp ta muäún aïp duûng haìm kãút táûp khäng phaíi chè trong mäüt
táûp caïc bäü thäi, maì trãn nhiãöu nhoïm, mäùi nhoïm laì mäüt táûp caïc bäü.
Âënh nghéa:
Goüi E laì mäüt biãøu thæïc âaûi säú quan hãû báút kyì. G 1, G2, ..., Gm taûo thaình danh
saïch caïc thuäüc tênh maì viãûc chia nhoïm dæûa trãn âoï. Våïi mäùi i=1, ..., n, mäùi Fi laì mäüt
haìm kãút táûp vaì mäùi Ai laì mäüt tãn thuäüc tênh.
Haìm kãút táûp trãn nhoïm coï daûng:
G1, G2, ..., Gm G F1 A1, F2A2, ..., FnAn (E)

Caïc bäü trong biãøu thæïc E seî âæåüc chia thaình caïc nhoïm sao cho:
+ Táút caí caïc bäü trong mäüt nhoïm seî coï cuìng giaï trë trãn G 1, G2, ..., Gm.
+ Caïc bäü åí caïc nhoïm khaïc nhau seî coï trë khaïc nhau trãn G1, G2, ..., Gm
Nhæ váûy, caïc nhoïm coï thãø âæåüc xaïc âënh bàòng giaï trë cuía caïc thuäüc tênh G1, G2,
..., Gm.
Âäúi våïi mäùi nhoïm (g1, g2, ..., gm), kãút quaí seî coï mäüt bäü
(g1, g2, ..., gm, a1, a2, ..., an)
trong âoï, våïi mäùi i, ai laì kãút quaí cuía viãûc aïp duûng haìm Fi trãn táûp bäüi caïc trë
cuía Ai trong nhoïm.
Vê duû 1:
Duìng quan hãû LËCH_THI åí trãn.

Cáu hoíi Haìm Kãút quaí

Säú män PHOÌNG G count PHOÌNG B 3


MA_MON (LËCH_THI)
coï trong lëch thi/ PHOÌNG C 3
phoìng
PHOÌNG D 2
PHOÌNG E 2
Täøng säú thê sinh âi NGAÌY G sum SÄÚ_TS 12/07/1994 80
thi / ngaìy (LËCH_THI)
14/07/1994 85
16/07/1994 115
17/07/1994 90
Ngaìy thi trãù nháút PHOÌNG G max NGAY PHOÌNG B 16/07/1994

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


64

/ phoìng (LËCH_THI)
PHOÌNG C 17/07/1994
PHOÌNG D 16/07/1994
PHOÌNG E 17/07/1994
Ngaìy thi såïm nháút PHOÌNG G min PHOÌNG B 12/07/1994
/ phoìng NGAY(LËCH_THI)
PHOÌNG C 12/07/1994
PHOÌNG D 12/07/1994
PHOÌNG E 14/07/1994

Ví dụ 2:
GVIÊN (MS_GV, HỌ, TÊN, MÃ_KHOA, CHỨC_VỤ, HỌC_VỊ, CHỨC
DANH)
GTRÌNH (MS_GT, TÊN, SỐ_TC, SỐ_TRG, THĐIỂM_PH)
VIẾT_GT (MS_GT, MS_GV, CH_PHỤ)
KHOA (MÃ_KHOA, TÊN_KHOA)
1. Tìm số giáo trình mà hiệu trưởng Nguyễn Anh Tuấn đã phát hành từ
năm 1998 đến 2008.
2. Tìm ngày phát hành sớm nhất của giáo trình “Mạng máy tính” viết bởi
giáo viên Phan Thượng Cang.
3. Tìm số giáo trình mà mỗi giáo viên ở Khoa Nông nghiệp đã viết.
4. Tìm số trang dày nhất trong số các giáo trình mang tên “Dinh dưỡng
cho cá”.
5. Tìm thời điểm phát hành gần nhất trong số các giáo trình viết bởi mỗi
giáo viên.
6. Tìm tổng số tín chỉ mà mỗi giáo viên Khoa Khoa học đã viết giáo
trình.
7. Tìm tổng số giáo viên có học vị thạc sĩ hoặc tiến sĩ ở mỗi khoa đã viết
giáo trình trong khoảng thời gian từ năm 2004 đến nay.
8. Tìm trung bình số tín chỉ của các giáo trình viết bởi các giáo viên có
chức vụ Trưởng bộ môn.
9. Tìm tên các giáo trình mà thạc sĩ Lê Văn Lâm đã viết.
10. Tìm họ tên và tên khoa của giáo viên viết được nhiều giáo trình nhất từ
năm 2007 đến nay.
11. Tìm mã và tên của các quyển giáo trình có số tín chỉ nhiều nhất Khoa
CNTT-TT.
12. Tìm tổng số giáo trình đã viết trong khoa có nhiều giáo viên nhất.
13. Tìm tên các khoa có trung bình số giáo trình viết bởi mỗi giáo viên lớn
hơn 3.

Ví dụ 3:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


65

THÍ_SINH (MS_TS, HỌ, TÊN, NĂM_SINH, TRĐỘ_VH, TỈNH)


GIÁM_KHẢO (MS_GK, PHÁI, HỌ, TÊN, NĂM_SINH, NGHỀ,
NƠI_CGTÁC)
SỞ_THÍCH (MS_ST, DGIẢI)
THÍCH (MS_TS, MS_ST)
CHẤM (VÒNG, MS_GK, MS_TS, ĐIỂM)

14. Tìm số thí sinh có sở thích về thời trang.


15. Tìm sở thích có nhiều thí sinh chọn nhất.
16. Tìm mã số và họ tên các thí sinh lọt vào vòng bán kết (giả sử đạt trung
bình trên 9 điểm).
17. Tìm họ tên các vị giám khảo đã cho ở vòng 2 thí sinh Huỳnh Thị Hồng
Loan điểm bằng với điểm cao nhất.
18. Tìm thí sinh thích đi du lịch nhưng không thích nấu ăn.
19. Tìm những thí sinh có nhiều sở thích nhất.
20. Tìm vị giám khảo ở vòng chung kết vừa cho điểm cao nhất cho thí
sinh Nguyễn Thùy Lâm, vừa cho điểm cao nhất cho thí sinh Mai
Phương Thúy.
21. Tìm vị giám khảo cao tuổi nhất và có số vòng chấm điểm nhiều nhất.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


66

Chương 4
NGÔN NGỮ HỎI SQL

I. GIỚI THIỆU NGÔN NGỮ SQL


1. Sự cần thiết của ngôn ngữ hỏi SQL
Âaûi säú quan hãû vaì pheïp tênh quan hãû âãöu hãút sæïc cå baín âãø biãøu diãùn caïc cáu
hoíi, nhæng váùn coìn mang nàûng tênh cháút hçnh thæïc nhiãöu. Do âoï, caïc HQTCSDL
trãn thë træåìng cáön mäüt ngän ngæî hoíi thán thiãûn våïi ngæåìi sæí duûng hån, trong khi
váùn âaím baío dæûa trãn hai khaïi niãûm trãn.
SQL (træåïc kia âæåüc goüi laì SEQUEL: Structured English Query Language) âaïp
æïng âæåüc yãu cáöu âoï. Âoï laì mäüt ngän ngæî hoíi thäng duûng nháút trãn thë træåìng tin
hoüc, dæûa trãn caí âaûi säú quan hãû láùn pheïp tênh quan hãû trãn bäü.
2. Sự xuất hiện của SQL
Coï nhiãöu phiãn baín (version) cuía SQL.
Tiãön thán cuía ngän ngæî SQL laì SQUARE, cuîng laì mäüt ngän ngæî hoíi do
HQTDL System R phaït triãøn vaì âæåüc thiãút kãú åí Phoìng Nghiãn cæïu åí San Jose cuía
IBM (hiãûn nay laì Almaden Reseaích Center) vaìo nhæîng nàm âáöu 70.
Do caïch trçnh baìy cuía SQUARE tæång âäúi khoï (hay duìng chè säú trãn, chè säú
dæåïi, kyï hiãûu toaïn hoüc, ... trong ngæî phaïp) trãn maïy tênh, nãn SQL thay thãú. Luïc
âoï, noï coï tãn laì SEQUEL 2. Âãún nay âaî coï ráút nhiãöu ngän ngæî caìi âàût SQL.
Nàm 1986, Viãûn Chuáøn quäúc gia cuía Myî (ANSI: Amercan National Standard
Institute) vaì Täø chæïc Chuáøn Thãú giåïi (ISO: International Standard Organization)
cäng bäú mäüt SQL chuáøn, goüi laì SQL-86. Nàm 1987, IBM cuîng xuáút baín chuáøn
SQL riãng, tãn SAA-SQL (Systems Application Architecture Database Interface).
Mäüt chuáøn måí räüng khaïc cuía SQL laì SQL-89, âæåüc xuáút baín nàm 1989, vaì caïc
HQTDL hiãûn nay âãöu phaíi caìi âàût êt ra laì SQL-89. Phiãn baín hiãûn nay cuía SQL theo
chuáøn cuía ANSI / ISO laì SQL-92. Khaïc våïi caïc phiãn baín træåïc, âæåüc âàût ra âãø
thêch æïng våïi caïc saín pháøm thæång maûi âaî coï træåïc, SQL-92 âàût ra chuáøn træåïc âãø
caïc saín pháøm phaíi tuán theo âoï khi caìi âàût SQL.
Ngæåìi ta âaî áúp uí mäüt dæû aïn vãö SQL hæåïng âäúi tæåüng, âënh âàût tãn laì SQL-93,
nhæng nay âaî âäøi tãn thaình SQL-3 (coï thãø do khäng tung ra âæåüc vaìo nàm 1993
nhæ dæû âënh ?) như là một bí danh, vì tên đúng của nó là SQL:1999.
Gần đây, có SQL:2003 bước đầu đưa ra các tiện ích liên quan XML. Nhưng
thực sự đến SQL:2006 mới có đưa vào (import) và lưu trữ dữ liệu theo XML trong
CSDL, và cho phép tích hợp ngôn ngữ hỏi Xquery do W3C đưa ra vào các trình
ứng dụng, để truy xuất đồng thời dữ liệu thông thường và dữ liệu theo XML.
Tuy nhiên, không phải các chuẩn SQL được miễn phí. SQL:2003 và
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
67

SQL:2006 có thể mua từ ISO hoặc ANSI. Tuy nhiên, có bản thảo miễn phí (late
draft) cho SQL:2003 dưới dạng tập tin nén .zip từ Whitemarsh Information
Systems Corporation. Tập tin này chứa một số tập tin PDF định nghĩa các phần
của đặc tả SQL:2003.
3. Ưu điểm của SQL
SQL laì mäüt ngän ngæî CSDL quan hãû coï tênh chuyãn sáu, âæåüc duìng âãø
âënh nghéa, sæî duûng vaì kiãøm tra caïc CSDL quan hãû.
a) Baín thán tãn cuía noï cuîng noïi lãn mäüt æu âiãøm: gáön våïi ngän ngæî tæû nhiãn,
âån giaín vaì coï cáúu truïc, bàòng caïch duìng caïc tæì khoïa SELECT ... FROM ... WHERE
... âãø chè ra vai troì giæîa quan hãû vaì caïc tãn thuäüc tênh
b) SQL coï thãø âæïng mäüt mçnh nhæ mäüt ngän ngæî hoíi âäüc láûp. Ngæåìi sæí duûng
chè cáön biãøu diãùn caïc cáu hoíi dæåïi daûng SQL vaì HQTDL System R seî khai thaïc
chuïng vaì traí låìi.
c) SQL cuîng coï thãø âæåüc läöng trong mäüt ngän ngæî chuí khaïc.
d) Mäüt cáu lãûnh SQL thay thãú âæåüc cho caí mäüt âoüan chæång trçnh nhiãöu cáu
lãûnh.
e) HQTCSDL seî âaím traïch luän pháön täúi æu hoïa cáu hoíi, ngæåìi sæí duûng khäng
phaíi báûn tám nhiãöu vãö âiãöu naìy.
f) Ngæåìi sæí duûng coï thãø duìng bê danh cho quan hãû âãø âån giaín hoïa caïch goüi
quan hãû:
SELECT ... FROM R T WHERE ...
T âoïng vai troì nhæ mäüt con troí chè âãún bäü hiãûn haình cuía quan hãû âang xeït
R. ÅÍ âáy, chênh laì dæûa trãn pheïp âàût tãn laûi trong âaûi säú quan hãû, vaì cuîng dæûa trãn
biãún bäü trong pheïp tênh quan hãû trãn bäü.
g) Liãût kã nhiãöu hån 1 quan hãû trong nhoïm tæì FROM, do âoï, coï thãø viãút cáu
lãûnh mäüt caïch ngàõn goün maì váùn truy xuáút âæåüc âäöng thåìi âãún nhiãöu quan hãû âãø thæûc
hiãûn pheïp láúy têch Âãö-caïc hoàûc caïc loaûi kãút näúi.
4. Các tiện ích của SQL
SQL DDL: Cung cáúp caïc lãûnh âãø âënh nghéa vaì sæía caïc så âäö quan hãû, xoïa caïc
quan hãû, taûo chè muûc.
SQL DML tæång taïc: Âáy laì pháön quan troüng nháút cuía SQL, biãøu läü roî nháút
tênh cháút cuía mäüt ngän ngæî hoíi dæûa trãn âaûi säú quan hãû vaì pheïp tênh quan hãû trãn
bäü. Noï cuîng gäöm luän caïc lãûnh thãm, xoïa, sæía caïc bäü trong CSDL.
DML nhuïng (embedded SQL): Daûng nhuïng cuía SQL âæåüc thiãút kãú âãø caìi âàût
trong caïc ngän ngæî láûp trçnh cáúp cao nhæ C, Fortran, Cobol, Pascal, PL/ I. Nãúu
phán biãût kyî, ta coìn tháúy noï bao haìm caí SQL âäüng (dynamic SQL).
Âënh nghéa khung nhçn: Coï thãø âënh nghéa khung nhçn nhåì mäüt cáu lãûnh SQL
khaïc.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
68

Quaín lyï taïc quyãön: Coï caïc lãûnh âãø âàûc taí quyãön truy xuáút âãún caïc quan hãû vaì
khung nhçn.
Raìng buäüc toìan veûn: SQL cung cáúp caïc lãûnh âãø âàûc taí caïc raìng buäüc toìan veûn
maì dæî liãûu læu trong CSDL phaíi thoía.
Âiãöu kiãøm giao taïc: SQL coï caïc lãûnh âãø âàûc taí nåi bàõt âáöu vaì kãút thuïc cuía mäùi
giao taïc. Nhiãöu pheïp caìi âàût cuîng cho pheïp khoïa cäng khai (explicit locking) dæî liãûu
âãø giuïp cho sæû caûnh tranh giæîa caïc giao taïc.

Ta có thể tóm tắt các loại lệnh SQL trong bảng sau:

Loại lệnh Tên lệnh Ý nghĩa


DML Tìm kiếm SELECT Tìm kiếm dữ liệu
DML Cập nhật INSERT Thêm dữ liệu
UPDATE Sửa dữ liệu
DELETE Xóa dữ liệu
MERGE Trộn dữ liệu
DDL CREATE Tạo mới quan hệ
ALTER Sửa cấu trúc quan hệ
DROP Xóa quan hệ
RENAME Đặt tên lại cho quan hệ
TRUNCATE
Âiãöu kiãøm giao taïc COMMIT
ROLLBACK
SAVEPOINT
DCL (Data Control GRANT Taûo quyãön truy xuáút quan hãû
Language)
REVOKE Hủy quyãön truy xuáút quan hãû

5. Phạm vi trình bày SQL trong bài giảng


ÅÍ âáy, træåïc tiãn ta xeït SQL-99, chuáøn hån, vaì mới hơn, do âoï, phæïc
taûp hån, caìi âàût chàût cheî trong caïc pháön mãöm låïn hån Sau âoï, ta laìm quen våïi
SQL-92 cuû thãø trong SQL Server 2000, Foxpro 2.6 vç dãù caìi âàût trãn maïy nhoí vaì
âån giaín seî giuïp dãù nàõm âæåüc caïc khaïi niãûm chênh.
Riãng trong quaï trçnh trçnh baìy, seî coï âãö cáûp âãún caïc khaïi niãûm, caïc lãûnh, ...
cuía riãng HQTCSDL vaì tuy coï liãn quan âãún SQL nhæng khäng thuäüc vãö SQL. Viãûc
tçm hiãøu chi tiãút caïc váún âãö âoï xin daình cho ngæåìi âoüc, vç khäng nàòm trong phaûm

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


69

vi cuía män Cå såí dæî liãûu naìy.


Trong caïc vê duû, seî coï duìng âãún CSDL gäöm caïc quan hãû:
SV (MA_SV, HO_SV, TEN_SV, NAM_S_SV, ÂCHI_SV, LOP)
GV (MA_GV, HO_GV, TEN_GV, NAM_S, HOC_VI)
MON (TEN_MON)
HOC (MA_SV, TEN_MON, MA_GV, STT_HK, N_KHOA, K_QUA)
Ngoaìi ra, coìn coï mäüt CSDL khaïc, våïi caïc quan hãû:
KH_HANG (MA_KH, TEN_CTY, DUONG, TY_SUAT_THUE, TINH_TP)
NVIEN ( MA_NV, HO_TEN_NV, MUC_LUONG)
HOA_DON (SO_HD, MA_KH, TRI_GIA_HD, MA_NV, NGAY_GHI)
CHI_TRA (MA_KH, NGAY_TRA, SO_TIEN)
HS_KDOANH (MA_KH, MAT_HANG)
II. CÁC LỆNH DDL ĐỊNH NGHĨA VÀ CẬP NHẬT SƠ ĐỒ CSDL TRONG
SQL-99
1. Tạo bảng
Trong SQL-99, phân biệt 4 loại bảng:
Bảng cơ sở thường trực (persistent base table): lưu trữ dữ liệu thường xuyên
trong CSDL, có thể được gọi trong bất kỳ phiên (session) nào của SQL. Đây là
kiểu hay gặp nhất.
Bảng tạm toàn cục (global temporary table): bảng chỉ tồn tại trong một
phiên của SQL, do đó giữa các phiên với nhau, nội dung sẽ khác nhau.
Bảng tạm cục bộ được tạo (created local temporary table): giống như kiểu
trên, nhưng thay vì được truy xuất từ bất kỳ nơi đâu trong phiên SQL, bảng kiểu
này chỉ được truy xuất bên trong đơn thể (module) liên quan.
Bảng tạm cục bộ được khai báo (declared local temporary table): được khai
báo như một phần của một thủ tục trong một đơn thể. Định nghĩa của bảng chỉ
được chứa trong sơ đồ quan hệ và được khai thác khi thủ tục được khai thác. Như
kiểu trên, nó chỉ được tham chiếu trong nội bộ phiên.
a. Ngæî phaïp
CREATE [{GLOBAL | LOCAL} TEMPORARY] TABLE <tãn baíng >
(< phần tử bảng> [ { , < phần tử bảng> > } … ] )
[ ON COMMIT {PRESERVE | DELETE } ROWS ]
[ < ràng buộc toàn vẹn trên toàn bảng> ]
b. Giaíi thêch
{ } : để gom lại các yếu tố lại với nhau
Tùy theo HQTCSDL, tên bảng có thể bao gồm tên sơ đồ, tên được cấp
quyền (authorization identifier) hay tên của CSDL (ví dụ: QLNS.NV).

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


70

Dòng thứ 3 chỉ áp dụng khi ta muốn tạo một bảng tạm. Nó cho phép ta xác
định bảng có được xóa trắng hay không khi lệnh COMMIT (là một lệnh cho giao
tác để xác nhận các thay đổi trong CSDL) được thi hành.
< phần tử bảng> : chủ yếu là định nghĩa cột và ràng buộc toàn vẹn.
Ngữ pháp để định nghĩa một cột:
<tên cột> { <kiểu> | < miền giá trị> }
[ <ràng buộc toàn vẹn trên cột > ] [ COLLATE < tên của tập collation> ]
Ràng buộc toàn vẹn trên cột :
- Trị mặc nhiên:
DEFAULT <exp >
exp: biểu thức nói chung, có thể là hằng, hàm hoặc NULL
- Trị rỗng:
NOT NULL
- Tính duy nhất:
UNIQUE
- Khóa chính:
PRIMARY KEY
- Luận lý:
CHECK ( <expL> )
- Khóa ngòai:
[ NOT NULL ] REFERENCES <tên bảng cha>
[( <ds tên các cột của khóa chính trong bảng cha> )]
[MATCH { FULL| PARTIAL | SIMPLE } ]
[<thao tác kích khởi>]
+ Chỉ đặc tả ds tên các cột của khóa chính trong bảng cha khi chúng
khác với tên của các cột trong khóa ngoài.
MATCH: để đặc tả mức độ tương ứng giữa khóa chính và khóa
ngoài.
FULL: tương ứng hoàn toàn,
PARTIAL : tương ứng từng phần
SIMPLE : tương ứng tự do, là mức độ tương ứng mặc nhiên khi
không có mệnh đề MATCH.
+ thao tác kích khởi: thao tác sẽ được thực hiện trên bảng con khi
cập nhật trên bảng cha. Ngữ pháp:
ON UPDATE <thao tác > [ ON DELETE <thao tác > ]
| ON DELETE <thao tác > [ ON UPDATE <thao tác > ]
<thao tác kích khởi> ::=
CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION
+ RESTRICT : Nếu việc cập nhật hoặc xóa trên bảng cha có thể vi
phạm RBTV trên bảng con, thì không thực hiện cập nhật hoặc xóa này trên bảng
cha.
Ràng buộc toàn vẹn trên toàn bảng: Trước tiên, có thể đặc tả tên ràng
buộc:
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
71

[ CONSTRAINT <tên ràng buộc> ]


và sau đó là các mệnh đề tương ứng với loại ràng buộc.
- Tính duy nhất:
UNIQUE (< tên cột> [ { , < tên cột> > } … ] )
- Khóa chính:
PRIMARY KEY (< tên cột> [ { , < tên cột> > } … ] )
- Khóa ngòai:
FOREIGN KEY <ds tên các cột của khóa ngoài >
REFERENCES <tên bảng cha>
[<ds tên các cột của khóa chính trong bảng cha>]
[MATCH { FULL| PARTIAL | SIMPLE } ]
[<thao tác kích khởi>]
- Luận lý:
CHECK <exp>
2. Định nghĩa ràng buộc toàn vẹn trên nhiều bảng
a. Ngæî phaïp
CREATE ASSERTION <tên ràng buộc> CHECK <exp>
b. Yêu cầu:
Phải được định nghĩa độc lập với định nghĩa của các bảng liên quan.
c. Vê duû
CREATE ASSERTION rb_tong CHECK
( (SELECT sum(LUONG+PCAP) from LG_NV) < 30000)
3. Định nghĩa miền giá trị
a. Ngæî phaïp
CREATE DOMAIN <tên miền giá trị> [AS] <kiểu>
[DEFAULT <exp > ]
[ CONSTRAINT <tên ràng buộc> ]
[CHECK <exp> ]
b. Yêu cầu
Âënh nghéa miãön giaï trë theo kiãíu vaì kêch thæåïc âaî âàûc taí.
c. Vê duû
CREATE DOMAIN chuoi40 char(40)
4. Sửa sơ đồ quan hệ
a. Ngæî phaïp
ALTER TABLE <tên bảng>
ADD [COLUMN] < định nghĩa cột>
| ALTER [COLUMN] < tên cột>
{ SET DEFAULT < trị mặc nhiên> | DROP DEFAULT}
[ ADD <ràng buộc toàn vẹn trên cột > ]

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


72

| ADD [ <ràng buộc toàn vẹn trên bảng > ]


| DROP [COLUMN] < tên cột> { CASCADE | RESTRICT }

b. Giaíi thêch
* DROP: xóa đi, ADD: thêm vào, ALTER: sửa.
* Định nghĩa cột: như ở lệnh CREATE.
* Đối với việc sửa định nghĩa một cột, chỉ có thể đặt hoặc xóa trị mặc nhiên
của nó nếu có.
* Ràng buộc toàn vẹn trên cột và trên bảng: như ở lệnh CREATE.
* CASCADE | RESTRICT : như trong phần định nghĩa ràng buộc toàn vẹn
về khóa ngoài.
5. Xóa một quan hệ
a. Ngæî phaïp
DROP TABLE <tãn baíng> { CASCADE | RESTRICT }
b. Vê duû
Xoïa quan hãû MON:
DROP TABLE MON RESTRICT
6. Tạo khung nhìn
a. Ngæî phaïp
CREATE VIEW < tên khung nhìn> [ ( <danh sách các cột> ) |
AS <câu hỏi> ]
[ WITH CHECK OPTION ]
b. Giaíi thêch
* <câu hỏi>: là câu lệnh tìm kiếm SELECT.
* WITH CHECK OPTION : cho biết phải luôn kiểm tra ràng buộc toàn vẹn trên
mệnh đề WHERE của SELECT (thông số này chỉ áp dụng cho SELECT có WHERE).

III. CÁC LỆNH DDL ĐỊNH NGHĨA VÀ CẬP NHẬT SƠ ĐỒ CSDL TRONG
SQL SERVER 2008
1. Tạo CSDL
a. Ngæî phaïp
CREATE DATABASE < tên CSDL >

[;]
d. Giaíi thêch
< tên CSDL >: là tên của CSDL muốn tạo. Tên này phải duy nhất trong
một lần chạy SQL Server và theo qui tắc đặt tên, dài tối đa 128 ký tự.
e. Ví dụ
CREATE DATABASE nhansu;
USE nhansu;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


73

2. Tạo bảng
a. Ngæî phaïp
CREATE TABLE
[ <tãn CSDL> .[<tãn chủ bảng> . ]
| <tãn chủ bảng>
] <tãn baíng >
( { < định nghĩa cột>
| <tên cột> AS <exp>
}…)
b. Giaíi thêch
* Các ràng buộc có thể có:
- Ràng buộc về trị mặc nhiên trên cột: như ở SQL-99. Nhưng ngòai ra, cũng
có thể tạo ra trị mặc nhiên độc lập với việc gắn trị với một cột nào đó:
CREATE DEFAULT [<tên chủ bảng>.] <tên của trị mặc nhiên>
AS <exp>
Ví dụ
CREATE DEFAULT ma_tinh_mn AS “071”
Muốn xóa đi định nghĩa trên:
DROP DEFAULT { [<tên chủ bảng>.] <tên của trị mặc nhiên> , …}
- Ràng buộc về luận lý: dùng để hạn chế trị nhập vào chỉ trong một tập nào
đó, hoặc dùng để định dạng dữ liệu nhập. Để tạo ra một ràng buộc về luận lý trên
bảng:
CONSTRAINT <tên ràng buộc>
CHECK [NOT FOR REPLICATION] ( <exp>)
Ví dụ:
CREATE TABLE nv
( ma char(25),
ho char(25),
ten char(8),
tel char(7)
CONSTRAINT rb_tel
CHECK ( tel LIKE ‘ [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] ‘)
)
Ta cũng có thể tạo ra ràng buộc độc lập với bảng, bằng cách tạo ra các qui
tắc:
CREATE RULE [<tên chủ bảng>.] <tên của qui tắc>
AS <exp luận lý>
Ví dụ:
CREATE RULE qt_tel
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
74

AS @tel LIKE ‘ [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] ‘

CREATE RULE qt_nam_s


AS @nam_s<=2007 and @nam_s>=1907
- Ràng buộc toàn vẹn về khóa: cũng như ở SQL-99.
- Ràng buộc toàn vẹn về khóa ngoài: cũng như ở SQL-99, nhưng thao tác
kích khởi có thay đổi:
[ ON DELETE { CASCADE | NO ACTION } ]
[ON UPDATE { CASCADE | NO ACTION } ]

Ví dụ: Ràng buộc trên một thuộc tính


DEFAULT (getdate())

SalesPersonID int NULL REFERENCES SalesPerson(SalesPersonID)

FOREIGN KEY (SalesPersonID) REFERENCES


SalesPerson(SalesPersonID)

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
FOREIGN KEY (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
Name nvarchar(100) NOT NULL UNIQUE
CHECK (CreditRating >= 1 and CreditRating <= 5)
CHECK (emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]')
Ví dụ:
CREATE TABLE PurchaseOrderDetail
(
PurchaseOrderID int NOT NULL
REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
LineNumber smallint NOT NULL,
ProductID int NULL REFERENCES Production.Product(ProductID),
UnitPrice money NULL,
OrderQty smallint NULL,
ReceivedQty float NULL,
RejectedQty float] NULL,
DueDate datetime NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


75

CONSTRAINT [DF_PurchaseOrderDetail_rowguid] DEFAULT (newid()),


ModifiedDate datetime NOT NULL
CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate
DEFAULT (getdate()),
LineTotal AS ((UnitPrice*OrderQty)),
StockedQty AS ((ReceivedQty-RejectedQty)),
CONSTRAINT PK_PurchaseOrder__LineNumber
PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
WITH (IGNORE_DUP_KEY = OFF)
)
ON [PRIMARY];

Ví dụ:
Vê duû sau âãø taûo mäüt CSDL måïi tãn Mydata1 vaì 3 baíng (Salesman,
Customer, and Orders).
- Taûo CSDL mydata1 trong thæ muûc hiãûn haình.
CREATE DATABASE mydata1
- Taûo baíng salesman våïi khoïa chênh
CREATE TABLE salesman
(SalesID c(6) PRIMARY KEY,
SaleName C(20))
- Taûo baíng customer vaì liãn kãút noï våïi baíng salesman.
CREATE TABLE customer
( SalesID c(6),
CustId i PRIMARY KEY,
CustName c(20) UNIQUE,
SalesBranch c(3),
FOREIGN KEY SalesId TAG SalesId REFERENCES salesman)
- Taûo baíng orders , liãn kãút noï våïi customer våïi khoïa chênh vaì âàûc taí caïc raìng
buäüc toìan veûn.
CREATE TABLE orders
( OrderId i PRIMARY KEY,
CustId i REFERENCES customer TAG CustId,
OrderAmt y(4),
OrderQty i DEFAULT 10 CHECK (OrderQty > 9),
DiscPercent n(6,2) NULL,
CHECK (OrderAmt > 0)
)
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
76

3. Kiểu dữ liệu trong SQL Server


Kiểu dữ liệu trong SQL Server được chia thành các loại sau:
Exact numerics Unicode character strings
Approximate numerics Binary strings
Date and time Other data types
Character strings

Exact Numerics Unicode Character Strings


bigint numeric n
nvarchar
bit smallint char
decimal smallmoney n
int tinyint text

money
Approximate Binary Strings
Numerics
binary varbinary
float real
image
Date and Time Other Data Types
date datetimeoffset cursor timestamp
datetime2 smalldatetime hierarchyid uniqueidentifier
datetime time sql_variant xml
table
Character Strings
char varchar
text

4. Sửa sơ đồ quan hệ
a. Ngæî phaïp
ALTER TABLE <tên bảng>
{ ADD [< định nghĩa cột> ]
| <tên cột> AS <exp> }
[ [ DEFAULT <exp> ]
| [ IDENTITY [ (<trị bắt đầu, bước nhảy >)

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


77

[ NOT FOR REPLICATION ] ]


]
|
{ ALTER COLUMN < tên cột>
{ < kiểu dữ liệu mới >
[ NULL | NOT NULL ] }
| [ WITH { CHECK | NOCHECK } ]

|
{ DROP COLUMN < tên cột>
| [ CONSTRAINT ] <tên ràng buộc toàn vẹn >
}

|
[ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK }
CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
|

{ ENABLE | DISABLE } TRIGGER


{ ALL | trigger_name [ ,...n ] }

b. Giải thích
Như ở SQL-99, lệnh này nhằm thay đổi hoặc xóa một cột đã có tên, hoặc
thêm một cột mới vào bảng.
 Sửa đổi cột:
Cột được sửa đổi không thể ở một trong những dạng sau:
 Có kiểu dữ liệu timestamp
 ROWGUIDCOL
 Cột có tính toán (computed column) hoặc được dùng trong một cột
có tính toán.
 Cột được dùng trong một chỉ mục, trừ phi cột này có kiểu varchar,
nvarchar, hoặc varbinary, kiểu dữ liệu không thay đổi, kích thước
mới lớn hơn hoặc bằng kích thước cũ, và chỉ mục không là kết quả
của một ràng buộc PRIMARY KEY.
 Được dùng trong một ràng buộc PRIMARY KEY hoặc
[FOREIGN KEY] REFERENCES.
 Được dùng trong một ràng buộc CHECK hoặc UNIQUE. Tuy
nhiên, được phép thay đổi chiều dài của cột có kiểu chuỗi ký tự
biến đổi (variable-length column) dùng trong một ràng buộc
CHECK hoặc UNIQUE.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


78

 Có định nghĩa kèm giá trị mặc nhiên. Tuy nhiên, chiều dài, số chữ
số thập phân của một cột có thể được thay đổi nếu kiểu dữ liệu
không đổi.
Kiểu dữ liệu của các cột text, ntext and image chỉ có thể được thay
đổi theo các cách sau:
 text thành varchar(max), nvarchar(max), hoặc xml
 ntext thành varchar(max), nvarchar(max), hoặc xml
 image thành varbinary(max)
Một số thay đổi kiểu dữ liệu có thể gây nên thay đổi trong dữ liệu. Chẳng
hạn như đổi cột kiểu nchar hoặc nvarchar column sang kiểu char hoặc varchar có
thể làm chuyển đổi các ký tự mở rộng (extended characters). Xem thêm CAST and
CONVERT (Transact-SQL).
Giảm số chữ số thập phân hoặc kích thước một cột có thể làm cắt cụt dữ liệu
(data truncation).
 Xóa cột:
Cột được xóa không thể ở một trong những dạng sau:
 Cột được dùng trong một chỉ mục.
 Được dùng trong một ràng buộc CHECK, FOREIGN KEY,
UNIQUE, hoặc PRIMARY KEY.
 Có định nghĩa kèm giá trị mặc nhiên bởi từ khóa DEFAULT.
 Gắn với một qui tắc (rule).
 { CHECK | NOCHECK } CONSTRAINT
Cho biết ràng buộc có được thực hiện hay không. Chỉ áp dụng cho
các ràng buộc dạng FOREIGN KEY hoặc CHECK. Các ràng buộc
DEFAULT, PRIMARY KEY, và UNIQUE không thể bị vô hiệu.
ALL
Cho biết mọi ràng buộc hoặc có thể bị vô hiệu bởi NOCHECK hoặc được
thực hiện toàn bộ bởi CHECK.
 { ENABLE | DISABLE } TRIGGER
Cho biết trigger (trình kích khởi) có tên đặc tả sẽ được thực hiện hay
không. Khi một trigger bị vô hiệu, nó vẫn còn được định nghĩa cho
bảng; tuy nhiên, khi các lệnh INSERT, UPDATE, hoặc DELETE
thực hiện trên bảng, trigger sẽ không được thực thi cho đến khi nó
được cho phép trở lại.
ALL
Cho biết mọi triggers được phép thực thi hay không.

 WITH CHECK | WITH NOCHECK

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


79

Cho biết dữ liệu trong bảng có được kiểm tra lại hay không theo một ràng
buộc FOREIGN KEY or CHECK mới được thêm vào hoặc được cho phép trở lại
(re-enable). Nếu không đặc tả, sẽ coi như có WITH CHECK đối với các ràng buộc
mới, và WITH NOCHECK đối với các ràng buộc được cho phép trở lại. Việc đặc
tả WITH NOCHECK để khỏi kiểm tra các ràng buộc mới CHECK hoặc
FOREIGN KEY không được khuyến khích, ngoại trừ trong các trường hợp hiếm

Ví dụ:
c1. Thêm một cột mới
CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa
ADD column_b VARCHAR(20) NULL ;
GO

ALTER TABLE customer ADD COLUMN fax c(20) NULL


c2. Xóa một cột
CREATE TABLE dbo.doc_exb (
column_a INT,
column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
c3. Đổi kiểu dữ liệu của một cột
CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy
ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
c4. Thêm một cột có ràng buộc
CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
GO

c5. Thêm một ràng buộc CHECK không kiểm tra cho một cột đã có
Cột trong ví dụ sau có một giá trị vi phạm ràng buộc toàn vẹn. Do đó, WITH
NOCHECK được dùng để ngăn không kiểm tra ràng buộc trên các dòng dữ liệu
đang có, và cho phép ràng buộc được thêm vào.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


80

CREATE TABLE dbo.doc_exd ( column_a INT) ;


GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1);
GO
c6. Thêm một ràng buộc DEFAULT cho một cột đã có
Ví dụ sau tạo ra một bảng có 2 cột và thêm vào một giá trị cho cột đầu, còn
cột thứ hai vẫn giữ NULL. Một ràng buộc DEFAULT sau đó được thêm vào cho
cột thứ hai này. Để kiểm tra xem giá trị mặc nhiên có được áp dụng chưa, một
giá trị khác được thêm vào cột thứ nhất, và bảng sẽ dduwwojc truy vấn.
CREATE TABLE dbo.doc_exz (
column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (7) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES (10) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
c7. Thêm nhiều cột có ràng buộc
Cột mới đầu tiên có tính chất IDENTITY. Mỗi dòng trong bảng có các giá
trị mới tăng dần trong cột thứ nhất đó.
CREATE TABLE dbo.doc_exe (
column_a INT CONSTRAINT column_a_un UNIQUE);
GO
ALTER TABLE dbo.doc_exe ADD

-- Add a PRIMARY KEY identity column.


column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,

-- Add a column that references another column


-- in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


81

-- Add a column with a constraint to enforce


-- that nonnull data is
-- in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE
'[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9])
[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.


column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
c8. Thêm một cột có thể null với các giá trị mặc nhiên
Ví dụ sau có dùng DEFAULT và dùng WITH VALUES để cung cấp các
giá trị cho mỗi dòng hiện có trong bảng. Nếu WITH VALUES không được dùng,
mỗi dòng sẽ có giá trị NULL trong cột mới.
USE AdventureWorks ;
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH
VALUES ;
GO
c9. Vô hiệu và cho phép lại một ràng buộc
Ví dụ sau vô hiệu hóa một ràng buộc giới hạn mức lương trong dữ liệu.
NOCHECK CONSTRAINT được dùng với ALTER TABLE để vô hiệu ràng buộc
và cho phép chèn thêm dữ liệu thường là vi phạm ràng buộc. CHECK
CONSTRAINT cho phép ràng buộc có hiệu lực lại.
CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


82

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe
Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary
Smith',75000);

-- This insert violates the constraint.


INSERT INTO dbo.cnst_example VALUES (3,'Pat
Jones',105000);

-- Disable the constraint and try again.


ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT
salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat
Jones',105000);

-- Re-enable the constraint and try another insert;


this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT
salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric
James',110000) ;
c10. Xóa một ràng buộc
CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT
my_constraint ;
GO
c11. Vô hiệu và cho phép lại một trigger
Ví dụ sau dùng thông số DISABLE TRIGGER của ALTER TABLE để vô
hiệu trigger và cho phép chèn thêm dữ liệu vi phạm trigger. ENABLE TRIGGER
sau đó được dùng để cho phép lại trigger.
CREATE TABLE dbo.trig_example
( id INT,
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR
INSERT
AS

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


83

IF (SELECT COUNT(*) FROM INSERTED


WHERE salary > 100000) > 0
BEGIN
print 'TRIG1 Error: you attempted to insert a
salary > $100,000'
ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat
Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1
;
GO
-- Try an insert that would typically violate the
trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck
Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary
Booth',100001) ;
GO
c12. Thêm và xóa một ràng buộc FOREIGN KEY
USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact
FOREIGN KEY (ContactID)
REFERENCES Person.Contact (ContactID)
;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


84

c13. Thay đổi kích thước một cột


Ví dụ sau tăng kích thước của một cột kiểu varchar và số chữ số thập phân,
kích thước của một cột kiểu số thập phân. Vì các cột đang chứa dữ liệu, kích thước
cột chỉ có thể tăng thôi. Lưu ý rằng col_a được định nghĩa như một chỉ mục cho
tính duy nhất. Kích thước của col_a có thể được tăng vì kiểu dữ liệu của nó là
varchar và chỉ mục không phải kết quả của một ràng buộc PRIMARY KEY.
IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL
DROP TABLE dbo.doc_exy;
GO

-- Create a two-column table with a unique index on


the varchar column.
CREATE TABLE dbo.doc_exy (
col_a varchar(5) UNIQUE NOT NULL,
col_b decimal (4,2));
GO

INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);


GO

-- Verify the current column size.


SELECT name, TYPE_NAME(system_type_id), max_length,
precision, scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO

-- Increase the size of the varchar column.


ALTER TABLE dbo.doc_exy ALTER COLUMN col_a
varchar(25);
GO

-- Increase the scale and precision of the decimal


column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal
(10,4);
GO

-- Insert a new row.


INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize',
99999.9999) ;
GO

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


85

-- Verify the current column size.


SELECT name, TYPE_NAME(system_type_id), max_length,
precision, scale
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

c14. Các ví dụ đơn giản


*
ALTER TABLE customer ADD PRIMARY KEY cust_id TAG cust_id

ALTER TABLE customer ALTER COLUMN cust_id c(5) PRIMARY KEY

*
ALTER TABLE orders;
ALTER COLUMN quantity CHECK quantity >= 0;
ERROR "Quantities must be non-negative"

*
ALTER TABLE orders;
ADD FOREIGN KEY cust_id TAG cust_id REFERENCES customer

*
ALTER TABLE orders ALTER COLUMN quantity DROP CHECK

*
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE

*
CLEAR
ALTER TABLE customer ADD COLUMN fax2 c(20) NOT NULL

ALTER TABLE customer;


ALTER COLUMN fax2 NULL;
ALTER COLUMN fax2 SET DEFAULT NULL

ALTER TABLE customer DROP COLUMN fax2


* Thãm thuäüc tênh chè âëa chè giaïo viãn vaìo quan hãû GV:
ALTER TABLE GV

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


86

ADD ÂCHI_GV chuoi40


* Xoïa thuäüc tênh chè âëa chè giaïo viãn trong quan hãû GV:
ALTER TABLE GV
DROP ÂCHI_GV

5. Xóa một quan hệ


a. Ngæî phaïp
DROP TABLE [ < tên CSDL >. [ < tên lược đồ > ] .
| < tên lược đồ > . ]
< tên bảng > [ ,...n ] [ ; ]
b. Giaíi thêch:
DROP TABLE không thể dùng để xóa một bảng được tham chiếu tới
(referenced table) tức bảng cha bằng một ràng buộc FOREIGN KEY. Trước tiên,
ràng buộc FOREIGN KEY hoặc bảng đi tham chiếu (referencing table) tức bảng
con phải được xóa trước. Nếu cả hai bảng cha con đều bị xóa trong cùng một lệnh
DROP TABLE, bảng con phải được liệt kê trước.
Khi một bảng bị xóa, các qui tắc hoặc các giá trị mặc nhiên trên bảng cũng
bị mất sự gắn kết với bảng, các ràng buộc hoặc triggers gắn với bảng cũng tự động
bị xóa. Nếu tạo lại bảng, ta phải gắn lại (rebind) các thành phần này.
Nếu ta chỉ xóa hết tất cả dữ liệu trên các dòng bằng lệnh DELETE < tên
bảng > hoặc TRUNCATE TABLE, bảng vẫn còn đó cho đến khi ta xóa bảng bằng
lệnh DROP TABLE.
Ví dụ:
c1. Xóa một bảng trong CSDL hiện hành
Ví dụ sau xóa bảng ProductVendor1 cùng dữ liệu và các chỉ mực của nó
khỏi CSDL hiện hành.
DROP TABLE ProductVendor1 ;
c2. Xóa một bảng trong CSDL khác trong cùng phiên hoạt động của server
(server instance).
DROP TABLE AdventureWorks.dbo.SalesPerson2 ;
c3. Xóa một bảng tạm
Ví dụ sau tạo ra một bảng tạm, kiểm tra xem nó có tồn tại không, xóa nó đi,
và lại kiểm tra sự tồn tại của nó lần nữa.
USE AdventureWorks;
GO
CREATE TABLE #temptable (col1 int);
GO
INSERT INTO #temptable VALUES (10);
GO
SELECT * FROM #temptable;
GO

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


87

IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT


NULL
DROP TABLE #temptable;
GO
--Test the drop.
SELECT * FROM #temptable;

6. Tạo khung nhìn


a. Ngæî phaïp
CREATE VIEW < tên khung nhìn> [ ( <danh sách các cột> ) ]
[ WITH { ENCRYPTION| SCHEMABINDING | VIEW_METADATA } ]
AS <câu hỏi>
[ WITH CHECK OPTION ]
b. Giaíi thêch
* Nếu tên cột không được kể ra, cột trong khung nhìn sẽ lấy tên cột trong
mệnh đề SELECT của câu hỏi. Tên cột sẽ dùng khi cột là kết quả của một phép
toán số học, một hàm hay một hằng.
* < câu hỏi > là câu lệnh SELECT định nghĩa khung nhìn. Câu lệnh có thể
dùng nhiều hơn một bảng và các khung nhìn khác.
Trong một định khung nhìn có chỉ mục, lệnh SELECT phải thực hiện trên
một bảng đơn, hoặc là kết quả của phép kết nối JOIN nhiều bảng và cho ra kết quả
của một hàm kết tập nào đó.
* WITH ENCRYPTION: dùng để mã hóa chương trình trong khung nhìn
để bảo vệ quyền sở hữu trí tuệ của các nhà lập trình ứng dụng.
* SCHEMABINDING : sơ đồ của các đối tượng trong khung nhìn liên
quan chặt chẽ với cấu trúc khung nhìn nên không thể được cập nhật nếu sự cập nhật
này ảnh hưởng đến khung nhìn.
* VIEW_METADATA : nhắm tránh tìm thông tin về cấu trúc khi đang ở
mức các đối tượng của khung nhìn.
c. Ví dụ
c1. Lệnh tạo khung nhìn đơn giản
Ví dụ sau tạo ra một khung nhìn bằng một lệnh SELECT đơn giản. Một
khung nhìn đơn giản hữu ích khi một tổ hợp nhiều cột thường được truy vấn cùng
nhau thường xuyên. Dữ liệu hiển thị ra tên của nhân viên nhưng lại che đi thông tin
về ngày tuyển dụng của họ. Khung nhìn có thể được tạo ra cho người có trách
nhiệm theo dõi niên hạn công việc của nhân viên nhưng không cho phép người này
truy cập tất cả các dữ liệu trong các bảng gốc.
USE AdventureWorks ;
GO
IF OBJECT_ID ('hiredate_view', 'V') IS NOT NULL
DROP VIEW hiredate_view ;
GO

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


88

CREATE VIEW hiredate_view


AS
SELECT c.FirstName, c.LastName, e.EmployeeID,
e.HireDate
FROM HumanResources.Employee e
JOIN Person.Contact c on e.ContactID = c.ContactID
;
GO
c2. Dùng WITH ENCRYPTION
Ví dụ sau dùng WITH ENCRYPTION và hiển thị các cột được tính toán,
các cột được đổi tên và nhiều cột khác.
USE AdventureWorks ;
GO
IF OBJECT_ID ('Purchasing.PurchaseOrderReject',
'V') IS NOT NULL
DROP VIEW Purchasing.PurchaseOrderReject ;
GO
CREATE VIEW Purchasing.PurchaseOrderReject WITH
ENCRYPTION
AS
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,
RejectedQty / ReceivedQty AS RejectRatio, DueDate
FROM Purchasing.PurchaseOrderDetail
WHERE RejectedQty / ReceivedQty > 0
AND DueDate > CONVERT(DATETIME,'20010630',101) ;
GO
c3. Dùng WITH CHECK OPTION

Ví dụ sau chỉ ra một khung nhìn tên SeattleOnly tham chiếu đến năm bảng
và cho phép chỉnh sửa dữ liệu chỉ trên những nhân viên sống ở Seattle.

USE AdventureWorks ;
GO

IF OBJECT_ID ('dbo.SeattleOnly', 'V') IS NOT NULL


DROP VIEW dbo.SeattleOnly ;
GO

CREATE VIEW dbo.SeattleOnly


AS
SELECT c.LastName, c.FirstName, a.City,
s.StateProvinceCode
FROM Person.Contact AS c

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


89

JOIN HumanResources.Employee AS e ON c.ContactID =


e.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON
e.EmployeeID = ea.EmployeeID
JOIN Person.Address AS a ON ea.AddressID =
a.AddressID
JOIN Person.StateProvince AS s ON a.StateProvinceID
= s.StateProvinceID
WHERE a.City = 'Seattle'
WITH CHECK OPTION ;
GO
c4. Dùng hàm nội trú (built-in functions) trong khung nhìn
Khi dùng hàm trong khung nhìn, ta phải đặct ả tên cho cột tương ứng.
USE AdventureWorks ;
GO

IF OBJECT_ID ('Sales.SalesPersonPerform', 'V') IS


NOT NULL
DROP VIEW Sales.SalesPersonPerform ;
GO

CREATE VIEW Sales.SalesPersonPerform


AS
SELECT TOP 100 SalesPersonID, SUM(TotalDue) AS
TotalSales
FROM Sales.SalesOrderHeader
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)
GROUP BY SalesPersonID;
GO

IV. CÁC LỆNH CẬP NHẬT DỮ LIỆU


1. Sửa dữ liệu
a. Ngæî phaïp
UPDATE <tãn baíng>
SET <tãn cäüt>= <giaï trë>
[ WHERE <âiãöu kiãûn> ]
b. YÏï nghéa
Sæía giaï trë cuía mäüt säú thuäüc tênh trong baíng.
c. Vê duû
Âäøi kãút quaí cuía sinh viãn coï maî '010' cuía män ' Cáúu truïc dæî liãûu' laì 5.5
âiãøm:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


90

UPDATE HOC
SET K_QUA=5.5
WHERE MA_SV='010' AND TEN_MON='Cáúu truïc dæî liãûu'
2. Xóa một số dòng
a. Ngæî phaïp
DELETE FROM <tãn baíng>
WHERE <âiãöu kiãûn>
b. YÏï nghéa
Chè xoïa khoíi baíng nhuîng doìng thoía âiãöu kiãûn âaî cho.
c. Vê duû
Xoïa khoíi danh saïch sinh viãn coï maî '015':
DELETE FROM SV
WHERE MA_SV='015'
3. Xóa tất cả các dòng
a. Ngæî phaïp
DELETE FROM <tãn baíng>
b. YÏ nghéa
Sau khi bë xoïa, baíng váùn täön taûi nhæng räùng.
c. Vê duû:
Xoïa baíng MON:
DELETE FROM MON
4. Thêm vào bảng một bộ cụ thể
a. Ngæî phaïp
INSERT INTO <tãn táûp tin bảng>
[(<tãn vuìng 1> [, <tãn vuìng 2> [, ...]])]
VALUES (<expr1> [, <expr2> [, ...]])
b. Giaíi thêch
* INSERT INTO <tãn táûp tin >
<tãn táûp tin > âàûc taí tãn cuía táûp tin CSDL maì máùu tin seî âæååüc thãm vaìo.
<tãn táûp tin > coï thãø chæïa mäüt âæåìng dáùn vaì coï thãø laì mäüt biãøu thæïc coï âàût tãn.
* [(<tãn vuìng 1> [, <tãn vuìng 2>[, ...]])]
VALUES (<expr1> [, <expr2> [, ...]])
Nhoïm tæì âàûc taí caïc giaï trë (<expr1>, <expr2>, ... ) âãø chæïa trong máùu tin
âang âæåüc thãm vaìo CSDL. Baûn phaíi âàûc taí caïc giaï trë theo thæï tæû âënh båíi cáúu truïc
CSDL, træì khi baûn coï âàûc taí tãn vuìng. Mäùi tãn vuìng coï thãø laì mäüt biãøu thæïc coï âàût
tãn.
c. YÏ nghĩîa

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


91

Thãm mäüt máùu tin vaìo cuäúüi táûp tin CSDL âang täön taûi, tæïc thãm mäüt bäü vaìo
quan hãû âæååüc biãøu diãùn båíi táûp tin âoï. Máùu tin måïi chæïa dæî liãûu liãût kã trong lãûnh
INSERT.
d. Vê duû
- Cho quan hãû:
HOC(MA_SV, TEN_MON, MA_GV, STT_HK, N_KHOA, K_QUA)
Thãm mäüt doìng vaìo baíng HOC, chæïa thäng tin liãn quan sinh viãn coï
maî '025' hoüc män Lëch sæí Âaíng våïi giaïo viãn maî 'A03' vaìo hoüc kyì 2 niãn khoïa
94-95 vaì âaût âiãøm 4.
INSERT INTO hoc
VALUES ('025', 'Lëch sæí Âaíng', 'A03', '2', '94-95', 4)
-
INSERT INTO cong_nvien (ho_ten, luong, duong, tinh_tp, tel) ;
VALUES ('Fred Parks', 63500.00, '111 Westwood', 'New York',
'99452')
5. Thêm vào bảng một số dòng từ mảng trong bộ nhớ
a. Ngæî phaïp
INSERT INTO <tãn táûp tin dbf>
FROM ARRAY <maíng>
FROM MEMVAR
b. Giaíi thêch
* FROM ARRAY <maíng>
<maíng> laì tãn mäüt maíng âang chæïa dæî liãûu cho máùu tin âæåüc thãm vaìo.
* FROM MEMVAR
FROM MEMVAR cheïp dæî liãûu tæì caïc biãún nhåï sang máùu tin måïi trong CSDL
tãn <tãn táûp tin dbf>. Dæî liãûu chè âæåüc cheïp sang caïc vuìng tæåång æïng våïi caïc biãún
nhåï. Nãúu caïc biãún nhåï chè täön taûi cho mäüt säú vuìng trong <tãn táûp tin dbf>, caïc vuìng
khäng tæång æïng våïi biãún nhåï naìo seî váùn mang trë träúng.
b. YÏ nghéa
Thãm mäüt máùu tin vaìo cuäúüi táûp tin CSDL âang täön taûi, tæïc thãm mäüt bäü vaìo
quan hãû âæåüc biãøu diãùn båíi táûp tin âoï. Máùu tin måïi chæïa dæî liãûu trong mäüt maíng cho
træåïc. Phaíi âaím baío caïc cäüt âæåüc choün tæì maíng phaíi phuì håüp våïi caïc cäüt cuía baíng
1.
c. Vê duû
Láûp danh saïch låïp 'ÂT17' tæì maíng LOP_ÂT17 (giaí thiãút træåïc âoï ta
âaî taûo maíng LOP_ÂT17 coï cuìng så âäö quan hãû våïi ÂT17):
INSERT INTO ât17 ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


92

FROM ARRAY lop_ât17

V. CÁC LỆNH DML CHO TÌM KIẾM


1. Giới thiệu chung về lệnh SELECT
Lãûnh SELECT trong SQL duìng âãø láúy dæî liãûu tæì mäüt hoàûc nhiãöu táûp tin
CSDL. SELECT ráút maûnh vaì coï thãø thay thãú mäüt chuäùi lãûnh cuía ngän ngæî chuí, do
âoï noï laìm täúi æu hoïa chæång trçnh..
SELECT cho pheïp baûn âàûc taí thäng tin baûn muäún maì khäng cáön baío
HQTCSDL laìm thãú naìo âãø coï âæåüc chuïng. HQTCSDL seî diãùn dëch caïc cáu hoíi vaì
xaïc âënh caïch täút nháút âãø láúy thäng tin.
SELECT âæåüc duìng våïi nhiãöu thäng säú (option) khaïc nhau. Dæåïi âáy laì ngæî
phaïp âáöy âuí cuía noï:
2. Lệnh SELECT trong SQL Server
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
Các phép toán hội, trừ và giao (UNION, EXCEPT và INTERSECT) có thể
được dùng giữa các câu truy vấn.
Ngữ pháp chi tiết:
<SELECT statement> ::=
[WITH <common_table_expression> [,...n]]
<query_expression>
[ ORDER BY { order_by_expression | column_position [ ASC
| DESC ] }
[ ,...n ] ]
[ COMPUTE
{ { AVG | COUNT | MAX | MIN | SUM } (expression )} [ ,...n ]
[ BY expression [ ,...n ] ]
]
[ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ]

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


93

<query_expression> ::=
{ <query_specification> | ( <query_expression> ) }
[ { UNION [ ALL ] | EXCEPT | INTERSECT }
<query_specification> | ( <query_expression> ) [...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
[TOP (expression) [PERCENT] [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { <table_source> } [ ,...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING < search_condition > ]

3. Lệnh SELECT trong Oracle9i

SELECT [ALL | DISTINCT]


[<bê danh>.]<muûc>
[AS <tãn cäüt>]
[, [<bê danh>.]<muûc>
[AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
[, <táûp tin CSDL> [<bê danh cuûc bäü>] ...]
[[INTO <âêch>]
[WHERE <âiãöu kiãûn näúi kãút>
[AND <âiãöu kiãûn näúi kãút> ...]
[AND | OR
<âiãöu kiãûn choün>
[AND | OR
<âiãöu kiãûn choün>...]]]
[GROUP BY <nhoïm caïc cäüt>
[, <nhoïm caïc cäüt> ...]]

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


94

[HAVING <âiãöu kiãûn choün>]


[<phép toán tập hợp> [ALL] <lãûnh SELECT >]
[ORDER BY <muûc âãø sàõp> [ASC | DESC]
[, <muûc âãø sàõp> [ASC | DESC]...]] ;

SELECT [ALL | DISTINCT]


[<bê danh>.]<muûc>
[AS <tãn cäüt>]
[, [<bê danh>.]<muûc>
[AS <tãn cäüt>] ...]
FROM <táûp tin CSDL 1 >
[ CROSS JOIN <táûp tin CSDL 2 > ] |
[ NATURAL JOIN <táûp tin CSDL 2 > ] |
[ JOIN <táûp tin CSDL 2 > USING (<tãn cäüt>)] |
[ JOIN <táûp tin CSDL 2 >
ON (<táûp tin CSDL 1 > . <tãn cäüt> = (<táûp tin CSDL 1 > . <tãn cäüt> )] |

[ LEFT | RIGHT | FULL OUTER JOIN <táûp tin CSDL 2 >


ON (<táûp tin CSDL 1 > . <tãn cäüt> = (<táûp tin CSDL 1 > . <tãn cäüt> )]
[AND | OR <âiãöu kiãûn choün> ]
[[INTO <âêch>] ;

4. Tìm kiếm đơn giản (SELECT ... FROM ... )


a. Ngæî phaïp:
SELECT [<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
[[INTO <âêch>]
b. YÏ nghéa:
Thæûc hiãûn pheïp chiãúu trong âaûi säú quan hãû âäúi våïi quan hãû âaî cho,
trãn caïc thuäüc tênh coï tãn trong danh saïch. SELECT khäng loaûi boí caïc pháön tæí
truìng làûp trong kãút quaí.
c. Giaíi thêch lãûnh:
* SELECT [<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]

Mäùi <muûc> coï thãø laì:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


95

_ Mäüt vuìng tæì táûp tin CSDL trong mãûnh âãö FROM.
_ Mäüt hàòng, hàòng naìy seî xuáút hiãûn trong moüi doìng cuía kãút quaí.
_ Mäüt biãøu thæïc, biãøu thæïc naìy coï thãø chæïa mäüt UDF (user defined function:
haìm do ngæåìi sæí duûng âënh nghéa).
Màûc nhiãn, TÁÚT CAÍ caïc doìng trong kãút quaí cáu hoíi seî âæåüc hiãûn ra.
Mãûnh âãö tuìy choün (optional) AS <tãn cäüt> âàûc taí tãn cho mäüt cäüt
trong kãút xuáút cuía cáu hoíi. Âiãöu naìy hæîu êch khi baûn coï mäüt <muûc> laì mäüt biãøu thæïc
hoàûc chæïa mäüt haìm trãn vuìng vaì baûn muäún cho cäüt tæång æïng cuía noï mäüt caïi tãn
coï nghéa. <tãn cäüt> coï thãø laì mäüt biãøu thæïc.

* FROM <táûp tin CSDL> [<bê danh cuûc bäü>]


Liãût kã ra táûp tin CSDL chæïa dæî liãûu seî âæåüc láúy ra båíi cáu hoíi. <bê danh cuûc
bäü> laì mäüt tãn taûm thåìi cho mäüt táûp tin CSDL. Nãúu baûn âàûc taí mäüt <bê danh cuûc
bäü> cho mäüt táûp tin CSDL, baûn phaíi duìng <bê danh cuûc bäü> thay cho tãn cuía táûp
tin CSDL trong suäút lãûnh SELECT.

Chè coï thãø duìng macro âãø thay thãú caïc biãøu thæïc tãn nãúu lãûnh cáön mäüt tãn
biãún âån hay mäüt tãn táûp tin. Vê duû sau chè ra ngæî phaïp âuïng vaì sai:

* Âuïng
fileNV = 'NVIEN.dbf'
SELECT n FROM (fileNV).

* Sai, vç mãûnh âãö SELECT cáön coï mäüt danh saïch vuìng âãø choün (vãö
nguyãn tàõc, danh saïch vuìng gäöm nhiãöu vuìng nãn khäng laì biãún âån)
field = 'MA_NV'
SELECT (field) FROM nvien
Caïc haìm nhæ BOF(), DBF(), DELETED(), EOF(), FIELD(), FOUND(),
RECCOUNT(), REMA_KH(), etc., seî laìm viãûc trong caïc baíøng âån chæìng naìo baûn
coìn chæa âàûc taí mäüt bê danh (alias). Trong caïc baíng keïp (multiple tables), caïc haìm
naìy seî sinh ra caïc kãút quaí ngoaìi dæû âoaïn.

* [[INTO <âêch>]
Nãúu coï INTO, khäng coï kãút xuáút naìo âæåüc in ra trãn maìn hçnh; ngay caí baûn
coï duìng TO trong cuìng cáu hoíi våïi INTO, TO cuîng bë boí qua. Ngæåüc laûi, nãúu khäng
coï INTO, kãút quaí cuía cáu hoíi seî hiãûn ra trãn maìn hçnh vaì coï thãø âæåüc in trãn maïy
in hay lãn mäüt táûp tin våïi mãûnh dãö TO.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


96

<âêch> : Læu kãút quaí cáu hoíi vaìo mäüt <táûp tin CSDL>. Nãúu baûn âàûc taí
mäüt táûp tin CSDL âaî måí räöi, FoxPro seî âoïng noï vaì måí ra laûi maì khäng baïo baûn cho
baûn biãút nãúu baûn coï duìng SET SAFETY OFF træåïc âoï. Nãúu baûn khäng âàûc taí pháön
måí räüng cuía tãn táûp tin, táûp tin seî âæåüc cho pháön måí räüng .DBF. Sau khi lãûnh
SELECT khai thaïc xong, táûp tin CSDL váùn måí vaì åí traûng thaïi hoaût âäüng (active).
d. Vê duû:
- In danh saïch hoü tãn cuía táút caí caïc sinh viãn.
SELECT ho_sv, ten_sv ;
FROM sv
- In ra danh saïch táút caí caïc cäng ty trong táûp tin CSDL KH_HANG trãn
maìn hçnh:
SELECT kh_hang.ten_cty ;
FROM kh_hang
- In ra táút caí caïc thaình phäú trong KH_HANG daûng chæî in hoa vaì âàût tãn
cho cäüt kãút xuáút laì DS_T_TP
SELECT UPPER(tinh_tp) AS ds_t_tp FROM kh_hang
5. Tìm kiếm phần tử duy nhất
a. Ngæî phaïp
SELECT DISTINCT
[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
b. YÏ nghéa
Tæì khoïa DISTINCT nhàòm yãu cáöu SQL thæûc hiãûn pheïp loaûi boí caïc giaï trë
truìng làûp trong pheïp chiãúu åí muûc 1. Baûn chè coï thãø duìng DISTINCT mäüt láön cho
mäüt cáu mãûnh âãö SELECT.
c. Vê duû
Danh saïch maî sinh viãn coï âi hoüc êt nháút mäüt män:
SELECT DISTINCT ma_sv ;
FROM hoc
6. Tìm kiếm tất cả các cột
a. Ngæî phaïp
SELECT *
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
b. YÏ nghéa
Dáúu sao (*) laì kyï hiãûu viãút tàõt danh saïch âaî âæåüc sàõp xãúp thæï tæû gäöm táút caí caïc
cäüt trong baíng do FROM chè roî. Nhæ váûy, åí âáy khäng liãn quan âãún pheïp chiãúu.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


97

Kãúút quaí daûng lãûnh naìy laì táút caí caïc bäü chæïa âáöy âuí caïc thuäüc tênh cuía quan hãû âaî
cho.
c. Vê duû
SELECT * ;
FROM sv
7. Tìm kiếm theo điều kiện
a. Ngæî phaïp
SELECT [ALL | DISTINCT]
[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
WHERE <âiãöu kiãûn choün>
[AND | OR <âiãöu kiãûn choün>...]]

b. YÏï nghéa
Chè cho chæïa mäüt säú máùu tin trong kãút quaí. Thæûc cháút cuía daûng lãûnh naìy
laì thæûc hiãûn pheïp choün keìm theo pheïp chiãúu.
c. Giaíi thêch ngæî phaïp
<âiãöu kiãûn choün> âàûc taí tiãu chuáøn láúy caïc máùu tin vaìo kãút quaí. Baûn coï
thãø näúi caïc âiãöu kiãûn choün bàòng caïc taïc tæí logic AND hoàûc OR hoàûc NOT. Baûn cuìng
coï thãø duìng IS [NOT] NULL âãø kiãøm tra trị mäüt vuìng coï rỗng hay khäng.
<âiãöu kiãûn choün> coï thãø åí mäüt trong caïc daûng sau:

Daûng: <vuìng 1> <so saïnh> <vuìng 2>


Vê duû: KH_HANG.MA_KH = CHI_TRA.MA_KH

Daûng: <vuìng> <so saïnh> <biãøu thæïc>


Vê duû: CHI_TRA.SO_TIEN >= 1000
Ngoài ra, có thể áp dụng các hàm trên bộ. Các hàm này chia làm nhiều loại :

L Tên hàm Ý nghĩa


oại
K LOWER
ý tự
UPPER
INITCAP
CONCAT

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


98

SUBSTR
LENGTH
INSTR
LPAD | RPAD
TRIM
REPLACE
S ROUND

TRUNC
MOD
T MONTH_BETW
hời gian EEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND
TRUNC

d. Vê duû
- Danh saïch hoü tãn sinh viãn cuía låïp TH17:
SELECT ho_sv, ten_sv ;
FROM sv ;
WHERE lop= 'TH17'
8.Tìm kiếm dựa trên hằng
a. Ngæî phaïp vaì yï nghéa
Nhæ muûc 5, nhæng <âiãöu kiãûn choün> coï mäüt trong caïc daûng sau:

Daûng: <vuìng> [NOT] BETWEEN <giaï trë âáöu> AND <giaï trë cuäúi>
Vê duû: kh_hang.ty_suat_thue BETWEEN 5.50 AND 6.00

Kiãøm tra xem <vuìng> coï nàòm trong khoaíng giaï trë âaî cho khäng.

Daûng: <vuìng> [NOT] IN <táûp giaï trë>


Vê duû: kh_hang.ma_kh NOT IN ('43411','43506','43667')

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


99

Våïi IN, <vuìng> phaíi laì mäüt pháön cuía táûp giaï trë âaî cho træåïc khi máùu tin
chæïa noï âæåüc âæa vaìo kãút quaí.

Daûng: <vuìng> [NOT] LIKE <expC>


Vê duû: kh_hang.tinh_tp NOT LIKE 'TP HCM'

Âiãöu kiãûn choün naìy tçm tæìng vuìng tæång æïng våïi biãøu thæïc chuäùi âaî cho.
Baûn coï thãø duìng % (pháön tràm) vaì _ (gaûch dæåïi) trong <expC>. Dáúu _ biãøu diãùn mäüt
kyï tæû chæa biãút trong chuäùi vaì dáúu % biãøu diãùn mäüt daîy kyï tæû chæïa biãút trong chuäùi.
b. Vê duû
- Tçm maî caïc giaïo viãn coï daûy trong caïc nàm hoüc 93-94, 94-95:
SELECT ma_gv ;
FROM hoc ;
WHERE n_khoa IN ('93-94', '94-95')
- In ra táút caí caïc máùu tin cuía táûp tin CSDL KH_HANG coï tãn cäng ty bàõt
âáöu bàòng mäüt kyï tæû in hoa 'C' vaì coï chiãöu daìi chæa biãút.
SELECT * FROM kh_hang a WHERE a.ten_cty LIKE 'C%'
- In ra táút caí caïc máùu tin cuía táûp tin KH_HANG coï mäüt TINH_TP bàõt âáöu
bàòng mäüt kyï tæû in hoa 'N' vaì theo sau laì mäüt kyï tæû báút kyì.
SELECT * FROM kh_hang a WHERE a.tinh_tp LIKE 'N_'
9. Tìm kiếm có sắp xếp
a. Ngæî phaïp
SELECT [ALL | DISTINCT]
[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
ORDER BY <muûc âãø sàõp> [ASC | DESC]
[, <muûc âãø sàõp> [ASC | DESC]...]
b. YÏ nghéa
Sàõp xãúp caïc kãút quaíí cáu hoíi dæûa trãn dæî liãûu trong mäüt hoàûc nhiãöu cäüt.
ORDER BY tæång tæû nhæ mäüt chè muûc åí chäù noï sàõp xãúp táûp tin qua mäüt vuìng hay
haìm cho træåïc, nhæng noï khäng taûo ra mäüt táûp tin âàûc biãût naìo giäúng chè muûc.
c. Giaíi thêch ngæî phaïp
Mäùi <muûc âãø sàõp> phaíi tæång æïng våïi mäüt cäüt trong kãút quaí vaì coï thãø laì:
_ Mäüt vuìng trong táûp tin CSDL trong FROM, âäöng thåìi cuîng laì mäüt <muûc>
kãút xuáút trong mãûnh âãö SELECT chênh (khäng phaíi trong mäüt cáu hoíi con).

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


100

_ Mäüt biãøu thæcï säú chè ra vë trê cuía cäüt trong baíng kãút quaí (cäüt âáöu tiãn âæåüc
âaïnh säú laì 1).
DESC âãø chè kãút quaí seî sàõp theo thæï tæû giaím trãn <muûc âãø sàõp>. ASC âàûc
taí thæï tæû tàng vaì laì giaï trë màûc nhiãn.
d. Vê duû
1. Danh saïch sinh viãn thi âaût caïc män, gäöm maî sinh viãn, tãn män, vaì kãút
quaí âaût âæåüc cuía män âoï (khäng dæåïi 5), sàõp theo kãút quaí giaím dáön:
SELECT ma_sv, ten_mon, k_qua ;
FROM hoc ;
WHERE k_qua>=5 ;
ORDER BY k_qua DESC
2. Danh saïch sinh viãn gäöm maî, hoü tãn vaì tãn låïp sàõp theo tãn låïp tàng dáön
(thæï tæû chênh) vaì tãn sinh viãn tàng dáön (thæï tæû phuû):
SELECT ma_sv, ho_sv, ten_sv, lop ;
FROM sv ;
ORDER BY lop ASC, ten_sv ASC
3. In ra nhiãöu vuìng tæì KH_HANG theo thæï tæû tàng cuía caïc vuìng TINH_TP,
DUONG vaì TEN_CTY:
SELECT tinh_tp, duong, ten_cty, ma_kh ;
FROM kh_hang ;
ORDER BY tinh_tp, duong, ten_cty
10. Tìm kiếm sử dụng ánh xạ lồng nhau (2 mức lồng)
a. Ngæî phaïp
Gäöm 2 khäúi SELECT- FROM- WHERE läöng nhau. Khäúi thæï hai âæåüc
goüi laì cáu hoíi con (subquery), vaì phaíi âæåüc âoïng trong ngoàûc.

SELECT [ALL | DISTINCT]


[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL thæï nháút> [<bê danh cuûc bäü>]
WHERE <âiãöu kiãûn choün> [AND | OR <âiãöu kiãûn choün>...]]
( SELECT [ALL | DISTINCT]
[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]
FROM <táûp tin CSDL thæï hai> [<bê danh cuûc bäü>]
WHERE <âiãöu kiãûn näúi kãút> [AND <âiãöu kiãûn näúi kãút> ...]
[AND | OR <âiãöu kiãûn choün>

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


101

[AND | OR <âiãöu kiãûn choün>...]] )

b. YÏï nghéa
Cuîng laì mäüt daûng cuía pheïp kãút näúi giæîa hai quan hãû, sau khi thæûc hiãûn caïc
pheïp choün trãn tæìng quan hãû.
c. Giaíi thêch ngæî phaïp
<âiãöu kiãûn choün> coï thãø åí mäüt trong caïc daûng âaî âãö cáûp åí muûc 4 vaì
trong caïc daûng sau:

Daûng: <vuìng> <so saïnh> ALL (<cáu hoíi con>)


Vê duû: ty_suat_thue < ALL ;
(SELECT ty_suat_thue FROM kh_hang WHERE tinh_tp = 'CAN THO')

Våïi ALL, <vuìng> phaíi thoía âiãöu kiãûn so saïnh âäúi våïi moüi giaï trë sinh ra tæì
cáu hoíi con træåïc khi máùu tin chæïa noï âæåüüc chæïa trong kãút quaí.

Daûng: <vuìng> <so saïnh> ANY | SOME (<cáu hoíi con>)


Vê duû: ty_suat_thue < ANY ;
(SELECT ty_suat_thue FROM kh_hang WHERE tinh_tp = 'TP HCM')

Våïi ANY hoàûc SOME, <vuìng> phaíi thoía âiãöu kiãûn so saïnh âäúi våïi êt nháút
mäüt giaï trë sinh ra tæì cáu hoíi con. ANY và SOME cùng ý nghĩa.

ANY ALL
< nhỏ hơn trị tối nhỏ hơn trị
đa tối thiểu
> lớn hơn trị tối lớn hơn trị
thiểu tối đa
= như IN

Daûng: [NOT] EXISTS (<cáu hoíi con>)


Vê duû: EXISTS ;
(SELECT * FROM hoa_don ;
WHERE kh_hang.ma_kh= hoa_don.ma_kh )

Kiãøm tra xem coï êt nháút mäüt doìng thoía âiãöu kiãûn trong cáu hoíi con khäng.
Våïi EXISTS, diãöu kiãûn choün cho trë âuïng, træì khi cáu hoíi con cho ra mäüt táûp räùng.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


102

Daûng: <vuìng> [NOT] IN (<cáu hoíi con>)


Vê duû: kh_hang.ma_kh IN ;
(SELECT hs_kdoanh.ma_kh FROM hs_kdoanh ;
WHERE hs_kdoanh.mat_hang='FoxPro')

Våïi daûng naìy, <vuìng> phaíi laì mäüt pháön cuía táûp giaï trë cho båíi cáu hoíi con
træåïc khi máùu tin chæïa noï âæåüc âæa vaìo kãút quaí.

Caïc táûp tin thæï nháút vaì thæï hai coï thãø truìng nhau. Nãúu coï truy xuáút âãún cuìng
tãn vuìng åí caí hai khäúi, nãn duìng bê danh cuûc bäü khaïc nhau åí hai khäúi, nhààòm laìm
phán biãût hai giaï trë cuía thuäüc tênh væìa noïi âãø coï thãø so saïnh chuïng trong mãûnh âãö
WHERE.
Baûn coï thãø coï nhiãöu cáu hoíi con åí cuìng mæïc trong mãûnh âãö WHERE. Caïc
cáu hoíi con coï thãø chæïa caïc âiãöu kiãûn näúi kãút bäüi (multiple join conditions).
Caïc haìm sau coï thãø duìng trong âiãöu kiãûn näúi kãút cuía mãûnh âãö WHERE:
UPPER(), VAL(), DTOC(), PADR(), PADL() and PADC().
Læu yï:
- Caïc cáu hoíi con chè coï thãø xuáút hiãûn bãn phaíi cuía mäüt trong caïc dáúu =,
<>, <, >, <=, >=, !=, SOME | ANY | ALL, [NOT] IN, vaì [NOT] EXISTS. Âiãöu naìy
coï thãø âaí âäüng âãún sæû phaït biãøu tæû nhiãn mäüt váún âãö. Chàóng haûn, baûn muäún liãût kã
caïc nhán viãn baïn haìng âaût doanh säú baïn trãn 10%. Caïch viãút sau tæû nhiãn hån,
nhæng sai vãö ngæî phaïp:
SELECT;
nvien. ho_ten_nv;
FROM;
nvien;
WHERE;
muc_luong > 1.10 * (SELECT AVG(muc_luong) FROM nvien)
Baûn phaíi viãút laûi nhæ sau:
SELECT;
nvien. ho_ten_nv;
FROM;
nvien;
WHERE;
muc_luong/ 1.10 > (SELECT AVG(muc_luong) FROM nvien)
- Nếu câu hỏi con không tìm ra được kết quả, câu hỏi chính sẽ không có kết
quả trả lại.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
103

Ví dụ: NV (MÃ_NV, HỌ, TÊN, MÃ_SẾP)


Có những người là sếp cao nhất thì trị của MÃ_SẾP trong bộ tương ứng là
null. Vì câu hỏi phụ có một trị là null, nên trả về toàn bộ kết quả cũng là null. Mà
câu lệnh có chứa điều kiện so sánh với một trị null sẽ trả về trị null. Do đó, câu lệnh
dưới đây không có kết quả trả về:
SELECT ho, ten;
FROM nv linh;
WHERE ma_nv NOT IN ;
(SELECT ma_sep;
FROM nv sep)
(Tìm ra những người không là sếp)
Cho nên, ta sửa lại như sau:
SELECT ho, ten;
FROM nv ;
WHERE ma_nv NOT IN ;
(SELECT ma_sep;
FROM nv
WHERE ma_sep IS NOT NULL)

d. Vê duû
1. Danh saïch hoü tãn sinh viãn hoüc män 'Cå såí dæî liãûu':
SELECT ho_sv, ten_sv ;
FROM sv ;
WHERE ma_sv IN ;
(SELECT ma_sv;
FROM hoc ;
WHERE ten_mon ='Cå såí dæî liãûu')
Nếu câu hỏi con không tìm ra được kết quả vì trong CSDL không lưu dấu
chẳng hạn, câu hỏi chính cũng sẽ không có kết quả.
2. Danh saïch maî sinh viãn hoüc caïc giaïo viãn coï hoüc vë 'TS' (tiãún sé):
SELECT ma_sv ;
FROM hoc ;
WHERE ma_gv IN ;
( SELECT ma_gv ;
FROM gv ;
WHERE hoc_vi='TS' )
3. Tçm hoü tãn caïc sinh viãn khäng hoüc giaïo viãn coï maî 'A01':
SELECT ho_sv, ten_sv ;
FROM sv ;
WHERE 'A01' NOT IN ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


104

( SELECT ma_gv ;
FROM hoc ;
WHERE ma_sv= sv.ma_sv)
4. In ra táút caí caïc máùu tin tæì KH_HANG coï tyí lãû thuãú tháúp hån cuía caïc
khaïch haìng TP HCM.
SELECT * FROM kh_hang a WHERE a.ty_suat_thue < ANY ;
(SELECT ty_suat_thue FROM kh_hang WHERE tinh_tp= "TPHCM")
5. Cho hiãûn ra táút caí caïc cäng ty tæì táûp tin KH_HANG våïi mäüt maî khaïch
haìng tæång æïng våïi mäüt maî khaïch haìng trong táûp tin HOA_DON:
SELECT ten_cty FROM kh_hang a WHERE ;
EXISTS (SELECT * FROM hoa_don b WHERE a.ma_kh = b. ma_kh)
6. Tçm maî caïc sinh viãn hoüc êt nháút mäüt män do giaïo viãn maî 'A01'
giaíng daûy:
SELECT DISTINCT ma_sv ;
FROM hoc ;
WHERE ten_mon IN ;
(SELECT ten_mon ;
FROM hoc ;
WHERE ma-gv= 'A01' )
7. Tçm maî caïc sinh viãn hoüc nhiãöu hån mäüt tháöy:
SELECT DISTINCT ma_sv ;
FROM hoc H1 ;
WHERE ma_sv IN ;
( SELECT ma_sv ;
FROM hoc H2 ;
WHERE H1.ma_gv  = H2.ma_gv )
11. Tìm kiếm đồng thời từ nhiều bảng
a. Ngæî phaïp
SELECT [ALL | DISTINCT]
[<bê danh>.]<muûc>
[AS <tãn cäüt>]
[, [<bê danh>.]<muûc>
[AS <tãn cäüt>] ...]
FROM <táûp tin CSDL> [<bê danh cuûc bäü>]
[, <táûp tin CSDL> [<bê danh cuûc bäü>] ...]
WHERE <âiãöu kiãûn näúi kãút>
[AND <âiãöu kiãûn näúi kãút> ...]

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


105

[AND | OR
<âiãöu kiãûn choün>
[AND | OR
<âiãöu kiãûn choün>...]]

Trong Oracle9i:

SELECT [ALL | DISTINCT]


[<bê danh>.]<muûc>
[AS <tãn cäüt>]
[, [<bê danh>.]<muûc>
[AS <tãn cäüt>] ...]
FROM <táûp tin CSDL 1 >
[ CROSS JOIN <táûp tin CSDL 2 > ] |
[ NATURAL JOIN <táûp tin CSDL 2 > ] |
[ JOIN <táûp tin CSDL 2 > USING (<tãn cäüt>)] |
[ JOIN <táûp tin CSDL 2 >
ON (<táûp tin CSDL 1 > . <tãn cäüt> = (<táûp tin CSDL 1 > . <tãn cäüt> )] |

[ LEFT | RIGHT | FULL OUTER JOIN <táûp tin CSDL 2 >


ON (<táûp tin CSDL 1 > . <tãn cäüt> = (<táûp tin CSDL 1 > . <tãn cäüt> )]
[AND | OR <âiãöu kiãûn choün> ] ;

b. YÏ nghéa
Thæûc hiãûn pheïp kãút näúi (join) trong âaûi säú quan hãû, sau âoï thæûc hiãûn
pheïp chiãúu. Duìng âãø láúy dæî liãûu tæì nhiãöu táûp tin CSDL.
c. Giaíi thêch ngæî phaïp
<âiãöu kiãûn näúi kãút> âàûc taí caïc vuìng liãn kãút caïc táûp tin CSDL trong
FROM laûi.
Caïc âiãöu kiãûn näúi kãút seî caïch nhau bàòng taïc tæí logic AND. <âiãöu kiãûn näúi
kãút> coï thãø chæïa caïc haìm trãn vuìng vaì coï daûng:
<vuìng 1> <taïc tæí so saïnh> <vuìng 2>
trong âoï <vuìng 1> laì mäüt vuìng cuía mäüt táûp tin CSDL, <vuìng 2> laì mäüt vuìng
cuía mäüt táûp tin CSDL khaïc vaì <taïc tæí so saïnh> laì mäüt trong caïc taïc tæí sau:.
=
< >, !=, #
==

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


106

>
>=
<
<=
Khi baûn duìng so saïnh = trãn caïc chuäùi, noï seî hoaût âäüng khaïc nhau
tuìy theo caìi âàût trong lãûnh SET ANSI.

Lưu ý
Khi duìng mäüt lãûnh SELECT, caïc tçnh huäúng sau coï thãø laìm giaím sæû hoaìn
thiãûn vaì sinh ra caïc kãút quaí khäng nhæ yï:
- Nãúu baûn coï âæa vaìo hai CSDL trong mäüt cáu hoíi vaì khäng âàûc taí âiãöu kiãûn
näúi kãút, mäùi vuìng trong CSDL thæï nháút seî näúi kãút våïi moüi vuìng cuía CSDL thæï hai
trong thoía âiãöu kiãûn choün. Âiãöu naìy coï thãø sinh ra caïc kãút quaí báút thæåìng.
- Haîy chuï yï khi näúi kãút caïc CSDL coï vuìng rỗng vç HQTCSDL cho tæång æïng
(match) caïc vuìng träúng våïi nhau. Vê duû, nãúu baûn näúi kãút KH_HANG.MA_KH chæïa
100 MA_KH träúng vaì HOA_DON.MA_KH chæïa 400 MA_KH träúng, kãút xuáút cuía
cáu hoíi seî chæïa 40.000 máùu tin sinh ra tæì caïc vuìng träúng. Âãø traïnh âiãöu naìy, baûn coï
thãø duìng haìm EMPTY() trong Foxpro hoặc IS NULL trong Oracle.
Nãúu mäüt cáu hoíi âæåüc thæûc hiãûn quaï láu, haîy kiãøm tra xem baûn âaî gom âuí
hãút táút caí caïc âiãöu kiãûn näúi kãút chæa. Nãúu hai baíng näúi kãút nhau maì khäng coï âiãöu
kiãûn näúi kãút naìo, baíng kãút quaí seî coï säú doìng bàòng têch caïc säú doìng cuía hai baíng ban
âáöu, âáy laì âiãöu hiãúm khi ngæåìi ta mong muäún.
Vê duû, baûn bàõt âáöu bàòöng cáu hoíi:
SELECT;
TEN_CTY, TRI_GIA_HD;
FROM;
KH_HANG, HOA_DON;
WHERE;
KH_HANG.MA_KH = HOA_DON.MA_KH
Noï seî in ra haîng vaì täøng trë giaï cho mäùi hoïa âån. Giaí sæí baûn cuîng muäún
biãút nhán viãn baïn haìng cho tæìng danh muûc giao haìng. Baûn âaî sæía cáu hoíi trãn laûi
nhæ sau:
SELECT;
TEN_CTY, HO_TEN_NV, TRI_GIA_HD;
FROM;
KH_HANG, HOA_DON, NVIEN;
WHERE;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


107

KH_HANG.MA_KH = HOA_DON.MA_KH

Vç âaî boí qua âiãöu kiãûn näúi kãút "NVIEN.MA_NV = HOA_DON.MA_NV",


cáu hoíi trãn âaî taûo ra mäüt máùu tin kãút xuáút cho tæìng täø håüp cuía danh muûc giao haìng
vaì ngæåìi baïn. Khäng nhæîng âiãöu naìy khäng âaïp æïng yï muäún cuía baûn, maì noï coìn
chiãúm quaï nhiãöu thåìi gian âãø thæûc hiãûn.
d. Vê duû
- Danh saïch hoü tãn caïc giaïo viãn daûy tæìng sinh viãn:
SELECT ho_gv, ten_gv ;
FROM hoc, gv ;
WHERE hoc.ma_gv= gv.ma_gv
- Læu træî caïc chi tiãút: maî khaïch haìng. tãn cäng ty vaì trë giaï tæìng hoïa âån cho
khaïch haìng âoï tæì hai táûp tin CSDL vaìo mäüt táûp tin thæï III:
SELECT a.ma_kh, a.ten_cty, btri_gia_hd ;
FROM kh_hang a, hoa_don b ;
WHERE a.ma_kh = b. ma_kh ;
INTO TABLE c:\kh_tghd.dbf
- Tæì 2 táûp tin CSDL , näúi kãút 2 táûp tin âoï dæûa trãn vuìng MA_KH , in ra maìn
hçnh vaì khäng læu vaìo táûp tin 3 vuìng: tãn cäng ty, ngaìy chi traí vaì säú tiãön mäùi láön traí,.
Duìng caïc bê danh cuûc bäü cho caí hai táûp tin CSDL:
SELECT a.ten_cty, b.ngay_tra, b.so_tien ;
FROM kh_hang a, chi_tra b ;
WHERE a.ma_kh= b.ma_kh
- Tæång tæû nhæ trãn nhæng chè in ra caïc máùu tin khäng truìng làûp våïi
caïc vuìng âaî âàûc taí:
SELECT DISTINCT a.ma_kh, b.ngay_tra, b.so_tien ;
FROM kh_hang a, chi_tra b ;
WHERE a.ma_kh= b.ma_kh
- Chè in ra caïc máùu tin maì ngaìy ghi hoïa âån træåïc 15/10/90.
SELECT a.ma_kh, a.ten_cty, b.tri_gia_hd ;
FROM kh_hang a, hoa_don b ;
WHERE ( a.ma_kh= b.ma_kh AND (b.ngay_ghi < {15/10/90})
12. Tìm kiếm có chứa GROUP BY, HAVING
a. Ngæî phaïp
SELECT [ALL | DISTINCT]
[<bê danh>.]<muûc> [AS <tãn cäüt>]
[, [<bê danh>.]<muûc> [AS <tãn cäüt>] ...]

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


108

FROM <táûp tin CSDL> [<bê danh cuûc bäü>]


[, <táûp tin CSDL> [<bê danh cuûc bäü>] ...]
GROUP BY <nhoïm caïc cäüt>
[, <nhoïm caïc cäüt> ...]
[HAVING <âiãöu kiãûn choün> ]
b. YÏ nghéa
Phán nhoïm quan hãû theo giaï trë cuía mäüt hoàûc nhiãöu cäüt.
c. Giaíi thêch ngæî phaïp
* GROUP BY <nhoïm caïc cäüt>
[, <nhoïm caïc cäüt> ...]
Nhoïm laûi caïc doìng trong cáu hoíi, dæûa trãn caïc giaï trë cuía caïc cäüt. <nhoïm
caïc cäüt> coï thãø laì mäüt vuìng CSDL, tæïc mäüt haìm trãn vuìng cuía SQL hay mäüt biãøu
thæïc säú chè vë trê cuía cäüt trong baíng kãút quaí (cäüt âáöu tiãn âæåüc âaïnh säú 1).

* HAVING <âiãöu kiãûn choün>


Chæïa caïc nhoïm trong kãút quaí khi chuïng thoía âiãöu kiãûn choün. <âiãöu kiãûn
choün> khäng thãø chæïa mäüt cáu hoíi con.
HAVING <âiãöu kiãûn choün> nãn duìng våïi GROUP BY âãø âàûc taí tiãu chuáøn
caïc nhoïm phaíi thoía âãø âæåüc chæïa trong kãút quaí. HAVING coï thãø chæïa nhiãöu âiãöu
kiãûn choün, näúi nhau båïi AND hoàûc OR hoàûc NOT .
HAVING hoaût âäüng giäúng nhæ mäüt mãûnh âãö WHERE, nhæng aïp duûng cho
toaìn nhoïm chæï khäng cho tæìng doìng. Baûn cuîng coï thãø duìng caïc bê danh cuûc bäü vaì
haìm vuìng trong HAVING. Nếu có dùng WHERE để đặc tả điều kiện nối kết hoặc điều
kiện chọn, WHERE phải đặt trước GROUP BY.
GROUP BY hoaût âäüng giäúng nhæ mäüt doìng phán chia giæîa caïc nhoïm máùu
tin, tuìy theo giaï trë caïc cäüt trong danh saïch 2, mäùi nhoïm gäöm caïc bäü æïng våïi mäüt giaï
trë cuía caïc cäüt naìy.
Lưu ý:
Bất kỳ mục nào trong danh sách kết quả cần đưa ra sau từ khoá SELECT,
nếu không là hàm kết tập thì phải có trong danh sách các thuộc tính dùng để chia
nhóm ở GROUP BY.
Không được dùng hàm kết tập trong mệnh đề WHERE, mà phải dùng với
HAVING.
d. Vê duû
- Tçm maî caïc giaïo viãn coï daûy trong caïc nàm hoüc 93-94, 94-95:
SELECT DISTINCT ma_gv ;
FROM hoc ;
GROUP BY ma_gv ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


109

HAVING n_khoa IN ('93-94', '94-95')


- Tìm mã các SV có trung bình kết quả trong mỗi niên khoá lớn hơn 8.0:
SELECT DISTINCT ma_sv, n_khoa, AVG(k_qua) ;
FROM hoc ;
GROUP BY ma_sv, n_khoa ;
HAVING AVG(k_qua)> 8.0

13. Tìm kiếm có chứa phép tính tập hợp (UNION, INTERSECT,
MINUS)
a. Ngæî phaïp
Ngæî phaïp tổng quát laì:
(<lãûnh SELECT thæï nhất> )

<taïc tæí táûp håüp>

([ALL] <lãûnh SELECT thæï hai>)

b. YÏ nghéa
- MINUS: hiãûu cuía hai quan hãû (R-S)
- INTERSECT: giao cuía hai quan hãû (R  S)
- UNION: håüp cuía hai quan hãû (R  S). Kãút håüp caïc kãút quaí cuäúi cuìng
cuía mäüt lãûnh SELECT våïi caïc kãút quaí cuäúi cuìng cuía mäüt lãûnh SELECT khaïc. Màûc
nhiãn, UNION seî kiãøm tra vaì xoïa caïc doìng truìng nhau. Duìng ALL åí hai khäúi âãø
ngàn khäng cho UNION xoaï caïc doìng truìng trong kãút quaí.
Baûn coï thãø duìng caïc dáúu ngoàûc âãø kãút håüp nhiãöu mãûnh âãö UNION.
c. Giaíi thêch ngæî phaïp
<taïc tæí táûp håüp> gäöm mäüt trong caïc taïc tæí sau: MINUS, INTERSECT,
UNION. Nhæng trong FoxPro 2.0, chè coï pheïp häüi UNION laì thæûc hiãûn chênh xaïc,
coìn INTERSECT thç chaûy khäng äøn âënh vaì MINUS thç khäng thæûc hiãûn âæåüc.
Yãu cáöu caïc quan hãû biãøu thë qua caïc baíng phaíi tæång thêch våïi nhau.
Caïc qui tàõc vãö UNION:
_ Baûn khäng thãø duìng UNION âãø kãút håüp caïc cáu hoíi con.
_ Caí hai lãûnh SELECT phaíi kãút xuáút cuìng mäüt säú cäüt.
_ Mäùi cäüt trong kãút quaí cuía mäüt cáu lãûnh SELECT phaíi coï cuìng kiãøu dæî liãûu
nhæ cäüt tæång æïng trong lãûnh SELECT kia.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


110

_ Chè coï lãûnh SELECT cuäúi måïi coï thãø coï mäüt mãûnh âãö ORDER BY vaì
ORDER BY phaíi tham chiãúu âãún caïc cäüt kãút xuáút qua säú thæï tæû. Nãúu coï ORDER BY,
noï seî taïc âäüng âãún toaìn bäü kãút quaí.
d. Vê duû
1. Tçm maî caïc giaïo viãn hiãûn khäng daûy sinh viãn naìo caí:
(SELECT ma_gv
FROM gv )
MINUS
(SELECT ma_gv
FROM hoc )
2. Giaí sæí ta coï thãm quan hãû:
CBQL(MA_GV, HO_GV, TEN_GV, NAM_S, HOC_VI)
âãø chè caïc caïn bäü quaín lyï. Danh saïch nhæîng ngæåìi sinh træåïc nàm 1945, laì giaïo viãn
hoàûc caïn bäü quaín lyï, âæåüc tçm båíi:
(SELECT *
FROM gv
WHERE nam_s <1945)
UNION
(SELECT *
FROM cbql
WHERE nam_s<1945)
14. Tìm kiếm có chứa một bộ đã được liệt kê
a. Ngæî phaïp
SELECT <danh saïch thuäüc tênh 1>
FROM <tãn baíng 1>
WHERE [ <âiãöu kiãûn 1> AND | OR ] ( <danh saïch thuäüc tênh 2> )
IN
(SELECT <danh saïch thuäüc tênh 2>
FROM <tãn baíng 2>
[WHERE <âiãöu kiãûn 2> ])
<danh saïch thuäüc tênh 2> phaíi giäúng nhau åí hai khäúi vãö caïc pháön tæí láùn thæï
tæû cuía chuïng trong âoï .
b. YÏï nghéa
Tçm caïc bäü coï cuìng giaï trë åí caïc cäüt trong danh saïch nhæ bäü âaî cho.
c. Vê duû
Tçm hoü tãn vaì âëa chè caïc sinh viãn sinh cuìng nàm vaì hoüc cuìng låïp våïi sinh
viãn coï maî '021':

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


111

SELECT HO_SV, TEN_SV, ÂCHI_SV


FROM SV
WHERE (NAMS_SV, LOP) IN
(SELECT (NAMS_SV, LOP)
FROM SV
WHERE MA_SV='021' )
IV. CÁC HÀM KẾT TẬP
Caïc haìm dæåïi âáy âãø duìng våïi <muûc>, trong âoï muûc laì mäüt vuìng hoàûc mäüt
biãøu thæïc coï chæïa mäüt vuìng. Các hàm kết tập bỏ qua các giá trị null. Riêng trong
Oracle, nếu muốn kể luôn các giá trị null, dùng thêm hàm NVL (Null VaLue).
Læu yï, các HQTCSDL như SQL Server, Foxpro khäng thãø cho caïc haìm läöng
vaìo nhau, nhưng Oracle thì cho 2 mức lồng.
Ngữ pháp chung:
< tên hàm> ( [ DISTINCT | ALL ] [ NVL ] <mục>)
1. SUM
a. YÏ nghéa
Láúy täøng trãn mäüt cäüt coï kiãøu säú.
b. Vê duû
Cho quan hãû:
XA (TEN_XA, TEN_HUYEN, TEN_TINH, DIEN_TICH, DAN_SO)
Tênh täøng diãûn têch cuía huyãûn Tán an, tènh Long an:
SELECT SUM(dien_tich) ;
FROM xa ;
WHERE ten_huyen='Tán an' AND ten_tinh='Long an'
2. AVG
a. YÏ nghéa
Láúy trung bçnh trãn mäüt cäüt coï kiãøu säú.
b. Vê duû
Tênh âiãøm trung bçnh cuía sinh viãn '001' trong niãn khoïa 93-94:
SELECT AVG(k_qua) ;
FROM hoc ;
WHERE ma_sv='001' AND n_khoa='93-94'
3. COUNT
a. YÏ nghéa
Âãúm caïc <muûc> trong mäüt cäüt. COUNT(*) âãúm säú doìng trong kãút xuáút
cuía cáu hoíi. COUNT ( DISTINCT <mục> ) âãúm các phần tử không trùng nhau trong
kãút xuáút cuía cáu hoíi
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
112

b. Vê duû
1. Âãúm säú giaïo viãn hiãûn coï:
SELECT COUNT(ma_gv) ;
FROM gv
2. Âäúi våïi mäùi huyãûn, in ra tãn huyãûn, tãn tènh vaì säú xaî tæång æïng cuía
noï:
SELECT ten_huyen, ten_tinh, COUNT(ten_xa) ;
FROM xa ;
GROUP BY ten_huyen, ten_tinh
3. Tçm maî caïc sinh viãn hoüc êt hån 4 män trong mäüt niãn khoïa:
SELECT ma_sv ;
FROM hoc ;
GROUP BY ma_sv, n_khoa ;
HAVING COUNT(ten_mon)<4
4. MAX
a. YÏ nghéa
Âënh giaï trë låïn nháút cuía <muûc> trong mäüt cäüt.
b. Vê duû
- Tçm caïc sinh viãn coï kãút quaí cao nháút, män tæång æïng, säú thæï tæû hoüc kyì
vaì niãn khoïa:
SELECT ma_sv, ten_mon, k_qua, stt_hk, n_khoa ;
FROM hoc ;
WHERE k_qua= ;
( SELECT MAX(k_qua) ;
FROM hoc )
- Tìm kết quả trung bình cao nhất trên tất cả các SV, tât cả các môn ở mỗi
học kỳ:
SELECT MAX( AVG( k_qua) )
FROM hoc ;
GROUP BY stt_hk, n_khoa ;
5. MIN
a. YÏ nghéa
Âënh giaï trë nhoí nháút cuía <muûc> trong mäüt cäüt.
b. Vê duû
1. Tçm caïc giaïo viãn cao tuäøi nháút:
SELECT ho_gv, ten_gv ;
FROM gv ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


113

WHERE nam_s= ;
( SELECT MIN(nam_s) ;
FROM gv )
2. Tçm diãûn têch xaî nhoí nháút cuía tènh Vénh long:
SELECT MIN(dien_tich) ;
FROM xa ;
WHERE ten_tinh='Vénh long'
3. Tçm tên tỉnh và diãûn tích xã nhoí nháút cuía tỉnh có diện tích xã nhỏ nhất
còn nhỏ hơn cả diện tích xã nhỏ nhất của tỉnh Vénh long:
SELECT ten_tinh, MIN(dien_tich) ;
FROM xa ;
GROUP BY ten_tinh;
HAVING MIN(dien_tich) <
(SELECT MIN(dien_tich) ;
FROM xa ;
WHERE ten_tinh='Vénh long')
4. Ví dụ sau là sai vì câu hỏi phụ trả về hơn một giá trị nên số giá trị trong các
mục dùng để so sánh ở mẹnh đề WHERE không như nhau:
SELECT ho_gv, ten_gv ;
FROM gv ;
WHERE nam_s= ;
( SELECT MIN (nam_s) ;
FROM gv
GROUP BY hoc_vi )

6. STDDEV
a. YÏ nghéa
Tính độ lệch chuẩn (standard deviation) của <mục>. Có trong Oracle9i.
b. Vê duû
SELECT STDDEV (nang_suat) ;
FROM giong_lua ;
WHERE ten_tinh='Vénh long'
7. VARIANCE
a. YÏ nghéa
Tính phương sai của <mục>. Có trong Oracle9i.
b. Vê duû
SELECT VARIANCE (nang_suat) ;

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


114

FROM giong_lua ;
WHERE ten_tinh='Vénh long'

IX. CÁC LỆNH KHÁC TRONG SQL


A. Lệnh tìm kiếm
1. Tìm kiếm sử dụng ánh xạ lồng nhau ( >2 mức lồng)
a. Ngæî phaïp
Tæång tæû nhæ trãn, nhæng duìng nhiãöu khäúi tæång æïng våïi säú mæïc läöng.
b. Vê duû
Danh saïch hoü tãn caïc sinh viãn hoüc caïc giaïo viãn coï hoüc vë 'TS':
SELECT HO_SV, TEN_SV
FROM SV
WHERE MA_SV IN
(SELECT MA_SV
FROM HOC
WHERE MA_GV IN
(SELECT MA_GV
FROM GV
WHERE HOC_VI='TS' ))
2. Tìm kiếm có chứa phép so sánh các tập
a. Ngæî phaïp
SELECT <danh saïch thuäüc tênh 1>
FROM <tãn baíng 1>
WHERE
(SELECT <danh saïch thuäüc tênh 2>
FROM <tãn baíng 2>
WHERE <âiãöu kiãûn 1> )
<taïc tæí so saïnh táûp håüp>
(SELECT <danh saïch thuäüc tênh 3>
FROM <tãn baíng 3>
WHERE <âiãöu kiãûn 2> )
Caïc taïc tæí so saïnh táûp håüp gäöm coï: = (hai táûp håüp bàòng nhau), = (hai táûp
håüp khäng bàòng nhau), IN (), NOT IN (), CONTAINS (), DOES NOT
CONTAIN ().
b. Vê duû
1. Tçm låïp hoüc táút caí caïc män:
SELECT DISTINCT LOP
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
115

FROM SV
WHERE
(SELECT TEN_MON
FROM HOC
WHERE MA_SV = SV.MA_SV)
=
(SELECT TEN_MON
FROM MON )
2. Tçm maî caïc giaïo viãn daûy êt nháút laì caïc sinh viãn maì giaïo viãn coï
maî 'A01' daûy:
- Caïch 1:
SELECT DISTINCT MA_GV
FROM HOC H1
WHERE
(SELECT MA_SV
FROM HOC
WHERE MA_GV = H1.MA_GV )
CONTAINS
(SELECT MA_SV
FROM HOC
WHERE MA_GV='A01' )
- Caïch 2:
SELECT MA_GV
FROM HOC
GROUP BY MA_GV
HAVING SET(MA_SV) CONTAINS
(SELECT MA_SV
FROM HOC
WHERE MA_GV='A01' )
B. Các lệnh định nghĩa và cập nhật CSDL
1. Tạo tập tin chỉ số trên một số thuộc tính của quan hệ
a. Ngæî phaïp
CREATE IMAGE <tãn táûp tin chè säú>
ON <tãn quan hãû>(<danh saïch thuäüc tênh>)
b. Vê duû
CREATE IMAGE GVIDX ON GV(TEN_GV, HO_GV)
2. Tạo liên kết giữa các thuộc tính của hai quan hệ

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


116

a. Ngæî phaïp
CREATE LINK <tãn liãn kãút>
FROM <tãn quan hãû 1>(<danh saïch thuäüc tênh 1>)
TO <tãn quan hãû 2>(<danh saïch thuäüc tênh 2>)
b. Vê duû
Taûo liãn kãút HOC_GV giæîa quan hãû HOC vaì quan hãû GV:
CREATE LINK HOC_GV
FROM HOC(MA_GV)
TO GV(MA_GV)
3. Xóa một khung nhìn hoặc tập tin chỉ số
a. Ngæî phaïp
* DROP VIEW <tãn khung>
* DROP IMAGE <tãn táûp tin chè säú>
b. Vê duû
Xoïa khung nhçn GIAOVU:
DROP VIEW GIAOVU
4. Gán kết quả cho quan hệ
a. Ngæî phaïp
Ta coï thãø gaïn mäüt kãút quaí trong âaûi säú quan hãû cho mäüt quan hãû khaïc
bàòng caïch duìng:
ASSIGN TO <tãn baíng> :
b. Vê duû
ASSIGN TO SVTH17:
SELECT HO_SV, TEN_SV
FROM SV
WHERE LOP='TH17'
C. Các phép tính về an ninh, an toàn dữ liệu
1. Tạo quyền truy xuất quan hệ
a. Ngæî phaïp
GRANT <thao taïc truy xuáút 1> (<danh saïch cäüt 1>)
[, <thao taïc truy xuáút 2> (<danh saïch cäüt 2>)
...
ON <tãn baíng> TO <danh saïch caïc giaï trë æïng våïi khoïa>
WITH GRANT OPTION
Thao taïc truy xuáút coï thãø laì: READ, INSERT, DELETE, UPDATE,
EXPAND, IMAGE, LINK vaì CONTROL.
b. Vê duû
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
117

Cho pheïp âoüc, thãm vaì sæía thuäüc tênh chè âëa chè cuía caïc giaïo viãn maî 'A02'
vaì 'B01':
GRANT READ, INSERT, UPDATE(ÂCH_GV)
ON GV TO 'A02', 'B01'
WITH GRANT OPTION
2. Hủy bỏ quyền truy xuất
a. Ngæî phaïp
REVOKE <thao taïc truy xuáút 1>
[, <thao taïc truy xuáút 2> (<danh saïch cäüt 2>)
...
ON <tãn baíng> FROM <danh saïch caïc giaï trë æïng våïi khoïa>
b. Vê duû
Ruït quyãön sæía âäøi thuäüc tênh cuía giaïo viãn coï maî 'B02':
REVOKE UPDATE ON GV FROM 'B02'

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


118

PHẦN B

LÝ THUYẾT VỀ
THIẾT KẾ
CSDL QUAN HỆ

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


119

Chương 5
CÁC LOẠI PHỤ THUỘC DỮ LIỆU

I. GIỚI THIỆU VẤN ĐỀ


1. Tình hình thực tế và nhu cầu
Khi thiãút kãú mäüt CSDL quan hãû, ta thæåìng phaíi choün mäüt trong nhiãöu så âäö
quan hãû. Mäüt vaìi choün læûa täút hån nhæîng caïi khaïc vç nhiãöu lyï do khaïc nhau. Ta seî
xeït mäüt säú caïc tênh cháút cáön coï âäúi våïi caïc så âäö quan hãû vaì nhiãöu giaíi thuáût cho ra
mäüt så âäö CSDL (database scheme) täút.
Troüng tám cuía viãûc thiãút kãú CSDL laì sæû phuû thuäüc dæî liãûu (data
dependancy/ deïpendances entre les donneïes). ÅÍ âáy, ta chè xeït caïc phuû thuäüc haìm
vaì phuû thuäüc âa trë.

2. Sự phụ thuộc dữ liệu


Sæû phuû thuäüc dæî liãûu xaíy ra âäúi våïi quan hãû R khi cho biãút mäüt säú thäng tin
vãö giaï trë cuía R, ta coï thãø suy diãùn âæåüc mäüt säú thäng tin khaïc vãö R.
Vê duû:
Giaí sæí ta coï så âäö quan hãû:
NCC(TEN_NCC, TEN_HG, GIA, ÂC_NCC)
vaì caïc dæî liãûu sau:

NCC TEN_NCC TEN_HG GIA ÂC_NCC


Âaûi Phæåïc Âáûu xanh 5050 25 Maûc Âénh Chi
Âaûi Phæåïc Âáûu âoí 4560 25 Maûc Âénh Chi
Âaûi Läüc Âáûu xanh 5000 128 Nguyãùn Hoaìng
Âaûi Läüc Âáûu âen 4520 128 Nguyãùn Hoaìng
Âaûi Thoü Âáûu âoí 4580 39 Lã Thaïnh Tän
Âaûi Thoü Âáûu tràõng 4600 39 Lã Thaïnh Tän

ÅÍ âáy, ta coï sæû phuû thuäüc dæî liãûu:


- {TEN_NCC, TEN_HG} xaïc âënh duy nháút GIA
- TEN_NCC ............................. ÂC_NCC
3. Các vấn đề nảy sinh đối với một CSDL không tốt
Duìng laûi vê duû trãn âãø minh hoüa.
a) Dæ thæìa dæî liãûu
(redundancy/ redondances d information):

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


120

Khi coï sæû phuû thuäüc dæî liãûu, chàõc chàõn seî coï sæû dæ thæìa dæî liãûu xaíy ra, dãù tháúy
nháút laì træåìng håüp coï phuû thuäüc haìm.
Mäùi láön coï mäüt màût haìng âæåüc cung æïng, âëa chè nhaì cung cáúp laûi âæåüc làûp
laûi.Chàóng haûn, khi xem bäü thæï nháút cuía NCC, ta âaî tháúy nhaì cung cáúp Âaûi Läüc coï
âëa chè laì 25 Maûc Âénh Chi. Do âaî biãút ÂC_NCC phuû thuäüc haìm vaìo TÃN_NCC,
nãn khi tháúy TÃN_NCC coï giaï trë cuîng laì Âaûi Phæåïc åí bäü thæï hai, khäng cáön nhçn
vaìo ÂC_NCC, ta cuîng biãút ngay noï coï giaï trë 25 Maûc Âénh Chi. Nhæ váûy, coï dæ thæìa
dæî liãûu åí bäü thæï hai.
b) Khäng nháút quaïn
Xaíy ra do sæû dæ thæìa dæî liãûu. Ta coï thãø sæía âëa chè mäüt nhaì cung cáúp taûi mäüt
bäü naìo âoï maì khäng sæía åí mäüt bäü khaïc (trong NCC hoàûc trong quan hãû khaïc cuía
cå såí dæî liãûu), gáy ra âëa chè khäng nháút quaïn cuía cuìng mäüt nhaì cung cáúp.
c) Sæû dë thæåìng (anomalies) do thãm dæî liãûu
- Ta khäng thãø ghi nháûn âëa chè mäüt nhaì cung cáúp nãúu nhaì cung cáúp âoï
khäng cung cáúp màût haìng naìo. Ta coï thãø nháûp giaï trë träúng (null) cho caïc thuäüc tênh
TEN_HG vaì GIA cho mäüt bäü cuía NCC, nhæng khi nháûp vaìo mäüt màût haìng cho nhaì
cung cáúp âoï, liãûu ta coï nhåï xoïa bäü âang chæïa trë träúng khäng ? Tãû haûi hån,
TEN_NCC vaì TEN_HG taûo thaình mäüt khoïa cho quan hãû, vaì coï thãø khäng tçm âæåüc
bäü coï khoaï mang trë träúng.
- Giaí sæí ta muäún thãm bäü sau:

Âaûi Läüc Âáûu âoí 4550 200 Lã Lai

Vç giaï trë cuía khoïa laì {ïï Âaûi Läüc, Âáûu âoí } chæa coï trong CSDL nãn bäü naìy
âæåüc cháúp nháûn. Trong khi âoï, ta biãút Âaûi Läüc âaî coï âëa chè laì 128 Nguyãùn Hoaìng.
Nhæ váûy, máu thuáùn våïi sæû phuû thuäüc dæî liãûu âaî âæåüc cháúp nháûn træåïc âoï
(TÃN_NCC xaïx âënh duy nháút ÂC_NCC).
d) Sæû dë thæåìng do xoïa dæî liãûu
Ngæåüc laûi våïi váún âãö (c), khi ta xoïa hãút caïc màût haìng do mäüt haîng cung cáúp,
ta khäng thãø theo doîi âæåüc âëa chè cuía haîng âoï.
Trong vê duû trãn, caïc váún âãö trãn seî khäng coìn næîa khi ta thay quan hãû NCC
bàòng hai quan hãû:
NCC_ÂC(TEN_NCC, ÂC_NCC)
NCC_HG(TEN_NCC, TEN_HG, GIA)
Tuy nhiãn, váùn coìn täön taûi vaìi váún âãö. Vê duû, váùn coìn mäüt báút låüi trong caïch
phán têch så âäö nhæ trãn: khi muäún tçm âëa chè haîng cung cáúp màût haìng bäüt ngoüt
Vedan, ta phaíi laìm mäüt kãút näúi (chi phê cao), trong khi chè våïi quan hãû NCC, ta chè

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


121

âån giaín thæûc hiãûn pheïp choün vaì pheïp chiãúu. Nhæ váûy, laìm sao xaïc âënh sæû thay
thãú nhæ trãn laì coï låüi ? Coï caïc váún âãö giäúng nhæ 4 váún âãö âaî noïi, trong hai quan hãû
måïi naìy khäng ? Laìm thãú naìo tçm âæåüc mäüt sæû thay thãú täút âeûp cho mäüt så âäö quan
hãû täöi tãû ?
II. PHỤ THUỘC HÀM
(functional dependencies/ deïpendances fonctionnelles)
1. Định nghĩa
Cho R(A1,..., An) laì mäüt så âäö quan hãû, X vaì Y laì caïc táûp con cuía
U={A1,..., An}. Ta noïi XY (âoüc laì: X xaïc âënh haìm Y, hoàûc Y phuû thuäüc haìm vaìo
X) nãúu våïi mäùi càûp bäü u,v cuía R:
u[X]=v[X]  u[Y]=v[Y]

2. Một số tính chất của phụ thuộc hàm


Våïi (X, Y, Z, W  U), phuû thuäüc haìm trãn táûp thuäüc tênh U thoía caïc tênh
cháút sau âáy:
F1) Tênh phaín xaû (reflexivity):
XY  X Y
F2) Tênh bàõc cáöu (transitivity):
X Y,YZ  X Z
F3) Tênh måí räüng hai vãú (augmentation):
X  Y  (Z  U) XZ  YZ
F4) Tênh tæûa bàõc cáöu (pseudotransitivity):
X  Y, YZ  W  XZ  W
F5) Tênh phaín xaû chàût:
X X
F6) Måí räüng vãú traïi vaì thu heûp vãú phaíi:
X  Y  (Z  U) (W  U) XZ  Y \ W
F7) Cäüng tênh âáöy âuí:
X  Y, Z  W  XZ  YW
F8) Måí räüng vãú traïi:
X  Y  XZ  Y
F9) Cäüng tênh åí vãú phaíi (union):
X  Y, X  Z  X  YZ
F10) Cuûc bäü åí vãú phaíi (decomposition):
X  YZ  X  Y
F11) Tênh têch luîy:
(A  U) X  YZ, A  AW  X  YZA

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


122

III. BAO ĐÓNG (CLOSURE)


1. Định nghĩa suy diễn theo logic
Cho táûp phuû thuäüc haìm F trãn U vaì mäüt phuû thuäüc haìm f trãn U. Ta noïi f
âæåüc suy diãùn logic (logically implied) tæì F, hoàûc suy diãùn theo tiãn âãö tæì F, kyï hiãûu
F ë f nãúu moüi quan hãû R thoía maîn caïc phuû thuäüc haìm trong F thç cuîng thoía f.
Noïi caïch khaïc, f âæåüc suy diãùn logic tæì F nãúu tæì F, aïp duûng mäüt säú láön caïc
tênh cháút F1, F2 vaì F3, ta thu âæåüc f.
Vê duû:
Cho táûp phuû thuäüc haìm F={A  B, B  CD}, ta chæïng minh phuû thuäüc
haìm AC  CD âæåüc suy diãùn logic tæì F.
Tháût váûy:
(F3): A  B  AC  BC
(F3): B  CD  BC  CD
(F2): AC  BC, BC  CD  AC  CD

2. Bao đóng của tập các phụ thuộc hàm


a. Âënh nghéa
Cho táûp phuû thuäüc haìm F trãn táûp thuäüc tênh U. Bao âoïng cuía F, kyï hiãûu
F+, laì táûp nhoí nháút caïc phuû thuäüc haìm trãn U thoía:
F+= {X  Y | F ë X  Y }
b. Tênh cháút
(1) Tênh phaín xaû: F+  F
(2) Tênh âån âiãûu: F  G  F+  G+
(3) Tênh luîy âàóng: (F+)+ = F+
(4) (FG)+  F+G+
(5) (F+G)+ = (FG+)+ = (FG)+
3. Bao đóng của tập các thuộc tính đối với tập các phụ thuộc hàm
a. Âënh nghéa
Cho táûp phuû thuäüc haìm F trãn táûp thuäüc tênh U vaì X U. Bao âoïng cuía táûp
thuäüc tênh X (âäúi våïi F), kyï hiãûu X+, laì táûp sau:
X+ = { A | X  A  F+ }
b. Tênh cháút
(1) Tênh phaín xaû: X+  X
(2) Tênh âån âiãûu: X  Y  X+  Y+
(3) Tênh luîy âàóng: (X+)+ = X+

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


123

(4) (XY)+  X+Y+


(5) (X+Y)+ = (XY+)+ = (XY)+
(6) X  Y  Y  X+
(7) X  Y  Y+  X+
(8) X  X+ vaì X+  X
(9) X+=Y+  X  Y, Y  X
IV. CÁC HỆ TIÊN ĐỀ
1. Hệ tiên đề Amstrong
(Armstrong's axioms):
a. Âënh nghéa hãû tiãn âãö Armstrong
Hãû A0 bao gäöm ba luáût suy diãùn F1, F2 vaì F3
A0= {F1, F2, F3}
âæåüc goüi laì hãû tiãn âãö Armstrong cho caïc phuû thuäüc haìm.
b. Âënh nghéa tênh âáöy âuí vaì tênh chàût cheî cuía mäüt hãû tiãn âãö
Cho táûp caïc phuû thuäüc haìm F.
Mäüt hãû tiãn âãö S cho caïc phuû thuäüc haìm âæåüc goüi laì âáöy âuí (complete) nãúu
caïc luáût cuía S cho pheïp suy diãùn ra moüi phuû thuäüc haìm trong F+.
Mäüt hãû tiãn âãö S cho caïc phuû thuäüc haìm âæåüc goüi laì chàût cheî (sound) nãúu
caïc luáût cuía S khäng cho pheïp suy diãùn tæì F báút kyì phuû thuäüc haìm naìo khäng thuäüc
F+.
c. Bäø âãö 1
Hãû tiãn âãö Armstrong laì chàût cheî. Nghéa laì, nãúu goüi F laì táûp caïc phuû thuäüc
haìm âuïng trãn quan hãû R, vaì nãúu X  Y laì mäüt quan hãû âæåüc suy diãùn tæì F nhåì hãû
tiãn âãö Armtsrong, thç X  Y âuïng trãn R.
Chæïng minh:
Láön læåüt chæïng minh trãn caïc tiãn âãö F1, F2, F3.
* F1: Tiãn âãö vãö tênh phaín xaû naìy roî raìng laì chàût cheî. Ta khäng thãø
coï mäüt quan hãû R maì hai bäü cuía noï âaî giäúng nhau trãn táûp thuäüc tênh X laûi khäng
thãø giäúng nhau trãn mäüt táûp con cuía X.
* F2 (tiãn dãö vãö bàõc cáöu): Do ta âaî coï X  Y nãn våïi hai bäü u, v báút
kyì trãn R thoía:
u[X] = v[X] (1)
suy ra: u[Y] = v[Y]
maì Y  Z, do âoï: u[Z] = v[Z] (2)
(1) & (2) cho ta kãút luáûn X  Z.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


124

* F3: CM bàòng phaín chæïng. Giaí sæí coï quan hãû R thoía X  Y, trong
âoï tçm âæåüc hai bäü u vaì v khäng thoía XZ  YZ. Ta coï:
u[XZ] = v[XZ]
 u[X] = v[X] vaì u[Z]=v[Z] (3)
nhæng u[YZ]  v[YZ]
do (3) nãn u[Y]  v[Y]
Âiãöu naìy máu thuáùn våïi giaí thiãút X  Y.

2. Các hệ tiên đề khác


Ngoaìi hãû A0, coìn coï caïc hãû tiãn âãö khaïc cho phuû thuäüc haìm vaì tæång âæång
våïi A0:
B0 = { F5, F10, F11}
S0 = { F1, F4}
D0 = { F2, F5, F6, F7}
M0 = { F4, F5, F8}

3. Bổ đề 2
X  Y suy diãùn âæåüc tæì F nhåì tiãn âãö Armstrong nãúu vaì chè nãúu Y X+.
Chæïng minh:
Âàût Y= A1...An vaì giaí thiãút Y  X+. Do âënh nghéa cuía X+, våïi moüi i,
XAi âæåüc suy diãùn nhåì hãû tiãn âãö Armstrong. Do tênh cháút F9 (cäüng tênh åí vãú
phaíi), ta coï X  Y.
Ngæåüc laûi, giaí sæí X  Y suy diãùn âæåüc nhåì hãû tiãn âãö. Våïi moüi i, ta coï X 
Ai do tênh cháút F10 (cuûc bäü åí vãú phaíi), nãn Y  X+.

4. Định lý 1
Hãû tiãn âãö Armstrong laì chàût cheî vaì âáöy âuí.

5. Định nghĩa khác của bao đóng của tập các phụ thuộc hàm
F+ laì táûp caïc phuû thuäüc haìm suy tæì F nhåì hãû tiãn âãö Armstrong. Tæïc noï phaíi
thoía hai tênh cháút sau:
(i) F+  F
(ii) Khi aïp duûng caïc tênh cháút (F1), (F2) vaì (F3) cho F+, ta khäng thu
âæåüc phuû thuäüc haìm naìo nàòm ngoaìi F+.

6. Định nghĩa khác của bao đóng của tập các thuộc tính

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


125

Noïi caïch khaïc, X+ laì táûp caïc thuäüc tênh A sao cho X  A coï thãø suy diãùn
âæåüc tæì F bàòng hãû tiãn âãö Armstrong (F ë X  A).
V. THUẬT TOÁN TÌM BAO ĐÓNG
1. Giới hạn vấn đề
Viãûc tçm F+ täún khaï nhiãöu thåìi gian, âån giaín vç F+ coï thãø ráút låïn ngay khi
baín thán F nhoí. Xeït F={A  B1, ..., A  Bn }, thç:
F+={A  Y | Y  {B1,..., Bn} }
Coï 2n táûp Y nhæ váûy, ta khäng mong gç liãût kã âæåüc hãút F+, duì cho n coï nhoí
âi næîa.
Màût khaïc, viãûc tçm X+ laûi khäng khoï. Nhåì bäø âãö 2, viãûc cho biãút X  Y coï
thuäüc F hay khäng thç khäng khoï hån viãûc tênh X+.

2. Giải thuật 1
Input: Mäüt táûp hæîu haûn caïc thuäüc tênh U, mäüt táûp caïc phuû thuäüc haìm trãn
U, vaì mäüt táûp X  U.
Output: X+ thoía F.
Phæång phaïp: Tçm mäüt chuäùi caïc táûp thuäüc tênh X(0), X(1)... nhåì caïc qui
tàõc sau:
(1) X(0) laì X.
(2) X(i+1) laì X(i) cäüng thãm táûp thuäüc tênh A sao cho coï êt nháút mäüt phuû
thuäüc haìm Y  Z trong F, våïi A thuäüc Z, vaì Y C X(i).
Vç X=X(0) ...  X(i) ...  U, vaì U hæîu haûn, nãn phaíi coï mäüt i âãø
X(i+1)=X(i). Táút nhiãn tiãúp theo laì X(i)= X(i+1)= X(i+2)=... nãn ta khäng cáön phaíi
laìm tiãúp khi âaî coï X(i+1)=X(i).
Luïc âoï, X+ chênh laì X(i).
3. Ví dụ
Goüi F laì táûp caïc phuû thuäüc haìm bao gäöm:
AB  C (1) D  EG (5)
C A (2) BE  C (6)
BC  D (3) CG  BD (7)
ACD  B (4) CE  AG (8)
Âàût X=BD. AÏp duûng giaíi thuáût, ta coï X(0)=BD.
Âãø tênh X(1), ta tçm caïc phuû thuäüc haìm coï phêa bãn traïi laì B, D, hoàûc BD. chè
coï mäüt PTH, âoï laì D  EG, nãn ta thãm E vaì G vaìo X(0) âãø coï:
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
126

X(1) = BDEG
Âäúi våïi X(2), ta tçm caïc phêa bãn traïi nàòm trong X(1) vaì tçm tháúy D  EG
vaì BE  C. Nhæ váûy:
X(2) = BCDEG
Âäúi våïi X(3), tçm tháúy caïc phuû thuäüc haìm C  A, BC  D, CG  BD vaì
CE  AG. Cho nãn:
X(3) = ABCDEG = táûp moüi thuäüc tênh.
Suy ra: X(3) = X(4) = ...
Váûy: (BD)+ = ABCDEG
4. Định lý 2
Giaíi thuáût 1 tçm âuïng X+.
VI. PHỦ CỦA CÁC PHỤ THUỘC HÀM
(Covers of sets of dependencies)
1. Sự tương đương giữa các tập phụ thuộc hàm- Phủ của tập phụ thuộc
hàm
Cho F vaì G laì caïc táûp phuû thuäüc haìm. Ta noïi F vaì G tæång âæång nãúu
F+=G+.
Khi âoï, ta noïi F phuí G (vaì G phuí F).

2. Bổ đề 3
Mäùi táûp phuû thuäüc haìm F âæåüc phuí båíi mäüt táûp phuû thuäüc haìm G, trong âoï
khäng coï phêa bãn phaíi naìo coï nhiãöu hån mäüt thuäüc tênh.
Chæïng minh:
Goüi G laì táûp caïc phuû thuäüc haìm X  A sao cho våïi X  Y trong F thç A
thuäüc Y. Do âoï, X  A âæåüc suy tæì X  Y nhåì qui tàõc F10 (cuûc bäü åí vãú phaíi).
FëX A
 X  A  F+
Nãn G  F+. Tênh âån âiãûu cuía bao âoïng cho G+  F+.
Nhæng F  G+, vç:
Y=A1...An  X  Y suy tæì X  A1,..., X  An
do tênh cháút F9 (cäüng tênh åí vãú phaíi).
GëX Y
 X  Y  G+
Suy ra: F+  G+.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


127

Váûy F+ = G+

3. Tập phụ thuộc hàm tối tiểu


Ta noïi mäüt táûp phuû thuäüc haìm F laì täúi tiãøu nãúu:
(i) Mäùi phêa bãn phaíi cuía mäüt phuû thuäüc haìm trong F chè chæïa mäüt
thuäüc tênh.
(ii) Khäng täön taûi X  A naìo trong F maì táûp F {X  A} tæång âæång
våïi F.
(iii) Khäng täön taûi X  A naìo trong F vaì táûp con thæûc sæû Z naìo cuía X,
âãø cho
F  ({X  A}  {Z  A})
tæång âæång våïi F.
4. Định lý 3
Moüi táûp phuû thuäüc haìm F âãöu tæång âæång våïi mäüt táûp phuû thuäüc haìm täúi
tiãøu F'.
Chæïng minh:
Do bäø âãö 3, giaí sæí khäng coï phêa bãn phaíi naìo trong F coï nhiãöu hån mäüt
thuäüc tênh. Âãø thoía âiãöu kiãûn (ii), xeït tæìng PTH X  Y theo thæï tæû naìo âoï, vaì nãúu
F  {X  Y} tæång âæång våïi F, thç xoïa X  Y khoíi F. Læu yï viãûc xeït caïc PTH theo
thæï tæû khaïc nhau coï thãø dáùn âãún viãûc xoïa caïc táûp PTH khaïc nhau. Vê duû, cho táûp F:
A B A C
B A C A
B C
Ta coï thãø xoïa caí hai B  A vaì A  C, hoàûc xoïa B  C, nhæng khäng thãø
xoïa caí ba.
Sau khi âaî thoía (ii), ta tiãún tåïi thoía (iii) bàòng caïch xeït tæìng PTH coìn laûi trong
F, vaì tæìng thuäüc tênh åí phêa bãn traïi cuía chuïng, theo thæï tæû naìo âoï. Nãúu khi coï thãø
xoïa mäüt thuäüc tênh åí bãn traïi maì váùn coï mäüt táûp thuäüc tênh tæång âæång, thç ta cæï
xoïa noï âi, cho âãún khi khäng thuäüc tênh bãn traïi naìo coìn bë xoïa âæåüc næîa. Ta cuîng
læu yï thæï tæû xoïa thuäüc tênh coï thãø aính hæåíng âãún kãút quaí. Vê duû, cho:
AB  C
A B
B A
ta coï thãø xoïa hoàûc A hoàûc B khoíi AB  C, nhæng khäng thãø xoïa caí hai.
5. Ví dụ
Duìng vê duû åí muûc V. AÏp duûng bäø âãö 3 âãø taïch caïc phêa bãn phaíi caïc PTH,
ta coï:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


128

AB  C BE  C
C A CG  B
BC  D CG  D
ACD  B CE  A
D E CE  G
D G
Roî raìng CE  A laì thæìa, vç noï âæåüc suy diãùn qua C  A. CG  B cuîng
thæìa, vç:
CG  D, C  A, ACD  B  CG  B
Khäng coìn PTH naìo thæìa. Tuy nhiãn, coï thãø thay ACD  B bàòng CD 
B, vç âaî cho C  A. Nhæ váûy, ta âæåüc mäüt phuí täúi tiãøu cho F nhæ cäüt bãn traïi dæåïi
âáy.
Mäüt phuí täúi tiãøu khaïc, âæåüc chè ra åí cäüt bãn phaíi, âæåüc xáy dæûng tæì F bàòng
caïch xoïa âi CE  A, CG  D, vaì ACD  B.
Læu yï hai phuí täúi tiãøu naìy coï säú phuû thuäüc haìm khaïc nhau.
AB  C AB  C
C A C A
BC  D BC  D
CD  B D E
D E D G
D G BE  C
BE  C CG  B
CG  D CE  G
CE  G
VII. PHỤ THUỘC ĐA TRỊ
(multivalued dependencies/ deïpendances multivalueïes)

1. Định nghĩa
a. Âënh nghéa træûc quan
Cho så âäö quan hãû R vaì X, Y laì hai táûp con cuía R. Ta noïi X xaïc âënh bäüi
(multidetermine) Y hoàûc coï mäüt phuû thuäüc âa trë giæîa X vaì Y hoàûc Y phuû thuäüc
âa trë vaìo X -kyï hiãûu X  Y - nãúu våïi mäüt bäü caïc giaï trë cho træåïc cuía caïc thuäüc
tênh trong X, coï mäüt táûp hoàûc räùng, hoàûc chæïa nhiãöu bäü giaï trë cho caïc thuäüc tênh
trong Y, vaì táûp chæïa caïc giaï trë cuía Y naìy tuyãût âäúi khäng liãn thäng våïi caïc giaï trë
cuía R-X-Y.
b. Âënh nghéa hçnh thæïc
Ta noïi X  Y trãn så âäú quan hãû R nãúu våïi r laìì mäüt quan hãû trãn R:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


129

 t,s  R: t[X]=s[X]   u,v  R: u[X]= v[X]= t[X]= s[X] 


u[Y]= t[Y]  u{R-X-Y]= s[R-X-Y] 
v[Y]= s[Y]  v[R-X-Y]= t[R-X-Y]
Nghéa laì, ta coï thãø traïo âäøi caïc giaï trë Y trãn t vaì s âãø nháûn âæåüc hai bäü måïi
cuîng åí trong r. Chuï yï ta khäng giaí thiãút X vaì Y råìi nhau.
2. Ví dụ
Xeït så âäö quan hãû:
HOÜC (MÄN, GV, TG, PHOÌNG, SV, K_QUAÍ)
våïi mäüt quan hãû trãn så âäö âoï nhæ sau:

HOÜC MÄN GV TG PHOÌNG SV K_QUAÍ


CSDL Tráön Cao Tãû T2 9g 222 Lã Myî Linh B
CSDL Tráön Cao Tãû T4 9g 333 Lã Myî Linh B
CSDL Tráön Cao Tãû T6 9g 222 Lã Myî Linh B
CSDL Tráön Cao Tãû T2 9g 222 Phan Anh Tuáún A
CSDL Tráön Cao Tãû T4 9g 333 Phan Anh Tuáún A
CSDL Tráön Cao Tãû T6 9g 222 Phan Anh Tuáún A

Trong træåìng håüp âån giaín naìy, ta chè coï mäüt män vaì mäüt giaïo viãn våïi hai
sinh viãn. Mäüt män coï thãø daûy åí nhiãöu luïc , åí nhiãöu phoìng. Mäùi sinh viãn coï mäüt bäü
cho tæìng buäøi hoüc cuîa män hoüc âang xeït. Trçnh âäü anh ta âäúi våïi män âoï âæåüc láûp
laûi åí tæìng bäü liãn quan.
Do âoï, ta hy voüng ràòng coï phuû thuäüc âa trë MÄN  TG, PHOÌNG, nghéa
laì coï mäüt táûp caïc càûp giåì- phoìng tæång æïng våïi mäùi män vaì bë taïch ra khoíi caïc thuäüc
tênh khaïc.
Vê duû, ta âàût:
t=

CSDL Tráön Cao Tãû T2 9g 222 Lã Myî Linh B

s=

CSDL Tráön Cao Tãû T4 9g 333 Phan Anh Tuáún A

Ta hy voüng coï thãø hoaïn vë âæåüc (T2 9g, 222) cuía t våïi (T4 9g, 333) cuía s âãø
nháûn âæåüc hai bäü:
u=
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
130

CSDL Tráön Cao Tãû Tráön Cao Âãû T2 9g 222 Phan Anh Tuáún A
v=
CSDL Tráön Cao Tãû Tráön Cao Âãû T4 9g 333 Lã Myî Linh B

Ta tháúy hai bäü u vaì v naìy roî raìng åí trong r.


Cáön nháún maûnh ràòng coï phuû thuuäüc âa trë MÄN  TG, PHOÌNG trãn
HOÜC khäng phaíi chè vç noï hiãûn hæîu trãn mäüt quan hãû cuû thãø nhæ trãn, Noï coï hiãûu
læûc trãn HOÜC laì do yï nghéa cuía caïc thuäüc tênh: Våïi mäüt män báút kyì m, nãúu noï âæåüc
daûy vaìo luïc t1 åí phoìng p1, do giaïo viãn g1, cho sinh viãn s1 våïi kãút quaí k1 vaì noï cuîng
âæåüc daûy vaìo luïc t2 åí phoìng p2, do giaïo viãn g2, cho sinh viãn s2 våïi kãút quaí k2, thç
tæì sæû hiãøu biãút cuía mçnh, ta hy voüng män m cuîng seî âæååüc daûy vaìo luïc t1 åí phoìng p1,
do giaïo viãn g2, cho sinh viãn s2 våïi kãút quaí k2.
Chuï ràòng khäng coï caïc phuû thuäüc âa trë MÄN  TG vaì C  PHOÌNG.
Phaín chæïng: Giaí sæí t vaï s laì caïc bäü âaî noïi åí trãn. Nãúu coï MÄN  TG, ta phaíi tçm
tháúy bäü:

CSDL Tráön Cao Âãû T2 9g 333 Phan Anh Tuáún A

nhæng thæûc tãú laûi khäng coï.


Ta coìn coï caïc phuû thuäüc âa trë khaïc trãn HOÜC nhæ
MÄN  SV, K_QUAÍ
vaì TG, PHOÌNG  SV, K_QUA.Í

3. Sự liên quan giữa phụ thuộc hàm và phụ thuộc đa trị


Dãù daìng tháúy ràòng nãúu ta coï X Y, ta seî suy ra âæåüc X  Y. Noïi caïch
khaïc, phuû thuäüc haìm chênh laì mäüt træåìng håüp âàûc biãût cuía phuû thuäüc âa trë.
Bài tập:
Tìm các PTH của quan hệ sau:
A B C D E
1. TIỆC_TÙNG ( CHỦ_XỊ, BẠN, QUÁN, NGÀY, GIỜ,
G H I J
MÓN, ĐVT_MÓN, ĐƠN_GIÁ_M, SL_MÓN)

A B C D E
2. HỌC_BÙ (PHÒNG, NHÀ_HỌC, MÔN, MSGV, NGÀY,
G H I J K
GIỜ, SỐ_TIẾT, MSSV, HỌ_SV, TÊN_SV)
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
131

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


132

Chương 6

CHUẨN HÓA SƠ ĐỒ QUAN HỆ

I. KHÓA CỦA SƠ ĐỒ QUAN HỆ


1. Khóa (key)
ÅÍ âáy, ta trçnh baìy laûi khaïi niãûm khoïa, sæí duûng caïc khaïi niãûm væìa trçnh baìy
åí chæång 5.
Giaí sæí R laì mäüt så âäö quan hãû våïi táûp caïc thuäüc tênh U={A1, A2, ... An }, táûp
phuû thuäüc haìm F vaì táûp thuäüc tênh X(U). Ta noïi X laì mäüt khoïa cuía R nãúu:
(i) XA1, A2, ... An thuäüc F+, nghéa laì sæû phuû thuäüc cuía moüi thuäüc tênh
vaìo X âaî coï træåïc trong F, hoàûc âæåüc suy diãùn tæì nhæîng phuû thuäüc haìm âaî coï.
(ii) Khäng coï táûp con thæûc sæû naìo Y X âãø cho Y A1, A2, ... An thuäüc F+.
Vê duû 1:
Cho quan hãû:
MÄN_HOÜC (MAÎ_MÄN, TÃN_MÄN)
ta tháúy caí hai thuäüc tênh MAÎ_MÄN vaì TÃN_MÄN âãöu thoía hai âiãöu kiãûn âaî noïi åí
trãn, nãn quan hãû coï âãún hai khoïa {MAÎ_MÄN} vaì {TÃN_MÄN}.
Vê duû 2:
Âäúi våïi quan hãû:
NHAÌ (SÄÚ_NHAÌ, ÂÆÅÌNG, DIÃÛN_TÊCH)
thç khoïa laì táûp {SÄÚ_NHAÌ, ÂÆÅÌNG}.
Vê duû 3
Trong quan hãû:
NHÁN_VIÃN (HOÜ_TÃN, NÀM_SINH, ÂËA_CHÈ)
tuìy træåìng håüp maì ta coï caïc khoïa khaïc nhau:
a) Nãúu khäng coï nhán viãn naìo truìng hoü tãn nhau, ta coï {HOÜ_TÃN} laì mäüt
khoïa.
b) Nãúu coï êt nháút hai nhán viãn truìng hoü tãn, {HOÜ_TÃN} khäng thãø laì khoïa
c) Nãúu khäng coï hai nhán viãn naìo truìng âëa chè, {ÂËA_CHÈ)} laì mäüt khoïa.
d) Nãúu âaî råi vaìo træåìng håüp b, vaì khäng thoía âiãöu kiãûn træååìng håüp c, ta coï
{HOÜ_TÃN, ÂËA_CHÈ} laì mäüt khoïa (vç hiãúm khi hai ngæåìi truìng tãn laûi coìn åí cuìng
mäüt nhaì).
e) Nãúu âaî råi vaìo træåìng håüp b, {HOÜ_TÃN, NÀM_SINH} cuîng laì mäüt khoïa
cuía quan hãû nãúu ta chàõc chàõn ràòng khäng coï hai ngæåìi væìa truìng tãn væìa sinh cuìng
nàm.

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


133

2. Siêu khóa (superkey)


Siãu khoïa laì mäüt táûp thuäüc tênh coï chæïa khoïa.
Nhæ váûy, khoïa laì mäüt træåìng håüp âàûc biãût cuía siãu khoïa.
Vê duû 1:
Trong quan hãû NHAÌ åí muûc 1, coï hai siãu khoïa la:ì
{SÄÚ_NHAÌ, ÂÆÅÌNG}
{SÄÚ_NHAÌ, ÂÆÅÌNG, DIÃÛN_TÊCH}
Vê duû 2:
Trong vê duû 3 åí muûc 1, nãúu råïi vaìo træåìng håüp a, ta coï caïc siãu khoïa sau:
{HOÜ_TÃN}
{HOÜ_TÃN, NÀM_SINH}
{HOÜ_TÃN, ÂËA_CHÈ}
{HOÜ_TÃN, NÀM_SINH, ÂËA_CHÈ}
II. CÁC DẠNG CHUẨN CỦA CÁC SƠ ĐỒ QUAN HỆ
1. Thuộc tính nguyên tố, không nguyên tố
(prime attribute, nonprime attribute)
Cho så âäö quan hãû R(U). Mäüt thuäüc tênh AU âæåüc goüi laì nguyãn täú nãúu A
laì thaình pháön cuía mäüt khoïa trong R. Ngæåüc laûi, A khäng nguyãn täú.
Vê duû:
Trong så âäö quan hãû ABCD våïi caïc phuû thuäüc haìm ABC, BD, BCA,
ta coï thãø kiãøm tra ràòng AB vaì BC laì caïc khoïa; do âoï A, B vaì C laì nguyãn täú vaì D laì
khäng nguyãn täú.
2. Các dạng phụ thuộc hàm
Cho quan hãû R(U), thuäüc tênh AXU, A khäng nguyãn täú.
a. Phuû thuäüc tæìng pháön
(partial dependency/ deïpendance partielle)
Phuû thuäüc haìm XA laì phuû thuäüc tæìng pháön nãúu X laì mäüt táûp con thæûc sæû
cuía mäüt khoïa cuía R.
b. Phuû thuäüc âáöy âuí/ phuû thuäüc så cáúp
(complete dependency/ deïpendance eïleïmentaire)
Phuû thuäüc haìm XA laì phuû thuäüc âáöy âuí (hay coìn goüi laì phuû thuäüc
så cáúp) nãúu khäng täön taûi táûp con thæûc sæû YX naìo âãø cho YA xaíy ra. Nhæ váûy,
phuû thuäüc âáöy âuí vaìo khoïa ngæåüc laûi våïi phuû thuäüc tæìng pháön.
f. Phuû thuäüc truyãön
(transitive dependency)
XA laì phuû thuäüc truyãön nãúu X khäng laì táûp con (không là táûp con thæûc
sæû, cũng không bằng đúng) cuía mäüt khoïa naìo.
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
134

Tæì truyãön coï xuáút xæï nhæ sau: Våïi Y laì mäüt khoïa, ta coï chuäùi khäng táöm
thæåìng (nontrivial) YXA. Chuäùi âæåüc xem laì khäng táöm thæåìng båíi vç:
AX (do giaí thiãút)
XY (do giaí thiãút)
AY (A khäng nguyãn täú)
g. Phuû thuäüc træûc tiãúp
XA laì phuû thuäüc træûc tiãúp nãúu khäng täön taûi táûp thuäüc tênh Y, våïi YX,
Y{A} , thoía:
XY vaì YA
Nhæ váûy, phuû thuäüc træûc tiãúp vaìo khoïa ngæåüc våïi phuû thuäüc truyãön.
h. Vê duû
Cho quan hãû
SAÏCH (MAÎ_SAÏCH, TÆÛA, LOAÛI)
våíi MAÎ_SAÏCH gäöm 2 pháön gheïp laûi: SÄÚ_THÆÏ_TÆÛû saïch (âaïnh trong tæìng loaûi saïch)
vaì MAÎ_LOAÛI saïch, trong khi thuäüc tênh LOAÛI âãø chè diãùn giaíi cuía loaûi saïch. Nhæ váûy
ta coï phuû thuäüc haìm:
MAÎ_LOAÛI  LOAÛI
laì mäüt phuû thuäüc tæìng pháön.
Trong khi âoï, åí quan hãû
SAÏCH2 (SÄÚ_THÆÏ_TÆÛ,û ì MAÎ_LOAÛI, TÆÛA, LOAÛI)
våïi thuäüc tênh SÄÚ_THÆÏ_TÆÛû âãø chè thæï tæû cuía saïch trong toaìn bäü thæ viãûn, ta laûi coï
phuû thuäüc haìm:
MAÎ_LOAÛI  LOAÛI
laì mäüt phuû thuäüc truyãön.

3. Sự chuẩn hóa một quan hệ


(normalization/ normalisation)
Caïc quan hãû trong mäüt cå såí dæî liãûu cáön âæåüc âæa vãö caïc daûng chuáøn, nhàòm
traïnh xaíy ra caïc báút låüi nhæ âaî nãu åí chæång 1 vaì chæång 10. Caïc daûng chuáøn åí
nhiãöu cáúp âäü khaïc nhau, vaì läöng vaìo nhau theo så âäö sau:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


135

daûng ban âáöu

så âäö åí daûng chuáøn thæï I (1NF)

så âäö åí daûng chuáøn thæï II (2NF)

så âäö åí daûng chuáøn thæï III (3NF)

så âäö åí daûng chuáøn Boyce-Codd (BCNF)

så âäö åí daûng chuáøn thæï tæ (4NF)

Mäüt så âäö quan hãû muäún thoía mäüt daûng chuáøn naìo âoï, træåïc hãút phaíi thoía
caïc daûng chuáøn åí cáúp tháúp hån (nãúu coï). ÅÍ âáy, ta khäng âãö cáûp âãún daûng chuáøn
thæï tæ (4NF) laì mäüt daûng chuáøn dæûa trãn phuû thuäüc âa trë. Thäng thæååìng, yãu cáöu
täúi thiãøu cho mäüt så âäö quan hãû laì daûng chuáøn thæï ba (3NF).
Cáön chuï yï ràòng mæïc âäü chuáøn hoïa âäúi våïi mäüt så âäö quan hãû âaî cho âæåüc xaïc
âënh båíi ngæî nghéa, chæï khäng phaíi båíi caïc giaï trë dæî liãûu coï màût trong quan hãû âoï
taûi mäüt thåìi âiãøm naìo âoï.

4. Dạng chuẩn thứ nhất (1NF)


a. Âënh nghéa
Mäüt så âäö quan hãû R âæåüc xem laì åí daûng chuáøn thæï nháút nãúu moüi thuäüc tênh
cuía R âãöu khaïc träúng (null), phuû thuäüc haìm vaìo khoïa vaì khäng âæåüc mang giaï trë
keïp (indivisible: khäng thãø chia âæåüc thaình caïc thaình pháön nhoí hån vaì coï yï nghéa).
b. Vê duû
Cho så âäö quan hãû
CUNG_ÆÏNG (MAÎ_NSX, MAÎ_HAÌNG, SÄÚ_LÆÅÜNG, VÄÚN_NSX,
THAÌNH_PHÄÚ, NÆÅÏC)

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


136

våïi caïc phuû thuäüc haìm:


MAÎ_NSX, MAÎ_HAÌNG  SÄÚ_LÆÅÜNG
(a)
MAÎ_NSX  VÄÚN_NSX
(b)
MAÎ_NSX  THAÌNH_PHÄÚ
(c)
MAÎ_NSX  NÆÅÏC
(d)
THAÌNH_PHÄÚ  NÆÅÏC
(e)
Dãù tháúy ràòng så âäö quan hãû naìy thoía daûng chuáøn thæï nháút
5. Dạng chuẩn thứ hai (2NF)
a. Âënh nghéa
Nãúu R khäng coï phuû thuäüc haìm tæìng pháön naìo, màûc duì coï thãø coï phuû thuäüc
truyãön, ta noïi R åí daûng chuáøn thæï hai.
b. Vê duû
Vê du 1:
Så âäö quan hãû SAIP våïi caïc phuû thuäüc haìm SIP vaì S A âaî vi phaûm daûng
chuáøn thæï hai: Khoïa duy nháút laì SI, nãn A laì khäng nguyãn täú.
Vê du 2:
Trong vê duû åí muûc 4, så âäö quan hãû CUNG_ÆÏNG khäng thoía daûng chuáøn
thæï hai vç caïc phuû thuäüc haìm (b)-(d) laì caïc phuû thuäüc haìm tæìng pháön.
Vê du 3:
Ta taïch CUNG_ÆÏNG thaình hai så âäö quan hãû:
CUNG_ÆÏNG2 (MAÎ_NSX, MAÎ_HAÌNG, SÄÚ_LÆÅÜNG)
NSX (MAÎ_NSX, VÄÚN_NSX, THAÌNH_PHÄÚ, NÆÅÏC)
thç caí hai så âäö måïi naìy âãöu thoía 2NF.

6. Dạng chuẩn thứ ba (3NF)


a. Âënh nghéa
Mäüt så âäö quan hãû R åí daûng chuáøn thæï ba nãúu noï khäng coï phuû thuäüc truyãön
naìo.
b. Vê duû
Vê duû 1:
Så âäö quan hãû CSZ våïi caïc phuû thuäüc haìm CSZ vaì ZC åí daûng chuáøn thæï
ba vç moüi thuäüc tênh cuía chuïng âãöu nguyãn täú.
Vê duû 2:
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
137

Cho så âäö quan hãû SIDM våïi caïc thuäüc tênh S (store), I (item), D
(departement) vaì M (manager). Caïc phuû thuäüc haìm gäöm SI D vaì SDM. Khoïa
duy nháút laì SI. Do âoï SDM vi phaûm qui tàõc chuáøn thæï ba vç SD khäng laì mäüt siãu
khoïa. Ta váùn coï phuû thuäüc truyãön SDM, nhæng khäng coï phuû thuäüc haìm tæìng
pháön naìo, vç khäng coï táûp con thæûc sæû naìo cuía SI xaïc âënh haìm D hoàûc M.
Vê duû 3:
Så âäö quan hãû NSX åí vê duû 3, muûc 4 khäng thoía 3NF vç váùn coìn chæïa phuû
thuäüc truyãön:
THAÌNH_PHÄÚ  NÆÅÏC
Vê duû 4:
Ta taïch NSX thaình hai så âäö quan hãû:
NSX (MAÎ_NSX, VÄÚN_NSX, THAÌNH_PHÄÚ)
TP (THAÌNH_PHÄÚ, NÆÅÏC)
thç hai så âäö naìy thoía 3NF.
7. Dạng chuẩn Boyce-Codd (BCNF)
Âáy laì daûng chuáøn maûnh nháút, vç trong mäüt säú træåìng håüp (nháút laì khi quan
hãû coï nhiãöu khoïa), daûng chuáøn thæï ba váùn chæa giuïp giaíi quyãút triãût âãø caïc báút låüi vaì
báút thæåìng nhæ âaî noïi åí muûc 3.
a. Âënh nghéa
R åí daûng chuáøn naìy nãúu våïi phuû thuäüc haìm báút kyì X A thoía trãn R, vaì
AX, ta coï X laì mäüt siãu khoïa cuía R.
b. Vê duû
Så âäö quan hãû CSZ åí vê duû trãn khäng åí daûng chuáøn Boyce-Codd vç trong
phuû thuäüc haìm Z C, Z khäng laì siãu khoïa (caïc khoïa laì CS vaì SZ).

8. Dạng chuẩn thứ tư (4NF)


Daûng chuáøn thæï tæ laì daûng måí räüng cuía daûng chuáøn Boyce- Codd, aïp duûng
cho caïc så âäö quan hãû coï caïc phuû thuäüc âa trë.
a. Âënh nghéa
Goüi R laì mäüt så âäö quan hãû vaì D laì táûp caïc phuû thuäüc aïp duûng trãn R. Ta noïi
R åí daûng chuáøn thæï tæ nãúu khi ta coï mäüt phuû thuäüc âa trë X  Y báút kyì, trong âoï
Y khaïc räùng hoáûc khäng laì mäüt táûp con cuía X vaì XY khäng chæïa hãút moüi thuäüc
tênh cuía R, thç X phaíi laì mäüt siãu khoïa cuía R.
Nhæ váûy, ta nháûn xeït ràòng khi D chè chæïa caïc phuû thuäüc haìm, nãúu R åí daûng
chuáøn thæï tæ thç noï cuîng åí daûng chuáøn Boyce- Codd. Tæì âoï, ta cuîng suy ra khi D chè
chæïa caïc phuû thuäüc haìm, nãúu R khäng åí daûng chuáøn Boyce- Codd thç noï cuîng
khäng åí daûng chuáøn thæï tæ.
b. Vê duû
Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT
138

Xeït så âäö quan hãû TKBIÃØU (TG, PHOÌNG, MÄN) våïi phuû thuäüc âa trë
MÄN  TG, PHOÌNG
Phuû thuäüc âa trë naìy khäng vi phaûm 4NF vç häüi caïc thuäüc tênh hiãûn diãûn trãn
âoï âaî chæïa hãút táút caí caïc thuäüc tênh cuía TKBIÃØU.

III. LỢI ÍCH CỦA VIỆC CHUẨN HÓA


1. Tầm quan trọng của các phụ thuộc hàm
Caïc phuû thuäüc haìm X  Y khäng chè biãøu diãùn raìng buäüc toaìn veûn trãn caïc
quan hãû, chuïng coìn biãøu diãùn mäúi liãn hãû (relationship) maì CSDL coï yï âënh læu træî.
Ta ráút coi troüng viãûc biãút âæåüc tæìng giaï trë tæång æïng trãn Y khi biãút caïc giaï trë trãn
X.

2. Nhược điểm của phụ thuộc từng phần


Nãúu ta coï mäüt phuû thuäüc tæìng pháön Y  A, trong âoï X laì mäüt khoïa vaì
YX, thç trong mäùi bäü duìng âãø kãút håüp laûi (associate) mäüt giaï trë trãn X våïi caïc giaï
trë trãn caïc thuäüc tênh Bi, trong âoï coï caïc Bi thoía BiA, BiX, cuîng phaíi coï mäúi kãút
håüp nhæ váûy giæîa Y vaì A. Thaình thæí mäùi khi Y âæåüc láûp laûi trong khoïa thç A cuîng
âæåüc láûp laûi, vaì láûp laûi mäüt caïch vä êch, hån næîa coìn coï thãø xaíy ra caïc dë thæåìng
trong cáûp nháût.
Vê duû: Nhæ trong pháön I, chæång 10,
3. Nhược điểm của phụ thuộc truyền
Nãúu ta coï mäüt phuû thuäüc truyãön X Y  A, ta khäng thãø kãút håüp mäüt giaï
trë cuía Y våïi mäüt giaï trë cuía X nãúu khäng coï mäüt giaï trë cuía A kãút håüp våïi giaï trë âaî
coï cuía Y. Tçnh huäúng naìy seî dáùn âãún thãm vaì xoïa mäüt caïch dë thæåìng:
- Ta khäng thãø thãm mäüt kãút håüp tæì X âãún Y maì khäng coï mäúi kãút håüp tæì
Y âãún A,
- Nãúu ta xoïa mäüt giaï trë cuía A âaî kãút håüp våïi mäüt giaï trë cho træåïc cuía Y, ta
coï thãø máút dáúu mäúi kãút håüp tæì X âãún Y.
Ta coï thãø giaíi thêch âæåüc âiãöu naìy bàòng toaïn hoüc nãúu ta coi phuû thuäüc haìm
nhæ aïnh xaû.
x X, !yY: y=f(x)
y Y, !aA: a=g(y)
 x X, !aA: a=gf(x)
Vê duû:
Cho quan hãû:
PHÁN_PHÄÚI (ÂÆÅÌNG, MÀÛT_HAÌNG, CHI_NHAÏNH, NG_QUAÍN_TRË)
âãø quaín lyï trong mäüt cäng ty kinh doanh, våïi caïc phuû thuäüc haìm:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


139

ÂÆÅÌNG, MÀÛT_HAÌNG  CHI_NHAÏNH


ÂÆÅÌNG, CHI_NHAÏNH  NG_QUAÍN_TRË
Ta khäng thãø ghi nháûn chi nhaïnh baïn maïy chuûp hçnh åí âæåìng Ngä Quyãön
nãúu chi nhaïnh âoï khäng coï ngæåìi quaín trë.
4. Lợi ích của các dạng chuẩn
Âiãöu kiãûn cuía daûng chuáøn thæï ba (khäng coï phuû thuäüc tæìng pháön láùn phuû
thuäüc truyãön) giuïp xoaï âi sæû dæ thæìa dæî liãûu vaì caïc dë thæåìng khi cáûp nháût dæî liãûu.
Daûng Boyce- Codd cuîng váûy, vaì hån næîa, noï coìn giuïp xoïa thãm mäüt säú nhæåüc âiãøm
khaïc chæa bë daûng chuáøn thæï ba ngàn ngæìa.
Ta nháûn xeït ràòng dæåìng nhæ caïc táút caí caïc phuû thuäüc haìm thoía maîn 3NF
nhæng khäng thỏa BCNF thæåìng coï yï nghéa khäng thêch âaïng làõm trong bäúi caính
quan hãû âang xeït.. Coï thãø laì vç noï phaín aïnh chæa hoaìn toaìn âuïng thæûc tãú, hoàûc laì
noï phaín aïnh thæûc tãú âuïng nhæng caïc thuäüc tênh cuía noï laûi âæåüc âàût khäng âuïng chäù
trong quan hãû âang xeït.
Vê duû:
Cho quan hãû
TAI_NAÛN (XE_GÁY_TN, NG_GÁY_TN, NAÛN_NHÁN, NÅI_CHỐN,
THÅÌI_ÂIÃØM)
våïi caïc phuû thuäüc haìm:
XE_GÁY_TN, NG_GÁY_ÛTN, NAÛN_NHÁN, NÅI_CHÄN  THÅÌI_ÂIÃØM
(1)
XE_GÁY_TN, NG_GÁY_TN, NAÛN_NHÁN, THÅÌI_ÂIÃØM  NÅI_CHÄÚN
(2)
XE_GÁY_TN  NG_GÁY_TN (3)
Nhæ váûy, coï 2 khoïa:
{ XE_GÁY_TN, NG_GÁY_TN, NAÛN_NHÁN, NÅI_CHỐN }
vaì { XE_GÁY_TN, NG_GÁY_TN, NAÛN_NHÁN, THÅÌI_ÂIÃØM }
Ta tháúy quan hãû trãn thoía 3NF nhæng laûi khäng thoía BCNF do phuû thuäüc
haìm (3): XE_GÁY_TN khäng phaíi laì siãu khoïa. ÅÍ âáy, ráút dãù xaíy ra sæû dæ thæìa dæî
liãûu vç mäùi láön làûp laûi XE_GÁY_TN thç NG_GÁY_TN cuîng âæåüc láûp laûi.
Ta xeït phuû thuäüc haìm (3). Coï 2 khaí nàng xaíy ra:
- Thæûc tãú, coï thãø coï nhiãöu ngæåìi laïi cuìng mäüt chiãúc xe. Do âoï, khi biãút âæåüc
xe, khäng chàõc xaïc âënh âæåüc ngæåìi gáy tai naûn. Do âoï, trong (1) vaì (2) måïi cáön coï
thãm NG_GÁY_TN âãø xaïc âënh âæåüc âuïng thåìi âiãøm vaì nåi chäún xaíy ra tai naûn. Noïi
caïch khaïc, (3) khäng âuïng thæûc tãú. Khi âoï, ta phaíi xoïa noï âi.
- Quan hãû âang xeït coï cáúu truïc khäng håüp lyï vç (3) âuïng. Ta coï thãø taïch noï
ra thaình 2 quan hãû:

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


140

TAI_NAÛN (XE_GÁY_TN, NAÛN_NHÁN, NÅI_CHÄN, THÅÌI_ÂIÃØM)


LAI_XE (XE, NGÆÅÌI_LAÏI)
Ta tháúy hai quan hãû måïi naìy thoía qui tàõc chuáøn Boyce-Codd.

BÀI TẬP
Bài 1:

PHỤ_TRÁCH (MÃ_NG_QL, TẦNG, DÃY, MỨC_LG,


MÃ_CỔNG_DÃY)
Chung cư có nhiều người quản lý. Mỗi người quản lý có một mức lương.
Việc phân công phụ trách cho người quản lý khá tự do, không theo quy tắc nào.
Chung cư gồm nhiều dãy và nhiều tầng, mỗi dãy có một cổng để lên, phải
có mã của cổng mới mở khóa lên được dãy đó.
Bài 2:
GÓP_Ý_CB (MSSV, MSCB, NGÀY, GIỜ, Ý_KIẾN, STT_LẦN,
VAI_TRÒ_CB, MÃ_LỚP_SV)
Một sinh viên có thể góp ý cùng một ý kiến nhiều lần cho cùng một cán bộ.
Ở mỗi thời điểm SV đó góp một ý kiến cho một cán bộ, ghi nhận đó là lần thứ mấy
SV góp ý kiến đó cho CB đó.
Cần biết vai trò của CB (GV cố vấn, chủ nhiệm khoa, bí thư Đoàn khoa,
giáo vụ khoa, phó bí thư chi đoàn, …).
Ví dụ:
Tìm khóa của quan hệ sau:
A B C D
THAM_QUAN ( SỐ_CMND_KHÁCH, HỌ, TÊN, PHÁI,
E F G
NGÀY_S, SỐ_ĐT, ĐIỂM_TH_QUAN,
H I
GIÁ_VÉ_TH_QUAN, NGÀY)
A B C D
GỬI_XE (SỐ_XE, LOẠI_XE, ĐG_GỬI, MS_THẺ_XE,

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


141

E G H I J
TH_ĐIỂM_GỬI, BUỔI, NG_GỬI, LÀ_SV, BÃI_XE)

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT


142

HỌC BÙ: ở nhà C1, hẹn tại sảnh giữa 2 hội trường
Nhóm 15: CT7 20/4, CT7 4/5
Nhóm 7: 7g S CN 5/5
THI TRƯỚC 13/5:
Nhóm 7: 14g chiều T3 7/5

Bài giảng Hệ CSDL GV: Phạm Thị Xuân Lộc, ĐHCT

You might also like