Professional Documents
Culture Documents
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
PHẦN A
Chương 1
TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU
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.
Hệ quản
Nhóm người Khung nhìn 1 trị CSDL
sử dụng 1
.
.. Anh xạ
trong
Nhóm Khung nhìn n
người sử Anh xạ
dụng n ngoài
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 ...).
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
CSDL
váût lyï
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ụ:
7/1993
7/1994
x t
x’
m
m
P(m(x))=m(t(x))
y=m(x) P
y’’
y’
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
S S
1 S 3
ĐẶT HÀNG HÀNG HÓA
2
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.
Đặ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
. 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ụ
- Đổ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ụ
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
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.
DBMS
File manager
Chương 2
MÔ HÌNH QUAN HỆ
* 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: t1t2 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}.
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ụ:
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)
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
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
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ự
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
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)
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
- 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:
“H.H. Thaï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:
(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“
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.
(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ả.
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ãû.
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ãû:
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)
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
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
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.
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
Tçm DM HANG
* 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 ]
- 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
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 (AU) vaì quan
hãû S âäúi våïi thuäüc tênh B (BV), âæåüc âënh nghéa nhæ sau:
R S = { <u,v> | u R vS u[A] v[B] }
AB
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ãû:
* 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).
* 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 ]
02 150 08 4
02 150 09 6
02 150 10 4
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
b. Vê duû
Cho hai quan hãû:
NHÁNVIÃN VÅÜCHGNV
TRAÏI =
NHÁNVIÃN VÅÜCHGNV
PHAÍI =
HAIBÃNN = NHÁNVIÃN VÅÜCHGNV
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:
Vê duû:
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.
/ 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:
Chương 4
NGÔN NGỮ HỎI SQL
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:
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
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;
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
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
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
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 >)
|
{ 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 ] }
|
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.
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.
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
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.
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe
Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary
Smith',75000);
*
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
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
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
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 ;
<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 > ]
_ 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.
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.
<âê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.
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:
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.
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í.
Â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).
_ 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.
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:
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í.
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
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.
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
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 ;
( 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> ...]
[AND | OR
<âiãöu kiãûn choün>
[AND | OR
<âiãöu kiãûn choün>...]]
Trong Oracle9i:
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:.
=
< >, !=, #
==
>
>=
<
<=
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;
KH_HANG.MA_KH = HOA_DON.MA_KH
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> )
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.
_ 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. 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 ;
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) ;
FROM giong_lua ;
WHERE ten_tinh='Vénh long'
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ệ
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'
PHẦN B
LÝ THUYẾT VỀ
THIẾT KẾ
CSDL QUAN HỆ
Chương 5
CÁC LOẠI PHỤ THUỘC DỮ LIỆU
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:
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è
âå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 XY (â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]
* 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.
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,
XAi âæåü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
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+.
Váûy F+ = G+
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:
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=
s=
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
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
Chương 6
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) YXA. Chuäùi âæåüc xem laì khäng táöm thæåìng båíi vç:
AX (do giaí thiãút)
XY (do giaí thiãút)
AY (A khäng nguyãn täú)
g. Phuû thuäüc træûc tiãúp
XA 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 YX,
Y{A} , thoía:
XY vaì YA
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.
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ï.
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ì SDM. Khoïa
duy nháút laì SI. Do âoï SDM 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 SDM, 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ì
AX, 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).
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.
BÀI TẬP
Bài 1:
E G H I J
TH_ĐIỂM_GỬI, BUỔI, NG_GỬI, LÀ_SV, BÃI_XE)
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