You are on page 1of 151

Chương 1: Tổng quan về CSDL

CHƯƠNG I: TỔNG QUAN VỀ CƠ SỞ DỮ LIỆU


1.1 Các khái niệm cơ bản
1.1.1 Các khái niệm về tập hợp
1.1.1.1 Tập hợp và các phép toán trên tập hợp:
Định nghĩa 1: Các đối tượng trong một tập hợp cũng được gọi là các phần tử
của tập hợp đó. Tập hợp được nói là chứa các phần tử của nó và được kí hiệu bằng
những chữ cái lớn A, B, …, Y, Z,… còn các phần tử được kí hiệu bằng các chữ cái
nhỏ a, b, …, x, z, … . Để chỉ a là phần tử của A, ta viết a ∈ A , trái lại ta viết a ∉ A .
Định nghĩa 2: Hai tập hợp được gọi là bằng nhau nếu và chỉ nếu chúng có
cùng các phần tử.
Ví dụ: ta có hai tập A={0, 1, …, 100} và tập B={x ∈ N : x ≤ 100} thì khi đó
tập A bằng tập B và kí hiệu A = B.
Định nghĩa 3: Tập A được gọi là tập con của tập B nếu và chỉ nếu mỗi phần tử
của A đều là một phần tử của B, và kí hiệu A ⊆ B.

Tập rỗng là tập con của mọi tập hợp, tức là ∅ ⊆ B với B là tập hợp bất kỳ.
Định nghĩa 4: Cho hai tập hợp A và B. Tích Đề các (Descartes) của A và B và
kí hiệu là A× B, là tập hợp của tất cả các cặp (a, b) với a∈A và b∈B. Do đó,

A×B = {(a, b)  a∈A, b∈B}.


Ví dụ: A = {1,2,3}, B = {a, b, c}. Khi đó:
A×B = {(1, a); (1, b); (1, c); (2, a); (2, b); (2, c); (3, a); (3, b); (3, c)}

B×A = {(a, 1); (b, 1); (c, 1); (a, 2); (b, 2); (c, 2); (a, 3); (b, 3); (c, 3)}

Và rõ ràng A×B ≠ B×A


Định nghĩa 5: Tích Đề các (Descartes) của các tập A1, A2, …, An, được kí
hiệu bởi A1× A2× …× An là tập hợp của các dãy sắp thứ tự (a1, a2, …, an) trong đó

ai∈Ai với i=1, 2, …, n. Do đó


n

∏ A =A1× A2×
i =1
i …× An={ (a1, a2, …, an)  ai∈Ai , i=1, 2, …, n}

Người ta cũng dùng kí hiệu luỹ thừa để biểu diễn tích Đề các của cùng một tập
hợp :

A n
= A × A × . . .× A
n lÇ n A

Ví dụ: A = {1, 2}, B = {a, b, c} và C={3, 4}. Khi đó:

Vũ Bá Anh – Phan Phước Long 1


Chương 1: Tổng quan về CSDL

A×B×C = {(1, a, 3); (1, a, 4); (1, b, 3); (1, b, 4); (1, c, 3);(1, c, 4);
(2, a, 3); (2, a, 4); (2, b, 3); (2, b, 4); (2, c, 3);(2, c, 4) }
Định nghĩa 6: Cho hai tập hợp A và B. Hợp của hai tập hợp A và B được kí
hiệu là A ∪ B, là tập chứa tất cả các phần tử hoặc thuộc A hoặc thuộc B. Tức là:

A ∪ B = { x  x∈A ∨ x∈B}
Ví dụ: A = {1, 2, 4, 5, 6}, B = {3, 4, 6, 8, 9}.
Khi đó: A ∪ B = {1, 2, 3, 4, 5, 6, 8, 9}
Định nghĩa 7: Cho hai tập hợp A và B. Giao của hai tập hợp A và B được kí
hiệu là A ∩ B, là tập chứa tất cả các phần tử thuộc cả A và B. Tức là:

A ∩ B = { x  x∈A ∧ x∈B}
Ví dụ: A = {1, 2, 4, 5, 6}, B = {3, 4, 6, 8, 9}.
Khi đó: A ∩ B = {4, 6}
Định nghĩa 8: Hai tập hợp A và B được gọi là rời nhau (không giao nhau) nếu
giao của chúng bằng tập rỗng. Tức là
A không giao với B ⇔ A ∩ B = ∅
Định nghĩa 9: Cho hai tập hợp A và B. Hiệu của hai tập hợp A và B được kí
hiệu là A\ B, là tập chứa tất cả các phần tử thuộc A mà không thuộc B. Tức là:
A \ B = { x  x∈A ∧ x ∉ B}
Ví dụ: A = {1, 2, 4, 5, 6}, B = {3, 4, 6, 8, 9}.
Khi đó: A \ B = {1, 2, 5}
1.1.1.2 Hàm
Định nghĩa 1: Cho A và B là hai tập hợp. Một hàm f từ A đến B là một phép
tương ứng với mỗi phần tử a của A một phần tử duy nhất b của B mà ta kí hiệu là f(a)
và gọi là ảnh của a bởi f. Ta viết
f : A → B
a ֏ b = f (a)
Khi đó, ta cũng gọi a là nghịch ảnh của b. Tập A được gọi là miền xác định
của f. Tập B được gọi là miền giá trị của f.
Ví dụ: Giả sử f là hàm từ tập Z vào tập N mà ta cho tương ứng với mỗi phần
tử z ∈ Z với phần tử n ∈ N sao cho n= z , tức f(z)= z . Khi đó, miền xác định của f là
tập số nguyên Z, miền giá trị của f là tập số tự nhiên N.
Định nghĩa 2: Cho hàm g từ tập A đến tập B và hàm f từ tập B đến tập C. Hợp
thành của các hàm f và g, được kí hiệu là fοg, được định nghĩa bởi:
(fοg)(a) = f(g(a)), với ∀a ∈ A

Vũ Bá Anh – Phan Phước Long 2


Chương 1: Tổng quan về CSDL

Ví dụ: Cho hai hàm f, g : Z → Z xác định bởi f(x)=3x+4 và g(x)=7x+5. Khi
đó ta có:
(fοg)(x) = f(g(x)) = f(7x+5) = 3(7x+5) +4 = 21x+19
(gοf)(x) = g(f(x)) = g(3x+4) = 7(3x+4) +5 = 21x+33
Chúng ta thấy rằng: mặc dù tồn tại cả hai hợp thành fοg và gοf nhưng chúng
không bằng nhau.
1.1.1.3 Quan hệ
Định nghĩa 1: Một quan hệ giữa tập hợp A và tập hợp B là một tập con R của

A×B. Nếu (a, b) ∈ R , ta viết aRb. Một quan hệ giữa A và A được gọi là một quan hệ
trên A.
Ví dụ: Quan hệ “≤” trên tập số Z . Khi đó aRb ⇔ a ≤ b
Định nghĩa 2: Một quan hệ trên các tập hợp A1, A2, …, An, là một tập hợp con
n
của ∏ A =A1× A2×
i =1
i …× An.

1.1.2 Cơ sở dữ liệu
Trong mọi hoạt động của con người, nhu cầu tích lũy và xử lý các dữ liệu luôn
nảy sinh. Để giải quyết một vấn đề nhỏ cũng cần tới dữ liệu, nhưng không nhất thiết
phải quản lí những dữ liệu này theo các phương pháp khoa học. Vì khả năng tổng hợp
của người xử lí mà các dữ liệu được lấy ra, được xử lí không vấp phải khó khăn nào.
Tuy nhiên khi gặp phải một vấn đề, một bài toán với khối lượng dữ liệu cần xử lí lớn
thì tất yếu dữ liệu cần được quản lí tốt, có khoa học. Khi đó, manh nha công tác tự
động hóa dữ liệu. Ban đầu, người ta dùng hệ quản lí tệp với các tệp dữ liệu chứa các
thông tin và dùng chương trình để tìm kiếm, thao tác dữ liệu của tệp đó. Điều này đẫn
tới một số nhược điểm:
- Dư thừa dữ liệu và tính không nhất quán dữ liệu: Do các tệp được tạo ra bởi
các nhà lập trình khác nhau, trên các ngôn ngữ lập trình khác nhau nên một dữ liệu có
thể lưu trữ ở nhiều tệp khác nhau. Điều này dẫn tới dư thừa dữ liệu. Hơn nữa, dữ liệu
trong các tệp có thể được thay đổi một cách độc lập do các chương trình ứng dụng sử
dụng nó. Vì vậy, cùng một khoản mục dữ liệu, nhưng trong mỗi chương trình ứng
dụng lại khác nhau, dẫn tới tính không nhất quán dữ liệu.
- Khó khăn trong việc truy cập dữ liệu
- Sự cô lập dữ liệu: Do dữ liệu nằm ở nhiều tệp với các khuôn dạng khác nhau
nên khó viết các chương trình ứng dụng mới để tìm kiếm dữ liệu thích hợp.
- Các vấn đề về toàn vẹn:
- Các vấn đề về độ tin cậy:
- Các dị thường truy nhập tương tranh
- Các vấn đề về an toàn

Vũ Bá Anh – Phan Phước Long 3


Chương 1: Tổng quan về CSDL

Để khắc phục các nhược điểm trên và tổ chức việc xử lí dữ liệu một cách khoa
học hơn thì các hệ cơ sở dữ liệu đã xuất hiện.
Định nghĩa: Một cơ sở dữ liệu (CDSL) là tập hợp các dữ liệu có liên quan đến
nhau chứa thông tin về một tổ chức nào đó, được lưu trữ trên các thiết bị nhớ thứ cấp
để đáp ứng nhu cầu khai thác thông tin của nhiều người sử dụng với các mục đích
khác nhau.
Từ định nghĩa trên ta thấy, một cơ sở dữ liệu thỏa mãn hai tính chất dưới và
được làm rõ trong phần 1.2.3:
- Tính độc lập dữ liệu
- Tính chia xẻ dữ liệu

1.1.3 Hệ quản trị cơ sở dữ liệu


Định nghĩa: Hệ quản trị cơ sở dữ liệu là một hệ thống phần mềm cho phép tạo
lập cơ sở dữ liệu và điều khiển mọi truy nhập đối với cơ sở dữ liệu đó.
Các thao tác truy nhập chủ yếu:
- Tìm kiếm dữ liệu theo chỉ tiêu nào đó
- Bổ sung dữ liệu vào cơ sở dữ liệu
- Loại bỏ dữ liệu ra khỏi cơ sở dữ liệu
- Sửa chữa dữ liệu trong cơ sở dữ liệu
Ta thấy, khác hẳn với hệ quản lí các tệp (hay các tệp cơ sở dữ liệu), hệ quản trị
cơ sở dữ liệu cho phép mô tả dữ liệu (xác định tên, dạng dữ liệu, tính chất của dữ liệu,
…) theo cách không phụ thuộc vào người sử dụng, không phụ thuộc vào yêu cầu tìm
kiếm hay thay đổi thông tin.
Rõ ràng, hệ quản trị cơ sở dữ liệu có phương pháp, công cụ để lưu trữ, tìm
kiếm, sửa đổi và chuyển đổi các dữ liệu. Hệ quản trị cơ sở dữ liệu có giao diện người
sử dụng cho phép người dùng liên hệ với nó. Thông qua các lệnh của ngôn ngữ
người/máy mà nó liên hệ với bộ nhớ ngoài. Còn người sử dụng dùng ngôn ngữ hỏi cơ
sở dữ liệu để khai thác các chức năng của hệ quản trị cơ sở dữ liệu.
Các hệ quản trị cơ sở dữ liệu thường dùng
- Quy mô lớn
• Oracle: chạy trên 100 cấu hình khác nhau
• DB/2 của IBM
• SyBase
• Informix của IBM (2001)
• SQL Server
- Quy mô vừa và nhỏ:
• MicroSoft Access
• Visual FoxPro
• Paradox

Vũ Bá Anh – Phan Phước Long 4


Chương 1: Tổng quan về CSDL

1.1.4 Hệ thống quản lý dữ liệu


Người ta thường dùng thuật ngữ hệ cơ sở dữ liệu (DBMS-DataBase
Management System) để chỉ một cơ sở dữ liệu cùng với hệ quản trị cơ sở dữ liệu để
truy cập cơ sở dữ liệu đó. Ta mô phỏng qua sơ đồ của DBMS

Cách khác, có thể hiểu một hệ cơ sở dữ liệu là một hệ thống gồm bốn thành
phần:
- Cơ sở dữ liệu phải hợp nhất: Cơ sở dữ liệu phải thỏa mãn hai yêu cầu sau:
 Không dư thừa (trong thực tiễn dữ liệu dư thừa ít nhất)
 Chia xẻ dữ liệu
- Người sử dụng: Là người có yêu cầu truy cập cơ sở dữ liệu để thực hiện một
thao tác nào đó.
+ Người sử dụng đầu cuối (End-User): là những người sử dụng truy
cập vào cơ sở dữ liệu từ một trạm nào đó để tìm kiếm, tra cứu thông tin.
+ Người viết chương trình ứng dụng
+ Người quản trị cơ sở dữ liệu: là người có nhiệm vụ điều khiển toàn
bộ hệ cơ sở dữ liệu, là người có quyền cao nhất, chịu trách nhiệm thực hiện
các nhiệm vụ sau:
 Quyết định nội dung thông tin: (dữ liệu nào sẽ được lưu trữ
trong cơ sở dữ liệu)
 Quyết định cấu trúc lưu trữ, chiến lược truy cập
 Xác định những thao tác sao cho đảm bảo tính đúng đắn và an
toàn của dữ liệu.
 Xác định các phương án sao lưu, dự phòng.
- Hệ quản trị cơ sở dữ liệu: Đây chính là phần mềm của hệ cơ sở dữ liệu.
- Phần cứng: Là các thiết bị được sử dụng để sao lưu dữ liệu.
Để tổng quan về hệ cơ sở dữ liệu chúng ta sẽ phân chia các hệ cơ sở dữ liệu
thành hai loại cơ bản: các hệ cơ sở dữ liệu tập trung và các hệ cơ sở dữ liệu phân tán.
1. Các hệ cơ sở dữ liệu tập trung: là các hệ cơ sở dữ liệu mà trong đó phần cơ
sở dữ liệu được lưu trữ tại một nơi, một vị trí nhất định.
a) CSDL mang tính cá nhân (Personal DataBase): Là một hệ CSDL nhỏ gồm
4 thành phần (NSD, Máy trạm, DBMS, CSDL) như hình vẽ. Ở đây người viết chương
trình, người sử dụng cuối, người quản trị là một. Và do đó, hệ này chỉ đảm bảo cho
một chức năng nhỏ lẻ mà thôi.

Vũ Bá Anh – Phan Phước Long 5


Chương 1: Tổng quan về CSDL

b) Cơ sở dữ liệu trung tâm (Central DataBase): là hệ đa người dùng từ các


máy trạm. Mọi xử lí, tính toán được thực hiện tập trung ở một máy tính mạnh. Hệ này
có nhược điểm là nếu máy trung tâm có sự cố thì toàn bộ hệ thống sẽ ngừng hoạt động

c) Cơ sở dữ liệu khách/chủ (Client/Server DataBase): Với hệ này, cơ sở dữ


liệu được tạo và lưu trữ ở máy chủ, còn việc tính toán lại diễn ra ở máy trạm.

Vũ Bá Anh – Phan Phước Long 6


Chương 1: Tổng quan về CSDL

2. Các hệ cơ sở dữ liệu phân tán: Là các hệ cơ sở dữ liệu trong đó thành phần


cơ sở dữ liệu được chia nhỏ thành nhiều cơ sở dữ liệu thành phần, trải ra trong một
mạng máy tính. Trong hệ cơ sở dữ liệu phân tán thường được chia thành hai hệ: thuần
nhất và không thuần nhất. Khi các cơ sở dữ liệu địa phương biểu diễn theo những
cách giống nhau, mô hình giống nhau thì gọi là hệ thuần nhất. Ngược lại thì gọi là hệ
không thuần nhất

1.2 Kiến trúc của một hệ cơ sở dữ liệu

1.2.1 Các mức trừu tượng trong hệ thống cơ sở dữ liệu


Không phải người sử dụng cơ sở dữ liệu nào cũng hiểu biết hết sự phức tạp
của cơ sở dữ liệu. Chính vậy, những người phát triển hệ thống đã che dấu không cho
người dùng biết được sự phức tạp đó nhằm làm đơn giản những tương tác của người
dùng với hệ thống. Mặt khác, khi thiết kế cơ sở dữ liệu thì rất cần phải quan tâm đến
các yêu cầu về dữ liệu như tính độc lập dữ liệu, tính toàn vẹn dữ liệu, … . Do vậy cơ
sở dữ liệu nên được chia ra thành các mức hình thức. Từ đây, thấy ngay mục đích
chính của một hệ cơ sở dữ liệu là cung cấp người dùng một cách nhìn trừu tượng về
dữ liệu. Tức hệ thống che dấu các chi tiết phức tạp về cách thức dữ liệu được lưu trữ
và bảo trì.
Từ năm 1976, theo nhóm ANSI-PARC (American Nation Standard Institute
Planning And Requirements Committee – Viện tiêu chuẩn quốc phòng Mỹ - ủy ban
nhu cầu và kế hoạch Mỹ) các hệ cơ sở dữ liệu được nhìn dưới ba mức: mức trong
(vật lí), khái niệm (logic), mức ngoài (khung nhìn).

Vũ Bá Anh – Phan Phước Long 7


Chương 1: Tổng quan về CSDL

1. Mức Vật lí: Đây là mức thấp nhất của sự trừu tượng mô tả dữ liệu được lưu
trữ thực sự như thế nào trong cơ sở dữ liệu. Tại mức này, cơ sở dữ liệu được nhìn theo
cấu trúc lưu trữ.
2. Mức Khái niệm: Là mức cao hơn tiếp theo của sự trừu tượng mô tả những
dữ liệu nào được lưu trữ trong cơ sở dữ liệu và các mối quan hệ nào tồn tại giữa các
dữ liệu này. Do vậy cơ sở dữ liệu được nhìn theo cấu trúc chính quy của dữ liệu và sẽ
mô tả:
- Dạng dữ liệu cơ bản, nhằm xác định các thuộc tính của đối tượng.
- Các dạng dữ liệu thành phần, cho phép nhóm các thuộc tính lại để mô tả một
thực thể của thế giới thực ở mức gộp lớn hơn.
- Các dạng dữ liệu thành phần cho phép nhóm các thuộc tính để mô tả các liên
kết (quan hệ) trong thế giới thực.
3. Mức khung nhìn: Là mức cao nhất của sự từu tượng mô tả chỉ một phần của
toàn bộ cơ sở dữ liệu. Mức khung nhìn là cách người dùng cảm nhận về dữ liệu và do
vậy hệ thống có thể cung cấp nhiều khung nhìn đối với cùng một cơ sở dữ liệu.

1.2.2 Lược đồ và thể hiện


Để có một ứng dụng tốt về cơ sở dữ liệu thì trước tiên cần hiểu rõ chức năng
quản trị dữ liệu của hệ quản trị cơ sở dữ liệu là:
 Định nghĩa các cấu trúc lưu trữ và cấu trúc dữ liệu, và
 Theo dõi sự phát triển của dữ liệu.
Khi đó, thông qua hệ quản trị cơ sở dữ liệu (hoặc một ngôn ngữ cụ thể), đầu
tiên người ta phải mô tả tập các dữ liệu liên quan đến ứng dụng. Đó là lược đồ. Vậy:
Lược đồ là mô tả theo cách thức của một ngôn ngữ, cho phép xác định một tập
các dữ liệu cụ thể.
Như thế, toàn bộ mô tả cơ sở dữ liệu được gọi là lược đồ của cơ sở dữ liệu
(DataBase Schema).
Lược đồ được xác định trong quá trình thiết kế cơ sở dữ liệu và ít khi bị thay
đổi, thậm chí hầu như không thay đổi. Tương ứng với ba mức trừu tượng dữ liệu nói
trên có ba loại lược đồ: Lược đồ vật lí, lược đồ logic và lược đồ ngoài (hay còn gọi là

Vũ Bá Anh – Phan Phước Long 8


Chương 1: Tổng quan về CSDL

lược đồ con). Thông thường các hệ cơ sở dữ liệu hỗ trợ một lược đồ vật lí, một lược
đồ logic và nhiều lược đồ ngoài. Khi thiết kế cơ sở dữ liệu thường dùng lược đồ logic
để mô tả mức độ cao về thế giới thực. Sau đó, dịch lược đồ logic sang lược đồ vật lí.
Theo thời gian, các cơ sở dữ liệu sẽ thay đổi khi dữ liệu được thêm vào, xóa đi
hay sửa đổi. Toàn bộ dữ liệu lưu trữ trong cơ sở dữ liệu tại một thời điểm nhất định
được gọi là một thể hiện của cơ sở dữ liệu (DataBase Instance). Như thế, tương ứng
với một lược đồ cơ sở dữ liệu có thể có nhiều thể hiện của cơ sở dữ liệu đó.

(Quan hệ giữa mô hình, lược đồ và thể hiện)

1.2.3 Tính độc lập dữ liệu


Một trong các mục đích cần đạt được và đáng quan tâm của hệ quản trị cơ sở
dữ liệu, mà người thiết kế cũng như người sử dụng dữ liệu luôn đặt ra, đó là sự độc
lập dữ liệu (Data Independence).
Độc lập dữ liệu được hiểu các lược đồ ở mức trên không bị ảnh hưởng khi có
sự thay đổi các lược đồ ở các mức dưới. Có hai loại độc lập dữ liệu: độc lập dữ liệu
vật lý và độc lập dữ liệu logic.

Khung nhìn 1 Khung nhìn 2 Khung nhìn n

Độc lập dữ liệu mức logic

Mức khái niệm


Độc lập dữ liệu mức vật lí

Mức vật lí

Vũ Bá Anh – Phan Phước Long 9


Chương 1: Tổng quan về CSDL

- Độc lập dữ liệu vật lí: là khả năng các thay đổi tại mức vật lí nhiều khi là cần
thiết để tăng hiệu năng hệ thống.
- Độc lập dữ liệu logic: là khả năng sửa đổi lược đồ logic mà không làm thay
đổi các lược đồ ngoài và như vậy không cần đòi hỏi viết lại chương trình ứng dụng.
Cơ sở dữ liệu có tính độc lập logic sẽ có các ưu điểm:
 Cho phép mỗi nhóm người sử dụng thấy dữ liệu họ mong muốn
 Cho phép phát triển các khung nhìn của nhóm công tác
 Phát triển khung nhìn mà không cần tác động đền khung nhìn khác
 …
Do vậy độc lập dữ liệu logic là khó đạt được hơn so với độc lập dữ liệu vật lí.

1.3 Các ngôn ngữ dữ liệu


1.3.1 Ngôn ngữ định nghĩa dữ liệu
Một lược đồ cơ sở dữ liệu được đặc tả bởi một tập các định nghĩa được biểu
diễn một ngôn ngữ đặc biệt được gọi là ngôn ngữ định nghĩa dữ liệu (DDL – Data-
definition Language). Kết quả của việc dịch các lệnh của ngôn ngữ này là tập các
bảng được lưu trữ trong một tệp đặc biệt (Meta data) được gọi là từ điển dữ liệu hay
thư mục dữ liệu.
Từ điển dữ liệu là tập các lược đồ và những quy luật tương ứng giữa các lược
đồ liên quan đến cơ sở dữ liệu, chứa các mô tả về ý nghĩa của dữ liệu. Từ điển dữ liệu
dùng trong việc xác định và biến đổi cấu trúc của cơ sở dữ liệu đang xét.

1.3.2 Ngôn ngữ thao tác dữ liệu


Một ngôn ngữ thao tác dữ liệu (DML – Data-Manipulation Language) là một
ngôn ngữ cho phép người sử dụng truy cập hay thao tác dữ liệu được tổ chức bởi một
mô hình dữ liệu thích hợp. DML có hai dạng cơ bản:
- Các DML thủ tục đòi hỏi mỗi người sử dụng phải mô tả dữ liệu nào cần tìm
kiếm và tìm kiếm những dữ liệu đó ra sao.
- Các DML phi thủ tục đòi hỏi mỗi người sử dụng phải mô tả dữ liệu nào cần
tìm kiếm mà không phải đặc tả tìm kiếm những dữ liệu đó như thế nào.
Các DML thủ tục thường khó học và khó sử dụng hơn DML phi thủ tục.

1.3.3 Ngôn ngữ chủ


Ngôn ngữ chủ (Host Language) là ngôn ngữ lập trình có các danh từ, động từ
xử lí tệp và định nghĩa dữ liệu của tệp. Thông thường người ta dùng các ngôn ngữ lập
trình bậc cao để mô tả và xử lí dữ liệu. Khi đó, để khai thác dữ liệu sẽ được thực hiện
theo các giai đoạn:
- Các thuật toán được viết thành các lệnh của chương trình
- Dùng trình biên dịch để dịch chương trình nguồn thành chương trình nhị
phân
- Các chương trình nhị phân được liên kết và dịch thành chương trình khả thi.
- Khai thác chương trình khả thi.

Vũ Bá Anh – Phan Phước Long 10


Chương 1: Tổng quan về CSDL

1.4 Các mô hình dữ liệu


Để thiết kế một cơ sở dữ liệu, bao giờ cũng xuất phát từ các yêu cầu dữ liệu
của bài toán. Thông thường một lược đồ cơ sở dữ liệu được đặc tả bởi một ngôn ngữ
đặc biệt hay một tập các kí hiệu đặc biệt thích hợp để biểu thị một thiết kế cơ sở dữ
liệu. Mô hình dữ liệu là sự hình thức hóa toán học bao gồm:
- Một hệ thống các kí hiệu để mô tả dữ liệu;
- Tập các toán tử dùng để thao tác trên dữ liệu này.
Như vậy, một mô hình dữ liệu có thể coi gồm ba thành phần:
- Phần mô tả cấu trúc cơ sở dữ liệu
- Phần mô tả các thao tác, định nghĩa các phép toán được phép trên dữ liệu
- Phần mô tả các ràng buộc toàn vẹn để bảo đảm sự chính xác của dữ liệu
Đã có rất nhiều mô hình dữ liệu được đề xuât, tuy vậy chúng ta chỉ đề cập tới
một số mô hình sau

1.4.1 Mô hình thực thể - liên hệ


Mô hình thực thể-liên hệ (ERM – Entity Relationship Model) được xây đựng
dựa trên nhận thức về thế giới thực mà chúng ta muốn phản ánh. Đó là một tập các đối
tượng cơ sở và các mối quan hệ giữa chúng. Nó là một trong các mô hình dữ liệu ngữ
nghĩa. Mục đích của mô hình ER là cho phép mô tả một lược đồ logic của một tổ chức
mà không quan tâm đến tính hiệu quả mà hầu hết các mô hình dữ liệu khác mong
muốn. Mô hình ER được Peter Chen đưa ra năm 1976 và sử dụng rộng rãi. Đến năm
1988, ANSI đã chọn nó như mô hình chuẩn cho các hệ thống từ điển tài nguyên thông
tin IRDS.
1.4.1.1 Các khái niệm
1. Thực thể (Entity): Đây là khái niệm cơ sở của quản trị cơ sở dữ liệu nên
không có một định nghĩa hình thức nào cho nó. Ta có thể hiểu một thực thể là một đối
tượng cụ thể hay trừu tượng trong thế giới thực mà nó tồn tại và có thể phân biệt được
đối với các đối tượng khác.
Ví dụ:
- Thực thể là một vật cụ thể: 1 cá nhân, 1 quyển sách, …
- Thực thể là một vật trừu tượng: 1 tổ chức, 1 dự án, 1 môn học, …
Tất cả ví dụ trên cho thấy chúng là các thực thể vì chúng có thể phân biệt được
với nhau. Như vậy ở đây có một khái niệm cơ bản của thực thể là tính “phân biệt
được” rất gần với “nhận dạng đối tượng”. Do đó ERM là mô hình hướng đối tượng.
Thường thì mỗi thực thể đều có một số đặc tính để xác định nó và do đó hai
thực thể được hiểu là tương tự nếu chúng có cùng các đặc tính cơ bản. Một nhóm bao
gồm các thực thể tương tự hình thành một tập các thực thể.
Ví dụ: Tập các sinh viên của học viện là một tập các thực thể vì với mỗi sinh
viên là một thực thể.
Một tập thực thể thường được tham chiếu đến bằng cách dùng tên, cái tên đó
có thể coi là tên chỉ một kiểu thực thể.
Trong thực tế, để xác định các thực thể cần dựa vào hai tiêu chuẩn:

Vũ Bá Anh – Phan Phước Long 11


Chương 1: Tổng quan về CSDL

- Có ích cho quản lí


- Phân biệt được giữa các thực thể với nhau
2. Thuộc tính và khóa: Trong cơ sở dữ liệu, thực thể được mô tả bởi một tập
các đặc tính và được gọi là các thuộc tính.
Ví dụ: Tập các sinh viên của học viện được mô tả bởi: Mã số sinh viên, họ tên,
ngày sinh, lớp, khóa, địa chỉ, … của sinh viên đó. Và như thế ứng với mỗi sinh viên sẽ
có một giá trị cho mỗi thuộc tính của nó.
Trong mô hình ER có nhiều kiểu thuộc tính: Thuộc tính đơn và thuộc tính
phức hợp, thuộc tính đơn trị và thuộc tính đa trị, thuộc tính được lưu trữ và thuộc tính
được suy diễn.
- Thuộc tính đơn: là thuộc tính không phân chia được thành những thành phần
nhỏ hơn.
- Thuộc tính phức hợp: là thuộc tính có thể phân chia thành các thành phần
nhỏ hơn. Ví dụ, thuộc tính họ tên của kiểu thực thể SINHVIEN có thể chia thành họ,
đệm và tên.
- Thuộc tính đơn trị: là thuộc tính có một giá trị duy nhất cho một thực thể cụ
thể.
- Thuộc tính đa trị: là thuộc tính có nhiều giá trị cho một thực thể cụ thể. Ví
dụ, thuộc tính số điện thoại của SINHVIEN là thuộc tính đa trị vì một sinh viên có thể
có nhiều số điện thoại.
- Thuộc tính lưu trữ:
- Thuộc tính được suy diễn: là thuộc tính có thể thu được từ thuộc tính khác.
Ví dụ: thuộc tính tuổi của SINHVIEN là thuộc tính được suy diễn vì thuộc tính này
được rút ra từ thuộc tính ngày sinh.
Trong mô hình ER sử dụng một giá trị đặc biệt NULL để ghi nhận một thuộc
tính của một thực thể cụ thể chưa biết hay không tồn tại.
Một thuộc tính mà giá trị của nó nó xác định duy nhất mỗi thực thể trong tập
thực thể được gọi là thuộc tính Khóa đối với tập các thuộc tính này.
Ví dụ: Tập các thực thể tất cả các sinh viên của Học viện Tài chính có thể sử
dụng thuộc tính mã sinh viên như là một thuộc tính khóa.
Trong một số trường hợp, một số thuộc tính kết hợp với nhau tạo thành khóa.
Do vậy, một tập các thuộc tính như thế sinh ra một thuộc tính phức hợp và đó chính là
thuộc tính khóa cho kiểu thực thể đó. Và cũng có những thực thể có nhiều hơn một
một khóa. Ví như, kiểu thực thể SINHVIEN ngoài thuộc tính khóa là mã sinh viên thì
thuộc tính số CMND cũng là thuộc tính khóa.
3. Liên kết (Quan hệ):
Để nghiên cứu các tập các thực thể, người ta thường xét các mối liên hệ của
chúng. Các quan hệ (Relationship/Association) thể hiện mối liên hệ của hai hay nhiều
thực thể.
Ví dụ: Có thể xác định một quan hệ mà nó kết hợp một sinh viên S với một
lớp C. Quan hệ này đặc tả rằng sinh viên S là một thành viên của lớp C.

Vũ Bá Anh – Phan Phước Long 12


Chương 1: Tổng quan về CSDL

- Một tập các quan hệ là một tập các quan hệ cùng kiểu. Một cách toán học,
tập các quan hệ R là tập các quan hệ ri, trong đó ri thể hiện mối liên hệ của n thực thể
(e1, e2, …, en) với ej trong ri thuộc tập thực thể Ej (1≤ j ≤ n). Vậy nên thấy ngay tập
quan hệ R là tập con của tích Descartes E1× E2× …× En và khi đó n được gọi là cấp
của kiểu liên kết
1.4.1.2 Sơ đồ thực thể - liên kết
Cấu trúc logic tổng thể của một cơ sở dữ liệu có thể được biểu diễn bởi một sơ
đồ ER. Để biểu thị các thành phần của mô hình ER thông qua đồ thị, sơ đồ người ta sử
dụng các kí hiệu sau:

Ví dụ:

Vũ Bá Anh – Phan Phước Long 13


Chương 1: Tổng quan về CSDL

1.4.2 Mô hình quan hệ


1.4.2.1 Các khái niệm
1. Miền(Domain):
Một miền D là tập các giá trị nguyên tố. (Giá trị nguyên tố là giá trị mà không
thể phân chia được trong phạm vi mô hình quan hệ).
Để đặc tả một miền người ta cần chỉ ra một tên miền, một kiểu dữ liệu và
khuôn dạng dữ liệu.
Ví dụ: Miền mã sinh viên (MSV) là tập các dãy kí tự có độ dài 10. Và miền
này thường kí hiệu là Dom(MSV).
Chú ý: Tương ứng với mỗi thuộc tính có một miền, nhưng không nhất thiết
các thuộc tính khác nhau có các miền khác nhau.
2. Quan hệ (Relation):
Một quan hệ r trên tập các thuộc tính U={A1, A2, …, An} nếu r là tập con của
Dom(A1)×Dom(A2)× …× Dom(An), trong đó Dom(Ai) là miền của thuộc tính Ai –
tức là tập các giá trị có thể có của thuộc tính Ai. Khi đó, ta gọi U là sơ đồ quan hệ và
nói quan hệ r xác định trên sơ đồ quan hệ U.
3. Khóa
Cho một quan hệ r xác định trên tập thuộc tính U={A1, A2, …, An}. Một tập
con K ⊆ U được gọi là khóa của quan hệ r nếu với bất kỳ hai bộ t1, t2 ∈ r, t1 ≠ t2, đều

tồn tại thuộc tính A∈ K sao cho t1(A) ≠ t2(A)


1.4.2.2 Biến đổi mô hình ER sang mô hình quan hệ
Cho tới hiện nay chúng ta có rất nhiều công cụ hỗ trợ việc biến đổi từ mô hình
ER sang mô hình quan hệ. Và, nguyên tắc chung để thực hiện điều này là việc biến
đổi các tập thực thể, tập các liên kết thành quan hệ.
- Biến đổi các tập thực thể
Một tập thực thể E được biến đổi thành một quan hệ mà sơ đồ quan hệ của nó
bao gồm tập các thuộc tính của tập các thực thể. Mỗi bộ của quan hệ biểu diễn một
thực thể trong thể hiện hiẹn thời của E.
Nếu E là một tập thực thể mà các thực thể của nó được xác định thông qua
một liên kết với với một tập thực thể khác, giả sử là F, thì sơ đồ quan hệ tương ứng
với E chỉ chứa các thuộc tính khóa của F.
Ví dụ:
- Biến đổi các liên kết
Một liên kết R giữa các tập thực thể E1, E2, …, En được biến đổi thành một
quan hệ mà sơ đồ quan hệ của nó bao gồm các thuộc tính trong khóa của mỗi E1, E2,
…, En. Chú ý rằng, ta có thể đặt lại tên cho phù hợp để hai tập thực thể hay hai thuộc
tính không trùng tên.
Ví dụ:

Vũ Bá Anh – Phan Phước Long 14


Chương 1: Tổng quan về CSDL

1.4.3 Mô hình phân cấp (Hierarchical Model)


Trong thế gới thực, mọi đối tượng và những thông tin về chúng thường mang
tính phân cấp, thứ bậc. Chính vậy đã dẫn đến các khái niệm về mô hình hóa dữ liệu
theo loại cơ sở dữ liệu được gọi là cơ sở dữ liệu phân cấp (Hierarchical DataBase).
Mô hình này được đưa ra vào những năm 1960 với dữ liệu được tổ chức thành cấu
trúc cây. Trong mô hình này, các khái niệm trường, đoạn dữ liệu đã được sử dụng.
Trường được hiểu là đơn vị nhỏ nhất của dữ liệu và mang một tên.
Đoạn (Segment) là tập các trường sắp kế tiếp trong một cơ sở, mang một tên
và là một đơn vị trao đổi giữa cơ sở dữ liệu và các ứng dụng. Mỗi đoạn trong cơ sở dữ
liệu có kích thước cố định.

Để thể hiện liên kết giữa các đoạn, mô hình phân cấp dùng khái niệm quan hệ
cha con. Các đoạn được nối với nhau bằng quan hệ 1:n, tức ứng với một đoạn cha sẽ
trỏ đến n đoạn con. Tập các đoạn nối nhau bởi quan hệ cha con tổ chức dưới dạng
phân cấp gọi là cây các đoạn. Khi đó, cơ sở dữ liệu phân cấp được hiểu là cơ sở dữ
liệu được tạo bởi rừng các đoạn.
Từ đây ta hiểu, mô hình phân cấp có cả rừng các đoạn hay là tập các cây của
các đoạn. Mỗi đoạn cha chứa n đoạn con và đoạn con này lại có thể chứa m đoạn con
khác.

1.4.4 Mô hình mạng


Mô hình cơ sở dữ liệu mạng được trình bày bởi nhóm công tác DBGT của
CODASYL1 vào năm 1971. Sau này vào năm 1978 nó được phát triển dựa trên các
kết quả nghiên cứu. Đã có rất nhiều hệ thống tin học dùng mô hình này như CII,
UNIVAX. Ở mô hình này, các đối tượng được mô hình hóa trong cơ sở dữ liệu theo
ba khái niệm: Ngôn ngữ, dữ liệu gộp và bản ghi.
Mục tin (data item) là đơn vị bé nhất của dữ liệu có một cái tên. Ví như thông
tin của một sinh viên như họ tên, địa chỉ, ...thì dữ liệu bé nhất ở đây là họ, tên, địa chỉ
và dưới họ, tên, địa chỉ không còn dữ liệu nào nữa mang tên riêng.
Dữ liệu gộp (Data aggregate) là tập các mục tin xếp tuần tự trong cơ sở và có
một tên. Nó có hai dạng là vector, hay mang và nhóm lặp. Với ví dụ trên, ta có thể
gộp họ và tên thành dữ liệu gộp có tên là Ho_ten.
Bản ghi (record) là tập các dữ liệu gộp lớn và các mục tin xếp kế tiếp trong cơ
sở dữ liệu, tạo thành đơn vị trao đổi giữa cơ sở dữ liệu và các ứng dụng.

1
CODASYL – Conference On Data Systems Languages – là tổ chức được thành lập bởi bộ quốc phòng
Mỹ. Nó chuyên phát triển các hệ thống quản trị dữ liệu và hệ thống.

Vũ Bá Anh – Phan Phước Long 15


Chương 1: Tổng quan về CSDL

Rõ ràng các đối tượng được mô tả thông qua các bản ghi và qua các mối quan
hệ giữa chúng. Trong mô hình này, chỉ có thể xác định quan hệ qua một bản ghi gọi là
chủ và n bản ghi gọi là bản ghi thành phần. Và, tập(set) là quan hệ giữa một bản ghi
chủ và n bản ghi thành phần. Khi đó, cơ sở dữ liệu mạng (Network DataBase) là cơ sở
dữ liệu gồm các bản ghi được nối với nhau qua các tập.

1.4.5 Mô hình hướng đối tượng


Từ đầu những năm 1980 “vấn đề hướng đối tượng” đã nhắc đến rất nhiều và
đã có nó trở thành xu hướng mới của tin học. Việc phân tích hướng đối tượng trong
cơ sở dữ liệu hay trong một phần mềm đòi hỏi phải trang bị phương pháp phân tích có
đặc thù riêng, nhưng có khả năng như các cách phân tích quen dùng khác. Theo Coad
và Yourdon năm 1990, phân tích hướng đối tượng dựa trên các khái niệm các đối
tượng và thuộc tính, các lớp và các thành viên, cái toàn thể và bộ phận. Từ đó xuất
hiện các ngôn ngữ lập trình đối tượng và hướng đối tượng. Và, các mô hình hướng đối
tượng thì bắt nguồn từ các mạng ngữ nghĩa và các ngôn ngữ lập trình hướng đối
tượng. Trong mô hình này, mỗi thực thể của thế giới thực sẽ biểu diễn bằng một đối
tượng.
Đặc trưng của mô hình dữ liệu hướng đối tượng:
- Đặc tính nhận dạng đối tượng (Object Identity): Mỗi đối tượng được xác
định duy nhất bởi định danh đối tượng. Định danh này được hệ thống sinh ra và quản
lí.
- Các đối tượng phức tạp (Complex Object): Cho phép xây dựng một kiểu mới
từ các kiểu đã có.
- Phân cấp theo kiểu (Type hierarchy): Cho phép có các kiểu con với các đặc
tính riêng của nó.
Trong thực tế thì cơ sở dữ liệu hướng đối tượng có rất nhiều ưu điểm như:
 Cho phép liên kết các đối tượng dưới dạng các phép lưu trữ với các đối
tượng,
 Các đối tượng dùng chung giữa nhiều người sử dụng
 Khả năng phát triển kho trí thức bằng cách thêm các đối tượng mới và các
phép xử lí kèm theo,
 Phát triển hệ quản trị cơ sở dữ liệu dựa trên việc xử lí các đối tượng phức
tạp, giao diện chương trình, đối tượng động và trừu tượng.
 …
Các mô hình hướng đối tượng thì đa dạng, cho phép mô hình hóa các đối
tượng theo sự phát triển của chúng, cho phép sử dụng lại các đối tượng và các thủ tục
thực hiện trên các đối tượng đó, và xây dựng các đối tượng phức tạp.

Vũ Bá Anh – Phan Phước Long 16


Chương 1: Tổng quan về CSDL

Đối tượng (Object) là tập các phần tử của các dữ liệu có cấu trúc, tham chiếu
duy nhất qua tên.
Ví dụ: …………..
Mỗi một đối tượng có các thuộc tính (còn gọi là các thể hiện). một thuộc tính
mang giá trị cho phép xác định đặc tính của đối tượng. Giá trị này có thể là dữ liệu cơ
bản như số nguyên, số thực, kí tự hay dữ liệu phức tạp như một cấu trúc, các giá trị
lặp, và có thể dung con trỏ để trỏ đến đối tượng khác. Vậy, thuộc tính (Attribute) là
tính chất của đối tượng được gán tên, cho phép tương ứng với một giá trị hay một
tham chiếu đến một đối tượng khác.
Trong mô hình đối tượng còn cho phép quản lý cấu trúc của các đối tượng
theo chức năng mà được gọi là phương thức. Phương thức (Method) là thủ tục đặc
trưng bởi tên đầu thủ tục, các tham số gọi và các tham số trả về dùng để áp lên một
đối tượng có tên. Và như thế, một đối tượng được các phương phức xử lí.

Vũ Bá Anh – Phan Phước Long 17


Chương 3:Hệ quản trị CSDL Visual FoxPro

CHƯƠNG II: MÔ HÌNH CƠ SỞ DỮ LIỆU QUAN HỆ

Chương này sẽ giới thiệu cơ sở dữ liệu theo mô hình quan hệ. Thế hệ thứ nhất
của các hệ quản trị cơ sở dữ liệu (gồm mô hình mạng và mô hình phân cấp) là mô
hình truy cập vì sự phụ thuộc của chúng vào hệ điều hành. Thế hệ thứ hai của các hệ
quản trị cơ sở dữ liệu được đánh dấu từ năm 1970. Khi đó, Codd E.F. tại công ty IBM
ở SanJoe, Mỹ đã đề xuất mô hình dữ liệu quan hệ. Từ đó các hệ thống sử dụng mô
hình dữ liệu quan hệ trở nên phổ biến.
Việc nghiên cứu lí thuyết về mô hình dữ liệu quan hệ chủ yếu nhắm vào lí
thuyết chuẩn hóa quan hệ. Và mục đích chính là bỏ đi các phần tử không bình thường
của quan hệ khi thực hiện các phép cập nhật, loại bỏ các dữ liệu dư thừa, hiểu quan hệ
ngữ nghĩa giữa các dữ liệu.

2.1 Tổng quan về mô hình CSDL quan hệ


Từ những năm 1980, mô hình dữ liệu quan hệ được sử dụng rất nhiều trong
các hệ quản trị cơ sở dữ liệu thương mại vì tính đơn giản và vì có cơ sở lí thuyết vững
chắc dựa trên lí thuyết tập hợp.

2.1.1 Các khái niệm cơ bản


Các thông tin trên thực tế thường lưu trữ dưới dạng bảng biểu, mỗi bảng biểu
được thể hiện trên các bảng hai chiều gồm các dòng và các cột. Ví như ta có bảng sau:

Bảng trên thể hiện dữ liệu của tập thực thể là SINHVIEN. Mỗi dòng của bảng
chứa giá trị tương ứng với dữ liệu của một thực thể và có một hoặc nhiều giá trị dùng
để phân biệt giữa các dòng. Trên mỗi cột, các giá trị có cùng một kiểu dữ liệu. Trong
lí thuyết mô hình dữ liệu quan hệ, thuật ngữ quan hệ để chỉ bảng, thuộc tính để chỉ
tên của mỗi cột, miền để chỉ kiểu dữ liệu của một cột, bộ để chỉ một hàng trong bảng.
1. Miền(Domain):
Một miền D là tập các giá trị nguyên tố. (Giá trị nguyên tố là giá trị mà không
thể phân chia được trong phạm vi mô hình quan hệ).
Để đặc tả một miền người ta cần chỉ ra một tên miền, một kiểu dữ liệu và
khuôn dạng dữ liệu.

Vũ Bá Anh – Phan Phước Long 18


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ví dụ: Miền mã sinh viên (MSV) là tập các dãy kí tự có độ dài 10. Và miền
này thường kí hiệu là Dom(MSV).
Chú ý: Tương ứng với mỗi thuộc tính có một miền, nhưng không nhất thiết
các thuộc tính khác nhau có các miền khác nhau.
2. Quan hệ (Relation):
Một quan hệ r trên tập các thuộc tính U={A1, A2, …, An} nếu r là tập con của
Dom(A1)×Dom(A2)× …× Dom(An), trong đó Dom(Ai) là miền của thuộc tính Ai –
tức là tập các giá trị có thể có của thuộc tính Ai. Khi đó, ta gọi U là sơ đồ quan hệ và
nói quan hệ r xác định trên sơ đồ quan hệ U.
3. Bộ dữ liệu, Lược đồ quan hệ
Cho quan hệ r trên U={A1, A2, …, An}. Bộ t của quan hệ r là phần tử thuộc r
và viết t∈r.
Một lược đồ quan hệ R là cặp có thứ tự R=(U, F), trong đó U là tập hữu hạn
các thuộc tính của quan hệ, F là tập các điều kiện giữa các thuộc tính (F còn gọi là tập
các ràng buộc toàn vẹn). Bậc của R là số lượng thuộc tính của lược đồ. Như vậy, lược
đồ quan hệ được sử dụng để mô tả về cấu trúc và các ràng buộc toàn vẹn của một
quan hệ. Khi không quan tâm đến các RBTV thì lược đồ quan hệ được viết
R(A1, A2, …, An)
trong đó, R là quan hệ, A1, A2, …, An là danh sách các thuộc tính.
Một quan hệ (hoặc trạng thái quan hệ) r của lược đồ quan hệ R được ký hiệu là
r(R), là tập hợp các bộ t và gọi là một thể hiện của lược đồ R. Ta sẽ kí hiệu t[X], với
X⊆U, là bộ t chỉ chứa các giá trị của các thuộc tính trong X và kí hiệu t[Ai] để chỉ giá
trị của bộ t tương ứng với thuộc tính Ai của quan hệ r(R).
Các tính chất đặc trưng của một quan hệ
• Thứ tự của các bộ trong một quan hệ
Một quan hệ được xem như một tập hợp các bộ, mà các phần tử trong một tập
hợp thì không có thứ tự. Vì vậy, các bộ không có một thứ tự bắt buộc trong một quan
hệ. Tuy nhiên, trong một tệp, các bộ được lưu trữ một cách vật lý trên đĩa vì vậy luôn
có một thứ tự giữa các bộ. Thứ tự này chỉ rõ bộ thứ nhất, bộ thứ hai, …. Một cách
tương tự, khi ta biểu diễn một quan hệ như là một bảng, các hàng được hiển thị theo
một thứ tự nhất định. Tóm lại, về mặt lí thuyết, thứ tự các bộ không quan trọng.
• Thứ tự của các giá trị bên trong một bộ
Theo định nghĩa quan hệ, dễ thấy, thứ tự thuộc tính trong một lược đồ quan hệ
là quan trọng, từ đó suy ra thứ tự của các giá trị trong một bộ cũng quan trọng. Tuy
nhiên, ở mức logic, thứ tự của các thuộc tính và các giá trị của nó là không thực sự
quan trọng khi giữ được sự tương ứng giữa các thuộc tính và các giá trị.
Có thể đưa ra một định nghĩa khác về quan hệ, định nghĩa này sẽ làm cho thứ
tự của các giá trị trong một bộ là không cần thiết. Theo định nghĩa này, một lược đồ
quan hệ R = {A1, A2,…, An} là một tập hợp các thuộc tính và một quan hệ r(R) là
một tập hợp hữu hạn các hàm r = {t1, t2, …., tm}, trong đó mỗi ti là một hàm từ R vào

Vũ Bá Anh – Phan Phước Long 19


Chương 3:Hệ quản trị CSDL Visual FoxPro

D, trong đó D = Dom(A1)∪Dom(A2) ∪…∪Dom(An). Trong định nghĩa này, t[Ai]


phải ở trong Dom(Ai) với 1<= i <= n với mỗi hàm ti trong r. Mỗi hàm ti được gọi là
một bộ.
Theo định nghĩa này, một bộ có thể xem như một tập hợp các cặp (<thuộc
tính>, <giá trị>), trong đó mỗi cặp cho một giá trị của hàm trên thuộc tính Ai xác
định một giá trị vi của Dom(Ai) . Vì tên thuộc tính xuất hiện cùng với giá trị của nó
nên thứ tự của các thuộc tính là không quan trọng. Điều này làm nên ý nghĩa ở mức
trừu tượng hoặc logic vì chẳng có lý do gì để thích có một giá trị thuộc tính xuất hiện
trước một giá trị thuộc tính khác trong một bộ.
Khi một quan hệ được cài đặt như một tệp, các thuộc tính được sắp xếp một
cách vật lý như là các trường trong một bản ghi. Trong trường hợp đó chúng ta sẽ sử
dụng định nghĩa thứ nhất của quan hệ, trong đó các giá trị của các thuộc tính trong
một bộ là có thứ tự vì nó làm đơn giản rất nhiều khái niệm. Tuy nhiên, định nghĩa thứ
hai là tổng quát hơn.
• Các giá trị trong một bộ
Mỗi giá trị trong một bộ là một giá trị nguyên tố, nghĩa là nó không phân chia
được thành các thành phần trong phạm vi của mô hình quan hệ. Như vậy, trong mô
hình quan hệ không cho phép có các thuộc tính phức hợp và các thuộc tính đa trị. Các
thuộc tính đa trị phải được biểu diễn bằng các quan hệ còn các thuộc tính phức hợp
chỉ được biểu diễn bằng các thuộc tính thành phần đơn của nó.
Giá trị của một số bộ tại một vài thuộc tính nào đó có thể không biết được
hoặc không thích ứng cho nó. Trường hợp đó, người ta sử dụng một giá trị đặc biệt
gọi là giá trị null.Ví dụ, giả sử quan hệ SINHVIEN có thuộc tính TEL (số điện thoại).
Trong một tập thể sinh viên, có người có điện thoại, có người không có và cũng có
người có nhưng không biết chắc. Với những trường hợp không có hoặc không biết
chắc, thuộc tính TEL có giá trị null.
• Một quan hệ có một tên phân biệt với tên các quan hệ khác
• Mỗi thuộc tính trong quan hệ có một tên phân biệt
• Các giá trị của một thuộc tính thuộc cùng một miền
• Các bộ trong quan hệ là phân biệt, tức không có hai bộ nào giống nhau
trong một quan hệ.
Quan hệ được coi như một tập hợp các bộ. Theo định nghĩa, các phần tử của
một tập hợp là khác nhau, vì vậy, mọi bộ trong quan hệ phải khác nhau. Điều đó có
nghĩa là không có hai bộ có cùng một tổ hợp giá trị cho tất cả các thuộc tính của
chúng.
4. Khóa của quan hệ
Một lược đồ quan hệ R trên tập thuộc tính U={A1, A2, …, An} không tồn tại hai
bộ giống nhau hay không có hai bộ có cùng một tổ hợp giá trị cho tất cả các thuộc
tính. Thông thường, có tồn tại các tập con của U có tính chất là không có hai bộ nào ở
trong mọi trạng thái quan hệ r của R có cùng một tổ hợp giá trị cho các thuộc tính của
nó. Giả sử chúng ta ký hiệu một tập con như vậy là SK, khi đó với hai bộ khác nhau
bất kỳ t1 và t2 trong một trạng thái quan hệ r của R chúng ta có ràng buộc là t1[SK] ≠

Vũ Bá Anh – Phan Phước Long 20


Chương 3:Hệ quản trị CSDL Visual FoxPro

t2[SK]. Tập hợp thuộc tính SK như vậy được gọi là một siêu khoá của lược đồ quan hệ
R. Hình thức hóa ta có thể đưa ra định nghĩa:
Một tập con SK ⊆ U được gọi là siêu khóa của lược đồ quan hệ R nếu với mọi

quan hệ r của lược đồ R, và với bất kỳ hai bộ t1, t2 ∈ r, t1 ≠ t2 thì t1[SK] ≠ t2[SK]
Thấy ngay mỗi quan hệ đều có ít nhất một siêu khóa, đó là tập U – tập tất cả
các thuộc tính của quan hệ. Nếu có một siêu khóa SK là tập con thực sự của U thì
SK∪{A}, A∈U\SK, cũng là một siêu khóa. Vậy, một lược đồ quan hệ có thể có nhiều
siêu khóa. Tuy nhiên, trong một lược đồ quan hệ , một siêu khóa mà mọi tập con thực
của nó không là siêu khóa thì được gọi là khóa của lược đồ quan hệ đó. Như vậy,
khóa là một siêu khóa tối tiểu và do đó một lược đồ quan hệ cũng có thể có nhiều
khóa. Các thuộc tính tham gia vào khóa được gọi là thuộc tính khóa, ngược lại được
gọi là thuộc tính không khóa.
Ví dụ: Cho lược đồ quan hệ sau:
SINHVIEN(CMND, MASV, HO, TEN, NGAYSINH, GIOI)
Siêu khóa: (CMND, HO,TEN), (MASV, HO, TEN), …
Khóa: (CMND), (MASV)
Thuộc tính khóa: CNMD, MASV
Thuộc tính không khóa: HO, TEN, NGAYSINH, GIOI
Thực tế, người ta thường lựa một khóa tối tiểu tốt nhất làm khóa chính của
quan hệ, các khóa tối tiểu khác được coi là khóa dự phòng.

2.1.2 Các mối liên hệ 1-1, 1-n, n-n


Các quan hệ thường không cô lập mà liên hệ chặt chẽ với nhau. Khi quan tâm
tới nhiều lược đồ quan hệ thì cần chỉ rõ các mối liên hệ giữa chúng để mô tả càng
chính xác thế giới thực.
1. Mối liên hệ 1-1
Giả sử có hai quan hệ r(R) và s(S). Ta nói rằng có một mối liên hệ 1:1 giữa r
và s nếu mỗi bộ t∈r chỉ tương ứng (liên quan) duy nhất một bộ u∈s và ngược lại. Mối
liên hệ này thường ít có vì luôn thành lập được lược đồ mới bằng cách ghép hai lược
đồ R và S. Tuy nhiên, trong thực tiễn mối liên hệ này vẫn xuất hiện khi tách một quan
hệ (bảng) thành nhiều quan hệ con (bảng con) cho đỡ cồng kềnh.
Ví dụ: Cho hai lược đồ sau:
HOSO_SV(MASV, HO, TEN, NGAYSINH, GIOI)
DIEM_SV(MASV, DM1, DM2, DM3)
Ta thấy, trong quan hệ HOSO_SV và DIEM_SV, ứng với mỗi sinh viên sẽ
xác định duy nhất một mã sinh viên. Khi này tồn tại mối liên hệ 1:1 giữa hai lược đồ
trên. Mối liên hệ đó sẽ được ghi nhận bằng cùng một mã sinh viên ở hai bộ tương ứng
với hai quan hệ.
2. Mối liên hệ một – nhiều

Vũ Bá Anh – Phan Phước Long 21


Chương 3:Hệ quản trị CSDL Visual FoxPro

Giả sử có hai quan hệ r(R) và s(S). Ta nói rằng có một mối liên hệ một – nhiều
giữa r và s nếu mỗi bộ t∈r tương ứng (liên quan) nhiều bộ u∈s và mỗi bộ u∈s chỉ

tương ứng (liên quan) với duy nhất một bộ t∈r. Quan hệ r(R) được gọi là quan hệ chủ
(bảng chủ), s(S) được gọi là quan hệ liên kết.
Ví dụ: Cho hai lược đồ quan hệ sau:
HANG_BAN(NGAY, MAHANG, SLG, DG)
HANG(MAHANG, TENHANG, DVT)
Ta thấy, trong quan hệ HANG ứng với mỗi mã hàng (MAHANG) sẽ xác
định duy nhất một bộ. Ngược lại, trong quan hệ HANG_BAN, mỗi mã hàng
(MAHANG) sẽ tương ứng với nhiều bộ. Khi này tồn tại mối liên hệ một - nhiều giữa
HANG VÀ HANG_BAN.
3. Mối liên hệ nhiều – nhiều
Giả sử có hai quan hệ r(R) và s(S). Ta nói rằng có một mối liên hệ nhiều –
nhiều giữa r và s nếu mỗi bộ t∈r tương ứng (liên quan) nhiều bộ u∈s và ngược lại.
Ví dụ:

2.1.3 Quy tắc vẹn toàn(Integrity Constraint)


Mỗi CSDL luôn có nhiều mối liên hệ giữa các thuộc tính, giữa các bộ và các
liên hệ này xác định các điều kiện mà mọi trạng thái quan hệ phải tuân theo. Mặt
khác, CSDL là biểu diễn một phần của thế giới thực nên thường phụ thuộc vào các
quy tắc, các quy định được áp đặt trên các đối tượng mà nó thể hiện. Các điều kiện,
các quy tắc, quy định trên được gọi là ràng buộc toàn vẹn (RBTV). Trong một cơ sở
dữ liệu, ràng buộc toàn vẹn được xem như là một công cụ để diễn đạt ngữ nghĩa của
CSDL. Việc kiểm tra ràng buộc toàn vẹn thường được tiến hành vào thời điểm cập
nhật dữ liệu (thêm, sửa, xóa). Những ràng buộc toàn vẹn phát sinh cần phải được ghi
nhận và xử lý một cách tường minh (thường là bởi một hàm chuẩn hoặc một đoạn
chương trình).
Các yếu tố của ràng buộc toàn vẹn (RBTV)
Mỗi RBTV có 3 yếu tố: điều kiện, bối cảnh và tầm ảnh hưởng.
• Điều kiện
Điều kiện của một ràng buộc toàn vẹn R có thể được biểu diễn bằng ngôn ngữ
tự nhiên, thuật giải, ngôn ngữ đại số tập hợp, đại số quan hệ,… ngoài ra điều kiện của
ràng buộc toàn vẹn cũng có thể được biểu diễn bằng phụ thuộc hàm.
• Bối cảnh
Bối cảnh của một ràng buộc toàn vẹn là những quan hệ mà ràng buộc đó có
hiệu lực hay nói một cách khác, đó là những quan hệ cần phải được kiểm tra ràng
buộc toàn vẹn. Bối cảnh của một ràng buộc toàn vẹn có thể là một hoặc nhiều quan
hệ.
• Tầm ảnh hưởng

Vũ Bá Anh – Phan Phước Long 22


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong quá trình phân tích thiết kế một CSDL, người phân tích cần lập bảng
tầm ảnh hưởng cho một ràng buộc toàn vẹn nhằm xác định thời điểm cần phải tiến
hành kiểm tra các ràng buộc toàn vẹn đó. Các thời điểm cần phải kiểm tra RBTV
chính là những thời điểm cập nhật dữ liệu (thêm/sửa/ xóa)
Phân loại RBTV
Khi phân tích thiết kế cơ sở dữ liệu, người phân tích phải phát hiện tất cả các
ràng buộc toàn vẹn tiềm ẩn trong CSDL đó. Để tránh bỏ sót, khi xác định các ràng
buộc phải dựa trên bản chất của mô hình, tìm các ràng buộc dựa trên lược đồ và dựa
trên ứng dụng. Khi đó có các loại ràng buộc: ràng buộc miền, ràng buộc khoá, ràng
buộc toàn vẹn thực thể và ràng buộc toàn vẹn tham chiếu.
• Các ràng buộc miền
Ràng buộc miền trên thuộc tính A là mỗi giá trị của thuộc tính A phải thuộc
miền giá trị Dom(A). Các kiểu dữ liệu liên kết với các miền bao gồm: các kiểu dữ liệu
số chuẩn cho các số nguyên (short integer, integer, long integer), các số thực (float,
double precision float). Ngoài ra còn các kiểu dữ liệu ký tự (dãy ký tự với độ dài cố
định, dãy ký tự với độ dài thay đổi), ngày, thời gian và tiền tệ. Các loại miền khác có
thể là các miền con của một kiểu dữ liệu hoặc một kiểu dữ liệu đếm được trong đó
mọi giá trị có thể được liệt kê rõ ràng
• Ràng buộc khoá và ràng buộc trên các giá trị không xác định (null)
Một khoá K xác định rõ một ràng buộc về tính duy nhất, phát biểu rằng không
có hai bộ khác nhau trong một trạng thái r của R có cùng một giá trị cho K. Giá trị của
một thuộc tính khoá có thể được sử dụng để xác định một cách duy nhất mỗi bộ trong
một quan hệ. Ví dụ, giá trị 45150202 của MASV xác định một cách duy nhất bộ giá
trị tương ứng với sinh viên Hoàng Ngọc Lan trong quan hệ SINHVIEN. Chú ý rằng
một tập hợp thuộc tính tạo nên một khoá là một tính chất của lược đồ quan hệ. Điều
ràng buộc là tính chất đó phải thỏa mãn trên mọi trạng thái của lược đồ. Một khoá
được xác định từ ý nghĩa của các thuộc tính và tính chất là bất biến, tính chất đó phải
thỏa mãn khi chúng ta chèn thêm các bộ mới vào quan hệ. Ví dụ, ta không thể và
không được chỉ định cặp thuộc tính (HO, TEN) của quan hệ SINHVIEN là khoá bởi
vì không có gì đảm bảo rằng không tồn tại hai sinh viên có cùng họ tên.
Một ràng buộc khác trên các thuộc tính chỉ rõ khi nào thì cho phép các giá trị
null. Những thuộc tính luôn luôn phải có một giá trị xác định và hợp lệ thì bị ràng
buộc là NOT NULL.
• Cơ sở dữ liệu quan hệ và lược đồ cơ sở dữ liệu quan hệ
Ở trên, chúng ta đã nói đến các lược đồ quan hệ đơn lẻ và các quan hệ đơn lẻ.
Một cơ sở dữ liệu quan hệ thường gồm nhiều quan hệ với các bộ giá trị trong các quan
hệ được liên kết với nhau theo nhiều cách. Trong phần này chúng ta sẽ định nghĩa một
cơ sở dữ liệu quan hệ và một lược đồ cơ sở dữ liệu quan hệ. Một lược đồ cơ sở dữ liệu
quan hệ S là một tập hợp các lược đồ quan hệ
S = {R1, R2,…, Rn} và một tập các ràng buộc toàn vẹn.
Một trạng thái cơ sở dữ liệu quan hệ (hoặc một cơ sở dữ liệu quan hệ) DB của
S là một tập hợp các trạng thái quan hệ:

Vũ Bá Anh – Phan Phước Long 23


Chương 3:Hệ quản trị CSDL Visual FoxPro

DB = {r1, r2, …, rn}


sao cho mỗi ri là một trạng thái của Ri và sao cho các trạng thái quan hệ ri thoả
mãn các ràng buộc toàn vẹn chỉ ra trong tập các ràng buộc toàn vẹn.
Trong một lược đồ cơ sở dữ liệu quan hệ, các thuộc tính biểu diễn cùng một
khái niệm thế giới thực có thể (hoặc không) có cùng tên như nhau trong các quan hệ
khác nhau. Ngược lại, các thuộc tính biểu diễn các khái niệm khác nhau có thể có tên
như nhau trong các quan hệ khác nhau.
Một hệ quản trị cơ sở dữ liệu phải có ngôn ngữ định nghĩa dữ liệu (Data
definition language - DDL) để định nghĩa lược đồ cơ sở dữ liệu quan hệ. Các hệ quản
trị cơ sở dữ liệu hiện nay hầu như sử dụng SQL cho mục đích này.
Các ràng buộc toàn vẹn được chỉ ra trên một lược đồ cơ sở dữ liệu và được
tôn trọng làm thoả mãn trên mỗi trạng thái cơ sở dữ liệu của lược đồ này. Ngoài các
ràng buộc miền và ràng buộc khoá còn có thêm các ràng buộc được xem như một
phần của mô hình quan hệ, đó là ràng buộc toàn vẹn thực thể và ràng buộc toàn vẹn
tham chiếu.
• Toàn vẹn thực thể, toàn vẹn tham chiếu và khoá ngoài
Ràng buộc toàn vẹn thực thể được phát biểu là: khoá chính phải luôn luôn có
giá trị xác định, nghĩa là không được phép có giá trị null. Sở dĩ có điều đó là do giá trị
của khoá chính được sử dụng để xác định các bộ giá trị riêng biệt trong một quan hệ.
Việc có giá trị null cho khoá chính kéo theo việc chúng ta không thể xác định được
một số bộ giá trị. Ví dụ, nếu có hai hay nhiều hơn các bộ giá trị có giá trị null cho
khoá chính thì chúng ta không có khả năng phân biệt chúng.
Các ràng buộc khoá và ràng buộc toàn vẹn thực thể được chỉ ra trên các quan
hệ riêng rẽ. Ràng buộc toàn vẹn tham chiếu được chỉ ra giữa hai quan hệ để duy trì sự
tương ứng giữa các bộ của hai quan hệ. Một cách không hình thức, ràng buộc toàn
vẹn tham chiếu được phát biểu là: một bộ giá trị trong một quan hệ có liên kết đến
một quan hệ khác phải liên kết đến một bộ giá trị tồn tại trong quan hệ đó.
Để định nghĩa toàn vẹn tham chiếu một cách hình thức hơn, trước tiên chúng
ta đưa ra khái niệm khoá ngoài: Một tập hợp các thuộc tính FK trong một lược đồ
quan hệ R1 là một khoá ngoài của R1 tham chiếu đến quan hệ R2 nếu nó thoả mãn hai
điều kiện sau:
- Các thuộc tính trong FK có cùng miền giá trị như các thuộc tính của khoá
chính PK của R2. Các thuộc tính FK được gọi là tham chiếu đến (hoặc là liên hệ đến)
quan hệ R2.
- Một giá trị của FK trong một bộ t1 của trạng thái hiện tại r1(R1) hoặc có mặt
như một giá trị của khoá chính của một bộ t2 nào đấy trong trạng thái hiện tại r2(R2),
hoặc là null. Trong trường hợp này ta có t1[FK] = t2[PK] và ta nói rằng bộ t1 liên hệ
(tham chiếu) đến bộ t2. R1 được gọi là quan hệ tham chiếu và R2 được gọi là quan hệ
bị tham chiếu.
Trong một cơ sở dữ liệu có nhiều quan hệ thường có nhiều ràng buộc toàn vẹn
tham chiếu. Để chỉ ra các ràng buộc này, trước tiên ta phải có một hiểu biết rõ ràng về
ý nghĩa hoặc vai trò của mỗi tập thuộc tính ở trong các lược đồ quan hệ khác nhau của

Vũ Bá Anh – Phan Phước Long 24


Chương 3:Hệ quản trị CSDL Visual FoxPro

cơ sở dữ liệu. Các ràng buộc toàn vẹn quy chiếu thường nảy sinh từ các mối liên kết
giữa các thực thể được biểu diễn bằng các lược đồ quan hệ.
Chú ý rằng một khoá ngoài có thể tham chiếu đến quan hệ của chính nó. Trong
trường hợp đó, khoá ngoài biểu thị một liên kết đệ quy.
Chúng ta có thể biểu diễn các ràng buộc tham chiếu bằng sơ đồ. Để làm điều
đó ta vẽ một cạnh có hướng từ mỗi khoá ngoài đến quan hệ mà nó tham chiếu đến.
Ngoài các ràng buộc toàn vẹn ở trên, cơ sở dữ liệu còn phải thoả mãn một số
ràng buộc khác, như ràng buộc trạng thái, ràng buộc chuyển tiếp… Các ràng buộc
trạng thái xác định các ràng buộc mà một trạng thái vững chắc của cơ sở dữ liệu phải
thoả mãn. Ví dụ về các ràng buộc đó là: “ điểm cao nhất mà một sinh viên có thể đạt
được tại một môn là 10”. Các ràng buộc như vậy có thể được đặc tả và bắt tuân theo
bằng cách sử dụng một ngôn ngữ đặc tả ràng buộc. Người ta có thể sử dụng các cơ
cấu như là trigger hoặc assertion. Các ràng buộc chuyển tiếp có thể được định nghĩa
để làm việc với những thay đổi trạng thái trong cơ sở dữ liệu. Ví dụ về ràng buộc này
là: “học phí của một sinh viên chỉ có thể tăng”. Các ràng buộc như vậy thường được
định nghĩa bằng cách sử dụng các quy tắc hoặc bằng các trigger.

2.1.4 Các phép toán trên mô hình dữ liệu quan hệ


Trong mục này sẽ thảo luận về các phép toán của mô hình quan hệ. Các phép
toán của mô hình quan hệ có thể phân thành hai loại: các phép toán cập nhật và các
phép toán đại số quan hệ. Các phép toán cập nhật được sử dụng để tạo ra một quan hệ
đúng đắn. Các phép toán đại số quan hệ được sử dụng để đặc tả các phép lấy thông tin
ra (sẽ được bàn chi tiết trong mục 2.3.1).
Các phép toán cập nhật gồm ba phép toán cơ bản là chèn, xoá và sửa đổi. Phép
chèn được dùng để chèn một bộ giá trị hoặc nhiều bộ giá trị vào một quan hệ. Phép
xoá dùng để loại bỏ các bộ giá trị và phép sửa đổi dùng để sửa đổi các giá trị của một
số thuộc tính trong các bộ giá trị đã có. Mỗi khi các phép toán cập nhật được áp dụng,
các ràng buộc trên lược đồ cơ sở dữ liệu có thể bị vi phạm. Trong phần này chúng ta
sẽ nói đến khả năng vi phạm các ràng buộc của từng phép toán và các kiểu hành động
có thể thực hiện khi một ràng buộc bị vi phạm.
1. Phép chèn (Insert)
Phép chèn cung cấp một danh sách các giá trị cho một bộ mới t được chèn vào
trong một quan hệ R. Phép chèn có thể vi phạm các kiểu ràng buộc được mô tả ở trên.
Các ràng buộc miền có thể bị vi phạm nếu một giá trị thuộc tính được cho không
thuộc vào miền tương ứng. Các ràng buộc khoá có thể bị vi phạm nếu một giá trị khoá
trong bộ mới t đã tồn tại trong một bộ khác ở trong quan hệ r(R). Sự toàn vẹn thực thể
có thể bị vi phạm nếu khoá chính của bộ mới t là null. Sự toàn vẹn tham chiếu có thể
bị vi phạm nếu một giá trị của một khoá ngoài trong t tham chiếu đến một bộ không
tồn tại trong một quan hệ được tham chiếu. Ví dụ cho lược đồ quan hệ
SINHVIEN(MASV, HO,TEN NGAYSINH, GIOI) với quan hệ
SINHVIEN MASV HO TEN NGAYSINH GIOI
444101268 Lê Minh 15/10/1988 Nam

Vũ Bá Anh – Phan Phước Long 25


Chương 3:Hệ quản trị CSDL Visual FoxPro

444102156 Phan Thị Hoa 21/12/1988 Nữ


…. …. …. …. …
Chèn bộ giá trị <null, ‘Vũ’, ‘Hải’, ‘15/07/81’, ‘Nam’> vào quan hệ
SINHVIEN. Phép chèn này vi phạm ràng buộc toàn vẹn thực thể (giá trị null cho
khoá chính). Phép chèn bị loại bỏ.
Chèn bộ giá trị <‘444101268’,‘Cao Nhạc’,‘Phi’,‘21/09/88’, ‘Nam’> vào quan
hệ SINHVIEN. Phép chèn này vi phạm ràng buộc khoá, bới vì giá trị ‘444101268’ đã
có ở trong bảng. Phép chèn bị loại bỏ.
Chèn bộ giá trị <‘444109879’, ‘Vũ Thị Thanh’, ‘Bình’, ‘13/08/89’, ‘Nam’>
vào quan hệ SINHVIEN. Phép chèn thoả mãn tất cả các ràng buộc, vì thế nó được
chấp nhận.
Nếu một phép chèn vi phạm một hoặc nhiều ràng buộc, tuỳ chọn mặc định là
loại bỏ phép chèn. Trong trường hợp này, thường là các hệ quản trị cơ sở dữ liệu có
thể thông báo cho người sử dụng nguyên nhân của việc loại bỏ phép chèn.
2. Phép xoá (Delete)
Phép xoá được sử dụng để xoá một hoặc nhiều bộ giá trị của một quan hệ.
Phép xoá chỉ có thể vi phạm ràng buộc tham chiếu trong trường hợp bộ bị xoá được
tham chiếu bởi một khoá ngoài từ các bộ khác trong cơ sở dữ liệu. Để chỉ rõ một phép
xoá, cần phải đưa ra một điều kiện trên các thuộc tính của quan hệ để chọn các bộ sẽ
bị xoá. Ví dụ: Cho lược đồ cơ sở dữ liệu sau:
SINHVIEN(MASV,HO,TEN NGAYSINH, GIOI, MA_TINH)
TINH(MA_TINH, TEN_TINH)
Xoá một bộ giá trị của quan hệ SINHVIEN có MASV=‘444101268’ và
MA_TINH = ‘10’. Phép xoá này được chấp nhận.
Xoá bộ giá trị của TINH có MA_TINH = ‘10’. Phép xoá này không chấp nhận
được bởi vì có các bộ trong SINHVIEN tham chiếu đến bộ này, như vậy là vi phạm
ràng buộc toàn vẹn tham chiếu.
Có ba tuỳ chọn sau thường được sử dụng nếu một phép xoá gây ra sự vi phạm
RBTV. Tuỳ chọn thứ nhất là loại bỏ phép xoá. Tuỳ chọn thứ hai là cố gắng lan truyền
phép xoá (cascade the deletion) bằng cách xoá đồng thời các bộ tham chiếu đến bộ bị
xoá. Tuỳ chọn thứ ba là sửa đổi các giá trị của các thuộc tính tham chiếu gây ra sự vi
phạm. Mỗi giá trị như vậy hoặc là làm cho bằng null hoặc được thay đổi thành bộ có
hiệu lực tham chiếu khác. Chú ý rằng, nếu một thuộc tính tham chiếu gây ra sự vi
phạm là một phần của khoá chính thì không thể làm cho thành null, bởi vì nếu làm
vậy thì sẽ vi phạm ràng buộc toàn vẹn thực thể. Có thể kết hợp cả ba tuỳ chọn ở trên.
3. Phép sửa đổi (Update)
Phép toán sửa đổi được dùng để thay đổi các giá trị của một hoặc nhiều thuộc
tính trong một (hoặc nhiều) bộ của một quan hệ R nào đấy. Để lựa chọn các bộ cần
được thay đổi, người sử dụng phải chỉ ra một điều kiện trên các thuộc tính. Ví dụ:
Sửa đổi Ngày sinh của SINHVIEN có MASV = ‘444102156’ thành
‘20/10/1989’. Phép sửa đổi này được chấp nhận.

Vũ Bá Anh – Phan Phước Long 26


Chương 3:Hệ quản trị CSDL Visual FoxPro

Sửa đổi MASV của bộ SINHVIEN có MASV = ‘444102156’ thành


‘444101268’. Phép sửa đổi này vi phạm ràng buộc toàn vẹn thực thể và toàn vẹn tham
chiếu.
Việc sửa đổi một thuộc tính không phải là một khoá chính hoặc một khoá
ngoài thường không gây ra các vi phạm ràng buộc, hệ quản trị cơ sở dữ liệu chỉ cần
kiểm tra để khẳng định rằng giá trị mới là thuộc miền và kiểu giá trị đúng đắn. Việc
sửa đổi giá trị một khoá chính tương tự như việc xoá một bộ và chèn bộ khác vào chỗ
của nó. Như vậy chúng ta trở về trường hợp đã thảo luận với phép chèn và phép xoá.
Nếu một thuộc tính khoá ngoài bị sửa đổi thì hệ quản trị cơ sở dữ liệu phải đảm bảo
rằng giá trị mới tham chiếu đến một bộ có tồn tại trong quan hệ được tham chiếu
(hoặc là null).

2.2 Tổ chức dữ liệu vật lý

2.2.1 Mô hình tổ chức bộ nhớ ngoài


Bộ nhớ ngoài hay còn gọi là bộ nhớ thứ cấp (secondary storage) có thể là băng
từ, đĩa từ, trống từ, … được sử dụng để lưu trữ cơ sở dữ liệu. Trong phần này sẽ giới
thiệu cách tổ chức, lưu trữ cơ sở dữ liệu trên đĩa từ.
Đĩa từ được phân chia thành các khối Vật lí (physical block) có kích cỡ như
nhau. Mỗi khối có kích thước khoảng 512 Bytes đến 4096 Bytes và được đánh địa chỉ
khối. Đây chính là địa chỉ tuyệt đối trên đĩa.
Trên bộ nhớ thứ cấp, cơ sở dữ liệu được lưu trữ trong một hay nhiều tệp dữ
liệu. Mỗi tệp dữ liệu bao gồm một hay nhiều khối, mỗi khối chứa một hay nhiều bản
ghi. Các thao tác với cơ sở dữ liệu thông qua tên các tệp mà thực chất là thông qua địa
chỉ tuyệt đối của các khối.
Mỗi bản ghi có thể được cấp nhiều Byte và địa chỉ của Byte đầu tiên của bản
ghi được gọi là địa chỉ của bản ghi đó. Địa chỉ này thường được lưu ở một tệp hoặc
một vị trí nào đó để khi cần truy cập dữ liệu sẽ dùng tới. Chỉ dẫn đó được gọi là con
trỏ (pointer).
Hiện nay có rất nhiều cách tổ chức dữ liệu, tuy vậy trong giáo trình này chỉ đề
cập tới một vài dạng phổ biến trong các hệ quản trị cơ sở dữ liệu.

2.2.2 Tệp băm (Hash Files)


Trước khi trình bày khái niệm tệp băm, chúng ta cần nhắc lại về hàm băm. Hàm
băm được đề xuất và hiện thực trên máy tính từ những năm 50 của thế kỷ 20. Nó dựa
trên tư tưởng: biến đổi giá trị khóa thành một số (xử lý băm) và sử dụng số này để
đánh chỉ cho bảng dữ liệu.

Vũ Bá Anh – Phan Phước Long 27


Chương 3:Hệ quản trị CSDL Visual FoxPro

Khóa K có thể là dạng số hay số dạng chuỗi. Giả sử có 2 khóa phân biệt ki và kj
nếu h(ki)=h(kj) thì hàm băm bị đụng độ. Và một hàm băm tốt phải thỏa mãn các điều
kiện sau:
 Tính toán nhanh.
 Các khoá được phân bố đều trong bảng.
 Ít xảy ra đụng độ.
 Xử lý được các loại khóa có kiểu dữ liệu khác nhau
Hàm băm có thể là hàm băm sử dụng phương pháp chia, hàm băm sử dụng
phương pháp nhân và hàm băm phổ quát (universal hashing).

Hàm Băm sử dụng Phương pháp chia


Dùng số dư: h(k) = k mod m
k là khoá, m là kích thước của bảng.
Như vậy h(k) sẽ nhận: 0,1,2,…,m-1.
Việc chọn m sẽ ảnh hưởng đến h(k).
Nếu chọn m=2p thì giá trị của h(k) sẽ là p bit cuối cùng của k trong biểu diễn
nhị phân.
Nếu chọn m=10p thì giá trị của h(k) sẽ là p chữ số cuối cùng trong biểu diễn
thập phân của k.
Trong các ví dụ trên giá trị h(k) không phụ thuộc đầy đủ vào khóa k mà chỉ
phụ thuộc vào p bít (p chữ số) cuối cùng trong khóa k. Tốt nhất ta nên chọn m sao cho h(k)
phụ thuộc đầy đủ và khóa k. Thông thường chọn m là số nguyên tố.

Hàm Băm sử dụng Phương pháp nhân


h(k) = m*(k*A mod 1) 
k là khóa, m là kích thước bảng, A là hằng số: 0 < A < 1
Chọn m và A
Theo Knuth thì chọn A bằng giá trị sau:
A=( 5 -1)/2=0.6180339887…
m thường chọn m = 2p
VD: k=123456; m=10000
H(k)= 10000 (123456* 0.6180339887 mod 1) 
H(k)= 10000 (76300.0041089472 mod 1) 
H(k)= 10000 (0.0041089472) 
H(k)=41

Phép băm phổ quát (unisersal hashing)


Việc chọn hàm băm không tốt có thể dẫn đến xác suất đụng độ cao.
Giải pháp:
- Lựa chọn hàm băm h ngẫu nhiên.
- Khởi tạo một tập các hàm băm H phổ quát và từ đó h được chọn ngẫu nhiên.
Cho H là một tập hợp hữu hạn các hàm băm: ánh xạ các khóa k từ tập khóa U
vào miền giá trị {0,1,2,…, m-1}. Tập H là phổ quát nếu với mọi ∀ f ∈ H và 2 khoá phân biệt
k1,k2 ta có xác suất: Pr{f(k1) = f(k2)} <= 1/m

Vũ Bá Anh – Phan Phước Long 28


Chương 3:Hệ quản trị CSDL Visual FoxPro

Với tổ chức tệp băm, tệp dữ liệu được chia thành các cụm (buckets). Mỗi cụm
bao gồm một hoặc nhiều khối, mỗi khối chứa cố định các bản ghi. Trong tệp băm các
bản ghi không được viết tuần tự trong tệp. Do vậy, cần có một hàm băm h lấy đối số
là giá trị khóa của tệp và tính toán địa chỉ của cụm chứa bản ghi.
Giả sử ta “băm” tệp dữ liệu thành M cụm và xác định hàm băm h(K) = K mod
M. Khi đó địa chỉ băm được đánh số từ 0 đến M-1. Ở đầu mỗi khối đều chứa con trỏ
tới khối kế tiếp trong cụm và khối cuối cùng trong cụm chứa con trỏ rỗng (NULL).
Có một bảng chỉ dẫn cụm chứa M con trỏ, mỗi con trỏ chứa một cụm và là địa chỉ của
khối đầu tiên trong cụm.
Ví dụ hình sau là một tổ chức tệp băm gồm 4 cụm. Cụm 0 không chứa khối
nào. Cụm 1 chứa hai khối B1, B2. Khối B1 chứa hai bản ghi có khóa K1 và K5 và
một con trỏ trỏ tới khối B2, khối B2 chứa một bản ghi có khóa K9 và một con trỏ
rỗng. Và tương tự đối với các cụm 2 và cụm 3.

Nếu bảng chỉ dẫn cụm có kích thước nhỏ thì có thể được lưu ở bộ nhớ trong.
Trong trường hợp ngược lại, phải lưu ở thiết bị nhớ ngoài. Khi đó, nếu một giá trị
băm được tính thì các khối của cụm có địa chỉ tương ứng sẽ được gọi vào bộ nhớ
trong.
Các thao tác trên tổ chức tệp băm
 Tìm kiếm một bản ghi
Giả sử cần tìm một bản ghi nào đó có giá trị khóa là K. Đầu tiên tính hàm băm
h(K). Hàm băm này sẽ xác định địa chỉ cụm i trong khoảng từ 0 đến M-1 ứng với
các khối có thể chứa bản ghi này. Tại bảng chỉ dẫn cụm cho biết con trỏ trỏ tới khối
đầu tiên (nếu có). Ta sẽ duyệt từng khối cho đến khi tìm được bản ghi mong muốn
hoặc sẽ không tìm thấy bản ghi đó.
 Thêm một bản ghi
Giả sử cần thêm một bản ghi có giá trị khóa là K vào tệp, thủ tục được tiến
hành qua các bước:
- Tìm xem trong tệp đã có bản ghi nào có giá trị khóa là K không? Nếu
trong tệp đã có một bản ghi có giá trị khóa là K thì việc thêm bản ghi mới
không hợp lệ (vì khóa là duy nhất).
- Nếu không có bản ghi nào có giá trị khóa là K thì thêm bản ghi này vào
khối đầu tiên trong cụm (có địa chỉ h(K)) còn chỗ trống. Nếu không có
khối nào trong cụm còn chỗ trống thì tạo thêm khối mới và để con trỏ

Vũ Bá Anh – Phan Phước Long 29


Chương 3:Hệ quản trị CSDL Visual FoxPro

NULL của khối cuối cùng trỏ vào khối này. Theo đó bản ghi mới sẽ được
thêm vào vị trí đầu của khối này.
 Xóa một bản ghi
Giả sử cần xóa một bản ghi có giá trị khóa là K. Đầu tiên, tìm xem trong tệp
có bản ghi nào có giá trị khóa là K không? Nếu bản ghi tìm thấy nằm trong khối chứa
nhiều bản ghi khác thì bản ghi đó sẽ bị loại bỏ. Nếu bản ghi đó là duy nhất trong khối
thì sẽ loại bỏ cả khối đó trong cụm.
 Sửa đổi một bản ghi
Giả sử cần sửa đổi các giá trị của một hay nhiều trường của một bản ghi có giá
trị khóa là K. Có hai trường hợp sau:
- Trường cần sửa đổi có tham gia vào khóa. Khi đó, ta xóa bản ghi đó và
thêm bản ghi mới cho tệp theo các quy tắc trên.
- Trường cần sửa đổi không tham gia vào khóa. Đầu tiên sử dụng thủ tục tìm
bản ghi đó và tiến hành sửa đổi nếu tìm thấy.
Ví dụ: Cho quan hệ DS_LOP(stt, hoten, ngaysinh, quequan) được lưu trữ bởi
một tệp dữ liệu bao gồm một tập các bản ghi có cùng khuân dạng và có độ dài cố
định. Mỗi bản ghi gồm các trường:
• Stt: là trường khóa, có kiểu số nguyên và chiếm 2 Bytes.
• Hoten: là trường có kiểu kí tự và chiếm 30 Bytes.
• Ngaysinh: là trường có kiểu kí tự và chiếm 8 Bytes
• Quequan: là trường có kiểu kí tự và chiếm 80 Bytes
Để đơn giản ta giả sử các khối có kích thước là 256 Bytes. Nếu ta lưu trữ các
bản ghi của dữ liệu DS_LOP theo tổ chức tệp băm thì mỗi một khối cần có một con
trỏ 4 Bytes để móc nối tới khối khác. Do vậy mỗi khối có khả năng chứa được 2 bản
ghi của tệp này.
Giả sử tệp DS_LOP có 10 bản ghi và để tiết kiệm không gian chúng ta chỉ thể
hiện các giá trị của trường khóa cho mỗi bản ghi. Và tổ chức tệp băm với 4 cụm với
hàm băm h(K)= K mod 4. Khi đó tệp dữ liệu DS_LOP được thể hiện

Ta chỉ minh họa hai thao tác chính là thêm và xóa trong bốn thao tác trên. Vì
thao tác tìm kiếm luôn được thực hiện đầu tiên trong các thao tác này, còn thao tác
sửa đổi có thể quy về thực hiện một thao tác xóa và một thao tác thêm.
Giả sử cần thêm một bản ghi có giá trị khóa là 25. Đầu tiên chúng ta thực hiện
thủ tục tìm kiếm bản ghi có giá trị khóa là 25. Để tìm bản ghi này, ta tính hàm băm
h(25)= 25 mod 4 =1 và do đó địa chỉ cụm là 1. Tiếp đến chúng ta duyệt từng khối của

Vũ Bá Anh – Phan Phước Long 30


Chương 3:Hệ quản trị CSDL Visual FoxPro

cụm này và không tìm thấy bản ghi nào có giá trị khóa là 25. Như vậy, bản ghi này
chưa có trong tệp dữ liệu và chúng ta thêm nó vào khối đầu tiên trong cụm còn chỗ
trống. Tác động của thao tác này được thể hiện

Bây giờ cần xóa một bản ghi có giá trị khóa là 14. Trước tiên chúng ta thực
hiện thủ tục tìm kiếm bản ghi có giá trị khóa là 14. Để tìm bản ghi này, ta tính hàm
băm h(14)= 14 mod 4 =2 và do đó địa chỉ cụm là 2. Tiếp đến chúng ta duyệt từng khối
của cụm này và tìm thấy bản ghi có giá trị khóa là 14 nằm tại khối đầu tiên của cụm.
Trong khối này có chứa các bản ghi khác nên bản ghi này bị loại bỏ. Tác động của
thao tác này được thể hiện

2.2.3 Tệp chỉ số (Index Files)


Trong cơ sở dữ liệu, các tệp dữ liệu thường được truy cập dựa vào một hay
nhiều chỉ mục. Một chỉ mục (hay chỉ dẫn) của một tệp có ý nghĩa như một danh mục
giúp tra cứu sách trong thư viện. Muốn tìm một cuốn sách khi biết tên tác giả thì
chúng ta sẽ tìm thông qua danh mục tác giả. Để không phải duyệt toàn bộ các bản ghi
trong danh mục nên các danh mục đều được sắp xếp theo trình tự tăng (hay giảm) dần
của khóa. Như vậy, kiểu tổ chức tệp dữ liệu truy cập khóa thông qua các chỉ mục
được gọi là tệp chỉ dẫn. Để dễ dàng trong trình bày, giả thiết rằng tệp dữ liệu chính
luôn được sắp xếp theo khóa (không làm mất tính tổng quát, giả sử sắp xếp theo trình
tự tăng dần).
Để trợ giúp cho tệp dữ liệu chính, cần phải tạo một tệp chỉ dẫn theo khóa được
chọn. Tệp chỉ dẫn bao gồm các cặp (k, d) với k là giá trị của khóa, d là địa chỉ của
khối (hay con trỏ khối). Các cặp này được sắp xếp theo giá trị của khóa.

Vũ Bá Anh – Phan Phước Long 31


Chương 3:Hệ quản trị CSDL Visual FoxPro

Mỗi khối trong tệp dữ liệu chính chứa cố định một lượng bản ghi và được đại
diện bởi một cặp (k, d). Trong đó, k là giá trị khóa của bản ghi đầu tiên trong khối và
d là địa chỉ của khối hay con trỏ khối.
Ví dụ với khối chứa được m bản ghi như hình dưới và thường thỏa mãn
K1<K1,2< … < K1,m

Khi đó, khối này được đại diện bởi cặp (K1, d1)
Với cách tổ chức trên, tệp chỉ dẫn bao gồm n bản ghi tương ứng với n cặp (k,
d) với k là giá trị khóa của bản ghi đầu tiên trong khối và d là địa chỉ của khối hay con
trỏ khối. Do vậy ta thấy tệp chỉ dẫn nhỏ hơn nhiều tệp dữ liệu chính và được sắp xếp
theo thứ tự tăng dần. Vì mỗi khối trong tệp dữ liệu chính tương ứng với một bản ghi
trong tệp chỉ dẫn. Như thế, một giá trị khóa của một bản ghi bất kỳ nào đó trong tệp
dữ liệu chính có thể không xuất hiện trong tệp chỉ dẫn. Khi cần tìm kiếm một bản ghi
trong tệp dữ liệu chính theo giá trị khóa, dựa vào tệp chỉ dẫn, chúng ta xác định vị trí
của khối (có thể) chứa bản ghi cần tìm. Giả sử, chúng ta cần tìm bản ghi có giá trị
khóa là K1 trong tệp dữ liệu chính. Dựa vào tệp chỉ dẫn, chúng ta sẽ xác định được
bản ghi (K2, d) với d là địa chỉ của khối có thể chứa bản ghi cần tìm. Dễ dàng thấy bản
ghi (K2, d) thỏa mãn K2 – là giá trị lớn nhất không vượt quá K1 và nói rằng K2 phủ
K1. Để tìm bản ghi (K2, d) trên trong tệp chỉ dẫn chúng ta có hai chiến lược tìm kiếm:
tìm kiếm tuần tự và tìm kiếm nhị phân.
Tìm kiếm trên tệp chỉ dẫn
Phương pháp tìm kiếm tuần tự: Duyệt tệp chỉ dẫn từ bản ghi đầu tiên, tìm
kiếm tại mỗi bản ghi cho tới khi tìm thấy một bản ghi có giá trị khóa K2 sao cho K2
phủ K1. Phương pháp này hoạt động khá chậm trên các tệp chỉ dẫn nên không được ưa
chuộng.
Phương pháp tìm kiếm nhị phân: Do tệp chỉ dẫn luôn được sắp xếp nên tìm
kiếm nhị phân rất hiệu quả. Giả sử tệp chỉ dẫn có n bản ghi (pK1, d1), (pK2, d2), …,
(pKn, dn). Ta so sánh K1 với giá trị khóa K2=pK[n/2]. Nếu K1 <K2 thì bản ghi cần tìm
nằm trong các bản ghi (pK1, d1), (pK2, d2), …, (pK[n/2]-1, d[n/2]-1). Ngược lại thì bản ghi
cần tìm nằm trong các bản ghi (pK[n/2], d[n/2]), …,(pKn, dn). Quá trình trên được lặp
cho đến khi còn một bản ghi và bản ghi đó là bản ghi cần tìm.

Vũ Bá Anh – Phan Phước Long 32


Chương 3:Hệ quản trị CSDL Visual FoxPro

Thực tế, trong tệp chỉ dẫn cho phép nhiều bản ghi được xếp vào trong một
khối. Khi đó, ta lấy giá trị khóa bản ghi đầu tiên của khối ở giữa để so sánh với K1.
Thực hiện như trên cho đến khi còn một khối thì dùng phương pháp tuần tự để tìm.
Các thao tác trên tổ chức tệp chỉ dẫn
 Tìm kiếm một bản ghi
Giả sử cần tìm một bản ghi nào đó có giá trị khóa là K1. Đầu tiên, dựa vào tệp
chỉ dẫn, tìm bản ghi (K2, d) sao cho K2 phủ K1. Tại tệp dữ liệu chính, tìm bản ghi có
khóa là K1 trong khối có địa chỉ là d. Trong khối có địa chỉ d, chúng ta có thể sử dụng
phương pháp tìm kiếm tuần tự hay nhị phân để tìm bản ghi thỏa mãn. Nếu không có
bản ghi nào trong khối thỏa mãn thì bản ghi cần tìm kiếm không tồn tại.
 Thêm một bản ghi
Giả sử cần thêm một bản ghi có giá trị khóa là K1. Dùng thủ tục tìm kiếm trên,
xác định được bản ghi (K2, d) trong tệp chỉ dẫn thỏa mãn K2 phủ K1. Trong tệp dữ liệu
chính, khối có địa chỉ là d có thể chứa bản ghi cần thêm và nếu tìm kiếm thấy bản ghi
này thì việc thêm bản ghi mới không hợp lệ. Trong trường hợp ngược lại, bản ghi này
sẽ được thêm vào tệp dữ liệu chính như sau:
- Nếu trong khối có địa chỉ d còn trống thì thêm bản ghi này vào khối đó
đúng theo thứ tự sắp xếp của khóa. Chú ý rằng nếu bản này được thêm ở
đầu khối thì trong tệp chỉ dẫn, bản ghi (K2, d) được sửa thành (K1, d).
- Nếu trong khối có địa chỉ d không còn trống. Khi đó, nếu bản ghi có giá trị
khóa lớn nhất trong khối d (kể cả bản ghi sẽ thêm) sẽ chuyển sang làm bản
ghi đầu tiên của khối d +1 (nếu không có thì thành lập khối mới). Việc
thêm này kéo theo phải sửa các khóa tương ứng với các khối d, d +1, …
trong tệp chỉ dẫn cho phù hợp.
 Xóa một bản ghi
Quá trình được thực hiện giống như thêm bản ghi. Nếu khi xóa một bản ghi
mà tạo nên một khối rỗng thì đồng thời xóa luôn khối này.
 Sửa đổi một bản ghi
Để sửa một bản ghi nào đó, đầu tiên dùng thủ tục tìm kiếm bản ghi và định vị
vào bản ghi đó.
- Nếu các trường cần sửa không tham gia vào khóa thì việc sử dổi được tiến
hành bình thường, giá trị bản ghi sau khi được sửa sẽ ghi vào vị trí cũ.
- Nếu các trường cần sửa tham gia vào khóa thì quá trình sửa được coi là
quá trình xóa và thêm một bản ghi.
Chú ý: Tệp dữ liệu chính không nhất thiết phải được sắp xếp. Thấy ngay điều này nếu
tệp chỉ dẫn gồm các bản ghi (k, d) thỏa mãn:
- Tương ứng với mỗi bản ghi của tệp dữ liệu chính là một bản ghi của tệp chỉ
dẫn;
- Bản ghi (k, d) với k là giá trị khóa, d là địa chỉ của bản ghi trong tệp dữ liệu
chính.
Ví dụ: Chúng ta sẽ lưu trữ tệp DS_LOP trong ví dụ ở trên gồm10 bản ghi, mỗi
bản ghi chiếm 120 Bytes theo tổ chức tệp chỉ dẫn. Để đơn giản ta giả sử các khối có

Vũ Bá Anh – Phan Phước Long 33


Chương 3:Hệ quản trị CSDL Visual FoxPro

kích thước là 256 Bytes. Nếu ta lưu trữ các bản ghi của dữ liệu DS_LOP theo tổ chức
tệp chỉ dẫn thì mỗi một khối cần có một con trỏ 4 Bytes để móc nối tới khối khác. Do
vậy mỗi khối có khả năng chứa được 2 bản ghi của tệp này. Để tiết kiệm không gian
chúng ta chỉ thể hiện các giá trị của trường khóa cho mỗi bản ghi. Và tổ chức chỉ dẫn
đối với tệp dữ liệu DS_LOP được thể hiện

Ta chỉ minh họa hai thao tác chính là thêm và xóa trong bốn thao tác trên. Vì
thao tác tìm kiếm luôn được thực hiện đầu tiên trong các thao tác này, còn thao tác
sửa đổi có thể quy về thực hiện một thao tác xóa và một thao tác thêm.
Giả sử cần thêm một bản ghi có giá trị khóa là 29 vào tệp dữ liệu trên. Đầu
tiên, dùng thủ tục tìm kiếm ta xác định bản ghi (14, 5) trong tệp chỉ dẫn có khóa phủ
khóa của bản ghi cần thêm. Theo con trỏ chỉ dẫn, chúng ta đi tới khối có thể chứa bản
ghi cần thêm. Tìm kiếm trong khối này, chúng ta không thấy bản ghi nào có giá trị
khóa là 29. Do khối này đã hết chỗ để thêm nên bản ghi có giá trị khóa lớn nhất sẽ
chuyển sang làm bản ghi của khối tiếp theo. Thêm bản ghi có giá trị khóa là 29 vào
khối 5 theo thứ tự sắp xếp của khóa, sửa lại bản ghi chỉ dẫn (78,6) thành (42,6). Tác
động của thao tác này có dạng

Tiếp theo, giả sử cần cần xóa bản ghi có giá trị khóa là 14. Bước đầu dùng thủ
tục tìm kiếm ta xác định bản ghi (14, 5) trong tệp chỉ dẫn có khóa phủ khóa của bản
ghi cần xóa. Theo con trỏ chỉ dẫn, chúng ta đi tới khối 5 có thể chứa bản ghi cần xóa.
Tìm kiếm trong khối này, chúng ta xác định được bản ghi có giá trị khóa là 14 nằm ở
đầu khối và khối này còn chứa bản ghi khác. Do vậy, xóa bản ghi này và điều chỉnh
bản ghi chỉ dẫn (14, 50 thành (29, 5). Tác động của thao tác này có dạng

Vũ Bá Anh – Phan Phước Long 34


Chương 3:Hệ quản trị CSDL Visual FoxPro

2.2.4 B-cây (Balanced Tree)


Hiện nay, có rất nhiều hệ quản trị cơ sở dữ liệu dùng cấu trúc dữ liệu cây để
lưu trữ dữ liệu hay các chỉ mục.Trong các tổ chức chỉ mục đạt hiệu quả xử lí ở cả thao
tác thêm, xóa thì cấu trúc B-cây được sử dụng nhiều nhất.
Trước hết chúng ta sẽ nhắc lại khái niệm B-cây (B-tree). Một B-cây cấp m (số
lớn nhất các con cho mỗi nút) là một cây có gốc thỏa mãn:
- Mỗi nút không quá m con (con trỏ)
- Mỗi nút (trừ gốc và lá) có >= m/2 con
- Nút gốc có ít nhất 2 con
- Mọi đường từ gốc đến lá đều cùng một độ dài (chiều cao của B-cây)
- Mỗi nút trong có k con thì chứa k – 1 khóa
- Các giá trị khóa trong một nút được sắp xếp theo trình tự không giảm.
(Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to
Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Chapter 18: B-
Trees, pp.434–454.)
A B-tree T is a rooted tree (whose root is root[T]) having the following properties:
1. Every node x has the following fields:
a. n[x], the number of keys currently stored in node x,
b. the n[x] keys themselves, stored in nondecreasing order, so that
key1[x] ≤key2[x] ≤ ··· ≤ keyn[x][x],
c. leaf [x], a boolean value that is TRUE if x is a leaf and FALSE if x is an
internal node.
2. Each internal node x also contains n[x]+ 1 pointers c1[x], c2[x], ..., cn[x]+1[x] to its children.
Leaf nodes have no children, so their ci fields are undefined.
3. The keys keyi[x] separate the ranges of keys stored in each subtree: if ki is any key stored in
the subtree with root ci [x], then
k1 ≤ key1[x] ≤ k2 ≤ key2[x] ≤··· ≤ keyn[x][x] ≤ kn[x]+1.
4. All leaves have the same depth, which is the tree's height h.
5. There are lower and upper bounds on the number of keys a node can contain. These bounds
can be expressed in terms of a fixed integer t ≥ 2 called the minimum degree of the B-tree:
a. Every node other than the root must have at least t - 1 keys. Every internal node other than the
root thus has at least t children. If the tree is nonempty, the root must have at least one key.
b. Every node can contain at most 2t - 1 keys. Therefore, an internal node can have at most 2t
children. We say that a node is full if it contains exactly 2t – 1 keys

Vũ Bá Anh – Phan Phước Long 35


Chương 3:Hệ quản trị CSDL Visual FoxPro

A B-tree whose keys are the consonants of English. An internal node x containing n[x] keys
has n[x] + 1 children. All leaves are at the same depth in the tree. The lightly shaded nodes are
examined in a search for the letter R.
Tổng quát, cấu trúc một nút của B-cây có dạng:
P0 K1 P1 K2 …. Kn Pn
Trong đó, K1, K2, ..Kn là khóa và n +1 con trỏ P0, P1, …, Pn thỏa mãn: K1< K2
< ... <Kn.
Đối với các nút trong, các đặc điểm sau thể hiện tính chất của B-cây:
- Mọi khóa trong cây con được trỏ bởi con trỏ Pi đều nhỏ hơn Ki+1 với i=0,
1, … , n-1
- Mọi khóa trong cây con được trỏ bởi con trỏ Pn đều lớn hơn Kn
Ta thấy, các nút của B-cây thực chất là khối tệp chỉ dẫn. Các khối tệp chỉ dẫn
được phân theo từng mức, mức càng cao độ chi tiết càng lớn.
Các thao trên tổ chức B-cây
 Tìm kiếm một bản ghi
Giả sử cần tìm kiếm bản ghi có giá trị khóa là x. Đầu tiên cần xác định đường
từ gốc tới nút lá có thể chứa bản ghi này. Ta sẽ duyệt liên tiếp các nút của B-cây kể từ
nút gốc. Tại mỗi nút sẽ xác định con trỏ đi tới nút tiếp theo. Giả sử tại nút đang xét có
dạng (p0, k1,p1,k2, …, kn, pn), ta sử dụng thủ tục sau:
So sánh x với các khóa k1,k2, …, kn. Tồn tại một chỉ số i sao cho ki lớn nhất
mà không vượt x (trong trường hợp ngược lại, tức x<k1 thì i chọn là 0). Khi đó chọn
con trỏ pi để xét tiếp nút được con trỏ này trỏ tới. Cho tới khi nút cần xét là nút lá thì
tìm bản ghi có giá trị khóa x theo phương pháp tuần tự. Nếu không tìm thấy bản ghi
nào có giá trị khóa là x thì không tồn tại bản ghi này trong tệp.
 Thêm một bản ghi
Giả sử cần thêm một bản ghi có giá trị khóa là x. Đầu tiên cần xác định nút lá
sẽ chứa bản ghi này. Thủ tục xác định nút lá như thủ tục tìm kiếm một bản ghi và tìm
được nút lá là L.
Nếu nút lá L còn chỗ trống thì thêm bản ghi mới theo đúng trình tự sắp xếp
của giá trị khoá.
Nếu nút lá L hết chỗ trống, đầu tiên tạo thêm một nút lá L1 mới. Chuyển nửa
dữ liệu cuối của L sang L1 rồi bổ sung bản ghi có khoá x vào vị trí tương ứng trong L
hay L1.
Giả sử nút H là nút cha trực tiếp của nút L, khi đó phải thêm một cặp (p1, k1)
vào H trong đó p1 là con trỏ trỏ tới lá L1 và k1 là khoá bé nhất chứa trong L1. Nếu
trong H không có con trỏ rỗi thì việc thêm (p1, k1) vào H dẫn tới phải tách H thành 2
như nút L. Quá trình này có thể làm lan truyền tới tận nút gốc của cây dọc theo đường
dẫn đã chọn.
 Xóa một bản ghi
Giả sử cần xoá bản ghi có giá trị khóa là x. Đầu tiên cần xác định nút lá sẽ
chứa bản ghi này. Thủ tục xác định nút lá như thủ tục tìm kiếm một bản ghi và tìm
được nút lá là L.

Vũ Bá Anh – Phan Phước Long 36


Chương 3:Hệ quản trị CSDL Visual FoxPro

Nếu bản ghi cần xoá là bản ghi đầu tiên của L thì phải tìm tới nút H ngay trên
nút L để chỉnh lại giá trị khoá đầu tiên của L có trước đó. Nếu L lại là nút con đầu tiên
của H thì khoá đầu tiên của L không đặt được ở H, khi đó không cần thiết phải chỉnh
sửa nữa. Tuy nhiên có thể khoá đầu tiên đó của H lại xuất hiện ở một nút trên đó. Do
vậy việc tìm và chỉnh khoá này vẫn phải tiếp tục ngược lên cho tới tận gốc của cây
dọc theo đường dẫn đã chọn
Nếu sau khi loại bỏ khoá x của nút L, nút L trở thành một nút chứa số bản ghi
dưới m/2 , khi đó cần phải chỉnh lại cặp (p, k) ứng với L trong nút trên là nút H để
thể hiện sự thay đổi đã xảy ra. Việc thay đổi này có thể làm cho nút H có thể ít hơn
m/2 cặp (p, k), khi đó xem xét các nút anh em bên trái hoặc bên phải nó có hơn m/2
+1 cặp (p, k) để phân bổ lại các cặp này cho đúng thứ tự sao cho mỗi nút ít nhất có
m/2 cặp (k, p). Ngược lại, nếu nút bên trái (hoặc bên phải) có đúng m/2 cặp, khi đó

ghép p và p1 thành một nút mới với 2*m/2 -1cặp (k, p) và con trỏ ứng với nút trê.
Quá trình này có thể lan truyền ngược lên tới tận gốc.
Ví dụ: Chúng ta sẽ lưu trữ tệp DS_LOP trong ví dụ ở trên gồm 11 bản ghi, mỗi
bản ghi chiếm 120 Bytes theo tổ chức B-cây. Để đơn giản ta sẽ lưu trữ các bản ghi của
dữ liệu DS_LOP bởi một B-cây cấp 3. Mỗi khối ứng với nút lá chứa được tối đa 2
bản. B-cây cấp 3 đối với tệp DS_LOP được thể hiện:

Ta chỉ minh họa hai thao tác chính là thêm và xóa trong bốn thao tác trên. Vì
thao tác tìm kiếm luôn được thực hiện đầu tiên trong các thao tác này, còn thao tác
sửa đổi có thể quy về thực hiện một thao tác xóa và một thao tác thêm.
Giả sử cần thêm một bản ghi có giá trị khóa là 29 vào tệp dữ liệu trên. Đầu tiên,
dùng thủ tục tìm kiếm bản ghi này. Từ gốc của B-cây, tại khối B1, do 5<29<42 nên đi
theo con trỏ thứ hai trong B1 đến B3. Tại B3, do 13<29 nên đi theo con trỏ thứ hai
của B3 đến B8. Như vậy, đường dẫn mà chúng ta tìm được là B1, B3, B8. Tại B8,
theo thứ tự sắp xếp ta có 13, 14, 29, tuy nhiên, B8 không còn đủ không gian nhớ để
chứa thêm một bản ghi dữ liệu mới có giá trị khoá là 29. Do vây, chúng ta xin cấp
thêm một khối mới, khối B12, và đặt 29 vào B12.
Bây giờ, chúng ta phải thêm một bản ghi chỉ dẫn có giá trị khoá là 29 và con trỏ
trỏ tới B12 vào B3. Giá trị 29 được chọn vì nó là giá trị khoá bé nhất trong khối B12.
Thao tác thêm này dẫn tới có một con trỏ và ba bản ghi chỉ dẫn. Do B3 không có khả

Vũ Bá Anh – Phan Phước Long 37


Chương 3:Hệ quản trị CSDL Visual FoxPro

năng chứa thêm được một bản ghi chỉ dẫn mới nên chúng ta lại xin cấp một khối mới,
khối B13. Các bản ghi chỉ dẫn với các con trỏ tới B7, B8 được xếp vào B3, còn bản
ghi chỉ dẫn tới B12, B9 được đặt vào B13.Tiếp theo chúng ta thêm một bản ghi chỉ
dẫn có giá trị khoá là 34 và con trỏ tới B13 vào B1. Do B1 không có khả năng chứa
thêm được một bản ghi chỉ dẫn mới nên chúng ta lại xin cấp một khối mới, khối B14.
Các bản ghi chỉ dẫn với các con trỏ tới B2 và B3 được xếp vào B1, còn bản ghi chỉ
dẫn tới B13, B4 được đặt vào B14. Cuối cùng, chúng ta tạo một khối mới, khối B15,
gốc của B-cây với hai con trỏ trỏ tới B1 và B14. Cây kết quả được chỉ ra ở hình dưới:

Giả sử cần xoá bản ghi có giá trị khóa là 5 ở tệp dữ liệu trên. Thủ tục tìm kiếm
bản ghi này cho ta biết đường dẫn từ nút gốc đến nút lá tương ứng với khối có khả
năng chứa bản ghi này là B15, B1, B3, B7. Chúng ta tìm thấy bản ghi này tại đầu khối
B7 và xoá nó. Do bản ghi này đứng đầu khối nên chúng ta phải lan truyền sự kiện này
ngược lên trên với giá trị nhỏ nhất trong B7 là 12. Vì B7 là nút con trái nhất của B3
nên không thay đổi tại nút này mà truyền tiếp đến khối B1. Do B3 không phải là nút
con trái nhất của B1 nên khoá trong B1 phải thay đổi và chúng ta thay 5 thành 12 ở
đó.

2.3 Ngôn ngữ thao tác dữ liệu

2.3.1 Đại số quan hệ


Ngoài việc định nghĩa cấu trúc cơ sở dữ liệu và các ràng buộc, một mô hình dữ
liệu phải chứa một tập hợp phép toán để thao tác dữ liệu. Tập hợp cơ sở các phép toán
mô hình quan hệ tạo nên đại số quan hệ. Các phép toán này giúp cho người sử dụng
xác định rõ các yêu cầu lấy tin cơ bản. Kết quả của một phép lấy tin là một quan hệ
mới, có thể được tạo ra từ một hoặc nhiều quan hệ. Các quan hệ đó có thể được thao
tác tiếp theo bằng cách sử dụng các phép toán của cùng đại số. Một dãy các phép toán
quan hệ tạo nên một biểu thức đại số quan hệ mà kết quả của nó cũng là một quan hệ.

Vũ Bá Anh – Phan Phước Long 38


Chương 3:Hệ quản trị CSDL Visual FoxPro

Các phép toán đại số quan hệ được chia thành hai nhóm. Một nhóm bao gồm
các phép toán tập hợp lấy từ lý thuyết tập hợp toán học. Các phép toán đó là phép
hợp, phép giao, phép trừ tập hợp và phép tích Đề các. Nhóm kia bao gồm các phép
toán được xây dựng đặc biệt cho các cơ sở dữ liệu quan hệ. Các phép toán đó là phép
chọn, phép chiếu, phép nối và một số các phép toán khác.
Giả sử ta có quan hệ
SINHVIEN MASV HO TEN LOP CSDL1
444101268 Lê Minh 41.01 5
444102156 Phan Thị Hoa 41.01 8
444103125 Trần Hải Yến 41.01 8
444105321 Võ Văn Tần 41.02 9
444105411 Vũ Thị Hoa 41.02 4

Phép chọn (SELECT)


Phép chọn được sử dụng để chọn một tập hợp các bộ thoả mãn điều kiện chọn
từ một quan hệ. Ta có thể xem phép chọn như một bộ lọc, nó chỉ giữ lại các bộ thoả
mãn điều kiện đặt ra.
Phép chọn được ký hiệu là
R(< điều kiện chọn>)
trong đó điều kiện chọn là một biểu thức logic được chỉ ra trên các thuộc tính
của R. Chú ý rằng R nói chung là một biểu thức đại số quan hệ. Kết quả của một biểu
thức đại số quan hệ là một quan hệ. Biểu thức đơn giản nhất chính là tên của một quan
hệ của một cơ sở dữ liệu. Quan hệ kết quả của phép chọn có cùng thuộc tính như R.
Ví dụ, để chọn các bộ SINHVIEN thuộc về lớp 41.01 hoặc các bộ SINHVIEN có mã
444101268 ta có thể viết một cách riêng rẽ như sau:
SINHVIEN(LOP=”41.01”)
SINHVIEN(MASV=”444101268”)
Biểu thức logic chỉ ra trong <điều kiện chọn> được tạo nên từ một số hạng
mục có dạng :
<tên thuộc tính> <phép so sánh> <giá trị hằng>
hoặc <tên thuộc tính> <phép so sánh> <tên thuộc tính>
trong đó <tên thuộc tính> là tên của một thuộc tính trong R, <phép so sánh> là
một trong các phép toán so sánh {<, <=, =, >=, >, ≠} còn <giá trị hằng> là một giá trị
hằng từ miền giá trị của thuộc tính. Các hạng mục có thể được nối với nhau bằng các
phép toán logic AND, OR, NOT để tạo ra một điều kiện chọn chung. Ví dụ, để chọn
ra các sinh viên lớp 41.01có điểm CSDL1 lớn hơn 7 ta có thể viết phép chọn như sau:
SINHVIEN(LOP=”41.01” AND CSDL1>7)
Khi đó kết quả là quan hệ sau:
SINHVIEN MASV HO TEN LOP CSDL1
444102156 Phan Thị Hoa 41.01 8
444103125 Trần Hải Yến 41.01 8
Chú ý rằng các phép toán so sánh trong tập hợp {<, <=, =, >=, >, ≠} áp dụng
cho các thuộc tính có miền giá trị là các giá trị có thứ tự như là miền giá trị số. Miền

Vũ Bá Anh – Phan Phước Long 39


Chương 3:Hệ quản trị CSDL Visual FoxPro

giá trị các dãy ký tự được xem như có thứ tự dựa trên việc so sánh các dãy ký tự. Nếu
miền giá trị của một thuộc tính là một tập hợp các giá trị không có thứ tự thì chỉ có
các phép so sánh trong tập hợp { =, ≠ } là có thể áp dụng được. Ngoài ra, có thể còn
các phép so sánh bổ sung, chẳng hạn như “ là một dãy con của…” hoặc “trong khoảng
từ… đến…”.
Kết quả một phép chọn được xác định như sau: <Điều kiện chọn> được áp
dụng cho mỗi bộ t trong R một cách độc lập. Điều đó được thực hiện bằng cách thay
thế mỗi thuộc tính Ai trong điều kiện chon bằng giá trị t[Ai] của nó trong bộ. Nếu điều
kiện chọn cho giá trị đúng thì bộ t sẽ được chọn. Tất cả các bộ được chọn xuất hiện
trong kết quả của phép chọn. Các phép toán logic AND, OR, NOT được thực hiện
theo quy tắc bình thường của chúng.
Phép chọn là phép toán một ngôi, nghĩa là nó được áp dụng cho một quan hệ.
Hơn nữa, phép chọn được áp dụng cho từng bộ một cách độc lập, vì vậy, các điều
kiện chọn không thể liên quan đến nhiều bộ. Quan hệ kết quả của phép chọn có cấp
giống như cấp của R. Số các bộ trong quan hệ kết quả luôn luôn nhỏ hơn hoặc bằng số
các bộ trong R.
Phép chọn là một phép toán có tính chất giao hoán, nghĩa là
R( < Điều kiện 1>) (< Điều kiện 2>) = R(< Điều kiện 2>)(< Điều kiện 1>)
Hơn nữa ta có thể kết hợp một loạt các phép chọn thành một phép chọn đơn
giản bằng cách sử dụng phép toán AND. Ví dụ:
R(< Điều kiện 1>) (< Điều kiện 2>) = R(< Điều kiện 2>AND< Điều kiện 1>)
hay đơn giản hơn ta có thể viết R(< Điều kiện 2>, < Điều kiện 1>)
Phép chiếu (PROJECT)
Nếu ta coi một quan hệ như một bảng thì phép chọn chọn một số hàng của
bảng thoả mãn điều kiện chọn và bỏ qua các hàng không thoả mãn điều kiện chọn.
Phép chiếu là phép toán chọn một số cột của bảng. Nếu chúng ta chỉ quan tâm đến
một số thuộc tính của quan hệ, chúng ta dùng phép chiếu để chiếu lên các thuộc tính
đó. Phép chiếu được ký hiệu là:
R[<danh sách các thuộc tính>]
trong đó <danh sách các thuộc tính> là một danh sách con các thuộc tính của
quan hệ R. Nói chung R là một biểu thức đại số quan hệ. Trường hợp đơn giản nhất
nó là tên của một quan hệ của cơ sở dữ liệu. Kết quả của phép chiếu là một quan hệ
chỉ có các thuộc tính nằm trong <danh sách các thuộc tính> và có cùng thứ tự như
thứ tự của chúng có trong danh sách. Như vậy, cấp của quan hệ kết quả là số các
thuộc tính có trong <danh sách các thuộc tính>.
Nếu <danh sách các thuộc tính> chỉ bao gồm các thuộc tính không phải thuộc
tính khoá của R thì quan hệ kết quả có thể có những bộ trùng nhau. Phép chiếu loại bỏ
mọi bộ trùng lặp, và như vậy, kết quả của phép chiếu là một tập hợp các bộ và là một
quan hệ đúng đắn.
Ví dụ, phép chiếu SINHVIEN(LOP, CSDL1) cho kết quả là một quan hệ có
các thuộc tính LOP, CSDL1 như sau:
SINHVIEN LOP CSDL1

Vũ Bá Anh – Phan Phước Long 40


Chương 3:Hệ quản trị CSDL Visual FoxPro

41.01 5
41.01 8
41.02 8
41.02 4

Số các bộ trong quan hệ kết quả từ một phép chiếu luôn luôn nhỏ hơn hoặc
bằng số các bộ trong R. Nếu danh sách chiếu là một siêu khoá của R (nghĩa là nó chứa
một khoá nào đó của R) thì quan hệ kết quả có cùng một số bộ như R. Ngoài ra, nếu
<danh sách 2> chứa tất cả các thuộc tính có trong <danh sách 1> thì
R[< danh sách1>][< danh sách2> ] = R[< danh sách 1> ]
Phép chiếu không có tính giao hoán.
Phép đặt lại tên (RENAME)
Chúng ta có thể áp dụng nhiều phép toán quan hệ liên tiếp nhau. Trong trường
hợp đó hoặc chúng ta có thể viết các phép toán như là một biểu thức đại số quan hệ
đơn bằng cách xếp lồng các phép toán lại với nhau, hoặc chúng ta có thể áp dụng mỗi
phép toán tại một thời điểm và tạo ra các quan hệ kết quả trung gian. Trong trường
hợp tạo các quan hệ trung gian, ta phải đặt tên cho quan hệ đó. Ví dụ: Để đưa ra TEN
và điểm CSDL1 của các SINHVIEN lớp 41.01 phải áp dụng một phép chọn và một
phép chiếu. Chúng ta có thể viết một biểu thức đại số quan hệ đơn như sau :
SINHVIEN[ TEN, CSDL1](LOP=”41.01”)
Một cách khác, chúng ta có thể tạo ra kết quả trung gian và viết biểu thức trên
thành dãy các phép toán như sau:
KQTG ← SINHVIEN(LOP=”41.01”)
R ← KQTG[TEN, CSDL1]
Thông thường việc phân tích một dãy phức tạp các phép toán bằng cách chỉ ra
các quan hệ kết quả trung gian là dễ hơn việc viết một biểu thức đại số quan hệ đơn.
Chúng ta có thể dùng kỹ thuật này để đặt lại tên (Rename) cho các thuộc tính trong
các quan hệ trung gian và kết quả. Để đặt lại tên cho các thuộc tính của một quan hệ,
chúng ta liệt kê các tên mới của các thuộc tính trong cặp dấu ngoặc. Ví dụ:
KQTG{R(TEN,CSDL)} ← KQTG[ TEN, CSDL1]
Cho kết quả là quan hệ R, trong đó thuộc tính CSDL1 được đặt lại tên thành
CSDL.
Nếu không có việc đặt lại tên thì tên của các thuộc tính trong quan hệ kết quả
của một phép chọn là giống như các tên trong quan hệ ban đầu và có cùng một thứ tự
như thứ tự của các thuộc tính đó. Đối với phép chiếu, nếu không có việc đặt lại tên thì
quan hệ kết quả có các tên thuộc tính giống như các tên trong danh sách chiếu và có
cùng thứ tự như chúng xuất hiện trong danh sách.
Chúng ta có thể định nghĩa một phép toán đặt lại tên , nó có thể đặt lại tên cho
một tên quan hệ hoặc các tên thuộc tính hoặc cả hai. Phép đặt lại tên được ký hiệu là:
R{S(B1,B2,…Bn)} hoặc R(B1,B2,…Bn)
trong đó S là tên quan hệ mới, B1,B2,…Bn là các tên thuộc tính mới. Biểu
thức thứ nhất đặt lại tên quan hệ và các thuộc tính của nó. Nếu các thuộc tính của R là

Vũ Bá Anh – Phan Phước Long 41


Chương 3:Hệ quản trị CSDL Visual FoxPro

A1,A2, ...An thì sau khi đặt lại tên, quan hệ có tên mới là S còn các thuộc tính có tên
mới là B1, B2, …, Bn. Biểu thức thứ hai chỉ đặt lại tên các thuộc tính, nếu các thuộc
tính của R là A1,A2, ...An thì sau khi đặt lại tên chúng có tên là B1, B2, ...Bn.
Các phép toán lý thuyết tập hợp
Nhóm tiếp theo của các phép toán đại số quan hệ là các phép toán toán học
thông thường trên các tập hợp. Đó là các phép toán hợp, giao và trừ tập hợp. Các phép
toán này là các phép toán hai ngôi, nghĩa là mỗi phép toán được áp dụng cho hai tập
hợp. Khi áp dụng các phép toán này cho cơ sở dữ liệu quan hệ, hai quan hệ tham gia
vào một trong các phép toán trên phải có kiểu của các bộ như nhau, hay nói cách
khác, chúng phải có cùng một cấu trúc. Điều kiện này được gọi là tương thích đồng
nhất (khả hợp). Hai quan hệ R(A1,A2,…, An) và S(B1, B2, …,Bn) được gọi là khả hợp
nếu chúng có cùng cấp n và dom(Ai) = dom(Bi) với 1<= i <= n. Điều đó có nghĩa là
hai quan hệ có cùng số các thuộc tính và mỗi cặp thuộc tính tương ứng có cùng miền
giá trị.
Các phép toán được định nghĩa như sau:
. Phép hợp: Hợp của hai quan hệ R và S, được ký hiệu là R + S, cho kết quả là
một quan hệ chứa tất cả các bộ có trong R hoặc ở trong S hoặc ở trong cả hai. Các bộ
trùng lặp bị loại bỏ.
. Phép giao: Giao của hai quan hệ R và S , được ký hiệu là R & S , cho kết quả
là một quan hệ chứa tất các các bộ có trong cả hai quan hệ R và S.
. Phép trừ quan hệ: Phép trừ quan hệ R và S , được ký hiệu là R - S, cho kết
quả là một quan hệ chứa tất cả các bộ có trong R nhưng không có trong S.
Ví dụ, xét hai quan hệ:
R HOTEN TUOI GIOI S HOTEN TUOI GIOI
AA 20 Nam BB 18 Nữ
BB 18 Nữ EE 20 Nam
CC 21 Nam DD 25 Nữ
DD 25 Nữ FF 21 Nam

R+S HOTEN TUOI GIOI R&S HOTEN TUOI GIOI


AA 20 Nam BB 18 Nữ
BB 18 Nữ DD 25 Nữ
CC 21 Nam
DD 25 Nữ R-S HOTEN TUOI GIOI
EE 20 Nam AA 20 Nam
FF 21 Nam CC 21 Nam
Chú ý rằng các phép toán hợp và giao là các phép toán giao hoán, nghĩa là:
R + S = S + R và R & S = S & R
Các phép toán trên cũng có tính chất kết hợp, nghĩa là
R + (S + T) = (R + S) + T và R & (S &T) = (R&S) &T
Phép toán trừ tập hợp không có tính chất giao hoán.
R-S ≠S-R
Ngoài các phép toán trên, còn có một phép toán gọi là tích Đề các(Descartes).
Tích Đề các còn gọi là tích hỗn hợp (cross product) hoặc là nối hỗn hợp (cross join),
được ký hiệu là ×. Đó cùng là một phép toán hai ngôi nhưng những quan hệ mà nó áp

Vũ Bá Anh – Phan Phước Long 42


Chương 3:Hệ quản trị CSDL Visual FoxPro

dụng trên đó không phải là tương thích đồng nhất. Phép toán này được sử dụng để nối
các bộ của hai quan hệ vào một kiểu kết hợp. Kết quả của
R(A1, A2, .. , An)× S(B1, B2, …,Bm)
là một quan hệ Q với n+m thuộc tính Q(A1, A2,…, An, B1, B2,…,Bm). Quan
hệ kết quả Q có các bộ được tạo thành do sự kết hợp một bộ của R và một bộ của S.
Ví dụ, xét hai quan hệ R và S như sau:

R A1 A2 A3 S B1 B2 B3
aa bb cc dd da db
ab ba ac cd cb ac

R×S A1 A2 A3 B1 B2 B3
aa bb cc dd da db
aa bb cc cd cb ac
ab ba ac dd da db
ab ba ac cd cb ac
Như vậy, nếu R có nR bộ và S có nS bộ thì R× S có nR*nS bộ. Phép toán này
nếu áp dụng một mình thì không có ý nghĩa mấy. Nó chỉ có lợi khi tiếp theo bằng một
phép chọn các giá trị tương thích của các thuộc tính xuất phát từ các quan hệ thành
phần. Tích Đềcác kết hợp với một phép chọn cho ta một phép nối.
Phép nối (JOIN)
Phép nối được ký hiệu là và được dùng để kết hợp các bộ có liên hệ với
nhau từ hai quan hệ thành một bộ. Phép toán này rất quan trọng đối với cơ sở dữ liệu
quan hệ có nhiều bảng bởi vì nó cho phép ta xử lý các mối liên kết giữa các quan hệ.
Dạng tổng quát của phép nối trên hai quan hệ R(A1, A2,…,An) và S(B1,B2,…, Bm) là
R S(< Điều kiện nối>)
Kết quả của phép nối là một quan hệ Q(A1,A2,…,An,B1,B2,…,Bm) có n+m
thuộc tính. Mỗi bộ của Q là một sự kết nối giữa một bộ của R và một bộ của S khi
chúng thoả mãn điều kiện nối. Sự khác nhau giữa tích Đề các và phép nối là ở chỗ
trong phép nối, chỉ có các bộ thoả mãn điều kiện nối mới xuất hiện trong kết quả,
trong khi đó trong tích Đề các mọi tổ hợp của các bộ đều có trong kết quả. Điều kiện
nối được chỉ ra trên các thuộc tính của hai quan hệ R và S và được tính toán cho mỗi
tổ hợp các bộ. Mọi tổ hợp bộ mà điều kiện nối là đúng được chứa trong quan hệ kết
quả Q như là một bộ đơn. Một điều kiện nối tổng quát có dạng
<điều kiện> AND <điều kiện> AND … AND <điều kiện>
trong đó mỗi điều kiện có dạng Ai θ Bj, Ai là một thuộc tính của R, Bj là một
thuộc tính của S, Ai và Bj có cùng miền và θ là một trong các dấu phép toán so sánh
{<, <=, =, >=, >, ≠}. Một phép toán nối với điều kiện tổng quát như vậy gọi là một
phép nối tê-ta. Các bộ có các thuộc tính nối là null không xuất hiện trong kết quả.
Theo nghĩa đó, phép toán không nhất thiết phải xử lý mọi thông tin trong các quan hệ
tham gia. Ví dụ :
Giả sử ta có hai quan hệ R và S như sau:

Vũ Bá Anh – Phan Phước Long 43


Chương 3:Hệ quản trị CSDL Visual FoxPro

R A1 A2 A3 S B1 B2 B3
Aa Ca Ba Ba Aaa Bbb
Ab Cb Bb Bb Ccc Ddd
Ac Ca Ba
Ad Cc Null
Ae Cd Bb
Khi đó kết quả của phép nối tê-ta R và S với điều kiện A3 = B1 sẽ cho kết quả
là:
R S(A3=B1) A1 A2 A3 B1 B2 B3
Aa Ca Ba Ba Aaa Bbb
Ab Cb Bb Bb Ccc Ddd
Ac Ca Ba Ba Aaa Bbb
Ae Cd Bb Bb Ccc Ddd
Phần lớn các phép nối chỉ cho phép các điều kiện nối với các so sánh bằng.
Những phép nối chỉ sử dụng phép so sánh bằng được gọi là nối bằng (equi join). Ví
dụ trên là một phép nối bằng. Chú ý rằng trong kết quả của phép nối bằng chúng ta
thấy luôn luôn có một hoặc nhiều cặp thuộc tính có các giá trị như nhau trong mỗi bộ.
Việc có các cặp thuộc tính có giá trị như nhau là thừa, vì vậy người ta đề nghị một
phép nối mới gọi là nối tự nhiên, ký hiệu là *. Phép nối tự nhiên nhằm loại bỏ thuộc
tính thứ hai (thuộc tính thừa) trong điều kiện nối bằng. Định nghĩa chuẩn của nối tự
nhiên đòi hỏi hai thuộc tính nối (hoặc mỗi cặp thuộc tính nối) phải có tên như nhau
trong cả hai quan hệ. Nếu các thuộc tính đó không cùng tên thì trước khi nối phải áp
dụng phép toán đặt lại tên. Ví dụ, ta cần nối tự nhiên hai quan hệ R(A1,A2,A3) và
S(B1,B2,B3) như trong ví dụ trên. Để có thể thực hiện được phép nối tự nhiên với điều
kiện so sánh bằng, ta phải đổi tên thuộc tính B1 thành A3, nghĩa là ta phải viết:
R * S(A3, B2,B3)
Phép nối sẽ có kết quả như sau:
R*S A1 A2 A3 B2 B3
Aa Ca Ba Aaa Bbb
Ab Cb Bb Ccc Ddd
Ac Ca Ba Aaa Bbb
Ae Cd Bb Ccc Ddd
Nếu các thuộc tính mà trên đó nối tự nhiên được chỉ ra có tên như nhau thì
việc đặt lại tên là không cần thiết.
Chú ý rằng nếu không có một tổ hợp các bộ nào thoả mãn điều kiện nối thì kết
quả của một phép nối là một quan hệ rỗng không chứa bộ nào. Nói chung, nếu R có
nR bộ và S có nS bộ thì kết quả của phép nối R với S sẽ có số các bộ lớn hơn 0 và
nhỏ hơn nR.nS. Cỡ của một kết quả nối chia cho cỡ cực đại nR.nS tạo nên một tỷ lệ
gọi là chọn lựa nối, đó là một tính chất của mỗi điều kiện nối. Nếu không có điều kiện
nối, mọi tổ hợp các bộ sẽ được chọn và phép nối trở thành một tích Đề các.
Phép nối được sử dụng để kết hợp các dữ liệu từ nhiều quan hệ sao cho các
thông tin có liên hệ với nhau có thể được biểu diễn trong một bảng. Đôi khi phép nối
được áp dụng nối một bảng với chính nó. Chúng ta có thể áp dụng phép nối tự nhiên

Vũ Bá Anh – Phan Phước Long 44


Chương 3:Hệ quản trị CSDL Visual FoxPro

và nối bằng để nối nhiều bảng với nhau. Nếu ta nối n bảng với nhau thì phải chỉ ra n-1
điều kiện nối.
Tập hợp đầy đủ các phép toán quan hệ
Người ta đã chỉ rằng tập hợp các phép toán đại số quan hệ {(), [], +, −, ×} là
một tập đầy đủ, nghĩa là mọi phép toán đại số quan hệ khác có thể được biểu diễn
thông qua các phép toán của tập hợp này. Ví dụ, phép giao có thể được biểu diễn bằng
cách sử dụng các phép hợp và trừ tập hợp như sau:
R & S = (R + S) − ((R- S) + (S − R))
Như vậy, nói một cách chính xác là không cần phải có phép giao. Mỗi khi cần
thực hiện một phép giao, ta chỉ cần đưa ra biểu thức phức tạp này là đủ.
Một ví dụ khác, một phép nối có thể được chỉ ra như một tích Đề các và sau
đó là một phép chọn:
R S(< Điều kiện nối>) = R × S(< Điều kiện chọn> )
Một cách tương tự, ta có thể thay thế phép nối tự nhiên bằng một tích Đề các
đi sau một phép đặt lại tên và sau đó là các phép toán chọn và chiếu. Như vậy các
phép toán nối cũng không cần thiết. Tuy nhiên các phép toán đó rất quan trọng bởi vì
chúng tiện dùng và rất thường xuyên được áp dụng trong các cơ sở dữ liệu. Các phép
toán đó được đưa vào trong đại số quan hệ là do tiện dụng hơn là do cần thiết. Một
phép toán khác cũng được đưa vào, đó là phép chia.
Phép chia
Phép chia có lợi cho một loại truy vấn đặc biệt đôi khi có các ứng dụng trong
cơ sở dữ liệu. Phép chia được áp dụng cho hai quan hệ R(Z) và S(X) và được ký hiệu
là R(Z) ÷ S(X), trong đó X ⊂ Z . Giả sử Y = Z - X (như vậy Z = X ∪ Y). Kết quả
của phép chia là quan hệ T(Y) chứa một bộ t nếu các bộ tR xuất hiện trong R với
tR[Y] = t và với tR[X] = tS với mọi bộ tS trong S. Điều đó có nghĩa là để một bộ t
xuất hiện trong kết quả T của phép chia, các giá trị trong t phải xuất hiện trong R
trong sự kết nối với mọi bộ của S.
Ví dụ: Xét phép chia quan hệ R(A,B) cho quan hệ S(A) như hình vẽ dưới đây.
Ta thấy chỉ có các thuộc tính B1 và B4 là kết nối với tất cả các bộ của S ở trong R. Vì
vậy kết quả nhận được là một quan hệ T(B) với hai giá trị của B là B1 và B4.
Phép chia có thế được biểu diễn thông qua các phép toán [], ×, − như sau:
T1←R[Y] ; T2 ← ((S × T1) − R )[Y] ; T ← T1 − T2
R A B S A
A1 B1 A1
A2 B1 A2
A3 B1 A3
A4 B1
A1 B2
A3 B2
A2 B3 T B
A3 B3 B1

Vũ Bá Anh – Phan Phước Long 45


Chương 3:Hệ quản trị CSDL Visual FoxPro

A4 B3 B4
A1 B4
A2 B4
A3 B4
Phép chia T(B) = R(A,B) ÷ S(A).
T1 B T1×S A B T1×S-R A B
B1 A1 B1 A1 B3
B2 A1 B2 A2 B2
B3 A1 B3
B4 A1 B4 T2 B
A2 B1 B2
A2 B2 B3
A2 B3
A2 B4 T B
A3 B1 B1
A3 B2 B4
A3 B3
A3 B4

Các phép toán quan hệ bổ sung


Có nhiểu truy vấn cơ sở dữ liệu không thể thực hiện được bằng các phép toán
đại số cơ bản trình bày ở trên. Trong phần này chúng ta sẽ trình bày các phép toán bổ
sung để biểu diễn các truy vấn đó. Các phép toán này làm tăng cường sức mạnh của
đại số quan hệ.
Các hàm nhóm và các phép nhóm
Kiểu câu hỏi đầu tiên không thể biểu diễn được trong đại số quan hệ cơ sở là
chỉ ra các hàm nhóm toán học trên các tập hợp giá trị của các cơ sở dữ liệu. Các ví dụ
về các hàm như vậy có thể là đưa ra học phí trung bình hoặc tổng học phí của tất cả
sinh viên, hoặc cho biết số các bộ của bảng sinh viên. Các hàm hay áp dụng để thu
thập các giá trị số là hàm Tổng (SUM), Trungbình (AVERAGE), Tính giá trị lớn nhất
(MAX), Giá trị bé nhất (MIN). Hàm Đếm (COUNT) được sử dụng để đếm các bộ giá
trị.
Một kiểu câu hỏi hay dùng khác là đòi hỏi nhóm các bộ trong một quan hệ
theo một giá trị của một số các thuộc tính của chúng và sau đó áp dụng các hàm nhóm
một cách độc lập cho từng nhóm. Ví dụ, nhóm các bộ của quan hệ SINHVIEN theo
LOP. Như vậy, mỗi nhóm bao gồm các sinh viên học cùng một lớp. Sau đó chúng ta
có thể đưa ra mỗi giá trị của LOP cùng với học phí trung bình của các sinh viên ở
trong trường.
Chúng ta có thể định nghĩa một phép toán nhóm như sau:
R(< các thuộc tính nhóm> ℑ< danh sách các hàm>)

Vũ Bá Anh – Phan Phước Long 46


Chương 3:Hệ quản trị CSDL Visual FoxPro

trong đó ℑ là ký hiệu phép toán hàm nhóm, <các thuộc tính nhóm> là một
danh sách các thuộc tính của quan hệ được chỉ ra trong R, <danh sách hàm> là danh
sách các cặp (<hàm>(<thuộc tính>)). Trong các cặp như vậy, <hàm> là một trong các
hàm cho phép như SUM, AVERAGE, MAX, MIN, COUNT, và <thuộc tính> là một
thuộc tính của quan hệ được chỉ ra trong R. Quan hệ kết quả có các thuộc tính nhóm
cộng với một thuộc tính cho mỗi phần tử trong danh sách hàm. Ví dụ, để lấy ra theo
LOP các sinh viên và học phí trung bình của các sinh viên theo từng LOP, ta có thể
viết:
SINHVIEN(LOP ℑ COUNT ( ), AVERAGE(HP))
Kết quả được minh hoạ
LOP COUNT() AVERAGE(HP)
44/41.01 32 127
44/41.02 36 129
44/41.03 33 135

Nếu không chỉ ra thuộc tính nhóm thì các hàm được áp dụng cho các giá trị
thuộc tính của tất cả các bộ trong quan hệ, vì vậy quan hệ kết quả chỉ có một bộ. Cần
chú ý rằng, nói chung, các trùng lặp không được loại bỏ khi hàm nhóm được áp dụng.
Kết quả của việc áp dụng một hàm nhóm là một quan hệ chứ không phải là một đại
lượng vô hướng, thậm chí nếu nó chỉ có một giá trị.
Các phép toán khép kín đệ quy
Một kiểu phép toán khác, nói chung, không chỉ ra được trong các phép toán
đại số quan hệ cơ sở là phép toán khép kín đệ quy. Phép toán này được áp dụng cho
mối liên kết đệ quy giữa các bộ cùng kiểu.Với các phép toán này chúng ta phải sử
dụng kỹ thuật lặp.
Các phép toán nối ngoài (outer join), hợp ngoài (outer union)
Trong phần này chúng ta thảo luận một vài mở rộng của phép toán nối và hợp.
Các phép toán nối mô tả ở trên liên kết các bộ thoả mãn điều kiện nối. Như vậy, các
bộ không có bộ liên kết sẽ bị loại khỏi kết quả nối. Các bộ với giá trị null trong các
thuộc tính nối cũng bị loại. Một tập hợp các phép toán gọi là nối ngoài có thể được sử
dụng khi chúng ta muốn giữ các bộ trong R hoặc S hoặc trong cả hai quan hệ trong
kết quả của phép nối dù chúng có những bộ liên kết trong quan hệ kia hay không. Có
ba phép nối ngoài gọi là nối ngoài trái (left outer join), nối ngoài phải (right outer
join) và nối ngoài đầy đủ (full outer join), được ký hiệu tương ứng là:

Nối ngoài trái Nối ngoài phải Nối ngoài đầy đủ


Phép nối ngoài trái giữ lại mọi bộ trong quan hệ bên trái R trong phép nối.
Nếu không có bộ liên kết nào được tìm thấy trong S thì các thuộc tính của S trong kết
quả phép nối được “làm đầy” bằng các giá trị null.
Tương tự như vậy đối với các phép nối ngoài phải và các phép nối ngoài đầy
đủ.

Vũ Bá Anh – Phan Phước Long 47


Chương 3:Hệ quản trị CSDL Visual FoxPro

R A B C S D E
A1 B1 1 1 7
A1 B2 5 2 7
A2 B2 12 12 3
A2 B3 23 23 10

R S(C<D) A B C D E
A1 B1 1 2 7
A1 B1 1 12 3
A1 B1 1 23 10
A1 B2 5 12 3
A1 B2 5 23 10
A2 B2 12 23 10
A2 B3 23 null null

R S(C>D) A B C D E
A1 B2 5 1 7
A1 B2 5 2 7
A2 B2 12 1 7
A2 B2 12 2 7
A2 B3 23 1 7
A2 B3 23 2 7
A2 B3 23 12 3
null null null 23 10

R S(C=D) A B C D E
A1 B1 1 1 7
A2 B2 12 12 3
A2 B3 23 23 10
A1 B2 5 null null
null null null 2 7

Phép toán hợp ngoài được mở rộng để lấy hợp của các bộ từ các quan hệ nếu
các bộ không tương thích đồng nhất. Phép toán này chỉ lấy hợp của các quan hệ mà
chúng chỉ tương thích bộ phận, nghĩa là chỉ một vài thuộc tính của chúng là tương
thích phép hợp. Điều phải tôn trọng là danh sách các thuộc tính tương thích phải chứa
một khoá cho cả hai quan hệ. Các bộ từ các quan hệ thành phần với cùng một khoá
chỉ được biểu diễn một lần trong kết quả và có giá trị cho tất cả các thuộc tính trong
kết quả. Các thuộc tính không tương thích phép hợp từ bất kỳ quan hệ nào cũng được

Vũ Bá Anh – Phan Phước Long 48


Chương 3:Hệ quản trị CSDL Visual FoxPro

giữ trong kết quả và các bộ không có giá trị cho các thuộc tính này cũng được lấp đầy
bằng những giá trị null.
Một số ví dụ về truy vấn trong đại số quan hệ

2.3.2 Ngôn ngữ con dữ liệu DSL-Alpha

2.3.3 Ngôn ngữ con dữ liệu SQL


SQL là gì?
SQL là một ngôn ngữ con về dữ liệu được xây dựng theo một tiêu chuẩn công
nghệ, được thiết kế một cách chuyên biệt để sử dụng vào việc kiến tạo, xử lí, và kiểm
soát các CSDL. SQL là viết tắt của Structured Query Language - Ngôn ngữ truy vấn
cấu trúc.
SQL cho phép bạn truy cập vào CSDL.
SQL có thể thực thi các câu truy vấn trên CSDL.
SQL có thể lấy dữ liệu từ CSDL.
SQL có thể chèn dữ liệu mới vào CSDL.
SQL có thể xoá dữ liệu trong CSDL.
SQL có thể sửa đổi dữ liệu hiện có trong CSDL.
SQL là một chuẩn của ANSI (American National Standards Institute - Viện
tiêu chuẩn quốc gia Hoa kỳ) về truy xuất các hệ thống CSDL. Các câu lệnh SQL được
sử dụng để truy xuất và cập nhật dữ liệu trong một CSDL.
SQL hoạt động với hầu hết các chương trình CSDL như MS Access, DB2,
Informix, MS SQL Server, Oracle, Sybase v.v...
Lưu ý: Hầu hết các chương trình CSDL hỗ trợ SQL đều có phần mở rộng cho
SQL chỉ hoạt động với chính chương trình đó.
Các thuật ngữ trong CSDL quan hệ như: quan hệ, thuộc tính, bộ, … được thay
thế bằng các thuật ngữ như bảng (table), cột (column), bản ghi - dòng (record - row)
để phù hợp với ý nghĩa của các phần mềm này.
1. Các lệnh định nghĩa dữ liệu
Ngôn ngữ định nghĩa (DDL) của SQL cho phép đặc tả không chỉ một tập các
bảng hay các quan hệ mà còn cho phép đặc tả một số thông tin về mỗi bảng, bao gồm:
• Sơ đồ đối với mỗi bảng
• Kiểu dữ liệu hay miền giá trị kết hợp với mỗi cột
• Các ràng buộc toàn vẹn
• Tập các chỉ dẫn được bảo trì đối với mỗi bảng
• Thông tin an toàn và uỷ quyền đối với mỗi bảng
• Cấu trúc lưu trữ vật lí của mỗi bản trên đĩa
Tuy vậy, trong phần này chỉ giới thiệu phần định nghĩa sơ đồ và các kiểu dữ
liệu.

Vũ Bá Anh – Phan Phước Long 49


Chương 3:Hệ quản trị CSDL Visual FoxPro

Các kiểu dữ liệu


Kiểu dữ liệu Loại Bytes Diễn giải
Int Số nguyên 4 Số nguyên từ -2,147,483,648 đến 2,147,483,647
Smallint Số nguyên 2 Số nguyên từ -32,768 đến 32,767
Numeric(w,d) Số thực Varies Số từ -1038 đến 1038-1
Dạng
Float(n) Varies Số từ -1.79E+308 đến 1.79E+308
Numeric
Datetime Date/Time 8 Có giá trị từ 1/1/1753 đến 31/12/9999
Xâu kí tự có độ dài cố định, chiều dài cho phép 8000 kí
Char(n) Kí tự Varies
tự
Xâu kí tự có độ dài biến đổi, chiều dài cho phép 8000 kí
Varchar(n) Kí tự Varies
tự

Các lệnh đối với bảng


Chức năng Dạng lệnh

Tạo một bảng mới CREATE TABLE <Tên bảng> (


<tên cột> <kiểu dữ liệu> [NOT NULL] [, …] )
[ CONSTRAINT <tên ràng buộc> <kiểu ràng buộc>]

Thêm một cột với ALTER TABLE <tên bảng>


bảng
ADD COLUMN <tên cột> <kiểu dữ liệu> [NOT NULL]

Xoá một cột với ALTER TABLE <tên bảng>


bảng
DROP COLUMN <tên cột>

Sửa kiểu DL một cột ALTER TABLE <tên bảng>


với bảng
ALTER COLUMN <tên cột> <kiểu dữ liệu mới>

Thêm một ràng buộc ALTER TABLE <tên bảng>


với bảng
ADD CONSTRAINT <tên ràng buộc> <kiểu ràng buộc>

Xoá một ràng buộc ALTER TABLE <tên bảng>


với bảng
DROP CONSTRAINT <tên ràng buộc>

Xoá bảng DROP TABLE <tên bảng>

Ví dụ 1: Tạo cơ sở dữ liệu quản lí bán hàng


CREATE DATABASE QLHB
CREATE TABLE Hang (Mahh Char(10) PRIMARY KEY, tenhh Char(20))

CREATE TABLE TaiKhoan (matk Char(10) PRIMARY KEY,


tentk Char(20), cap Char(1))

CREATE TABLE KhachHang (makh Char(10) NOT NULL,


tenkh Char(30), dc Char(40),
CONSTRAINT KH_PK PRIMARY KEY (makh))

CREATE TABLE Hoadon (mahd Char(10) PRIMARY KEY ,


makh Char(10)references KhachHang,
dien_giai Char(40), tien Numeric(12,2),

Vũ Bá Anh – Phan Phước Long 50


Chương 3:Hệ quản trị CSDL Visual FoxPro

tk Char(10) REFERENCES taikhoan)

CREATE TABLE ct_HoaDon ( stt Numeric(1,0),


mahd Char(10) REFERENCES HoaDon,
mahh Char(10) REFERENCES Hang,
slg Numeric(3,1) CHECK slg>0 ,
dg Numeric(9,2), tkdu Char(10) REFERENCES Taikhoan)
Ví dụ 2:
CREATE TABLE NHANVIEN (
Ho varchar(15) not null,
Dem varchar(20),
Ten varchar(15) not null,
MaNV char(9) not null,
Ngsinh datetime,
Dchi varchar(30),
Gioi char,
Luong numeric(10,2),
MaGSat char(9),
MaPhong int not null
)
CREATE TABLE PHONGBAN (
Ten varchar(15) unique,
MaPB int not null,
TrPhong varchar(9) not null,
NgNhanChuc datetime,
constraint PB_PK primary key (MaPB),
constraint PB_TrPh foreign key (TrPhong) references NHANVIEN (MaNV)
on delete set null on update cascade
)

Thêm cột Tel vào tệp NHANVIEN


alter table NHANVIEN add column Tel char(10)

Xoá cột Tel của tệp NHANVIEN


alter table NHANVIEN drop column Tel

Thay đổi kiểu dữ liệu cho cột Gioi


alter table NHANVIEN alter column Gioi int

Thêm ràng buộc CHECK cho cột Lương


alter table NHANVIEN add constraint NV_Luong check (Luong > 0)

Xoá ràng buộc


alter table NHANVIEN drop constraint NV_Luong

Xoá bản NHANVIEN


DROP TABLE NHANVIEN

Các lệnh với tệp chỉ dẫn


Chức năng Dạng lệnh

Tạo tệp chỉ dẫn CREATE INDEX <tên chỉ dẫn> ON <tên bảng> (tên cột)
[ ASC | DSC]

Xoá tệp chỉ dẫn DROP INDEX <tên chỉ dẫn>

Vũ Bá Anh – Phan Phước Long 51


Chương 3:Hệ quản trị CSDL Visual FoxPro

2. Các lệnh thao tác dữ liệu


SQL là ngôn ngữ thao tác dữ liệu (DML - Data Manipulation Language). SQL
là cú pháp để thực thi các câu truy vấn. SQL cũng bao gồm cú pháp để cập nhật - sửa
đổi, chèn thêm và xoá các mẩu tin.
Sau đây là danh sách các lệnh và truy vấn dạng DML của SQL:
SELECT - lấy dữ liệu từ một bảng CSDL.

UPDATE - cập nhật/sửa đổi dữ liệu trong bảng.

DELETE - xoá dữ liệu trong bảng.

INSERT INTO - thêm dữ liệu mới vào bảng.

Các lệnh cập nhật dữ liệu


Chức năng Dạng lệnh

Bổ sung dữ liệu cụ INSERT INTO <Tên bảng> [(<danh sách cột>)]


thể vào một bảng
VALUES ( <các giá trị>)

Bổ sung vào bảng INSERT INTO <Tên bảng> [(<danh sách cột>)]
các dữ liệu từ bảng
<câu truy vấn>
khác

Xoá các bản ghi DELETE FROM <tên bảng> [WHERE <điều kiện> ]
trong bảng

Thay đổi dữ liệu cho UPDATE <tên bảng>


các bản ghi
SET <tên cột> = <biểu thức [, <tên cột> = <biểu thức> …]
[WHERE <điều kiện> ]

Ví dụ:
Thêm Địa chỉ khách hàng
INSERT INTO KhachHang VALUES ("A000", "Trần Thu Thuỷ", "70/42/132 - Ngọc Khánh")
INSERT INTO KhachHang VALUES ("A001", "Nguyễn Thị Oanh", "34 - Trường Chinh")
INSERT INTO KhachHang VALUES ("A002", "Hoàng Anh Tuấn", "75 - Hàng Bồ")
INSERT INTO KhachHang VALUES ("A003", "Lê Thị Thuý Kiều", "1A - Yết Kiêu")
INSERT INTO KhachHang VALUES ("A004", "Dương Đăng Doanh", "167/12/6 - Đường Thành")
INSERT INTO KhachHang VALUES ("A005", "Hồ Mai Thước", "42 - Giảng Võ")
INSERT INTO KhachHang VALUES ("A006", "Vũ Thanh Bình", "92/132 - Võ Văn Tần")

Thêm dữ liệu trong tệp Hoá đơn chính


INSERT INTO HoaDon VALUES ("Q1/A001","A000","Mua thiết bị y tế cho cơ quan",1000000000,"111")
INSERT INTO HoaDon VALUES ("Q1/A002","A002","Mua văn phòng phẩm", 10000000,"111")
INSERT INTO HoaDon VALUES ("Q1/A003","A006","Mua máy tính",500000000,"111")

Thêm Mã hàng hoá


INSERT INTO Hang VALUES ("X15","Máy X15")
INSERT INTO Hang VALUES ("X23","Máy X23")
INSERT INTO Hang VALUES ("B01","Bút bi loại 1")
INSERT INTO Hang VALUES ("B02","Bút bi loại 2")
INSERT INTO Hang VALUES ("P01","Phấn loại 1")
INSERT INTO Hang VALUES ("P02","Phấn loại 2")
INSERT INTO Hang VALUES ("M01","Máy tinh loại 1")
INSERT INTO Hang VALUES ("M02","Máy tinh loại 2")

Thêm Tên Tài Khoản


INSERT INTO Taikhoan VALUES ("111","Tiền mặt","1")
INSERT INTO Taikhoan VALUES ("156","Vật tư","1")

Thêm Chi tiết hóa đơn


INSERT INTO Ct_HoaDon VALUES (1, "Q1/A001", "X15", 2, 300000000, "156")
INSERT INTO Ct_HoaDon VALUES (2, "Q1/A001", "X23", 1, 400000000, "156")

INSERT INTO Ct_HoaDon VALUES (1, "Q1/A002", "B01", 1000, 2000, "156")
INSERT INTO Ct_HoaDon VALUES (2, "Q1/A002", "B02", 6000, 1000, "156")

Vũ Bá Anh – Phan Phước Long 52


Chương 3:Hệ quản trị CSDL Visual FoxPro

INSERT INTO Ct_HoaDon VALUES (3, "Q1/A002", "P01", 1000, 2000, "156")

INSERT INTO Ct_HoaDon VALUES (1, "Q1/A003", "P01", 20, 15000000, "156")
INSERT INTO Ct_HoaDon VALUES (2, "Q1/A003", "P02", 20, 10000000, "156")

Lệnh truy vấn dữ liệu


Trong SQL, cấu trúc cơ sở của một lệnh truy vấn bao gồm ba mệnh đề: select
– from – where
• Mệnh đề SELECT tương ứng với phép chiếu của đại số quan hệ. Nó
được sử dụng để liệt kê các cột mong muốn trong kết quả của một truy
vấn.
• Mệnh đề FROM tương ứng với phép tích Descartes của đại số quan hệ.
Nó liệt kê các bảng cần tra cứu để đánh giá kết quả của biểu thức.
• Mệnh đề WHERE tương ứng với phép chọn của đại số quan hệ.
Một truy vấn điển hình trong SQL có dạng:
SELECT A1, A2, …, An
FROM r1, r2, …, rm
WHERE <điều kiện>
Trong đó, Ai biểu diễn một cột, ri là tên của một bảng. Truy vấn này tương
đương với biểu thức đại số quan hệ
( r1×r2× …×rm(<điều kiện>) ) [A1, A2, …, An]
Tuy nhiên, không giống với các biểu thức quan hệ, kết quả câu lệnh truy vấn
SQL này có thể chứa các dòng giống nhau.
Ngoài ra, để mở rộng khả năng của ngôn ngữ này, khối select – from – where
còn được bổ sung thêm các mệnh đề GROUP BY, HAVING, ORDER BY, các hàm
mẫu và một số phần mềm còn thêm cả mệnh đề COMPUTER, FOR BROWSE.
Dạng tổng quát của lệnh SELECT được biểu diễn như sau:
SELECT [DISTINCT] <ds cột> | * | <btsh>
FROM <ds tên bảng> | <ds các view>
[WHERE <điều kiện>]
[GROUP BY <ds cột> [HAVING <điều kiện>] ]
[ORDER BY <ds cột> | <biểu thức> [ASC | DSC] ]
[UNION | INTERSECT | MINUS <câu truy vấn>]
Trong đó mệnh đề WHERE được biểu diễn với các dạng sau:
WHERE [NOT] <biểu thức> <phép so sánh> <biểu thức>
WHERE [NOT] <tên cột> [NOT] LIKE <xâu kí tự>
WHERE [NOT] <biểu thức> [NOT] IN ( <ds> | <câu truy vấn> )
WHERE [NOT] EXISTS (<câu truy vấn con>)
WHERE [NOT] <biểu thức> <phép so sánh> {SOME | ANY | ALL (<câu truy
vấn>)}
WHERE [NOT] <biểu thức logic>
WHERE [NOT] <bt logic> {AND | OR} [NOT] <bt logic>

Vũ Bá Anh – Phan Phước Long 53


Chương 3:Hệ quản trị CSDL Visual FoxPro

2.4 Lý thuyết thiết kế CSDL quan hệ


Trong chương này chúng ta sẽ thảo luận về một số vấn đề lý thuyết đã được
phát triển nhằm mục đích chọn được lược đồ quan hệ “tốt”, nghĩa là đo đạc một cách
hình thức vì sao tập hợp các thuộc tính này nhóm vào trong các lược đồ quan hệ thì
tốt hơn nhóm kia. Chúng ta có thể nói đến “tính tốt” của các lược đồ quan hệ ở hai
mức: mức thứ nhất là mức lôgic, mức thứ hai là mức cài đặt. Mức thứ nhất liên quan
đến việc các người sử dụng thể hiện các lược đồ quan hệ và ý nghĩa của các thuộc tính
của chúng như thế nào. Mức thứ hai liên quan đến việc các bộ trong một quan hệ cơ
sở được lưu trữ và cập nhật như thế nào.
Việc thiết kế cơ sở dữ liệu có thể được thực hiện bằng cách sử dụng hai giải
pháp: dưới lên (bottom-up) hoặc trên xuống (top-down). Phương pháp thiết kế dưới
lên xem các mối liên kết cơ bản giữa các thuộc tính riêng rẽ như là điểm xuất phát và
sử dụng chúng để xây dựng nên các quan hệ. Giải pháp này còn có tên gọi là thiết kế
bằng tổng hợp (design by synthesis). Ngược lại, phương pháp thiết kế trên xuống, còn
gọi là thiết kế bằng phân tích (design by analyse) bắt đầu từ một số các nhóm thuộc
tính trong các quan hệ nhận được từ thiết kế quan niệm và các hoạt động chuyển đổi.
Sau đó việc thiết kế bằng phân tích được áp dụng đối với các quan hệ một cách riêng
rẽ và tập thể dẫn đến việc tách các quan hệ cho đến khi đạt được tính chất mong
muốn.

2.4.1 Các nguyên tắc thiết kế một CSDL quan hệ

1. Ngữ nghĩa của các thuộc tính quan hệ


Khi chúng ta nhóm các thuộc tính để tạo nên một lược đồ quan hệ, ta giả thiết
rằng có một ý nghĩa nào đó gắn với các thuộc tính. Ý nghĩa này, còn gọi là ngữ nghĩa,
chỉ ra việc hiểu các giá trị thuộc tính lưu giữ trong các bộ của một quan hệ như thế
nào. Nói cách khác, các giá trị thuộc tính trong một bộ liên hệ với nhau như thế nào.
Nếu việc thiết kế khái niệm được làm một cách cẩn thận, sau đó là một chuyển đổi
sang các quan hệ thì hầu hết ngữ nghĩa đã được giải thích và thiết kế kết quả có một ý
nghĩa rõ ràng. Nói chung, việc giải thích ngữ nghĩa của quan hệ càng dễ dàng thì việc
thiết kế lược đồ quan hệ càng tốt. Một ví dụ về thiết kế lược đồ quan hệ tốt là lược đồ
cơ sở dữ liệu “CÔNG TY”.
NHÂNVIÊN(Họđệm, Tên, MãsốNV, Ngàysinh, Địachỉ, Giớitính, Lương, MãsốNGS, MãsốĐV)
ĐƠNVỊ(TênĐV, MãsốĐV, MãsốNQL, Ngàybắtđầu)
ĐƠNVỊ_ĐỊAĐIỂM(MãsốĐV, ĐịađiểmĐV)
DỰÁN(TênDA, MãsốDA, ĐịađiểmDA, Mã sốĐV)
NHÂNVIÊN_DỰÁN(MãsốNV, MãsốDA, Sốgiờ)
CON(MãsốNV, TênPT, Giớitính, Ngàysinh)
Trong lược đồ đó, các thuộc tính đều có ý nghĩa rõ ràng, không có tính mập mờ.
Nguyên tắc sau sẽ hỗ trợ cho việc thiết kế lược đồ quan hệ.
Nguyên tắc 1: Thiết kế một lược đồ quan hệ sao cho dễ giải thích ý nghĩa của
nó. Đừng tổ hợp các thuộc tính từ nhiều kiểu thực thể và kiểu liên kết vào một quan
hệ đơn. Một cách trực quan, nếu một lược đồ quan hệ tương ứng với một kiểu thực

Vũ Bá Anh – Phan Phước Long 54


Chương 3:Hệ quản trị CSDL Visual FoxPro

thể hoặc một kiểu liên kết thì ý nghĩa trở nên rõ ràng. Ngược lại, một quan hệ tương
ứng với một hỗn hợp các thực thể và liên kết thì ý nghĩa trở nên không rõ ràng.

2. Thông tin dư thừa trong các bộ và sự dị thường cập nhật


Một mục tiêu của thiết kế lược đồ là làm tối thiểu không gian lưu trữ các quan
hệ cơ sở. Các thuộc tính được nhóm vào trong các lược đồ quan hệ có một ảnh hưởng
đáng kể đến không gian lưu trữ. Nếu cùng một thông tin được lưu giữ nhiều lần trong
cơ sở dữ liệu thì ta gọi đó là dư thừa thông tin và điều đó sẽ làm lãng phí không gian
nhớ. Ví dụ, giả sử ta có bảng cơ sở sau đây:
NHÂNVIÊN_ĐƠNVỊ
MãsốNV Họđệm Tên Ngày sinh Địachỉ MãsốĐV TênĐV MãsốNQL
NV001 Lê Vân 12/02/79 Hà nội 5 Nghiêncứu NV002
NV002 Trần Đức Nam 14/02/66 Hà nội 5 Nghiêncứu NV002
NV010 Hoàng Thanh 05/08/79 Nghệ an 4 Hànhchính NV014
NV014 Phạm Bằng 26/06/52 Bắc ninh 4 Hànhchính NV014
NV016 Nguyễn Sơn 14/08/73 Hà nam 5 Nghiêncứu NV002
NV018 Vũ Hương Giang 26/03/83 Nam định 5 Nghiêncứu NV002
NV025 Trần Lê Hoa 15/03/80 Phú thọ 4 Hànhchính NV014
NV061 Hoàng Giáp 02/05/47 Hà tĩnh 1 Lãnhđạo NV061

Ở đây có sự dư thừa thông tin. Nếu một đơn vị có nhiều nhân viên làm việc thì
thông tin về đơn vị (Mã số, Tên đơn vị, Mã số người quản lý) được lưu giữ nhiều lần
trong bảng. So với việc dùng hai bảng NHÂNVIÊN và ĐƠNVỊ riêng rẽ như trong
lược đồ “CÔNG TY”, việc sử dụng bảng này làm lãng phí không gian nhớ.
Ngoài việc lãng phí không gian nhớ nó còn dẫn đến một vấn đề nghiêm trọng là
sự dị thường cập nhật. Dị thường cập nhật bao gồm: Dị thường Chèn, dị thường Xoá,
dị thường Sửa đổi. Những dị thường cập nhật này sẽ đưa vào cơ sở dữ liệu những
thông tin “lạ” và làm cho cơ sở dữ liệu mất tính đúng đắn.
Dị thường Chèn: Gây ra khó khăn khi chèn các bộ giá trị vào bảng hoặc dẫn đến
vi phạm ràng buộc. Ví dụ:
Để chèn một bộ giá trị cho một nhân viên mới vào bảng NHÂNVIÊN_ĐƠNVỊ
ngoài các thông tin về nhân viên, ta phải đưa vào các thông tin về đơn vị mà anh ta
làm việc hoặc các giá trị null (nếu nhân viên không làm việc cho đơn vị nào cả). Các
thông tin về đơn vị phải được đưa vào một cách đúng đắn, phù hợp với các thông tin
của đơn vị đó trong các bộ khác. Trong lúc đó, với lược đồ cơ sở dữ liệu “CÔNGTY”
chúng ta không phải lo lắng gì, vì các thông tin về một đơn vị chỉ được lưu trữ một
lần.
Rất khó chèn một đơn vị mới vào quan hệ NHÂNVIÊN_ĐƠNVỊ nếu đơn vị đó
không có nhân viên nào làm việc. Cách giải quyết duy nhất là điền các giá trị null vào
các thuộc tính của nhân viên. Điều đó làm nảy sinh vấn đề về ràng buộc bởi vì
MãsốNV là khóa chính của quan hệ.
Dị thường Xóa: Gây ra việc mất thông tin khi xóa. Ví dụ khi ta xóa một bộ giá
trị trong bảng NHÂNVIÊN_ĐƠNVỊ. Nếu nhân viên tương ứng với bộ giá trị đó là

Vũ Bá Anh – Phan Phước Long 55


Chương 3:Hệ quản trị CSDL Visual FoxPro

người cuối cùng làm việc cho đơn vị thì phép xóa sẽ kéo theo việc làm mất thông tin
về đơn vị.
Dị thường Sửa đổi: Gây ra việc sửa đổi hàng loạt khi ta muốn sửa đổi một giá trị
trong một bộ nào đó. Ví dụ, ta muốn sửa giá trị của thuộc tính MãsốNQL của đơn vị
5. Điều đó kéo theo ta phải sửa giá trị của thuộc tính này trong tất cả các bộ ứng với
đơn vị 5. Dựa trên các dị thường ở trên, chúng ta có thể phát biểu nguyên tắc sau:
Nguyên tắc 2: Thiết kế các lược đồ quan hệ cơ sở sao cho không sinh ra những
dị thường cập nhật trong các quan hệ. Nếu có xuất hiện những dị thường cập nhật thì
phải ghi chép lại một cách rõ ràng và phải đảm bảo rằng các chương trình cập nhật dữ
liệu sẽ thực hiện một cách đúng đắn.

3. Các giá trị không xác định trong các bộ


Trong một số thiết kế lược đồ, chúng ta có thể nhóm nhiều thuộc tính với nhau
vào một quan hệ “gộp”. Nếu nhiều thuộc tính không thích hợp cho mọi bộ trong một
quan hệ, chúng ta sẽ kết thúc với nhiều giá trị null trong các bộ đó. Điều đó có thể làm
tăng không gian ở mức lưu trữ và có thể dẫn đến vấn đề về hiểu ý nghĩa của các thuộc
tính. Việc chỉ ra các phép nối ở mức lôgic cũng sẽ gặp khó khăn. Một vấn đề nữa với
các giá trị null là các hàm nhóm như COUNT, SUM không đếm được đối với chúng.
Hơn nữa, các giá trị null có thể nhiều cách giải thích, chẳng hạn như thuộc tính không
áp dụng được cho bộ này, giá trị của thuộc tính cho bộ này là không có hoặc giá trị
cho thuộc tính là có nhưng vắng mặt. Tóm lại, các giá trị null có nhiều ý nghĩa khác
nhau .
Nguyên tắc 3: Tránh càng xa càng tốt việc đặt vào trong các quan hệ cơ sở
những thuộc tính mà các giá trị của chúng thường xuyên là null. Nếu không thể tránh
được các giá trị null thì phải đảm bảo rằng chúng chỉ áp dụng trong các trường hợp
đặc biệt và không áp dụng cho một số lớn các bộ trong quan hệ.

4. Sinh ra các bộ giả


Nhiều khi chúng ta đưa vào cơ sở dữ liệu những quan hệ không đúng, việc áp
dụng các phép toán (nhất là các phép nối) sẽ sinh ra các bộ giá trị không đúng, gọi là
các bộ “giả”. Ví dụ, xét hai lược đồ quan hệ:
NV_ĐĐ (Tên, ĐịađiểmDA)
NV_DA1(Mã sốNV, Mã sốDA, Sốgiờ, TênDA, ĐịađiểmDA)
NV_ĐĐ Tên ĐịađiểmDA
Vân Hànội
Vân Namđịnh
Sơn Bắcninh
Giang Hànội

NV_DA1 MãsốNV MãsốDA Sốgiờ TênDA ĐịađiểmDA


NV001 1 32 DA01 Hànội
NV001 2 7 DA02 Namđịnh

Vũ Bá Anh – Phan Phước Long 56


Chương 3:Hệ quản trị CSDL Visual FoxPro

NV016 3 40 DA03 Bắcninh


NV018 1 20 DA01 Hànội

Bây giờ ta nối tự nhiên hai quan hệ trên với nhau, ta có quan hệ
MãsốNV MãsốDA Sốgiờ TênDA Địađiểm Tên
NV001 1 32 DA01 Hànội Vân
*** NV001 1 32 DA01 Hànội Giang
NV001 2 7 DA02 Namđịnh Vân
NV016 3 40 DA03 Bắcninh Sơn
*** NV018 1 20 DA01 Hànội Vân
NV018 1 20 DA01 Hànội Giang

Ta thấy các dòng đánh dấu * là các bộ “giả”. Đấy là các bộ giá trị không có trên
thực tế.
Nguyên tắc 4: Thiết kế các lược đồ quan hệ sao cho chúng có thể được nối với
điều kiện bằng trên các thuộc tính là khoá chính hoặc khoá ngoài theo cách đảm bảo
không sinh ra các bộ “giả”. Đừng có các quan hệ chứa các thuộc tính nối khác với các
tổ hợp khoá chính-khoá ngoài. Nếu không tránh được những quan hệ như vậy thì
đừng nối chúng trên các thuộc tính đó, bởi vì các phép nối có thể sinh ra các bộ “giả”.

2.4.2 Phụ thuộc hàm


Khái niệm cơ bản nhất trong thiết kế lược đồ quan hệ là khái niệm phụ thuộc
hàm. Trong phần này chúng ta sẽ định nghĩa hình thức khái niệm này và cách sử dụng
nó để định nghĩa các dạng chuẩn cho các lược đồ quan hệ.

1. Định nghĩa phụ thuộc hàm


Một phụ thuộc hàm là một ràng buộc giữa hai nhóm thuộc tính của một cơ sở dữ
liệu. Giả sử rằng lược đồ cơ sở dữ liệu của ta có n thuộc tính A1,A2,…,An và ta hãy
nghĩ rằng toàn bộ cơ sở dữ liệu được mô tả bằng một lược đồ quan hệ chung R={A1,
A2,…., An}. Đừng nên nghĩ rằng cơ sở dữ liệu của chúng ta sẽ được lưu trữ trong một
bảng chung, chúng ta chỉ sử dụng khái niệm này để phát triển lý thuyết hình thức về
sự phụ thuộc dữ liệu. Giả sử X và Y là hai tập con của R.
Một phụ thuộc hàm, ký hiệu là X→ Y, giữa hai tập thuộc tính X và Y chỉ ra
một ràng buộc trên các bộ có thể có tạo nên một trạng thái quan hệ r của R. Ràng
buộc đó là: với hai bộ bất kỳ t1 và t2 trong r , nếu có t1[X] = t2[X] thì cũng phải có
t1[Y] = t2[Y]. Điều đó có nghĩa là các giá trị của thành phần Y của một bộ trong R phụ
thuộc vào, hoặc được xác định bởi, các giá trị của thành phần X. Nói cách khác, các
giá trị của thành phần X của một bộ xác định một cách duy nhất các giá trị của thành
phần Y. Chúng ta cũng nói rằng có một phụ thuộc hàm từ X vào Y hoặc Y phụ thuộc
hàm vào X. Phụ thuộc hàm được viết tắt là FD (functional dependency). Tập thuộc
tính X được gọi là vế trái của FD, tập thuộc tính Y được gọi là vế phải của FD.

Vũ Bá Anh – Phan Phước Long 57


Chương 3:Hệ quản trị CSDL Visual FoxPro

Như vậy, X xác định hàm Y trong lược đồ quan hệ R khi và chỉ khi nếu hai bộ
của r(R) bằng nhau trên các giá trị của X thì chúng nhất thiết phải bằng nhau trên các
giá trị của Y. Ta có các nhận xét sau:
• Nếu có một ràng buộc trên các trạng thái của R là chỉ có một bộ giá trị duy
nhất của X trong mọi thể hiện quan hệ r(R) thì điều đó kéo theo X → Y với mọi tập
con các thuộc tính Y của R.
• Nếu X → Y thì không thể nói gì về Y → X.
Một phụ thuộc hàm là một tính chất ngữ nghĩa của các thuộc tính. Những người
thiết kế cơ sở dữ liệu sẽ dùng hiểu biết của họ về ý nghĩa của các thuộc tính của R để
chỉ ra các phụ thuộc hàm có thể có trên mọi trạng thái quan hệ của r(R) của R. Khi
ngữ nghĩa của hai tập thuộc tính trong R chỉ ra rằng có thể có một phụ thuộc hàm,
chúng ta sẽ đặc tả phụ thuộc hàm như một ràng buộc. Các trạng thái quan hệ r(R) thoả
mãn các ràng buộc phụ thuộc hàm được gọi là các trạng thái hợp pháp của R, bởi vì
chúng tuân theo các ràng buộc phụ thuộc hàm. Như vậy, việc sử dụng chủ yếu của các
phụ thuộc hàm là dùng để mô tả một lược đồ quan hệ R bằng việc chỉ ra các ràng
buộc trên các thuộc tính phải thoả mãn ở mọi thời điểm.
Một phụ thuộc hàm là một tính chất của lược đồ quan hệ R chứ không phải là
tính chất của một trạng thái hợp pháp r của R. Vì vậy, một phụ thuộc hàm không thể
được phát hiện một cách tự động từ một trạng thái r mà phải do một người hiểu biết
ngữ nghĩa của các thuộc tính xác định một cách rõ ràng. Ví dụ, ta có quan hệ sau
DẠY Giáoviên Mônhọc Tàiliệu
AA Mônhọc1 XX
AA Mônhọc2 YY
BB Mônhọc3 ZZ
CC Mônhọc4 TT

Mới nhìn qua, chúng ta có thể nói có một phụ thuộc hàm Tàiliệu → Mônhọc,
tuy nhiên chúng ta không thể khẳng định được vì điều đó chỉ đúng với trạng thái quan
hệ này, biết đâu trong trạng thái quan hệ khác có thể có hai môn học khác nhau sử
dụng cùng một tài liệu tham khảo. Với một trạng thái cụ thể, chúng ta chỉ có thể
khẳng định là không có một phụ thuộc hàm giữa nhóm thuộc tính này và nhóm thuộc
tính khác. Để làm điều đó chúng ta chỉ cần đưa ra một phản ví dụ. Chẳng hạn, ở trong
quan hệ trên chúng ta có thể khẳng định rằng không có phụ thuộc hàm giữa Giáoviên
và Mônhọc bằng cách chỉ ra ví dụ là AA dạy hai môn học “ Mônhọc1” và “Mônhọc2”
vậy Giáo viên không thể xác định duy nhất Môn học.
Để biểu diễn các phụ thuộc hàm trong một lược đồ quan hệ, chúng ta sử dụng
khái niệm sơ đồ phụ thuộc hàm. Mỗi FD được biểu diễn bằng một đường nằm ngang.
Các thuộc tính ở vế trái của FD được nối với đường biểu diễn FD bằng các đường
thẳng đứng, các thuộc tính ở vế phải của FD được nối với đường biểu diễn FD bằng
mũi tên chỉ đến các thuộc tính.
Ví dụ: Ta có lược đồ quan hệ

Vũ Bá Anh – Phan Phước Long 58


Chương 3:Hệ quản trị CSDL Visual FoxPro

MƯỢN(Sốthẻ, Mãsốsách, Tênngườimượn, Tênsách, Ngàymượn)


Với các phụ thuộc hàm:
Sốthẻ → Tênngườimượn
Mãsốsách → Tênsách
Sốthẻ, Mãsốsách → Ngàymượn
Có sơ đồ phụ thuộc hàm như sau:
MƯỢN
Sốthẻ Mã số Tên người Tên sách Ngàymượn
sách mượn

2. Các quy tắc suy diễn đối với các phụ thuộc hàm
Chúng ta ký hiệu F là tập các phụ thuộc hàm được xác định trên một lược đồ
quan hệ R. Một phụ thuộc hàm X → Y được gọi là suy diễn được từ một tập các phụ
thuộc hàm F được xác định trên R nếu X → Y đúng trong mỗi trạng thái quan hệ r là
mở rộng hợp pháp của R, nghĩa là mỗi khi r làm thoả mãn mọi phụ thuộc hàm trong
F, X→ Y cũng đúng trong r. Tập hợp tất cả các phụ thuộc hàm suy diễn được từ F
được gọi là bao đóng của F và được ký hiệu là F+. Để xác định một cách suy diễn các
phụ thuộc hàm có hệ thống, chúng ta phải phát hiện một tập hợp các quy tắc suy diễn.
Tập quy tắc này sẽ được sử dụng để suy diễn các phụ thuộc hàm mới từ một tập các
phụ thuộc hàm cho trước. Ta sử dụng ký hiệu F |= X→ Y để ký hiệu phụ thuộc hàm
X→ Y được suy diễn từ tập các phụ thuộc hàm F. Để cho tiện, ta viết tắt phụ thuộc
hàm có dạng {X,Y}→ Z thành XY → Z ( nghĩa là ta nối các biến và bỏ dấu ngoặc
nhọn đi). Có 6 quy tắc suy diễn đối với các phụ thuộc hàm:
QT1 (quy tắc phản xạ) : Nếu X ⊃ Y thì X → Y
QT2 (quy tắc tăng) : { X→ Y } |= XZ →YZ
QT3 (quy tắc bắc cầu) : { X→ Y, Y→ Z } |= X→ Z
QT4 (quy tắc chiếu) : { X→ YZ } |= X→ Y và X→ Z
QT5 (quy tắc hợp) : { X→ Y , X→ Z } |= X→ YZ
QT6 (quy tắc tựa bắc cầu) : { X→ Y, WY→ Z } |= WX→ Z
Quy tắc phản xạ phát biểu rằng một tập hợp các thuộc tính luôn luôn xác định
chính nó hoặc một tập con bất kỳ của nó. Vì QT1 tạo ra các phụ thuộc luôn luôn đúng,
những phụ thuộc như vậy được gọi là tầm thường. Một cách hình thức, một phụ thuộc
hàm X → Y là tầm thường nếu X ⊃Y, ngược lại, nó được gọi là không tầm thường.
Quy tắc tăng nói rằng việc thêm cùng một tập thuộc tính vào cả hai vế của một phụ
thuộc hàm sẽ tạo ra một phụ thuộc hàm đúng đắn. Theo quy tắc 3, các phụ thuộc hàm
là bắc cầu. Quy tắc chiếu (QT4) nói rằng chúng ta có thể bỏ bớt các thuộc tính ra khỏi
vế phải của phụ thuộc hàm. Việc áp dụng nhiều lần quy tắc này có thể tách phụ thuộc

Vũ Bá Anh – Phan Phước Long 59


Chương 3:Hệ quản trị CSDL Visual FoxPro

hàm X → {A1, A2,…, An} thành một tập hợp phụ thuộc hàm { X→ A1, X→ A2, ...,
X→ An}. Quy tắc hợp cho phép chúng ta làm ngược lại, ta có thể gộp các phụ thuộc
hàm { X→ A1, X→A2, ..., X→ An} thành một phụ thuộc hàm đơn X→ {A1, A2, ...,
An}.
Có thể chứng minh các quy tắc suy diễn ở trên một cách trực tiếp hoặc bằng
phản chứng dựa trên định nghĩa của phụ thuộc hàm. Để chúng minh phản chứng, ta
giả thiết một quy tắc là không đúng và chỉ ra rằng điều đó là không thể. Sau đây là
chứng minh các quy tắc.
Quy tắc 1:
Giả sử rằng X ⊃ Y và hai bộ t1 và t2 trong một thể hiện quan hệ r của R sao cho
t1[X] = t2[X]. Khi đó t1[Y] = t2[Y] bởi vì X ⊃ Y, như vậy X→ Y phải xảy ra trong r.
Quy tắc 2: (chứng minh phản chứng)
Giả sử rằng X→Y đúng trong một thể hiện quan hệ r của R nhưng XZ→ YZ
không đúng. Khi đó phải có hai bộ t1 và t2 trong r sao cho:
(1) t1[X] = t2[X],
(2) t1[Y] = t2[Y],
(3) t1[XZ] = t2[XZ] và
(4) t1[YZ] ≠ t2[YZ]. Điều đó là không thể bởi vì từ (1) và (3) chúng ta suy ra
(5) t1[Z] = t2[Z], và từ (2) và (5) ta suy ra t1[YZ] = t2[YZ], mâu thuẫn với (4).
Quy tắc 3: Giả sử rằng
(1) X→ Y và (2) Y→ Z cả hai đúng trong một quan hệ r. Khi đó với mọi bộ t1
và t2 trong r sao cho t1[X] = t2[X] ta phải có (3) t1[Y] = t2[Y] theo giả thiết (1). Như
vậy chúng ta cũng phải có (4) t1[Z] = t2[Z] theo (3) và giả thiết (2). Vậy X→ Z phải
đúng trong r.
Chúng ta có thể chứng minh các quy tắc từ quy tắc 4 đến quy tắc 6 theo phương
pháp trên. Tuy nhiên ta có thể lợi dụng các quy tắc đã được chứng minh là đúng để
chứng minh chúng. Sau đây ta chứng minh theo cách đó.
Quy tắc 4:
1. X→ YZ (cho trước)
2. YZ → Y (sử dụng QT1 và YZ ⊃ Y)
3. X→ Y (sử dụng QT3 trên 1. và 2.)
Quy tắc 5:
1. X→ Y (cho trước)
2. X→ Z (cho trước)
3. X→ YX (sử dụng QT2 trên 1. bằng cách thêm vào cả hai vế X, và XX=X)
4. YX→ YZ (sử dụng QT2 trên 2. bằng cách thêm vào cả hai vế Y)
5. X→YZ (sử dụng QT3 trên 3. và 4.)
Quy tắc 6:
1. X→Y (cho trước )

Vũ Bá Anh – Phan Phước Long 60


Chương 3:Hệ quản trị CSDL Visual FoxPro

2. WY→Z (cho trước)


3. WX→WY (sử dụng QT2 trên 1. bằng cách thêm vào cả hai vế W)
4. WX→ Y (sử dụng QT3 trên 3. và 2.)
Amstrong đã chứng minh rằng các quy tắc suy diễn từ QT1 đến QT3 là đúng và
đầy đủ. Đúng có nghĩa là cho trước một tập các phụ thuộc hàm F trên một lược đồ
quan hệ R , bất kỳ một phụ thuộc hàm nào suy diễn được bằng cách áp dụng các quy
tắc từ QT1 đến QT3 cũng đúng trong mỗi trạng thái quan hệ r của R thoả mãn các phụ
thuộc hàm trong F. Đầy đủ có nghĩa là việc sử dụng các quy tắc từ QT1 đến QT3 lặp
lại nhiều lần để suy diễn các phụ thuộc hàm cho đến khi không còn suy diễn được nữa
sẽ cho kết quả là một tập hợp đầy đủ các phụ thuộc hàm có thể được suy diễn từ F.
Nói cách khác, tập hợp các phụ thuộc hàm F+ (bao đóng của F) có thể xác định được
từ F bằng cách áp dụng các quy tắc suy diễn từ QT1 đến QT3. Các quy tắc từ QT1
đến QT3 được gọi là các quy tắc suy diễn Amstrong.
Thông thường, những người thiết kế cơ sở dữ liệu đầu tiên chỉ ra một tập các
phụ thuộc hàm dễ xác định được nhờ ngữ nghĩa của các thuộc tính của R. Sau đó, sử
dụng các quy tắc Amstrong để suy diễn các phụ thuộc hàm bổ sung. Một cách có hệ
thống, để xác định tất cả các phụ thuộc hàm bổ sung là đầu tiên hãy xác định mỗi tập
thuộc tính X xuất hiện ở vế trái của một phụ thuộc hàm nào đấy trong F và sau đó xác
định tập hợp tất cả các thuộc tính phụ thuộc vào X. Như vậy, với mỗi tập thuộc tính
X, chúng ta xác định tập X+ các thuộc tính phụ thuộc hàm vào X dựa trên F. X+ được
gọi là bao đóng của X dưới F. Thuật toán xác định X+ như sau:
Thuật toán 1: ( xác định X+, bao đóng của X dưới F)
X+ = X;
Repeat
Old X+ = X+ ;
với mỗi phụ thuộc hàm Y → Z trong F thực hiện
nếu X+ ⊃ Y thì X+ = X+ ∪ Z;
until ( X+ = Old X+ );

Ví dụ: Xét lược đồ quan hệ


R = {MãsốNV, HọtênNV, MãsốDA, TênDA, ĐịađiểmDA, Sốgiờ}
và tập phụ thuộc hàm F = {MãsốNV → HọtênNV,
MãsốDA → TênDA, ĐịađiểmDA,
{MãsốNV, MãsốDA} → Số giờ}
Áp dụng thuật toán 1 ta có:
{MãsốNV}+ = { MãsốNV, HọtênNV}
{MãsốDA }+ = { MãsốDA, TênDA, ĐịađiểmDA}
{MãsốNV, MãsốDA}+ = {MãsốNV, HọtênNV, MãsốDA, TênDA, Sốgiờ}
Bao đóng và khóa: Để ý rằng nếu X+ là là tập tất cả các thuộc tính của quan hệ
thì có nghĩa là X xác định hàm các thuộc tính còn lại, hay nói cách khác X là một
siêu khóa. Chúng ta có thể kiểm tra xem một tập thuộc tính X có phải là khóa của một

Vũ Bá Anh – Phan Phước Long 61


Chương 3:Hệ quản trị CSDL Visual FoxPro

quan hệ bằng cách trước tiên xem X+ có chứa tất cả các thuộc tính của quan hệ hay
không sau đó kiểm tra không có một tập con S nào được lập từ X bằng cách loại bỏ
một thuộc tính của X thỏa mãn S+chứa tất cả các thuộc tính của quan hệ (nghĩa là X là
siêu khóa tối thiểu). Ví dụ:
Xét lược đồ quan hệ R( A,B,C,D,E,F) và tập phụ thuộc hàm
F ={ A,B → F ; A→ C,D; B → E }
Ta có {A,B}+ = {A,B,C,D,E,F}, A+ = {A,C,D}, B+ = {B,E} , vậy AB là khóa
của quan hệ.

3. Sự tương đương của các tập phụ thuộc hàm


Trong phần này chúng ta thảo luận về sự tương đương của hai tập phụ thuộc
hàm. Một tập hợp các phụ thuộc hàm E được phủ bởi một tập các phụ thuộc hàm F -
hoặc F phủ E - nếu mỗi một phụ thuộc hàm trong E đều ở trong F+ ,điều đó có nghĩa
là mỗi phụ thuộc hàm trong E có thể suy diễn được từ F. Hai tập phụ thuộc hàm E và
F là tương đương nếu E+ = F+. Như vậy tương đương có nghĩa là mỗi phụ thuộc hàm
trong E có thể suy diễn được từ F và mỗi phụ thuộc hàm trong F có thể suy diễn được
từ E.
Chúng ta có thể xác định xem F có phủ E hay không bằng cách tính X+ đối với
F đối với mỗi thuộc hàm X→Y trong E và sau đó kiểm tra xem X+ này có các thuộc
tính trong Y hay không (nghĩa là X+ ⊃ Y). Nếu điều đó xẩy ra với mỗi phụ thuộc hàm
trong E, thì F phủ E. Chúng ta xác định xem E và F có tương đương hay không bằng
cách kiểm tra E phủ F và F phủ E.
Ví dụ : Xét hai tập phụ thuộc hàm
F = {A →C, AC → D, E→AD, E →H }
E = { A →CD, E → AH }
Ta chứng minh F phủ E:
Tìm bao đóng của các vế trái của các phụ thuộc hàm trong E theo F. Áp dụng
thuật toán 1 ở trên, ta có:
{A}+ = { A, C, D };
{E}+ = {E, A,D, H}
ta thấy các bao đóng này chứa các vế phải tương ứng. Từ đó suy ra F phủ E.
Ta chứng minh E phủ F:
Tìm bao đóng của các vế trái của các phụ thuộc hàm trong F theo E. Ta có
{A}+ ={A,C,D},
{AC}+ = { A,C,D},
{E}+ = {E,A,H}, ta thấy các bao đóng này chứa các vế phải tương
ứng. Từ đó suy ra E phủ F.
Tóm lại E tương đương với F.

Vũ Bá Anh – Phan Phước Long 62


Chương 3:Hệ quản trị CSDL Visual FoxPro

4. Các tập phụ thuộc hàm tối thiểu


Một tập phụ thuộc hàm là tối thiểu nếu nó thoả mãn các điều kiện sau đây:
1. Vế phải của các phụ thuộc hàm trong F chỉ có một thuộc tính.
2. Chúng ta không thể thay thế bất kỳ một phụ thuộc hàm X →A trong F bằng
phụ thuộc hàm Y→A, trong đó Y là tập con đúng của X mà vẫn còn là một tập phụ
thuộc hàm tương đương với F.
3. Chúng ta không thể bỏ đi bất kỳ phụ thuộc hàm nào ra khỏi F mà vẫn có một
tập phụ thuộc hàm tương đương với F.
Chúng ta có thể nghĩ về tập tối thiểu các phụ thuộc hàm như là một tập hợp ở
dạng chuẩn không có sự dư thừa. Điều kiện 1 đảm bảo rằng mỗi phụ thuộc hàm là ở
dạng chính tắc với một thuộc tính ở vế phải. Điều kiện 2 và 3 đảm bảo rằng không có
sự dư thừa trong các phụ thuộc hoặc do có các thuộc tính dư thừa ở vế trái của phụ
thuộc, hoặc do có một phụ thuộc có thể được suy diễn từ các phụ thuộc khác ở trong
F.
Một phủ tối thiểu của một tập phụ thuộc hàm F là một tập tối thiểu các phụ
thuộc hàm Fmin tương đương với F. Thường có rất nhiều các phủ tối thiểu cho một tập
các phụ thuộc hàm. Chúng ta luôn luôn có thể tìm được ít nhất là một phủ tối thiểu G
cho một tập các phụ thuộc hàm F bất kỳ theo thuật toán 2 sau đây:
Thuật toán 2: ( Tìm phủ tối thiểu G cho F)
1. Đặt G := F;
2. Thay thế mỗi phụ thuộc hàm X → {A1, A2, ..., An} trong G bằng n phụ thuộc
hàm X → A1, X → A2, … , X → An.
3. Với mỗi phụ thuộc hàm X → A trong G,
với mỗi thuộc tính B là một phần tử của X
nếu ((G – (X → A) ∪ ((X − {B}) → A) là tương đương với G
thì thay thế X→A bằng (X – {B})→A ở trong G
4. Với mỗi phụ thuộc hàm X→A còn lại trong G
nếu (G − {X → A}) là tương đương với G
thì loại bỏ X → A ra khỏi G
Ví dụ áp dụng : Tìm phủ tối thiểu cho tập phụ thuộc hàm:
{A → B, A → C, B → A, B → C, C → A, C → B}
Áp dụng thuật toán trên, chúng ta có thể tìm được các phủ tối thiểu sau:
1) Do A→B và B→C nên A→C là thừa. Do C→B và B→A nên C→A là
thừa. Bỏ những phụ thuộc hàm thừa đi, ta có {A→B, B→A, B→C, C→B} là một phủ
tối thiểu.
2) Do A→B và B→C nên A→C là thừa. Do có B→C và C→A nên B→A
là thừa. Do có C→A và A→B nên C→B là thừa. Bỏ những phụ thuộc hàm thừa đi, ta
nhận được một phủ tối thiểu khác là {A→B, B→C, C→A}

Vũ Bá Anh – Phan Phước Long 63


Chương 3:Hệ quản trị CSDL Visual FoxPro

2.4.3 Phép tách các lược đồ quan hệ


Phép tách một lược đồ quan hệ R(U) là việc thay thế nó bởi tập các lược đồ
con { R1(U1), R2(U2),…, Rk(Uk)}, trong đó, U=U1∪U2 ∪ … ∪ Uk. Chú ý rằng các lược
đồ con không nhất thiết phải rời nhau.
Ví dụ: cho lược đồ sách trên thư viện
MUON(Masv, HoTen, MaSach, TenSach, NgayMuon) với các phụ thuộc hàm
Masv → Hoten, Masach → TenSach, {Masv, Masach} → NgayMuon
Lược đồ MUON có thể thay thế bằng ba lược đồ:
SV(Masv, HoTen), SACH(MaSach, TenSach), MS(Masv, MaSach,
NgayMuon)
Do vậy, có một vấn đề được đặt ra là liệu một cơ sở dữ liệu r thỏa trên R, khi
tách ra thành các R1, R2, …, Rk có còn phù hợp không? Các r[R1], r[R2], …, r[Rk] có
còn giữ được các thông tin với r? Nói cách khác, nếu kết nối tự nhiên lại giữa các
r[R1], r[R2], …, r[Rk], liệu có tạo lại được quan hệ r cũ không? Vấn đề này sẽ được
trình bày thông qua một số khái niệm sau:
Nếu R là một lược đồ quan hệ được tách ra thành các lược đồ con R1, R2, …,
Rk và F là tập các phụ thuộc hàm. Phép tách trên được gọi là tách – kết nối không mất
mát thông tin(Lossless Join Decomposition) đối với F, nếu mọi quan hệ r trên R, ta
đều có r=r1*r2*…*rk , trong đó ri=r[Ri]={t[Ui]: t∈r}
Như vậy, ρ=(R1, R2, …, Rk) là tách –kết nối không mất mát thông tin đối với F
khi kết nối các hình chiếu của r lên các thành phần Ri ta lại được chính quan hệ r.
Đặt mρ(r)= r1*r2*…*rk , trong đó ri=r[Ri]={t[Ui]: t∈r} thì điều kiện để tách –
kết nối không mất mát thông tin có thể viết ngắn gọn là r=mρ(r)
Bổ đề: Gọi R là lược đồ quan hệ, ρ=(R1, R2, …, Rk) là một phép tách của R, r
là một quan hệ trên R, và ri=r[Ri]={t[Ui]: t∈r}thì
i) r ⊆ mρ(r)
ii) Nếu s = mρ(r) thì s[Ri]=ri
iii) mρ( mρ(r))= mρ(r)
Thuật toán sau sẽ kiểm tra xem phép tách - kết nối có mất mát thông tin hay
không đối với tập các phụ thuộc hàm F?
Thuật toán 3:(Kiểm tra tính kết nối không mất mát thông tin)
Vào: Tập các thuộc tính U={A1, A2, …, An}, tập các phụ thuộc hàm F trên U
và phép tách ρ=(R1, R2, …, Rk)
Ra: Kết luận ρ có phải là phép tách – kết nối không mất mát thông tin không?
Phương pháp: Lập bảng kích thước k×n, trong đó k dòng lần lượt được đại
diện bởi U1,U2 , … , Uk và n cột được đại diện bởi A1, A2, …, An.
Tại dòng i cột j ta kí hiệu: aj nếu Aj ∈Ui, trong trường hợp ngược lại (Aj∉Ui)
thì kí hiệu bij.

Vũ Bá Anh – Phan Phước Long 64


Chương 3:Hệ quản trị CSDL Visual FoxPro

Với mỗi X → Y trong F, xét các dòng của bảng, nếu có giá trị bằng nhau trên
tập thuộc tính X (ví như có t1, t2 mà t1[X]=t2[X]) thì làm bằng giá trị của chúng trên Y
(ví dụ t1[Y]=t2[Y]) theo quy tắc:
- Nếu một trong hai kí hiệu có dạng ai thì kí hiệu kia sẽ được thay bằng ai
- Nếu cả hai kí hiệu đều có dạng bij thì lấy tùy ý một trong hai kí hiệu đó gán
chung cho cả hai.
Sau khi biến đổi bảng, nếu có một dòng gồm toàn kí hiệu dạng ai thì phép tách
là kết nối không mất mát thông tin, còn ngược lại phép tách đó làm tổn thất thông tin.
Ví dụ: cho lược đồ sách trên thư viện
MUON(Masv, HoTen, MaSach, TenSach, NgayMuon) với các phụ thuộc hàm
Masv → Hoten, Masach → TenSach, {Masv, Masach} → NgayMuon
Lược đồ MUON được tách thành ba lược đồ:
SV(Masv, HoTen),
SACH(MaSach, TenSach),
MS(Masv, MaSach, NgayMuon)
Lập bảng ban đầu:
Masv MaSach HoTen TenSach NgayMuon
Masv, HoTen a1 b12 a3 b14 b15
MaSach, TenSach b21 a2 b23 a4 b25
Masv, MaSach, NgayMuon a1 a2 b33 b34 a5
Áp dụng phụ thuộc hàm Masv → Hoten cho ba dòng của bảng ta có
Masv MaSach HoTen TenSach NgayMuon
Masv, HoTen a1 b12 a3 b14 b15
MaSach, TenSach b21 a2 b23 a4 b25
Masv, MaSach, NgayMuon a1 a2 a3 b34 a5
Áp dụng phụ thuộc hàm Masach → TenSach cho ba dòng của bảng ta có
Masv MaSach HoTen TenSach NgayMuon
Masv, HoTen a1 b12 a3 b14 b15
MaSach, TenSach b21 a2 b23 a4 b25
Masv, MaSach, NgayMuon a1 a2 a3 a4 a5
Bảng cuối có dòng thứ ba toàn các giá trị là a, do đó kết nối trên không mất
mát thông tin.
Định lí 1: Thuật toán trên là đúng đắn.
Định lí 2: Giả sử ρ=(R1, R2) là một phép tách của lược đồ quan hệ R, F là tập
các phụ thuộc hàm trên R. Khi đó, ρ là phép tách – kết nối không mất mát thông tin
đối với F khi và chỉ khi
U1∩U2 → U1-U2 hoặc U1∩U2 → U2-U1

2.4.4 Chuẩn hoá các lược đồ quan hệ


Sau khi đã nghiên cứu các phụ thuộc hàm và một số tính chất của chúng, bây
giờ chúng ta sẽ sử dụng chúng như thông tin về ngữ nghĩa của các lược đồ quan hệ.
Ta giả sử rằng mỗi một quan hệ được cho trước một tập các phụ thuộc hàm và mỗi

Vũ Bá Anh – Phan Phước Long 65


Chương 3:Hệ quản trị CSDL Visual FoxPro

quan hệ có một khoá chính. Trong phần này chúng ta sẽ nghiên cứu các dạng chuẩn
và quá trình chuẩn hoá các lược đồ quan hệ.

1. Nhập môn về chuẩn hoá


Quá trình chuẩn hoá (do Codd đề nghị 1972) lấy một lược đồ quan hệ và thực
hiện một loạt các kiểm tra để xác nhận nó có thoả mãn một dạng chuẩn nào đó hay
không. Quá trình này được thực hiện theo phương pháp trên xuống bằng việc đánh giá
mỗi quan hệ với tiêu chuẩn của các dạng chuẩn và tách các quan hệ nếu cần. Quá
trình này có thể xem như là việc thiết kế quan hệ bằng phân tích. Lúc đầu, Codd đề
nghị ba dạng chuẩn gọi là dạng chuẩn 1, dạng chuẩn 2 và dạng chuẩn 3. Một định
nghĩa mạnh hơn cho dạng chuẩn 3 gọi là dạng chuẩn Boyce-Codd do Boyce và Codd
đề nghị muộn hơn. Tất cả các dạng chuẩn này dựa trên các phụ thuộc hàm giữa các
thuộc tính của một quan hệ. Sau đó, dạng chuẩn 4 (4NF) và dạng chuẩn 5 (5NF) được
đề nghị dựa trên các phụ thuộc hàm đa trị và các phụ thuộc hàm nối.
Chuẩn hoá dữ liệu có thể được xem như một quá trính phân tích các lược đồ quan hệ
cho trước dựa trên các phụ thuộc hàm và các khoá chính của chúng để đạt đến các
tính chất mong muốn:
(1) Cực tiểu sự dư thừa và
(2) Cực tiểu các phép cập nhật bất thường.
Các lược đồ quan hệ không thoả mãn các kiểm tra dạng chuẩn sẽ được tách ra
thành các lược đồ quan hệ nhỏ hơn thoả mãn các kiểm tra và có các tính chất mong
muốn. Như vậy, thủ tục chuẩn hoá cung cấp cho những người thiết kế cơ sở dữ liệu:
• Một cơ cấu hình thức để phân tích các lược đồ quan hệ dựa trên các khoá của nó
và các phụ thuộc hàm giữa các thuộc tính của nó.
• Một loạt các kiểm tra dạng chuẩn có thể thực hiện trên các lược đồ quan hệ
riêng rẽ sao cho cơ sở dữ liệu quan hệ có thể được chuẩn hoá đến một mức cần
thiết.
Dạng chuẩn của một quan hệ liên quan đến điều kiện dạng chuẩn cao nhất mà
nó thoả mãn. Các dạng chuẩn khi được xem xét độc lập với các sự kiện khác không
đảm bảo một thiết kế cơ sở dữ liệu tốt. Nói chung, việc xác minh riêng biệt từng lược
đồ quan hệ ở dạng chuẩn này dạng chuẩn nọ là chưa đủ. Tốt hơn là quá trình chuẩn
hoá thông qua phép tách phải khẳng định một vài tính chất hỗ trợ mà tất cả các lược
đồ quan hệ phải có. Chúng gồm hai tính chất sau:
• Tính chất nối không mất mát (hoặc nối không phụ thêm), nó đảm bảo rằng vấn
đề tạo ra các bộ giả không xuất hiện đối với các lược đồ quan hệ được tạo ra sau
khi tách.
• Tính chất bảo toàn sự phụ thuộc, nó đảm bảo rằng từng phụ thuộc hàm sẽ được
biểu hiện trong các quan hệ riêng rẽ nhận được sau khi tách.
Tính chất nối không mất mát là rất quan trọng, phải đạt được bằng mọi giá, còn
tính chất bảo toàn phụ thuộc thì cũng rất mong muốn nhưng đôi khi có thể hy sinh.

Vũ Bá Anh – Phan Phước Long 66


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trước khi định nghĩa các dạng chuẩn chúng ta xem lại định nghĩa các khóa của một
quan hệ. Một siêu khóa (superkey) của một lược đồ quan hệ R = {A1, A2, .., An} là
một tập con S các thuộc tính của R, S ⊆ R, có tính chất là không có hai bộ t1, t2 trong
một trạng thái quan hệ hợp pháp r nào của R mà t1[S] = t2[S]. Một khóa K là một siêu
khóa có tính chất là nếu bỏ đi bất kỳ thuộc tính nào ra khỏi K thì K không còn là siêu
khóa nữa. Điều đó có nghĩa là khóa là một siêu khóa tối thiểu. Nếu một lược đồ quan
hệ có nhiều hơn một khóa thì các khóa đó được gọi là các khóa dự tuyển. Một trong
những khóa dự tuyển sẽ được chỉ định làm khóa chính và các khóa còn lại được gọi là
các khóa phụ (secondary key). Một lược đồ quan hệ phải có một khóa chính. Một
thuộc tính của một lược đồ quan hệ R được gọi là một thuộc tính khóa của R nếu nó là
một thành phần của khóa chính của R. Một thuộc tính được gọi là thuộc tính không
khóa nếu nó không phải là một thuộc tính khóa.

2. Dạng chuẩn 1
Một quan hệ được gọi là ở dạng chuẩn 1 (1NF) nếu miền giá trị của một thuộc
tính chỉ chứa các giá trị nguyên tử (đơn, không phân chia được) và giá trị của mỗi
thuộc tính trong một bộ phải là một giá trị đơn lấy từ miền giá trị của thuộc tính đó.
Như vậy, 1NF không cho phép quan hệ có các thuộc tính đa trị hoặc có các nhóm
thuộc tính lặp (quan hệ trong quan hệ). Nó chỉ cho phép các giá trị của các thuộc tính
là nguyên tử.
Ví dụ, xét các quan hệ ĐƠNVỊ và NHÂNVIÊN_DỰÁN như hình dưới đây. Các
quan hệ này không thỏa mãn điều kiện 1NF. Quan hệ ĐƠNVỊ chứa thuộc tính đa trị
Địađiểm, quan hệ NHÂNVIÊN_DỰÁN chứa nhóm các thuộc tính lặp (Tênnhânviên,
Sốgiờ).
ĐƠNVỊ MãsốĐV TênĐV Mã sốNQL Địađiểm

5 Nghiêncứu NV002 Namđịnh, Hànội,Bắcninh

4 Hànhchính NV014 Hànôi

1 Lãnhđạo NV061 Hànội

NHÂNVIÊN_DỰÁN MãsốDA TênDA Tênnhânviên Sốgiờ

1 DA01 Vân 15
Nam 20

2 DA02 Nam 10
Thanh 12
Bằng 28

3 DA03 Thanh 20

Để đạt đến dạng chuẩn 1 đối với các quan hệ ở trên chúng ta dùng phương pháp
sau:

Vũ Bá Anh – Phan Phước Long 67


Chương 3:Hệ quản trị CSDL Visual FoxPro

Loại bỏ các thuộc tính vi phạm dạng chuẩn 1 và đặt chúng vào một bảng riêng
cùng với khoá chính của quan hệ ban đầu. Khoá chính của bảng này là một tổ hợp của
khoá chính của quan hệ ban đầu và thuộc tính đa trị hoặc khoá bộ phận của nhóm lặp.
Các thuộc tính còn lại lập thành một quan hệ với khóa chính là khóa chính ban đầu.
Áp dụng : Lược đồ quan hệ ĐƠNVỊ ở trên sẽ được tách thành hai:
ĐƠNVỊ (Mã sốĐV, TênĐV, Mã sốNQL)
ĐƠNVỊ_ĐỊAĐIỂM ( MãsốĐV, Địađiểm)
Lược đồ quan hệ NHÂNVIÊN_DỰÁN cũng được tách thành hai:
DỰÁN (MãsốDA, TênDA)
NHÂNVIÊN_DỰÁN(MãsốDA, Tênnhânviên, Sốgiờ)

3. Dạng chuẩn 2
Dạng chuẩn 2 (2NF) dựa trên khái niệm phụ thuộc hàm đầy đủ. Một phụ thuộc
hàm X → Y là một phụ thuộc hàm đầy đủ nếu loại bỏ bất kỳ thuộc tính A nào ra khỏi
X thì phụ thuộc hàm không còn đúng nữa. Điều đó có nghĩa là, với thuộc tính A bất
kỳ, A ∈ X, (X – {A}) không xác định Y. Một phụ thuộc hàm X → Y là phụ thuộc bộ
phận nếu có thể bỏ một thuộc tính A∈ X, ra khỏi X phụ thuộc hàm vẫn đúng, điều đó
có nghĩa là với A∈ X, (X – {A}) → Y.
Ví dụ, xét lược đồ quan hệ
NHÂNVIÊN_DỰÁN(MãsốNV, MãsốDA, Sốgiờ, HọtênNV, TênDA, ĐịađiểmDA)
MãsốNV, MãsốDA → Sốgiờ là phụ thuộc hàm đầy đủ
MãsốNV, MãsốDA → HọtênNV là phụ thuộc hàm bộ phận, bởi vì có phụ thuộc
hàm
MãsốNV →HọtênNV
Việc kiểm tra đối với 2NF bao gồm việc kiểm tra đối với các phụ thuộc hàm có
các thuộc tính ở vế trái của nó là một bộ phận của khoá chính. Nếu khoá chính chứa
một thuộc tính đơn thì không cần phải kiểm tra. Một lược đồ quan hệ R là ở dạng
chuẩn 2 nếu nó thỏa mãn dạng chuẩn 1 và mỗi thuộc tính không khoá A trong R là
phụ thuộc hàm đầy đủ vào khoá chính của R.
Nếu một quan hệ không thoả mãn điều kiện 2NF ta có thể chuẩn hoá nó để có
các quan hệ 2NF như sau: Loại bỏ các thuộc tính không khoá phụ thuộc vào một bộ
phận khoá chính và tách thành ra một bảng riêng, khoá chính của bảng là bộ phận
khoá mà chúng phụ thuộc vào. Các thuộc tính còn lại lập thành một quan hệ, khóa
chính của nó là khóa chính ban đầu.
Ví dụ, xét lược đồ quan hệ:
NHÂNVIÊN_DỰÁN(MãsốNV, MãsốDA, Sốgiờ, HọtênNV, TênDA, ĐịađiểmDA) với
các phụ thuộc hàm:
MãsốNV, MãsốDA → Sốgiờ
MãsốNV →HọtênNV
MãsốDA→TênDA, ĐịađiểmDA

Vũ Bá Anh – Phan Phước Long 68


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ta thấy ở đây có những thuộc tính không khoá phụ thuộc vào một bộ phận của
khoá chính, như vậy nó không thoả mãn điều kiên 2NF.
Áp dụng phương pháp chuẩn hoá trên, lược đồ được tách thành các lược đồ như
sau:
N_D1(MãsốDA, TênDA, ĐịađiểmDA)
N_D2(MãsốNV , HọtênNV)
N_D3(MãsốNV, MãsốDA, Sốgiờ)

4. Dạng chuẩn 3
Dạng chuẩn 3 (3NF) dựa trên khái niệm phụ thuộc bắc cầu. Một phụ thuộc hàm
X → Y trong một lược đồ quan hệ R là một phụ thuộc hàm bắc cầu nếu có một tập
hợp thuộc tính Z không phải là một khoá dự tuyển cũng không phải là một tập con của
một khoá nào và cả hai X → Z và Z →Y đều đúng. Theo định nghĩa nguyên thuỷ của
Codd, một lược đồ quan hệ R là ở 3NF nếu nó thoả mãn 2NF và không có thuộc tính
không khoá nào của R là phụ thuộc bắc cầu vào khoá chính.
Nếu một lược đồ quan hệ không thoả mãn điều kiện 3NF, ta có thể chuẩn hoá
nó để có được các lược đồ 3NF như sau: Loại bỏ các thuộc tính phụ thuộc bắc cầu ra
khỏi quan hệ và tách chúng thành một quan hệ riêng có khoá chính là thuộc tính bắc
cầu. Các thuộc tính còn lại lập thành một quan hệ có khóa chính là quan hệ ban đầu.
Ví dụ: Xét lược đồ quan hệ
NHÂNVIÊN_ĐƠNVỊ(HọtênNV, MãsốNV, Ngàysinh, Địachỉ, MãsốĐV, TênĐV, MãsốNQL)
Với các phụ thuộc hàm:
MãsốNV→ HọtênNV, Ngày sinh, Địachỉ, MãsốĐV, TênĐV, MãsốNQL
MãsốDV→ TênĐV, Mã sốNQL
Các thuộc tính TênĐV, MãsốNQL phụ thuộc bắc cầu vào khoá chính, lược đồ
quan hệ không thoả mãn điều kiện 3NF.
Áp dụng phương pháp chuẩn hoá ở trên, lược đồ được tách ra như sau:
NV_DV1(HọtênNV, MãsốNV, Ngàysinh, Địachỉ, MãsốĐV)
NV_DV2(MãsốĐV, TênĐV, MãsốNQL)

5. Dạng chuẩn Boyce-Codd


Một lược đồ quan hệ R được gọi là ở dạng chuẩn Boyce-Codd (BCNF) nếu nó
là ở dạng chuẩn 3NF và không có các thuộc tính khóa phụ thuộc hàm vào thuộc tính
không khóa.
Ví dụ: Lược đồ
R (A1,A2,A3,A4,A5)
Với các phụ thuộc hàm:
A1,A2 → A3,A4,A5
A4 → A2
Quan hệ này vi phạm dạng chuẩn BCNF bởi vì có thuộc tính khóa (A2) phụ
thuộc hàm vào thuộc tính không khóa (A4).

Vũ Bá Anh – Phan Phước Long 69


Chương 3:Hệ quản trị CSDL Visual FoxPro

Nếu một lược đồ quan hệ không thoả mãn điều kiện BCNF, ta có thể chuẩn hoá
nó để có được các lược đồ BCNF như: Loại bỏ các thuộc tính khóa phụ thuộc hàm
vào thuộc tính không khóa ra khỏi quan hệ và tách chúng thành một quan hệ riêng có
khoá chính là thuộc tính không khóa gây ra phụ thuộc.
Áp dụng phương pháp chuẩn hóa ở trên, lược đồ được tách ra như sau:
R1( A4, A2)
R2(A1, A4, A3, A5)
Ví dụ áp dụng:
Cho lược đồ quan hệ R = {A,B,C,D,E,F,G,H,I,J} có khóa chính là A,B
Với tập các phụ thuộc hàm :
A,B → C,D,E,F,G,H,I,J
A→ E,F,G,H,I,J
F → I, J
D →B
Do có có phụ thuộc hàm A→ E,F,G,H,I,J mà A là một bộ phận của khóa chính
nên quan hệ R là vi phạm 2NF. Ta tách R thành R1(A,E,F,G,H,I,J) và R2(A,B,C,D).
Trong R1, do có phụ thuộc hàm F→ I, J, nên ta có I,J phụ thuộc bắc cầu vào khóa
chính, R1 là quan hệ vi phạm 3NF. Trong R2 ta có phụ thuộc hàm D → B trong đó B
là một thuộc tính khóa, R2 vi phạm BCNF. Tách R1 và R2 ta có:
R11( F,I,J) , R12( A,E,F,G,H), R21(D,B), R22( A,D,C)

2.4.5 Các thuật toán thiết kế CSDL quan hệ


Như chúng ta đã biết, có hai cách chính để thiết kế cơ sở dữ liệu quan hệ. Cách
thứ nhất là thiết kế trên-xuống (top-down design). Đây là cách hay được sử dụng nhất
trong thiết kế ứng dụng cơ sở dữ liệu thương mại. Nó bao gồm việc thiết kế một lược
đồ quan niệm trong một mô h́ nh dữ liệu bậc cao, chẳng hạn như mô h́ nh EER, sau đó
ánh xạ lược đồ quan niệm vào một tập quan hệ sử dụng các thủ tục ánh xạ như đã nói
đến trong chương III. Sau đó, mỗi một quan hệ được phân tích dựa trên các phụ thuộc
hàm và các khóa chính được chỉ định bằng cách áp dụng các thủ tục chuẩn hóa như đã
nói đến trong phần III chương này để loại bỏ các phụ thuộc hàm bộ phận và các phụ
thuộc hàm bắc cầu. Việc phân tích các phụ thuộc không mong muốn cũng có thể được
thực hiện trong quá trình thiết kế quan niệm bằng cách phân tích các phụ thuộc hàm
giữa các thuộc tính bên trong các kiểu thực thể và các kiểu liên kết để ngăn ngừa sự
cần thiết có sự chuẩn hóa phụ thêm sau khi việc ánh xạ được thực hiện.
Cách thứ hai là thiết kế dưới-lên (bottom-up design), một kỹ thuật tiếp cận và
nh́ n nhận việc thiết kế lược đồ cơ sở dữ liệu quan hệ một cách chặt chẽ trên cơ sở các
phụ thuộc hàm được chỉ ra trên các thuộc tính của cơ sở dữ liệu. Sau khi người thiết
kế chỉ ra các phụ thuộc, người ta áp dụng một thuật toán chuẩn hóa để tổng hợp các
lược đồ quan hệ. Mỗi một lược đồ quan hệ riêng rẽ ở dạng chuẩn 3NF hoặc BCNF
hoặc ở dạng chuẩn cao hơn.

Vũ Bá Anh – Phan Phước Long 70


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong phần này chúng ta chủ yếu trình bày cách tiếp cận thứ hai. Trước tiên
chúng ta sẽ định nghĩa lại các dạng chuẩn một cách tổng quát, sau đó trình bày các
thuật toán chuẩn hóa và các kiểu phụ thuộc khác. Chúng ta cũng sẽ trình bày chi tiết
hơn về hai tính chất cần có là nối không phụ thêm (mất mát) và bảo toàn phụ thuộc.
Các thuật toán chuẩn hóa thường bắt đầu bằng việc tổng hợp một lược đồ quan hệ rất
lớn, gọi là quan hệ phổ quát (universal relation), chứa tất cả các thuộc tính của cơ sở
dữ liệu. Sau đó chúng ta thực hiện lặp đi lặp lại việc tách (decomposition)
dựa trên các phụ thuộc hàm và các phụ thuộc khác do người thiết kế cơ sở dữ liệu chỉ
ra cho đến khi không còn tách được nữa hoặc không muốn tách nữa.

Định nghĩa tổng quát các dạng chuẩn


Nói chung, chúng ta muốn thiết kế các lược đồ của chúng ta sao cho chúng
không còn các phụ thuộc bộ phận và các phụ thuộc bắc cầu bởi vì các kiểu phụ thuộc
này gây ra các sửa đổi bất thường. Các bước chuẩn hóa thành 3NF, BCNF đã được
trình bày trong phần trước loại bỏ các phụ thuộc bộ phận và bắc cầu dựa trên khóa
chính. Các định nghĩa này không tính đến các khóa dự tuyển của quan hệ. Trong phần
này chúng ta sẽ đưa ra các định nghĩa về các dạng chuẩn tổng quát hơn, có tính đến tất
cả các khóa dự tuyển. Cụ thể, thuộc tính khóa được định nghĩa lại là một bộ phận của
một khóa dự tuyển. Các phụ thuộc hàm bộ phận, đầy đủ, bắc cầu bây giờ sẽ được định
nghĩa đối với tất cả các khóa dự tuyển của quan hệ.
Định nghĩa dạng chuẩn 1: Một lược đồ quan hệ R là ở dạng chuẩn 1 (1NF) nếu
miền giá trị của các thuộc tính của nó chỉ chứa các giá trị nguyên tử (đơn, không phân
chia được) và giá trị của một thuộc tính bất kỳ trong một bộ giá trị phải là một giá trị
đơn thuộc miền giá trị của thuộc tính đó.
Định nghĩa dạng chuẩn 2: Một lược đồ quan hệ R là ở dạng chuẩn 2 (2NF) nếu
mỗi thuộc tính không khóa A trong R không phụ thuộc bộ phận vào một khóa bất kỳ
của R.
Ví dụ: Xét lược đồ quan hệ
R={A,B,C,D,E,F}
Với các phụ thuộc hàm A → B,C,D,E,F; B,C → A,D,E,F; B → F; D →E.
Lược đồ trên có hai khóa dự tuyển là A và {B,C}. Ta chọn A làm khóa chính.
Do có phụ thuộc hàm B → F nên F phụ thuộc bộ phận vào khóa {B,C}, lược đồ vi
phạm chuẩn 2NF (chú ý rằng, trong định nghĩa dạng chuẩn dựa trên khóa chính, lược
đồ này không vi phạm 2NF).
Định nghĩa dạng chuẩn 3: Một lược đồ quan hệ R là ở dạng chuẩn 3 (3NF) nếu
khi một phụ thuộc hàm X → A thỏa mãn trong R, thì:
1) Hoặc X là một siêu khóa của R.
2) Hoặc A là một thuộc tính khóa của R.
Ví dụ: Xét lược đồ quan hệ R ở ví dụ trên. Giả sử nó được tách thành hai lược
đồ:
R1 = {A,B,C,D,E}
R2 = {B, F}.

Vũ Bá Anh – Phan Phước Long 71


Chương 3:Hệ quản trị CSDL Visual FoxPro

Do có phụ thuộc hàm D → E trong đó D không phải thuộc tính khóa, E cũng
không phải là thuộc tính khóa, nên R1 vi phạm chuẩn 3NF
Định nghĩa dạng chuẩn Boyce- Codd: Một lược đồ quan hệ là ở dạng chuẩn
Boyce-Codd (BCNF) nếu khi một phụ thuộc hàm X → A thỏa mãn trong R thì X là
một siêu khóa của R.
Ví dụ: Xét lược đồ R = {A, B, C, D} có A là khóa chính và {B,C} là khóa dự
tuyển. Nếu có tồn tại một phụ thuộc hàm D → B thì lược đồ này vi phạm BCNF vì B
là một thuộc tính khóa (chú ý rằng trong trường hợp định nghĩa dạng chuẩn dựa trên
khóa chính, lược đồ này không vi phạm BCNF).

Tách quan hệ và tính không đầy đủ của các dạng chuẩn


Tách quan hệ: Các thuật toán thiết kế cơ sở dữ liệu quan hệ được trình bày trong
phần này bắt đầu từ một lược đồ quan hệ vũ trụ đơn R = {A1, A2, …, An} chứa tất cả
các thuộc tính của cơ sở dữ liệu. Với giả thiết quan hệ vũ trụ, tên của mỗi thuộc tính là
duy nhất. Tập hợp F các phụ thuộc hàm thỏa mãn trên các thuộc tính của R do những
người thiết kế cơ sở dữ liệu chỉ ra sẽ được các thuật toán sử dụng. Sử dụng các phụ
thuộc hàm, các thuật toán sẽ tách lược đồ quan hệ vũ trụ R thành một tập hợp các lược
đồ quan hệ D = {R1, R2, …, Rm}, tập hợp đó sẽ là lược đồ cơ sở dữ liệu quan hệ. D
được gọi là một phép tách (decomposition) của R. Chúng ta phải đảm bảo rằng mỗi
thuộc tính trong R sẽ xuất hiện trong ít nhất là một lược đồ quan hệ Ri trong phép tách
để nó khỏi bị “mất ”. Một cách hình thức, ta có điều kiện bảo toàn thuộc tính sau đây:
∪Ri = R
Tính không đầy đủ của các dạng chuẩn: Mục đích của chúng ta là mỗi quan hệ
riêng rẽ Ri trong phép tách D là ở dạng chuẩn BCNF hoặc 3NF. Tuy nhiên, điều đó
không đủ để đảm bảo một thiết kế cơ sở dữ liệu tốt. Bên cạnh việc xem xét từng quan
hệ riêng rẽ, chúng ta cần xem xét toàn bộ phép tách. Ví dụ, xét hai quan hệ:
NV_ĐĐ(Tên, ĐịađiểmDA)
NV_DA1(Mă sốNV, Mă sốDA, Sốgiờ, TênDA, ĐịađiểmDA)
Ở phần 2.4.1 mục 4 chương này, ta thấy rằng dù quan hệ NV_ĐĐ là một quan
hệ ở dạng BCNF nhưng khi chúng ta đem nối tự nhiên với quan hệ NV_DA1 thì
chúng ta nhận được một quan hệ có chứa các bộ giả. Điều đó xảy ra là do ngữ nghĩa
không rơ ràng của quan hệ NV_ĐĐ. Đó là một lược đồ quan hệ được thiết kế tồi.
Chúng ta cần phải có tiêu chuẩn khác để cùng với các điều kiện 3NF và BCNF ngăn
ngừa các thiết kế tồi như vậy. Trong các phần tiếp theo chúng ta sẽ nối đến các điều
kiện phụ thêm phải thỏa mãn trên phép tách D.

Phép tách và sự bảo toàn phụ thuộc


Việc mỗi phụ thuộc hàm X → Y trong F hoặc được xuất hiện trực tiếp trong
một trong các lược đồ quan hệ Ri trong phép tách D hoặc có thể được suy diễn từ các
phụ thuộc hàm có trong Ri là rất có lợi. Ta gọi đó là điều kiện bảo toàn phụ thuộc.
Chúng ta muốn bảo toàn phụ thuộc bởi vì mỗi phụ thuộc trong F biểu thị một ràng

Vũ Bá Anh – Phan Phước Long 72


Chương 3:Hệ quản trị CSDL Visual FoxPro

buộc trong cơ sở dữ liệu. Nếu như một trong các phụ thuộc không được thể hiện trong
một quan hệ riêng rẽ Ri nào đó của phép tách, chúng ta không thể ép buộc ràng buộc
này đối với quan hệ riêng rẽ, thay vào đó, chúng ta nối hai hoặc nhiều quan hệ trong
phép tách và sau đó kiểm tra rằng phụ thuộc hàm thỏa mãn trong kết quả của phép
nối. Rơ ràng đó là một thủ tục không hiệu quả và không thực tiễn.
Việc các phụ thuộc chính xác được chỉ ra ở trong F xuất hiện trong các quan hệ
riêng rẽ của phép tách D là không cần thiết. Chỉ cần hợp của các phụ thuộc thỏa mãn
trên các quan hệ riêng rẽ trong D là tương đương với F là đủ. Bây giờ chúng ta định
nghĩa các khái niệm này một cách hình thức.
Cho trước một tập hợp các phụ thuộc F trên R, phép chiếu của F trên Ri, kí hiệu
là F[Ri] trong đó Ri là một tập con của R, là một tập hợp các phụ thuộc hàm X→Y
trong F+ sao cho các thuộc tính trong X ∪ Y đều được chứa trong Ri. Như vậy, phép
chiếu của F trên mỗi lược đồ quan hệ Ri trong phép tách D là tập hợp các phụ thuộc
hàm trong F+, bao đóng của F, sao cho các thuộc tính ở vế trái và vế phải của chúng
đều ở trong Ri. Ta nói rằng phép tách D = {R1, R2, …, Rm} của R bảo toàn phụ thuộc
đối với F nếu hợp của các phép chiếu của F trên mỗi Ri trong D là tương đương với F.
Điều đó có nghĩa là:
( F[R1] ∪ F[R2] ∪ … ∪ F[Rm])+ = F+
Nếu một phép tách là không bảo toàn phụ thuộc, một vài phụ thuộc sẽ bị mất
trong phép tách. Để kiểm tra xem một phụ thuộc hàm X→ B, trong đó X là tập thuộc
tính thuộc về Ri, B là một thuộc tính thuộc Ri có thỏa mãn trong Ri hay không ta làm
như sau: Trước hết tính X+ , sau đó với mỗi thuộc tính B sao cho
1. B là một thuộc tính của Ri
2. B là ở trong X+
3. B không ở trong X
Khi đó phụ thuộc hàm X → B thỏa mãn trong Ri.
Một ví dụ về phép tách không bảo toàn phụ thuộc. Xét lược đồ quan hệ:
R = { A,B,C,D} với các phụ thuộc hàm:
A → BCD; BC → DA; D →B
Lược đồ này có hai khóa dự tuyển là A và BC. Lược đồ này vi phạm BCNF. Nó
được tách thành:
R1 = {D,B}, lược đồ này chứa phụ thuộc hàm D → B
R2 = {A,C,D}, lược đồ này chứa phụ thuộc hàm A → CD
Rơ ràng sau khi tách, phụ thuộc hàm BC → DA bị mất.
Định lý: Luôn luôn tìm được một phép tách bảo toàn phụ thuộc D đối với F sao
cho mỗi quan hệ Ri trong D là ở 3NF. Phép tách D đựơc thực hiện theo thuật toán sau
đây:
Thuật toán 1: Tạo một phép tách bảo toàn phụ thuộc D = {R1,R2, …,Rm} của
một quan hệ vũ trụ R dựa trên một tập phụ thuộc hàm F sao cho mỗi Ri trong D là ở
3NF. Thuật toán này chỉ đảm bảo tính chất bảo toàn phụ thuộc, không đảm bảo tính
chất nối không mất mát.

Vũ Bá Anh – Phan Phước Long 73


Chương 3:Hệ quản trị CSDL Visual FoxPro

Input: Một quan hệ vũ trụ R và một tập phụ thuộc hàm F trên các thuộc tính của
R.
1) Tìm phủ tối thiểu G của F.
2) Với mỗi vế trái X của một phụ thuộc hàm xuất hiện trong G, hăy tạo một
lược đồ trong D với các thuộc tính {X ∪ {A1} ∪ {A2} ∪… ∪{Ak}} trong đó X→A1,
X→A2,…, X→Ak chỉ là các phụ thuộc hàm trong G với X là vế trái (X là khóa của
quan hệ này).
3) Đặt các thuộc tính còn lại (những thuộc tính chưa được đặt vào quan hệ
nào) vào một quan hệ đơn để đảm bảo tính chất bảo toàn thuộc tính.
Ví dụ áp dụng:
Xét lược đồ: R = { A,B,C,D} , với các phụ thuộc hàm:
F = {A → BCD; BC → DA; D →B}
Lược đồ này có hai khóa dự tuyển là A và BC.
Ta thực hiện thuật toán như sau: Trước tiên ta Tìm G là phủ tối thiểu của F.
Theo thuật toán Tìm phủ tối thiểu, đầu tiên ta làm cho các vế phải trong G chỉ chứa
một thuộc tính, ta có:
G = {A → B; A → C; A→ D; BC → D; BC → A; D → B}
Sau đó ta bỏ đi các phụ thuộc hàm thừa (là các phụ thuộc hàm có thể suy diễn
được từ các phụ thuộc hàm khác). Ta thấy A →B là thừa vì có A →D, D →B. Vậy G
còn lại là:
G = {A → C; A→ D; BC → D; BC → A; D → B}. Lược đồ R sẽ được tách
thành:
R1( A,C,D); R2(B,C,D,A); R3(D,B) với các khóa chính được gạch dưới.
Rõ ràng rằng tất cả các phụ thuộc hàm trong G đều được thuật toán bảo toàn bởi
vì mỗi phụ thuộc xuất hiện trong một trong các quan hệ của phép tách D. Bởi vì G
tương đương với F, tất cả các phụ thuộc của F cũng được bảo toàn hoặc trực tiếp bằng
thuật toán hoặc được suy diễn từ những phụ thuộc hàm trong các quan hệ kết quả, như
vậy tính chất bảo toàn phụ thuộc được đảm bảo.

Phép tách và kết nối không mất mát


Phép tách D phải có một tính chất nữa là nối không mất mát (hoặc tính chất nối
không phụ thêm), nó đảm bảo rằng không có các bộ giả được tạo ra khi áp dụng một
phép nối tự nhiên vào các quan hệ trong phép tách. Chúng ta đã đưa ra ví dụ về phép
tách không có tính chất nối không mất thông tin ở phần 2.4.1 mục 4 chương này.
Trong phép tách đó, khi ta thực hiện phép nối tự nhiên trên các quan hệ của phép tách,
rất nhiều các bộ giả đã sinh ra.
Một cách hình thức, ta nói rằng một phép tách D = { R1, R2,…,Rm} của R có
tính chất nối không mất mát (không phụ thêm) đối với một tập hợp phụ thuộc hàm F
trên R nếu với mỗi trạng thái quan hệ r của R thỏa mãn F thì
r[R1]* r[R2]* …* r[Rm] = r

Vũ Bá Anh – Phan Phước Long 74


Chương 3:Hệ quản trị CSDL Visual FoxPro

trong đó * là phép nối tự nhiên của các quan hệ trong D.


Nếu một phép tách không có tính chất nối không mất mát thông tin thì chúng ta
có thể nhận được các bộ phụ thêm (các bộ giả) sau khi áp dụng các phép chiếu và nối
tự nhiên. Nghĩa của từ mất mát ở đây là mất mát thông tin chưa không phải mất các
bộ giá trị. Vì vậy, với tính chất này ta nên gọi chính xác hơn là tính chất nối không
phụ thêm.
Chúng ta có thuật toán để kiểm tra một phép tách có tính chất nối không mất
mát thông tin hay không như sau:
Thuật toán 2: Kiểm tra tính chất nối không mất mát
Input: Một quan hệ vũ trụ R(A1,A2,…An), một phép tách D = {R1, R2, …, Rm}
của R và một tập F các phụ thuộc hàm.
1) Tạo một ma trận S có m hàng, n cột. Mỗi cột của ma trận ứng với một
thuộc tính, mỗi hàng ứng với mỗi quan hệ Ri
2) Đặt S(i,j) = 1 nếu thuộc tính Aj thuộc về quan hệ Ri và bằng 0 trong trường
hợp ngược lại.
3) Lặp lại vòng lặp sau đây cho đến khi nào việc thực hiện vòng lặp không làm
thay đổi S: Với mỗi phụ thuộc hàm X → Y trong F, xác định các hàng trong S có các
kí hiệu 1 như nhau trong các cột ứng với các thuộc tính trong X. Nếu có một hàng
trong số đó chứa 1 trong các cột ứng với thuộc tính Y thì hãy làm cho các làm cho các
cột tương ứng của các hàng khác cũng chứa 1.
4) Nếu có một hàng chứa toàn kí hiệu “1” thì phép tách có tính chất nối không
mất mát, ngược lại, phép tách không có tính chất đó.
Cho trước một quan hệ R được tách thành một số quan hệ R1, R2, ..,Rm . Thuật
toán 2 bắt đầu bằng việc tạo ra một trạng thái quan hệ r trong ma trận S. Hàng i trong
S biểu diễn một bộ ti (tương ứng với quan hệ Ri). Hàng này có các kí hiệu “1” trong
các cột tương ứng với các thuộc tính của Ri và các kí hiệu “0” trong các cột còn lại.
Sau đó thuật toán biến đổi các hàng của ma trận này (trong vòng lặp của bước 3) sao
cho chúng biểu diễn các bộ thỏa mãn tất cả các phụ thuộc hàm trong F. Ở cuối vòng
lặp áp dụng các phụ thuộc hàm, hai hàng bất kỳ trong S – chúng biểu diễn hai bộ
trong r – có các giá trị giống nhau đối với các thuộc tính của X ở vế trái của phụ thuộc
hàm X→ Y trong F sẽ cũng có các giá trị giống nhau đối với các thuộc tính của vế
phải Y. Có thể chỉ ra rằng sau khi áp dụng vòng lặp của bước 3, nếu một hàng bất kỳ
trong S kết thúc với toàn kí hiệu “1” thì D có tính chất nối không mất mát đối với F.
Mặt khác, nếu không có hàng nào kết thúc bằng tất cả kí hiệu “1” thì D không thỏa
mãn tính chất nối không mất mát. Trong trường hợp sau, trạng thái quan hệ r được
biểu diễn bằng S ở cuối thuật toán sẽ là một ví dụ về một trạng thái quan hệ r của R
thỏa mãn các phụ thuộc trong F nhưng không thỏa mãn điều kiện nối không mất mát .
Như vậy, quan hệ này được dùng như một phản ví dụ chứng minh rằng D không có
tính chất nối không mất mát đối với F. Chú ư rằng các kí hiệu “1” và “0” không có ý
nghĩa đặc biệt gì ở cuối thuật toán.

Vũ Bá Anh – Phan Phước Long 75


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ví dụ áp dụng 1:
R = ( MãsốNV, TênNV, MãsốDA, TênDA, ĐịađiểmDA, Sốgiờ)
R1= ( TênNV, ĐịađiểmDA)
R2 = ( MãsốNV, MãsốDA, Sốgiờ, TênDA, ĐịađiểmDA )
F= { Mă sốNV→ TênNV, MãsốDA → {TênDA, ĐịađiểmDA}, {MãsốNV,
Mă sốDA}→ Sốgiờ}
MãsốNV TênNV MãsốDA TênDA ĐịađiểmDA Sốgiờ
R1 0 1 0 0 1 0
R2 1 0 1 1 1 1

Xét lần lượt phụ thuộc hàm MãsốNV → TênNV, MãsốDA → {TênDA,
ĐịađiểmDA}, {MãsốNV, Mă sốDA} → Sốgiờ. Ta thấy không có trường hợp nào các
thuộc tính tương ứng với các vế trái đều có giá trị bằng 1, vì vậy ta không thể làm gì
để biến đối ma trận. Ma trận không chứa một hàng gồm toàn kí hiệu “1”. Phép tách là
mất mát.
Ví dụ áp dụng 2:
R = (MãsốNV, TênNV, MãsốDA, TênDA, ĐịađiểmDA, Sốgiờ)
R1= (MãsốNV, TênNV)
R2 = (MãsốDA, TênDA, ĐịađiểmDA)
R3 = (MãsốNV, MãsốDA, Sốgiờ)
F= {MãsốNV→ TênNV, MãsốDA → {TênDA, ĐịađiểmDA}, {MãsốNV,
MãsốDA} → Sốgiờ}
MãsốNV TênNV Mă sốDA TênDA ĐịađiểmDA Sốgiờ
R1 1 1 0 0 0 0
R2 0 0 1 1 1 0
R3 1 0 1 1 1 0
(Giá trị ban đầu của ma trận S)

MãsốNV TênNV Mă sốDA TênDA ĐịađiểmDA Sốgiờ


R1 1 1 0 0 0 0
R2 0 0 1 1 1 0
R3 1 0 1 1 0 1 0 1 1
(Ma trận S sau khi áp dụng hai phụ thuộc hàm đầu tiên dòng cuối cùng không chứa
toàn kí hiệu “a”). Ma trận chứa một hàng gồm toàn kí hiệu 1. Phép tách này là không
mất mát.
Thuật toán 2 cho phép chúng ta kiểm tra xem một phép tách D cụ thể có tuân
theo tính chất nối không mất mát hay không. Câu hỏi tiếp theo là liệu có một thuật
toán tách một lược đồ quan hệ vũ trụ R = {A1, A2, …, An} thành một phép tách D =
{R1, R2, …,Rm} sao cho mỗi Ri là ở BCNF và phép tách D có tính chất nối không mất
mát đối với F hay không? Câu trả lời là có. Trước khi trình bày thuật toán, ta xem một
số tính chất của các phép tách nối không mất mát nói chung.
Tính chất 1: Một phép tách D = {R1,R2} của R có tính chất nối không mất mát
đối với một tập phụ thuộc hàm F trên R khi và chỉ khi
- Hoặc phụ thuộc hàm ((R1∩ R2 ) → (R1− R2)) ở trong F+.

Vũ Bá Anh – Phan Phước Long 76


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Hoặc phụ thuộc hàm ((R1∩ R2) → (R2 − R1)) ở trong F+.
Với tính chất này, chúng ta có thể kiểm tra lại các phép tách chuẩn hóa trong 4.3
và sẽ thấy rằng các phép tách đó là thỏa mãn tính chất nối không mất mát.
Tính chất 2: Nếu một phép tách D = {R1, R2, …, Rm} của R có tính chất nối
không mất mát đối với một tập phụ thuộc hàm F trên R và nếu một phép tách D1 =
{Q1, Q2, …,Qk} của Ri có tính chất nối không mất mát đối với phép chiếu của F trên
Ri thì phép tách D2 = { R1, R2,…, Ri-1, Q1, Q2,…,Qk, Ri+1,…, Rm} của R có tính chất
nối không mất mát đối với F.
Tính chất này nói rằng nếu một phép tách D đã có tính chất nối không mất mát
đối với một tập F và chúng ta tiếp tục tách một trong các quan hệ Ri trong D thành
phép tách khác D1 (l = 1,2,..k) có tính chất nối không mất mát đối với πRi(F) thì việc
thay Ri trong D bằng D1 (l = 1,2,..k) cũng tạo ra một phép tách có tính chất nối không
mất mát đối với F.
Thuật toán 3 sau đây sử dụng hai tính chất trên để tạo ra một phép tách D = {R1,
R2, …, Rm} của một quan hệ vũ trụ R dựa trên một tập các phụ thuộc hàm F sao cho
mỗi Ri là BCNF.
Thuật toán 3: Tách quan hệ thành các quan hệ BCNF với tính chất nối không
mất mát.
Input: Một quan hệ vũ trụ R và một tập hợp các phụ thuộc hàm F trên các thuộc
tính của R.
1. Đặt D := {R} ;
2. Khi có một lược đồ quan hệ Q trong D không phải ở BCNF, thực hiện
vòng lặp: Với mỗi một lược đồ quan hệ Q trong D không ở BCNF hăy Tìm một phụ
thuộc hàm X→ Y trong Q vi phạm BCNF và thay thế Q trong D bằng hai lược đồ
quan hệ (Q-Y) và (X∪Y). Quá trình lặp dừng khi không còn quan hệ nào trong D vi
phạm BCNF.
Mỗi lần đi vào vòng lặp trong thuật toán 5.3, chúng ta tách một quan hệ Q
không phải BCNF thành hai lược đồ quan hệ. Theo các tính chất 1 và 2, phép tách D
có tính chất nối không mất mát. Kết thúc thuật toán, tất cả các quan hệ trong D sẽ ở
BCNF.
Trong bước 2 của thuật toán 5.3, cần xác định xem một lược đồ quan hệ Q có ở
BCNF hay không. Một phương pháp để làm điều đó là kiểm tra. Với mỗi phụ thuộc
hàm X → Y trong Q, ta tính X+. Nếu X+ không chứa tất cả các thuộc tính trong Q thì
X → Y vi phạm BCNF bởi vì X không phải là một siêu khóa.
Một kỹ thuật nữa dựa trên quan sát rằng khi một lược đồ quan hệ Q vi phạm
BCNF thì có tồn tại một cặp thuộc tính A,B trong Q sao cho {Q – {A,B}} → A. Bằng
việc tính bao đóng {Q – {A,B}}+ cho mỗi cặp thuộc tính {A,B} của Q và kiểm tra
xem bao đóng có chứa A (hoặc B) hay không, chúng ta có thể xác định được Q có ở
BCNF hay không.
Ví dụ áp dụng: Xét lược đồ quan hệ

Vũ Bá Anh – Phan Phước Long 77


Chương 3:Hệ quản trị CSDL Visual FoxPro

R = { A, B, C, D, E, F)
Với các phụ thuộc hàm:
A → BCDEF, BC → ADEF, B→ F, D→ E, D→ B
Lược đồ quan hệ này có hai khóa dự tuyển là A và BC.
Ta có B → F vi phạm BCNF vì B không phải là siêu khóa, R được tách thành:
R1(B,F) với phụ thuộc hàm B→ F
R2(A,B,C,D,E) với các phụ thuộc hàm A→BCDE, BC→ADF, D→E, D→B
Do D→ E vi phạm BCNF ( D là một thuộc tính không khóa ), R2 được tách
thành:
R21(D,E) với phụ thuộc hàm D → E
R22(ABCD) với các phụ thuộc hàm A → BCD, BC→ AD, D→ B
Do D→ B vi phạm BCNF (D không phải là thuộc tính khóa), R22 được tách
thành:
R221(D,B)
R222(A,B,D) với phụ thuộc hàm A → BD (phụ thuộc hàm BC → AD bị mất)
Tóm lại, ta có phép tách D = {R1, R21, R221, R222}. Phép tách này có tính
chất nối không mất thông tin nhưng không bảo toàn phụ thuộc.
Nếu chúng ta muốn có một phép tách có tính chất nối không mất mát và bảo
toàn phụ thuộc thì ta phải hài lòng với các lược đồ quan hệ ở dạng 3NF. Thuật toán
sau đây là cải tiến của thuật toán 1, tạo ra một phép tách thỏa mãn :
- Bảo toàn phụ thuộc.
- Có tính chất nối không mất mát.
- Mỗi lược đồ quan hệ kết quả là ở dạng 3NF.
Thuật toán 4: Thuật toán tổng hợp quan hệ với tính chất bảo toàn phụ thuộc và
nối không mất mát.
Input: Một quan hệ vũ trụ R và một tập các phụ thuộc hàm F trên các thuộc tính
của R.
1) Tìm phủ tối thiểu G cho F.
2) Với mỗi vế trái X của một phụ thuộc hàm xuất hiện trong G hãy tạo ra
một lược đồ quan hệ trong D với các thuộc tính {X∪{A1}∪{A2}∪…∪ {Ak}}, trong
đó X →A1, X→A2,…, X→ Ak chỉ là các phụ thuộc hàm ở trong G với X là vế trái (X
là khóa của quan hệ này).
3) Nếu không có lược đồ quan hệ nào trong D chứa một khóa của R thì
hăy tạo ra thêm một lược đồ quan hệ trong D chứa các thuộc tính tạo nên một khóa
của R.
Bước 3 của thuật toán 4 đòi hỏi phải xác định một khóa K của R. Để xác định
một khóa K của R, ta sử dụng thuật toán sau
Thuật toán xác định khóa: Tìm một khóa K của R dựa trên tập F các phụ thuộc
hàm.
1) Đặt K := R;

Vũ Bá Anh – Phan Phước Long 78


Chương 3:Hệ quản trị CSDL Visual FoxPro

2) Với mỗi thuộc tính A trong K


{tính (K-A)+ đối với F;
Nếu (K-A)+ chứa tất cả các thuộc tính trong R thì đặt K := K-{A}};
*Chú ý: Chúng ta có nhận xét sau: Nếu quan hệ có khóa thì các thuộc tính
khóa của quan hệ phải là các tập con của tập hợp các thuộc tính ở vế phải các phụ
thuộc hàm trong F. Vì vậy, để Tìm được các khóa nhanh hơn, trước tiên chúng ta tính
RF là hợp của các thuộc tính ở các vế trái của các phụ thuộc hàm trong F, sau đó đi
tính bao đóng của tất cả các tập con của RF. Nếu bao đóng của tập con nào chứa tất cả
các thuộc tính của R thì tập đó là một siêu khóa. Để kiểm tra nó là một khóa ta thực
hiện như bước 2) của thuật toán trên.
Không phải lúc nào cũng có khả năng Tìm được một phép tách thành các lược
đồ quan hệ bảo toàn phụ thuộc và mỗi lược đồ trong phép tách là ở BCNF. Các lược
đồ quan hệ trong phép tách theo thuật toán ở trên thường là 3NF. Để có các lược đồ
BCNF, chúng ta có thể kiểm tra các lược đồ quan hệ 3NF trong phép tách một cách
riêng rẽ để xem nó có thỏa mãn BCNF không. Nếu có lược đồ quan hệ Ri không ở
BCNF thì ta có thể tách tiếp hoặc để nguyên nó là 3NF.

2.4.6 Phụ thuộc đa trị


Trong phần này chúng ta thảo luận khái niệm phụ thuộc hàm đa trị và định
nghĩa dạng chuẩn 4. Các phụ thuộc đa trị hệ quả của dạng chuẩn 1 không cho phép
một thuộc tính của một bộ có một tập giá trị (nghĩa là các thuộc tính đa trị). Nếu
chúng ta có hai hoặc nhiều hơn các thuộc tính độc lập và đa trị trong cùng một lược
đồ quan hệ thì chúng ta phải lặp lại mỗi một giá trị của một trong các thuộc tính với
mỗi giá trị của thuộc tính khác để giữ cho trạng thái quan hệ nhất quán và duy trì tính
độc lập giữa các thuộc tính. Ràng buộc đó được chỉ ra bằng một phụ thuộc đa trị.

1. Định nghĩa phụ thuộc đa trị


Giả thiết có một lược đồ quan hệ R, X và Y là hai tập con của R. Một phụ thuộc
đa trị (MVD), ký hiệu là X →→ Y , chỉ ra ràng buộc sau đây trên một trạng thái
quan hệ bất kỳ của R: Nếu hai bộ t1 và t2 tồn tại trong R sao cho t1[X] = t2[X] thì hai
bộ t3 và t4 cũng tồn tại trong R với các tính chất sau:
. t3[X] = t4[X] = t1[X] = t2[X]
. t3[Y] = t1[Y] và t4[Y] = t2[Y]
. t3[Z] = t2[Z] và t4[Z] = t1[Z] với Z = (R- (X ∪ Y))
Khi X→→Y thỏa mãn, ta nói rằng X đa xác định Y. Bởi vì tính đối xứng trong
định nghĩa, khi X →→ Y thỏa mãn trong R, X→→Z cũng thỏa mãn trong R. Như vậy
X→→Y kéo theo X→→Z và vì thế đôi khi nó được viết là X→→Y|Z
Định nghĩa hình thức chỉ ra rằng, cho trước một giá trị cụ thể của X, tập hợp các
giá trị của Y được xác định bởi giá trị này của X là được xác định hoàn toàn bởi một
mình X và không phụ thuộc vào các giá trị của các thuộc tính còn lại Z của R. Như
vậy, mỗi khi hai bộ tồn tại có các giá trị khác nhau của Y nhưng cùng một giá trị X thì

Vũ Bá Anh – Phan Phước Long 79


Chương 3:Hệ quản trị CSDL Visual FoxPro

các giá trị này của Y phải được lặp lại trong các bộ riêng rẽ với mỗi giá trị khác nhau
của Z có mặt với cùng giá trị của X. Điều đó tương ứng một cách không hình thức với
Y là một thuộc tính đa trị của các thực thể được biểu diễn bằng các bộ trong R.
Ví dụ về phụ thuộc đa trị:
NHÂNVIÊN TênNV TênDA TênconNV

Nam DA01 Lan

Nam DA02 Hoa

Nam DA01 Hoa

Nam DA02 Lan

Trong bảng trên có hai phụ thuộc đa trị là:


TênNV→→TênDA, TênNV→→TênconNV
Một MVD X→→Y được gọi phụ thuộc đa trị tầm thường nếu:
a) Y là một tập con của X
b) hoặc X ∪ Y = R
Một MVD không thỏa mãn a) hoặc b) được gọi là một MVD không tầm thường.
Nếu chúng ta có một phụ thuộc đa trị không tầm thường trong một quan hệ, chúng ta
có thể phải lặp các giá trị một cách dư thừa trong các bộ. Trong quan hệ NHÂNVIÊN
ở ví dụ trên, các giá trị ‘DA01’, ‘DA02’ của TênDA được lặp lại với mỗi giá trị của
TênconNV (một cách đối xứng, các giá trị ‘Lan’, ‘Hoa’ được lặp lại với mỗi giá trị
của TênDA). Rõ ràng ta không mong muốn có sự dư thừa đó. Tuy nhiên, lược đồ
quan hệ trên là ở BCNF bởi vì không có phụ thuộc hàm nào thỏa mãn trong quan hệ
đó. Vì vậy, chúng ta phải định nghĩa một dạng chuẩn thứ tư mạnh hơn BCNF và ngăn
cấm các lược đồ quan hệ như quan hệ NHÂNVIÊN.

2. Các quy tắc suy diễn đối với các phụ thuộc hàm và phụ thuộc đa trị
Các quy tắc từ Qt1 đến Qt8 sau đây tạo nên một tập hợp đúng đắn và đầy đủ cho
việc suy diễn các phụ thuộc hàm và phụ thuộc đa trị từ một tập các phụ thuộc cho
trước. Giả thiết rằng tất cả các thuộc tính được chứa trong một lược đồ quan hệ “vũ
trụ” R = {A1, A2, …,An} và X, Y, Z, W là các tập con của R.
Qt1) (quy tắc phản xạ cho FD): Nếu X ⊇ Y thì X → Y
Qt2) (quy tắc tăng cho FD): {X →Y} |= XZ → YZ
Qt3) (quy tắc bắc cầu cho FD): { X → Y, Y→ Z } |= X→ Z
Qt4) (quy tắc bù cho MVD): {X →→Y } |= {X→→ (R-(X∪ Y))}
Qt5) (quy tắc tăng cho MVD): Nếu X →→Y và W ⊇ Z thì WX →→ YZ
Qt6) (quy tắc bắc cầu cho MVD): {X→→ Y, Y→→ Z } |= X→→ (Z – Y)
Qt7) (quy tắc tái tạo cho FD và MVD): {X →Y} |= X→→ Y
Qt8) (quy tắc liên hợp cho FD và MVD): Nếu X →→ Y và có tồn tại W với các
tính chất a) W ∩Y = ∅, b) W →Z và c) Y ⊇ Z thì X → Z.

Vũ Bá Anh – Phan Phước Long 80


Chương 3:Hệ quản trị CSDL Visual FoxPro

Qt1 đến Qt3 là các quy tắc suy diễn Amstrong đối với các phụ thuộc hàm. Qt4
đến Qt6 là các quy tắc suy diễn chỉ liên quan đến các phụ thuộc đa trị. Qt7 và Qt8 liên
kết các phụ thuộc hàm và các phụ thuộc đa trị. Đặc biệt, Qt7 nói rằng một phụ thuộc
hàm là một trường hợp đặc biệt của một phụ thuộc đa trị. Điều đó có nghĩa là mỗi phụ
thuộc hàm cũng là một phụ thuộc đa trị bởi vì nó thỏa mãn định nghĩa hình thức của
phụ thuộc đa trị. Về cơ bản, một phụ thuộc hàm X →Y là một phụ thuộc đa trị X →→
Y với một hạn chế phụ rằng có nhiều nhất là một giá trị của Y được kết hợp với mỗi
giá trị của X. Cho trước một tập hợp các phụ thuộc hàm và phụ thuộc đa trị chỉ ra trên
R = {A1, A2, …, An}, chúng ta có thể sử dụng các quy tắc từ Qt1 đến Qt8 để suy ra
tập hợp đầy đủ các phụ thuộc (hàm và đa trị) F+ đúng trong mọi trạng thái quan hệ r
của R thỏa mãn F. Chúng ta lại gọi F+ là bao đóng của F.

3. Dạng chuẩn 4
Định nghĩa: Một lược đồ quan hệ R là ở dạng chuẩn 4 (4NF) đối với một tập
hợp các phụ thuộc F (gồm các phụ thuộc hàm và phụ thuộc đa trị) nếu với mỗi phụ
thuộc đa trị không tầm thường X→→Y trong F+ , X là một siêu khóa của R.
Như vậy, một lược đồ quan hệ vi phạm 4NF nếu nó chứa các phụ thuộc hàm đa
trị không mong muốn. Ví dụ, lược đồ quan hệ NHÂNVIÊN ở ví dụ trên là vi phạm
4NF bởi vì trong các phụ thuộc hàm đa trị TênNV→→TênDA và TênNV→→
Têncon, TênNV không phải là một siêu khóa .
Giả sử chúng ta tách bảng NHÂNVIÊN thành hai bảng như sau:
NV_DA TênNV TênDA NV_CON TênNV TênconNV
Nam DA01 Nam Lan
Nam DA02 Nam Hoa
Hai bảng này là ở 4NF bởi vì các phụ thuộc đa trị TênNV→→TênDA và
TênNV→→TênconNV là các phụ thuộc đa trị tầm thường. Trong hai bảng này không
có các phụ thuộc đa trị không tầm thường cũng như không có các phụ thuộc hàm.

4. Tách có tính chất nối không mất mát thành các quan hệ 4NF
Khi chúng ta tách một lược đồ quan hệ R thành R1 = (X∪Y) và R2 = (R-Y) dựa
trên phụ thuộc hàm đa trị X→→Y đúng trong R, phép tách có tính chất nối không mất
mát. Đó cũng là điều kiện cần và đủ cho một phép tách một lược đồ thành hai lược đồ
có tính chất nối không mất mát. Ta có tính chất sau:
Tính chất 1’: Các lược đồ quan hệ R1 và R2 tạo thành một phép tách có tính chất
nối không mất mát của R khi và chỉ khi (R1∩ R2)→→ (R1 –R2) (hoặc (R1∩R2)
→→(R1 –R2)).
Áp dụng tính chất trên chúng ta có thuật toán tạo một phép tách có tính chất nối
không mất mát thành các lược đồ quan hệ ở dạng 4NF.
Thuật toán 5: Tách quan hệ thành các quan hệ 4NF với tính chất nối không mất
mát.
Input: Một quan hệ vũ trụ R và một tập phụ thuộc hàm và phụ thuộc đa trị F.

Vũ Bá Anh – Phan Phước Long 81


Chương 3:Hệ quản trị CSDL Visual FoxPro

1. Đặt D := {R};
2. Khi có một lược đồ quan hệ Q trong D không ở 4NF, thực hiện:
{Chọn một lược đồ quan hệ Q trong D không ở 4NF;
Tìm một phụ thuộc đa trị không tầm thường X→→Y trong Q vi phạm 4NF;
Thay thế Q trong D bằng hai lược đồ quan hệ (Q – Y) và (X ∪ Y)};
Ví dụ áp dụng:
Xét lược đồ NHÂNVIÊN(TênNV, TênDA, TênconNV). Ta có phụ thuộc hàm
đa trị TênNV→→TênDA trong đó TênNV không phải là một siêu khóa, vậy nó vi
phạm 4NF. Ta tách thành NV_DA(TênNV, TênDA), NV_CON(TênNV, TênconNV).

2.4.7 Phụ thuộc nối


Như chúng ta đã thấy, các tính chất 1 và tính chất 1’ cho điều kiện để một lược
đồ quan hệ R được tách thành hai lược đồ quan hệ R1 và R2 và phép tách có tính chất
nối không mất mát. Tuy nhiên, trong một số trường hợp, có thể không có phép tách có
tính chất nối không mất mát của R thành hai lược đồ quan hệ nhưng có thể có phép
tách có tính chất nối không mất mát thành nhiều hơn hai quan hệ. Hơn nữa, có thể
không có phụ thuộc hàm nào trong R các chuẩn cho đến BCNF và có thể không có
phụ thuộc đa trị nào có trong R vi phạm 4NF. Khi đó chúng ta phải sử dụng đến một
phụ thuộc khác gọi là phụ thuộc nối và nếu có phụ thuộc nối thì thực hiện một phép
tách đa chiều thành dạng chuẩn 5 (5NF).
Một phụ thuộc nối (JD), ký hiệu là JD(R1, R2, …, Rn) trên lược đồ quan hệ R
chỉ ra một ràng buộc trên các trạng thái r của R. Ràng buộc đó tuyên bố rằng mỗi
trạng thái hợp pháp r của R phải có phép tách có tính chất nối không mất mát thành
R1, R2, …, Rn. Điều đó nghĩa là:
*( πR1(r), πR2(r), …, πRn(r)) = r
Một phụ thuộc nối JD(R1, R2, …, Rn) là một phụ thuộc nối tầm thường nếu một
trong các lược đồ quan hệ Ri ở trong JD(R1, R2, …, Rn) là bằng R.
Một lược đồ quan hệ R là ở dạng chuẩn 5 (5NF) (hoặc dạng chuẩn nối chiếu
PJNF – Project-Join normal form) đối với một tấp F các phụ thuộc hàm, phụ thuộc đa
trị và phụ thuộc nối nếu với mỗi phụ thuộc nối không tầm thường JD(R1, R2, …, Rn)
trong F+, mỗi Ri là một siêu khóa của R.
Ví dụ: Xét quan hệ CUNGCẤP gồm toàn các thuộc tính khóa
CUNGCẤP Tênnhàcungcấp Tênhàng TênDựán

Ncc1 Bulong Dựán1

Ncc1 Đaiốc Dựán2

Ncc2 Bulong Dựán2

Ncc3 Đaiốc Dựán3

Ncc2 Đinh Dựán1


Ncc2 Bulong Dựán1

Vũ Bá Anh – Phan Phước Long 82


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ncc1 Bulong Dựán2

Giả thiết rằng ràng buộc phụ thêm sau đây luôn đúng: Khi một nhà cung cấp S
cung cấp hàng P VÀ một dự án J sử dụng hàng P VÀ nhà cung cấp S cung cấp ít nhất
là một hàng cho dự án J THÌ nhà cung cấp S cũng sẽ cung cấp hàng P cho dự án J.
Ràng buộc này chỉ ra một phụ thuộc nối JD(R1,R2,R3) giữa ba phép chiếu
R1(Tênnhàcungcấp,Tênhàng), R2(Tênnhàcungcấp,Têndựán),R3(Tênhàng,TênDựán)
của quan hệ CUNGCẤP. Quan hệ CUNGCẤP được tách thành ba quan hệ R1, R2, R3
ở dạng chuẩn 5. Chú ý rằng nếu ta áp dụng phép nối tự nhiên cho từng đôi quan hệ
một thì sẽ sinh ra các bộ giả, nhưng nếu áp dụng phép nối tự nhiên cho cả ba quan hệ
thì không sinh ra các bộ giả.
R1 R2 R3
Tênnhàcungcấp Tênhàng Tênnhàcungcấp Têndựán Tênhàng Têndựán
Ncc1 Bulong Ncc1 Dựán1 Bulong Dựán1
Ncc1 Đaiốc Ncc1 Dựán2 Đaiốc Dựán2
Ncc2 Bulong Ncc2 Dựán2 Bulong Dựán2
Ncc3 Đaiốc Ncc3 Dựán3 Đaiốc Dựán3
Ncc2 Đinh Ncc2 Dựán1 Đinh Dựán1
Việc phát hiện các phụ thuộc nối trong các cơ sở dữ liệu thực tế với hàng trăm
thuộc tính là một điều rất khó khăn. Vì vậy, thực tiễn thiết kế cơ sở dữ liệu hiện nay
thường không chú ý đến nó.
Nói chung, trong thực tế thiết kế cơ sở dữ liệu, người ta chỉ chuẩn hóa các bảng
đến 3NF, BCNF là đủ

Vũ Bá Anh – Phan Phước Long 83


Chương 3:Hệ quản trị CSDL Visual FoxPro

CHƯƠNG III: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU FOXPRO

1. CÁC KHÁI NIỆM CHUNG


1.1. Khái niệm tệp cơ sở dữ liệu (Database file)
Các thông tin trên thực tế thường lưu trữ dưới dạng bảng biểu gọi là bảng
hai chiều gồm các dòng, các cột.
Trong bảng, thường thì mỗi cột chứa thông tin về một thuộc tính của các
đối tượng, mỗi dòng chứa các thông tin về tất cả các thuộc tính cần quản lý của
một đối tượng. Giao của mỗi dòng và một cột là giá trị cụ thể của một thuộc
tính của đối tượng tương ứng.
Khi lưu trữ trên máy, mỗi bảng như vậy sẽ được ghi thành một tệp dữ
liệu. Vậy có thể hiểu: Tệp dữ liệu là tệp chứa các thông tin về các thuộc tính
của một tập hợp các đối tượng cùng loại cần cho việc quản lý (các đối tượng
cùng loại với nghĩa là các đối tượng có chung các thuộc tính cần quản lý). Mỗi
đối tượng sẽ được quản lý trên một số thuộc tính nhất định. Một bộ thông tin về
tất cả các thuộc tính của một đối tượng sẽ được lưu trữ trong tệp gọi là một bản
ghi dữ liệu (RECORD). Trên mỗi bản ghi sẽ chứa thông tin về các thuộc tính
của một đối tượng. Thông tin về mỗi thuộc tính của đối tượng được ghi trong
một phần của bản ghi gọi là một trường (Field).
Vậy có thể hình dung:
Mỗi tệp dữ liệu tương tự một bảng hai chiều gồm các dòng và các cột.
Mỗi bản ghi tương ứng với một dòng trên bảng.
Mỗi trường tương ứng với một cột trên bảng. Trường chính là đơn vị dữ
liệu cơ sở của cơ sở dữ liệu.
Mỗi trường được xác định bởi các đặc trưng sau đây:
+ Tên trường (FileName): Dùng để truy nhập đến các trường trong tệp.
Các trường trong một tệp phân biệt với nhau qua tên trường, do đó, không có
hai trường trùng tên trong một tệp. Trong FoxPro, tên trường do người sử dụng
đặt, gồm một dãy không quá 10 ký tự thuộc loại chữ cái, chữ số, dấu gạch nối
và bắt đầu phải là một chữ cái, không phân biệt chữ viết in và thường.
Ví dụ: HO_TEN, DIEM1, SBD
+ Kiểu trường (Type): Để xác định loại thông tin chứa trong trường.
FoxPro sử dụng các kiểu dữ liệu cơ bản sau:

Vũ Bá Anh – Phan Phước Long 84


Chương 3:Hệ quản trị CSDL Visual FoxPro

• Loại ký tự (Character): Loại này có thể chứa các chữ cái, chữ số
không tính toán và các ký tự đặc biệt.
• Loại số (Numeric): Dùng để chứa các số có thể tham gia vào các
phép toán số học.
• Loại ngày (Date): Để lưu trữ một ngày tháng năm cụ thể.
• Loại logic (Logical): Để chứa các thông tin có hai giá trị trái ngược
nhau của một thuộc tính.
• Loại ký ức (Memo): Thường để ghi các thông tin của các thuộc
tính dùng để tra cứu.
+ Độ rộng trường (Width): Để xác định số ký tự nhiều nhất ghi được
trong trường đó.
Trong FoxPro:
• Trường ký tự có độ rộng không quá 254 ký tự
• Trường số có độ rộng không quá 20 chữ số
• Trường ngày tháng có độ rộng 8
• Trường logic có độ rộng là 1
• Trường ký ức có độ rộng không quá 5000
+ Số chữ số thập phân (Deciman): Để xác định số chữ số thập phân được
dùng đối với các trường số. Nếu số chữ số thập phân là 0 thì đó là số nguyên.
Khi xây dựng một tệp dữ liệu trong FoxPro, cần chú ý:
• Mỗi tệp không quá 256 trường và 1 tỷ bản ghi ;
• Tệp dữ liệu có phần mở rộng là DBF (DataBase File).
Ví dụ: Để quản lý kết quả học tập của 100 sinh viên, mỗi sinh viên cần
biết: Họ tên, số báo danh, điểm thi môn 1, điểm thi môn 2 thì phải tổ chức một
tệp gồm 100 bản ghi, mỗi bản ghi chứa thông tin về một học sinh, gồm 4
trường, chẳng hạn như:
HOTEN SBD DIEM 1 DIEM 2
Nguyễn A 1 8 9
Trần B 2 9 7
1.2. Khái niệm cơ sở dữ liệu.
Hệ quản trị cơ sở dữ liệu chính là một hệ thống các chương trình dùng để
thực hiện các thao tác trên một cơ sở dữ liệu. Để xây dựng các chương trình và
tạo các tệp dữ liệu ta phải sử dụng các ngôn ngữ của một hệ quản trị nào đó.
Hiện nay có nhiều ngôn ngữ quản trị dữ liệu, chẳng hạn như: các hệ dBase,

Vũ Bá Anh – Phan Phước Long 85


Chương 3:Hệ quản trị CSDL Visual FoxPro

FoxPro, Access, SQL Server, Oracle,...Trong các bài toán quản lý hiện nay,
FoxPro là một trong các ngôn ngữ được sử dụng phổ biến nhất.
FoxPro được cải tiến từ Foxbase đến Foxpro rồi lên Visual FoxPro theo
hướng tương thích đi lên. Trong chương trình này chúng tôi sẽ giới thiệu hệ
quản trị dữ liệu FoxPro và chủ yếu dựa trên nền là cái lõi của Visual FoxPro
2. HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU FOX.

2.1. Làm quen với FOX.


2.1.1. Khởi động FOX.
Ta đã biết, các chương trình sau khi đã được cài đặt, để chạy từ
WINDOWS, có thể dùng một trong ba cách:
- Từ biểu tượng của chương trình trong màn hình chính của Windows.
- Từ thực đơn START, chọn PROGRAM rồi chọn mục tương ứng.
- Từ RUN, chọn tên tệp chương trình cần chạy rồi chọn OK để chạy.
Sau khi khởi động xong, màn hình xuất hiện một cửa sổ lệnh (Command
window), báo cho người sử dụng biết Fox đã được khởi động xong, sẵn sàng
nhận các lệnh Fox để thực hiện.

Ngoài cửa sổ lệnh là nơi người sử dụng có thể đưa lệnh vào, còn có một
hệ thống thực đơn mà thông qua đó, người sử dụng có thể thực hiện được một
số các lệnh cơ bản của Fox. Trong tài liệu này sẽ hướng dẫn làm việc với Fox
thông qua các lệnh vào từ cửa sổ lệnh.

Vũ Bá Anh – Phan Phước Long 86


Chương 3:Hệ quản trị CSDL Visual FoxPro

2.1.2 Thoát khỏi FOX.


Có 3 cách thoát khỏi FOX:
 Đưa lệnh QUIT vào từ cửa sổ lệnh
 Chọn trên thực đơn lựa chọn File -> Exit
 Đóng cửa sổ hoạt động của FOX
Khi đó máy sẽ tự động đóng các tệp của FOX rồi thoát khỏi FOX, trở về
môi trường WINDOWS.
2.2. Hai chế độ làm việc với FOX.
2.2.1. Chế độ hội thoại .
Là chế độ đưa vào từng lệnh của FOX từ cửa sổ lệnh, kết thúc ấn ↵, lệnh
thực hiện ngay, xong lại quay về cửa sổ lệnh để chờ lệnh.
Chế độ này có đặc điểm là các lệnh sau khi thực hiện không được lưu lại
trên đĩa nên chỉ thường dùng để thực hiện các thao tác đơn giản trên các tệp dữ
liệu hoặc để sửa, chạy chương trình FOX.
2.2.2. Chế độ chương trình.
Là chế độ ghép các lệnh Fox thành một tệp chương trình Fox và ghi
chương trình này lên đĩa. Tệp này có tên do người sử dụng đặt với phần mở
rộng là .PRG (viết tắt của PROGRAM). Các chương trình có thể được soạn
thảo ngay trong môi trường của FOX hoặc có thể dùng một hệ soạn thảo nào
đó. Trong môi trường của FOX để soạn chương trình, từ cửa sổ lệnh ta đưa vào
lệnh:
MODIFY COMMAND <tên tệp>
Trong đó:
Tên tệp là tên của tệp chương trình cần soạn, phần mở rộng ngầm định là
.PRG
Sau đó người sử dụng tiến hành soạn thảo chương trình tương tự như soạn
văn bản, mỗi lệnh thường được viết trên một dòng, nếu dòng lệnh quá dài thì có
thể viết trên nhiều dòng, nhưng để máy nhận biết các dòng của cùng một lệnh
thì cuối các dòng dở dang phải có ký tự chấm phảy (;). Kết thúc toàn bộ
chương trình ấn ^W để máy ghi chương trình lên đĩa. Để chạy chương trình đã
có trên đĩa, từ cửa sổ lệnh ta đưa vào lệnh:
DO <tên tệp>

Vũ Bá Anh – Phan Phước Long 87


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong đó: <tên tệp> là tên tệp chương trình cần chạy. Khi đó các
lệnh trong chương trình sẽ được thực hiện theo đúng cấu trúc của nó đã có.
Ví dụ: Giải phương trình bậc hai: ax2 + bx + c = 0 (a ≠ 0)
 Để soạn chương trình ta gõ lệnh:
Modify command GPTB2. PRG
Sau đó trên màn hình soạn thảo ta đưa vào các dòng lệnh sau
INPUT ‘vào a’ TO A
INPUT ‘vào b’ TO B
INPUT ‘ vào c’ TO C
D =B*B -4*A*C
IF D<0
? ‘phương trình vô nghiệm’
ELSE
IF D = 0
? ‘Phương trình có nghiệm kép X =’ , - B / (2 * A)
ELSE
? ‘X1 =’ , ( - B - SQRT(D))/ (2 * A)
? ‘X2 =’ , ( - B + SQRT(D))/ (2 * A)
ENDIF
ENDIF
^W
Các lệnh trên tạo thành một chương trình và được ghi lên đĩa với tên tệp
là GPTB2.PRG đặt tại thư mục làm việc.
 Để thực hiện chương trình trên tại cửa sổ lệnh ta đưa lệnh:
DO GPTB2
Khi đó máy sẽ thực hiện các lệnh trong chương trình.
2.3. Các loại tệp chủ yếu dùng trong Fox.

Loại tệp Phần mở rộng Viết tắt của


Tệp CSDL . DBF Data Base File
Tệp chỉ dẫn . IDX IndeX File
Tệp chương trình . PRG Program file

Vũ Bá Anh – Phan Phước Long 88


Chương 3:Hệ quản trị CSDL Visual FoxPro

Tệp báo cáo . FRM Report FormFile


Tệp ký ức . MEM Memo Variable
file

Trong khi viết tên các tệp của FOX, ta chỉ việc viết phần tên chính, còn
phần mở rộng sẽ được Fox tự gán chính xác.

3. CÁC YẾU TỐ CƠ BẢN CỦA FOX.

3.1. Các ký hiệu dùng trong FOX.


FOX sử dụng mọi ký hiệu trong bảng mã ASC I I, gồm:
- 26 chữ cái La tinh in và thường.
- 10 chữ số Ả rập từ 0, 1, 2, ...,9
- Các ký hiệu đặc biệt: +, - , *, ...
Mỗi ký hiệu nói chung gọi là một ký tự. Một dãy ký tự gọi là xâu. Số ký
tự trong xâu gọi là độ dài của xâu. Xâu không có ký tự nào gọi là xâu rỗng.

3.2. Từ khoá (Keywords).


FOX sử dụng một số từ tiếng Anh với cách viết và ý nghĩa xác định,
không dùng từ có nghĩa tương đương để thay thế - gọi là từ khoá.
Tất cả cá từ khoá đều có thể viết tắt tới 4 ký tự đầu tiên.
Ví dụ: MODIFY là từ khoá, có thể viết thành MODI

3.3. Các đại lượng.


3.3.1. Hằng .
Là đại lượng có giá trị không đổi và cho trực tiếp. Hằng gồm các loại:
- Hằng số: Được viết tắt theo cách viết của Châu Âu (Dùng dấu chấm (.)
để ngăn cách phần nguyên và phần phân).
Ví dụ: 123; 4.6; 5.7; 6.
- Hằng xâu: Gồm một xâu ký tự bất kỳ có độ dài không quá 256 ký tự đặt
trong cặp dấu nháy đơn hoặc cặp dấu nháy kép hoặc cặp dấu ngoặc vuông,
nhưng phải chú ý là khi đặt trong cặp dấu nào thì dãy ký tự phải không gồm
dấu bao ngoài.

Vũ Bá Anh – Phan Phước Long 89


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ví dụ: ‘HA NOI’


“ Việt nam”
[ ĐH TCKT]
- Hằng ngày tháng : Để chỉ một ngày tháng năm cụ thể.
Cách viết thông thường là: { mm/dd/ yy} hoặc {dd - mm - yy}
Hoặc { m m/d d/ yyyy} hoặc {dd - mm - yyyy}
Trong đó:
mm - 2 chữ số chỉ tháng (month)
d d - 2 chữ số chỉ ngày (day)
yy - 2 chữ số cuối của năm (year)
yyyy - 4 chữ số của năm
- Hằng logic: FOX sử dụng hai hằng .T. (True) và . F. (False) để chỉ giá
trị các mệnh đề logic có thoả mãn hay không.
3.3.2. Biến.
Biến là đại lượng có giá trị có thể thay đổi và được thể hiện thông qua tên
biến. Trong FOX, có hai kiểu biến : Biến trường và biến bộ nhớ.
Biến trường (còn gọi là trường): Là các tên trường trong tệp dữ liệu. Các
biến này chỉ được sử dụng khi đang làm việc với tệp dữ liệu có chứa các trường
đó (tệp đang mở). Tên trường do người sử dụng tự đặt khi khai báo cấu trúc tệp
(xem lệnh CREATE), gồm không quá 10 ký hiệu thuộc loại chữ số, chữ cái,
dấu gạch dưới và bắt đầu phải bằng chữ cái, không phân biệt chữ in và thường.
Biến bộ nhớ (còn gọi là biến, biến nhớ): Là các biến trung gian được sử
dụng trong quá trình làm việc với FOX. Các biến thuộc loại này thường không
được lưu trữ lên đĩa.
Tên biến nhớ gồm không quá 254 ký hiệu thuộc loại chữ số, chữ cái và
dấu gạch dưới bắt đầu không là chữ số. Tuy nhiên, người ta thường đặt tên biến
có tính gợi nhớ.
3.3.3. Biến có chỉ số.
Biến có chỉ số: Là một dạng đặc biệt của biến nhớ để mô tả các đại lượng
mang chỉ số, cách viết biến chỉ số như sau:
Tên biến (các chỉ số)

Vũ Bá Anh – Phan Phước Long 90


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong đó: Tên biến đặt giống như tên biến nhớ, các chỉ số viết cách nhau
dấu phảy.
Tuy vậy, FOX là hệ quản trị để xử lý các bảng 2 chiều nên ở đây sẽ có
không quá hai chỉ số.
Ví dụ: Biến Viết trong FOX
a1 A(1)
xi j X(I,J)

Muốn sử dụng biến có chỉ số, trước hết phải tạo ra nó (xem lệnh
DIMENSION).
3.3.4. Hàm.
Cũng như mọi ngôn ngữ khác, FOX có một hệ thống các hàm, song hàm
trong FOX rất phong phú và thiên về xử lý các bài toán quản lý. Trong chương
trình này chúng tôi xin giới thiệu một số hàm chính thường dùng là:
3.3.4.1. Các hàm thao tác trên xâu ký tự.

a. Hàm LEN
Dùng để xác định độ dài một xâu ký tự.
Dạng hàm: LEN(<BT xâu>)
Hàm cho giá trị là độ dài của xâu xác định bởi <BT xâu>.
Ví dụ:
? LEN(‘INFORMATION’)
11
? LEN(‘’)
0

b. Hàm TYPE
Dùng để cho biết kiểu của một biểu thức kiểu ký tự.
Dạng hàm : TYPE( <BT xâu> )
Hàm cho biết kiểu của giá trị của biểu thức ghi trong <BT xâu>, giá trị
của hàm là một trong các ký tự sau:
C nếu là biểu thức kiểu ký tự
N nếu là biểu thức kiểu số

Vũ Bá Anh – Phan Phước Long 91


Chương 3:Hệ quản trị CSDL Visual FoxPro

L nếu là biểu thức kiểu logic


D nếu là biểu thức kiểu ngày tháng
M nếu là biểu thức kiểu ký ức
U nếu không xác định được loại biểu thức.
Ví dụ :
? TYPE([‘Hà văn Hùng’])
C
? TYPE(‘3+4*5’)
N
? TYPE(“CTOD(‘01/21/99’)”)
D
? TYPE([4<5 .and. ‘A’>’B’])
L
? TYPE(12345)
U

c. Hàm LEFT
Dùng để trích ra một xâu con ở phía trái từ một xâu ký tự.
Dạng hàm: LEFT(<BT xâu>,<n>)
Trong đó: n là một biểu thức số.
Hàm cho giá trị là một xâu con gồm n ký tự trái nhất trích ra từ <BT
xâu>.
Nếu giá trị của n lớn hơn độ dài của giá trị biểu thức xâu, giá trị của hàm
sẽ là toàn bộ biểu thức xâu.
Nếu giá trị của n nhỏ hơn hoặc bằng 0 thì giá trị của hàm là một xâu rỗng.
Nếu giá trị của n không nguyên thì FOX sẽ lấy giá trị là phần nguyên của
biểu thức n.
Ví dụ:
? LEFT(‘ABCDE’,2)
AB
? LEFT(‘ABCDE’,5+2)
ABCDE

Vũ Bá Anh – Phan Phước Long 92


Chương 3:Hệ quản trị CSDL Visual FoxPro

? LEFT(‘ABCDE’,-2)

? LEFT(‘ABCDE’,3.7)
ABC

d. Hàm RIGHT
Dùng để trích ra một xâu con ở phía phải từ một xâu ký tự.
Dạng hàm: RIGHT(<BT xâu>,<n>)
Trong đó: n là một biểu thức số.
Hàm cho giá trị là một xâu con gồm n ký tự phải nhất trích ra từ <BT
xâu>.
Nếu giá trị của n lớn hơn độ dài của giá trị biểu thức xâu, giá trị của hàm
sẽ là toàn bộ biểu thức xâu.
Nếu giá trị của n nhỏ hơn hoặc bằng 0 thì giá trị của hàm là một xâu rỗng.
Nếu giá trị của n không nguyên thì FOX sẽ lấy giá trị là phần nguyên của
biểu thức n.
Ví dụ:
? RIGHT(‘ABCDE’,2)
DE
? RIGHT(‘ABCDE’,5+2)
ABCDE
? RIGHT(‘ABCDE’,-2)

? RIGHT(‘ABCDE’,3.7)
CDE

e. Hàm SUBSTR
Dùng để trích ra một xâu con trong một xâu ký tự bắt đầu từ một vị trí
nào đó.
Dạng hàm: SUBSTR(<BT xâu>,<n> [,m] )
Trong đó: n, m là các biểu thức số để chỉ vị trí bắt đầu trích và số ký tự
cần trích ra ở BT xâu.
Hàm cho giá trị là một xâu con gồm m ký tự bắt đầu từ ký tự thứ n tính
về phía cuối của BT xâu.

Vũ Bá Anh – Phan Phước Long 93


Chương 3:Hệ quản trị CSDL Visual FoxPro

Nếu giá trị của n lớn hơn độ dài của giá trị biểu thức xâu, FOX sẽ báo lỗi
“ Beyond string”.
Nếu giá trị của m nhỏ hơn hoặc bằng 0 thì giá trị của hàm là một xâu
rỗng.
Nếu giá trị của m không nguyên thì FOX sẽ lấy giá trị là phần nguyên
của biểu thức m.
Nếu không viết m hoặc giá trị của m lớn hơn chiều dài của BT xâu thì giá
trị của hàm là một xâu gồm tất cả các ký tự từ vị trí n về cuối BT xâu.
Ví dụ:
? SUBSTR(‘ABCDE’,2,3)
BCD
? SUBSTR(‘ABCDE’,3,6)
CDE
? SUBSTR(‘ABCDE’,2,-2)
? SUBSTR(‘ABCDE’,2,3.7)
BCD
? SUBSTR(‘ABCDE’,4)
DE

f. Hàm REPLICATE
Dùng để lặp lại giá trị của một xâu ký tự.
Dạng hàm: REPLICATE(<BT xâu>,<n>)
Trong đó: n là một biểu thức số.
Hàm cho giá trị là một xâu gồm giá trị của BT xâu được lặp n lần.
Nếu giá trị của n nhỏ hơn hoặc bằng 0 thì giá trị của hàm là một xâu rỗng.
Nếu giá trị của n không nguyên thì FOX sẽ lấy giá trị là phần nguyên của
biểu thức n.
Ví dụ:
? REPLICATE(‘ABCDE’,2)
ABCDEABCDE
? REPLICATE(‘ABCDE’,-10)
? REPLICATE(‘ABCDE’,2.9)
ABCDEABCDE

Vũ Bá Anh – Phan Phước Long 94


Chương 3:Hệ quản trị CSDL Visual FoxPro

g. Hàm LTRIM, RTRIM, ALLTRIM


Dùng để cắt các ký tự trống trong một xâu ký tự.
Dạng hàm:
LTRIM(<BT xâu>)
RTRIM(<BT xâu>)
ALLTRIM(<BT xâu>)
Hàm LTRIM sẽ cho giá trị là một xâu lấy từ giá trị BT xâu sau khi đã cắt
hết các ký tự trống ở phía trái.
Hàm RTRIM sẽ cho giá trị là một xâu lấy từ giá trị BT xâu sau khi đã
cắt hết các ký tự trống ở phía phải.
Hàm AALTRIM sẽ cho giá trị là một xâu lấy từ giá trị BT xâu sau khi
đã cắt hết các ký tự trống ở cả hai phía trái và phải.
Ví dụ:
? LTRIM(‘ ABCDE’)
ABCDE
? RTRIM(‘Nguyễn văn Hùng ’)+’Sinh ngày:1/1/1970’
Nguyễn văn HùngSinh ngày:1/1/1970
? AALTRIM(‘ ABCDE ’)
ABCDE

h. Hàm AT
Dùng để tìm kiếm vị trí một xâu con chứa trong một xâu ký tự.
Dạng hàm: AT(<BT xâu 1>, <BT xâu 2>)
Trong đó : BT xâu 1, BT xâu 2 là các xâu ký tự.
Hàm này tìm kiếm giá trị của BT xâu 1 trong xâu xác định bởi giá trị của
BT xâu 2. Giá trị của hàm là một số chỉ ra vị trí bắt đầu của xâu 1 trong xâu 2.
Nếu giá trị của BT xâu 1 không có trong giá trị của BT xâu 2 ( không là xâu
con) thì hàm cho giá trị là số 0.
Ví dụ:
? AT(‘ABC’,’123ABCD’)
4
? AT(‘Hương’, ‘NGUYỄN THỊ HƯƠNG’)
0

Vũ Bá Anh – Phan Phước Long 95


Chương 3:Hệ quản trị CSDL Visual FoxPro

i. Hàm LOWER
Dùng để chuyển tất cả các chữ cái trong xâu ký tự thành chữ thường.
Dạng hàm: LOWER(<BT xâu>)
Hàm sẽ cho giá trị là một xâu là kết quả của giá trị BT xâu đã chuyển tất
cả các chữ cái thành chữ thường.
Ví dụ :
? LOWER(‘123aBcD’)
123abcd

j. Hàm UPPER
Dùng để chuyển tất cả các chữ cái trong xâu ký tự thành chữ in.
Dạng hàm: UPPER(<BT xâu>)
Hàm sẽ cho giá trị là một xâu là kết quả của giá trị BT xâu đã chuyển tất
cả các chữ cái thành chữ in.
Ví dụ :
? UPPER(‘123aBcD’)
123ABCD
3.3.4.2. Các hàm chuyển loại dữ liệu.

a. Hàm VAL
Dùng để chuyển loại dữ liệu từ loại xâu sang loại số.
Dạng hàm: VAL(<BT xâu>)
Hàm sẽ chuyển giá trị BT xâu thành một số tương ứng. Trong trường hợp
giá trị BT xâu không biểu diễn một số nào thì hàm cho giá trị là số không “0”.
Ví dụ:
? VAL(‘123’+’45’)
12345
(Đây là số 12.345)
? VAL(‘12H1’)
12 (số 12)
? VAL(‘XYZT’)
0 (số 0)

b. Hàm STR

Vũ Bá Anh – Phan Phước Long 96


Chương 3:Hệ quản trị CSDL Visual FoxPro

Dùng để chuyển giá trị một biểu thức số thành một xâu ký tự tương ứng.
Dạng hàm: STR(<Bt số> [,n] [,m])
Trong đó: n, m là các biểu thức số.
Hàm cho giá trị là một xâu biểu diễn giá trị của biểu thức số với độ dài là
n và m ký tự sau dấu chấm.
Nếu không viết m thì hiểu là dãy ký tự biểu diễn số nguyên.
Nếu không viết n thì lấy độ dài ngầm định của xâu là 10.
Nếu n nhỏ hơn số chữ số phần nguyên của giá trị Bt số thì xảy ra hiển
tượng tràn nên giá trị của hàm n ký tự “ * “.
Ví dụ:
? STR(20/3,5,2)
6.67 ( - một khoảng trống)
? STR(20/3,5)
7
? STR(20/3)
7

c. Hàm CTOD
Dùng để chuyển một xâu ký tự thành một ngày tương ứng.
Dạng hàm: CTOD( <Bt xâu> )
Hàm chuyển giá trị Bt xâu thành một ngày (dữ kiệu loại ngày tháng)
tương ứng.
Ví dụ:
NGAY=’01/21/98’
? CTOD(NGAY)
01/21/98
? TYPE(CTOD(NGAY))
D
Khi biểu thức xâu không chuyển được thành một ngày tương ứng thì các
giá trị ngày, tháng, năm sẽ bỏ trống.
Ví dụ: Giá trị của hàm CTOD(‘abcdefgh’) là { / / }.

d. Hàm DTOC

Vũ Bá Anh – Phan Phước Long 97


Chương 3:Hệ quản trị CSDL Visual FoxPro

Dùng để chuyển giá trị một biểu thức ngày thành một xâu ký tự tương
ứng.
Dạng hàm: DTOC( <Bt ngày> )
Hàm chuyển giá trị <Bt ngày> thành một xâu ký tự tương ứng biểu diễn
giá trị của nó.
Ví dụ:
NGAY={01/21/98}
? DTOC(NGAY)
01/21/98 (là một xâu)
? TYPE(DTOC(NGAY))
C
3.3.4.3. Một số hàm số toán học thường gặp:
Hàm số nhận đối là số thực nằm trong miền xác định và giá trị của hàm là
một số thực:
Tên hàm Hàm Viết trong FOX
Trị tuyệt đối của x |x| ABS(X)
Căn bậc 2 của x X SQRT(X)
E mũ x Ex EXP(X)
Loga tự nhiên của x Lnx LOG(X)
Phần nguyên của x [x] INT(X)
Phần dư của x chia y X mod Y MOD(X,Y)
Sin x sinx SIN(X)
Cosin x cos x COS(X)
Tang x tg x TAN(X)
Giá trị nhỏ nhất Min {x1,x2,...,xn} MIN(x1,x2,...,xn)
Giá trị lớn nhất Max{x1,x2,...,xn} MAX(x1,x2,...,xn)

3.3.4.4. Một số hàm khác:

a. Hàm DATE
Để xác định ngày hệ thống.

Vũ Bá Anh – Phan Phước Long 98


Chương 3:Hệ quản trị CSDL Visual FoxPro

Dạng hàm: DATE()


Hàm sẽ cho giá trị là ngày hiện tại theo sự cập nhật ngày của máy đang
dùng. Dạng ngày sẽ theo SET DATE đã chọn.
Ví dụ :
? DATE()
18-10-99

b. Hàm DAY
Dùng để trích ra ngày từ giá trị một biểu thức ngày.
Dạng hàm: DAY(<Bt ngày>)
Hàm cho giá trị là ngày được trích ra từ giá trị biểu thức ngày.
Ví dụ:
Ngay={21/01/99}
?DAY(NGAY)
21 (giá trị thuộc loại số)
? TYPE(‘DAY(NGAY)’)
N

c. Hàm MONTH
Dùng để trích ra tháng từ giá trị một biểu thức ngày.
Dạng hàm: MONTH( <Bt ngày> )
Hàm cho giá trị là tháng được trích ra từ giá trị biểu thức ngày.
Ví dụ:
Ngay={21/01/99}
?MONTH(NGAY)
1 (giá trị thuộc loại số)
? TYPE(‘MONTH(NGAY)’)
N

d. Hàm YEAR
Dùng để trích ra năm từ giá trị một biểu thức ngày.
Dạng hàm: YEAR(<Bt ngày> )

Vũ Bá Anh – Phan Phước Long 99


Chương 3:Hệ quản trị CSDL Visual FoxPro

Hàm cho giá trị là năm được trích ra từ giá trị biểu thức ngày.
Ví dụ:
Ngay={21/01/99}
?YEAR(NGAY)
1999 (giá trị thuộc loại số)
? TYPE(‘YEAR(NGAY)’)
N

e. Hàm DOW
Dùng để xác định thứ tự của ngày trong tuần của ngày lấy ra từ biểu thức
ngày.
Dạng hàm: DOW(<Bt ngày>)
Hàm cho giá trị là thứ tự ngày trong tuần của ngày được trích ra từ giá trị
biểu thức ngày.
Ví dụ:
Ngay={21/01/99}
?DOW(NGAY)
5 (Ngày thứ 5 trong tuần - giá trị thuộc loại số)
? TYPE(‘DOW(NGAY)’)
N

f. Hàm RECNO()
Dùng để xác định số thứ tự của bản ghi trong tệp dữ liệu.
Dạng hàm:
RECNO()
Hàm cho giá trị là số hiệu của bản ghi hiện thời có loại là số.
Số hiệu của bản ghi là số thứ tự của bản ghi.
Ví dụ:
USE QLHS
? RECNO()
1
GOTO 120

Vũ Bá Anh – Phan Phước Long 100


Chương 3:Hệ quản trị CSDL Visual FoxPro

? RECNO()
120

g. Hàm EOF
Dùng để xác định con trỏ bản ghi có đặt vào dấu hiệu kết thúc tệp hay
không.
Dạng hàm: EOF()
Hàm cho giá trị .T. khi con trỏ đặt vào dấu hiệu kết thúc tệp và cho giá trị
là .F. trong trường hợp ngược lại.
Ví dụ:
USE QLHS
? EOF()
.F.
GOTO BOTTOM
? EOF()
.F.
SKIP
? EOF()
.T.

h. Hàm BOF
Dùng để xác định con trỏ bản ghi có đặt vào dấu hiệu bắt đầu tệp hay
không.
Dạng hàm: BOF()
Hàm cho giá trị .T. khi con trỏ đặt vào dấu hiệu bắt đầu tệp và cho giá trị
là .F. trong trường hợp ngược lại.
Ví dụ:
USE QLHS
? BOF()
.F.
SKIP -1
? BOF()

Vũ Bá Anh – Phan Phước Long 101


Chương 3:Hệ quản trị CSDL Visual FoxPro

.T.

i. Hàm PROW
Dùng để xác định dòng của đầu in đang đặt trên trang in.
Dạng hàm: PROW()
Hàm cho giá trị là số chỉ thứ tự dòng của đầu in trên trang giấy in.
Hàm thường dùng khi điều khiển máy in để xuất thông tin ra giấy thành
văn bản.

j. Hàm PCOL
Dùng để xác định cột của đầu in đang đặt trên trang in.
Dạng hàm: PCOL( )
Hàm cho giá trị là số chỉ thứ tự cột của đầu in trên trang giấy in.
Hàm thường dùng khi điều khiển máy in để xuất thông tin ra giấy thành
văn bản.

k. Hàm ROW
Dùng để xác định dòng hiện thời trên màn hình.
Dạng hàm: ROW( )
Hàm cho giá trị là số chỉ thứ tự dòng hiện thời trên màn hình khi xuất
thông tin ra màn hình.

l. Hàm COL
Dùng để xác định cột hiện thời trên màn hình.
Dạng hàm: COL( )
Hàm cho giá trị là số chỉ thứ tự cột hiện thời trên màn hình khi xuất thông
tin ra màn hình.
3.4. Biểu thức.
Biểu thức gồm các đại lượng liên kết với nhau bởi các dấu phép toán và
cặp dấu ( ). Tuỳ thuộc đại lượng thuộc loại nào, liên kết bởi dấu phép toán
tương ứng mà có các loại biểu thức tương ứng.

Vũ Bá Anh – Phan Phước Long 102


Chương 3:Hệ quản trị CSDL Visual FoxPro

3.4.1. Biểu thức số.


Biểu thức số gồm các đại lượng số (hằng số, biến số, hàm số ) liên kết với
nhau bởi các dấu phép toán số học, dấu ( , ) một cách có ý nghĩa.
Hai đại lượng ngày trừ đi nhau cũng được coi là biểu thức số.
Ví dụ: { 01/20/99 } - { 01/15/99} có giá trị là 5 (loại số).
Các dấu phép toán số học gồm:
+: Dấu phép toán cộng
- : Dấu phép toán trừ
* : Dấu phép toán nhân
/ : Dấu phép toán chia
∧ (**): Dấu phép toán luỹ thừa.
Thứ tự ưu tiên khi thực hiện các phép toán:
- Các phép toán trong ngoặc ( )
- Tính hàm
- Tính luỹ thừa
- Nhân và chia
- Cộng và trừ.
Nếu các phép toán cùng mức độ ưu tiên thì thực hiện từ trái sang phải.
3.4.2. Biểu thức xâu.
Biểu thức xâu gồm tập hợp các đại lượng xâu liên kết với nhau bởi dấu
phép toán ghép xâu. Dấu phép toán ghép xâu là + hoặc -
Giá trị của biểu thức xâu là một xâu ký tự gồm giá trị của các đại lượng
có mặt trong biểu thức ghép lại tuần tự.
- Nếu dấu ghép xâu là + thì ghép toàn bộ các xâu.
- Nếu dấu ghép xâu là dấu - thì ghép sau khi đã loại bỏ hết các ký tự trắng
vô nghĩa ở phía phải.
Ví dụ: ‘ABC ’ + ‘DE’ có giá trị là ‘ABC DE’
‘ABC ‘ - ‘DE’ có giá trị là ‘ABCDE’

Vũ Bá Anh – Phan Phước Long 103


Chương 3:Hệ quản trị CSDL Visual FoxPro

3.4.3. Biểu thức ngày.


Biểu thức ngày gồm một đại lượng ngày và các đại lượng số liên kết với
nhau bởi dấu cộng hoặc trừ một cách có nghĩa (được hiểu là một ngày tháng
cộng hoặc trừ bao nhiêu ngày).
Giá trị của biểu thức ngày là một hằng ngày tháng.
Ví dụ: {01/20/99} + 5 có giá trị {01/25/99}
{01/21/69} - 10 có giá trị là {01/11/69}
3.4.4. Biểu thức quan hệ.
Biểu thức quan hệ gồm hai biểu thức cùng loại (số, xâu hoặc ngày) liên
kết với nhau bởi một dấu phép toán quan hệ.
Các dấu phép toán quan hệ:
= Bằng <= Nhỏ hơn hoặc bằng.
< Nhỏ hơn >= Lớn hơn hoặc bằng.
> Lớn hơn < > (#) Khác.
Khi tính giá trị, máy so sánh giá trị hai biểu thức ở hai vế, nếu phù hợp
với dấu phép toán thì biểu thức quan hệ nhận giá trị .T. (Viết tắt của True,
nghĩa là đúng), ngược lại thì nhận giá trị .F. (False - sai)
Ví dụ:
- Biểu thức: 5 + 1 < 2 có giá trị .F.
- Biểu thức: ‘ANH’ > ‘ANG’ nhận giá trị .T.
Nhớ rằng, khi so sánh hai xâu, máy thực hiện so sánh theo kiểu từ điển
dựa trên giá trị của mã ASC I I của các ký tự.
- Biểu thức:
{01/21/99} < {01/25/99} nhận giá trị .T.
Khi so sánh hai ngày tháng, đầu tiên so sánh năm, cùng năm mới xét
tháng, cùng tháng mới xét ngày. Mỗi thành phần này đều là số.
3.4.5. Biểu thức logic.
Biểu thức logic gồm một tập hợp các đại lượng logic, các biểu thức quan
hệ, liên kết với nhau bởi các dấu phép toán logic, dấu mở ngoặc “ ( “ , dấu đóng
ngoặc “ ) ” một cách có nghĩa.
Các dấu phép toán logic gồm:

Vũ Bá Anh – Phan Phước Long 104


Chương 3:Hệ quản trị CSDL Visual FoxPro

.NOT. - Phép phủ định NOT.


.AND. - Phép toán và logic.
.OR. - Phép toán hoặc logic.
Cách thực hiện từng phép toán như sau:
Phép toán . NOT. chỉ có một toán hạng: Phủ định .T. là .F.
Phủ định .F. là .T.
Phép toán .AND. có hai toán hạng. Phép và chỉ đúng khi cả hai toán hạng
đồng thời đúng, nhận giá trị sau khi ít nhất một trong hai toán hạng sai.
Bảng giá trị của phép toán .AND. như sau:

a .T. .T. .F. .F.

b .T. .F. .T. .F.

a .AND. b .T. .F. .F. .F.

Phép toán .OR. có hai toán hạng. Phép hoặc chỉ nhận giá trị sai (.F.) khi
cả hai toán hạng sai, sẽ nhận giá trị đúng khi có ít nhất một trong hai toán hạng
đúng (. T.)
Bảng giá trị của phép toán .OR. như sau:

a .T. .T. .F. .F.

b .T. .F. .T. .F.

a .OR. b .T. .T. .T. .F.

Khi tính giá trị biểu thức logic, sẽ theo trình tự ưu tiên sau:
- Các phép toán trong ngoặc ( )
- Phép toán .NOT.
- Phép toán .AND.
- Phép toán .OR.
Vậy biểu thức logic chỉ nhận giá trị .T. hoặc .F.

Vũ Bá Anh – Phan Phước Long 105


Chương 3:Hệ quản trị CSDL Visual FoxPro

Lưu ý: Các dấu phép toán logic, khi viết trong FOX có thể bỏ các dấu
chấm trước và sau nhưng phải có ít nhất một khoảng trống trước và sau các từ
NOT, AND, OR.
3.5. Phạm vi.
Phạm vi là một yếu tố của FOX để chỉ ra tập hợp các bản ghi được thao
tác đối với các lệnh xử lý các bản ghi trên tệp dữ liệu.
FOX sử dụng các phạm vi sau:
ALL - bao gồm tất cả các bản ghi.
NEXT n - gồm n bản ghi tiếp theo kể từ bản ghi hiện thời (đang làm
việc).
RECORD n - chỉ gồm bản ghi có số hiệu là n (số hiệu bản ghi chính là số
thứ tự của bản ghi trong tệp).
REST - gồm tất cả các bản ghi kể từ bản ghi đang làm việc đến cuối tệp.
4. CÁC LỆNH CƠ BẢN CỦA FOX.

4.1. Tạo tệp dữ liệu.


Tạo tệp dữ liệu được tiến hành với hai phần việc:
- Tạo cấu trúc tệp: Khai báo cho máy biết về các trường mà tệp phải có
với đầy đủ các đặc trưng về tên trường, loại trường, độ rộng và số chữ số thập
phân nếu là trường số.
- Nhập nội dung các bản ghi của tệp.
Tuy nhiên việc tạo cấu trúc tệp chỉ phải thực hiện lần đầu, còn nội dung
tệp sẽ được cập nhật dữ liệu dần dần.
4.1.1. Lệnh CREATE
- Dùng để : Tạo cấu trúc tệp dữ liệu.
- Dạng lệnh :
CREATE < tên tệp >
Trong đó:
CREATE : Là từ khoá
Tên tệp : Là tên tệp dữ liệu cần tạo cấu trúc, phần mở rộng ngầm định là
.DBF

Vũ Bá Anh – Phan Phước Long 106


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Tác động: Lệnh cho hiện ra một bảng khai báo để người sử dụng khai
báo cấu trúc tệp, có dạng:

Khi đó người sử dụng khai báo lần lượt từng trường, với:
+ Tên trường: Đặt theo qui tắc ở phần 3.3.2.
+ Loại trường: Ta chỉ xét mỗi trường thuộc một trong năm loại:
C (Character) - Trường loại ký tự.
N (Numeric) - Trường loại số.
D (Date) - Trường loại ngày tháng.
L (Logical) - Trường loại logic.
M (Memo) - Trường loại ký ức.
+ Độ rộng trường:
Trường loại ký tự (C) có độ rộng ≤ 254
Trường loại số (N) có độ rộng ≤ 20
Trường loại ngày tháng (D) có độ rộng = 8
Trường loại logic (L) có độ rộng =1
Trường loại memo (M) có độ rộng ≤ 5000
+ Số chữ số thập phân: Chỉ phải khai báo với trường số, nếu là 0 thì số đó
là số nguyên, nếu > 0 thì là số thực và khi đó mất một vị trí cho dấu chấm ngăn
cách phần nguyên và phân.
Kết thúc khai báo bấm ^ W ↵ hoặc ↵↵ , khi đó xuất hiện của sổ hỏi:

Vũ Bá Anh – Phan Phước Long 107


Chương 3:Hệ quản trị CSDL Visual FoxPro

(bây giờ bạn có vào các bản ghi dữ liệu không?)


 Nếu trả lời Y (yes) : Máy sẽ cho nhập lần lượt các bản ghi vào tệp.
Kết thúc nhập dữ liệu bấm ∧W hoặc ∧End. (Thực chất ở đây, khi trả
lời Y, máy đã chuyển sang thực hiện lệnh APPEND)
 Nếu trả lời N (No) : Máy đã thực hiện xong lệnh CREATE thường
thì lại quay về đợi lệnh tiếp theo (tại cửa sổ lệnh).
Ví dụ: Để quản lý điểm thi của sinh viên Trường Đại học TC - KT Hà
nội, người ta cần lưu trữ các thông tin sau của mỗi sinh viên: Họ tên, số báo
danh, khoá, lớp, ngày sinh, giới sinh, điểm thi môn 1, môn 2, môn 3, điểm
trung bình, phân loại học tập, ta có thể tạo tệp dữ liệu (thiết kế cấu trúc tệp) như
sau:
CREATE QLHS. DBF

Thuộc tính Name Type Wodth Dec


Họ tên đệm HTD C 17
Tên TEN C 7
Số báo danh SBD C 5
Khoá KHOA C 2
Lớp LOP C 4
Ngày sinh NS D 8
Giới tính GT L 1
Điểm môn 1 D1 N 2 0
Điểm môn 2 D2 N 2 0
Điểm môn 3 D3 N 2 0
Điểm trung bình DTB N 5 2
Phân loại PL C 4

Vũ Bá Anh – Phan Phước Long 108


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ở đây, trường GT thuộc loại L chỉ nhận T hoặc F, vậy phải mã tương ứng
T tương ứng giới tính gì (giả sử T - Nam), F tương ứng với giới tính gì (giả sử
F - Nữ) và khi nhập dữ liệu bắt buộc phải tuân theo qui định đó để có thể xử lý
được về sau.
4.1.2. Mở - đóng tệp dữ liệu.
- Khái niệm : Tệp dữ liệu được lưu trữ trên đĩa. Để làm việc với tệp nào,
ta phải đọc tệp đó vào RAM - gọi là mở tệp. Sau khi làm việc xong ta ghi lại
thông tin của tệp ở RAM trở lại đĩa - gọi là đóng tệp.
- Để mở tệp, ta dùng lệnh:
USE < tên tệp >
Trong đó: <tên tệp> là tên tệp dữ liệu cần mở, phầm mở rộng ngầm định
là .DBF.
- Để đóng tệp, dùng một trong các lệnh:
USE - đóng tệp đang sử dụng.
CLOSE DATABASE - Đóng CSDL tức là đóng tất cả các tệp dữ liệu
đang mở.
CLOSE ALL - Đóng tất cả các tệp đang mở (trong đó có các tệp dữ
liệu).
Ngoài ra tại một vùng làm việc, khi mở một tệp dữ liệu, nếu trước đó đã
có một tệp khác đang mở, máy sẽ tự đóng tệp đang mở trước đó:
Ví dụ:
USE A:\VATTU.DBF
USE CHUNGTU
USE
4.1.3 Lệnh APPEND
- Dùng để bổ sung thêm các bản ghi vào cuối tệp dữ liệu đang mở
- Dạng: APPEND
- Tác động: Lệnh sẽ cho bổ sung thêm các bản ghi vào cuối tệp đang mở, dữ
liệu do người sử dụng nhập từ bàn phím, kết thúc nhập dữ liệu bấm ^W hoặc
^End.
Ví dụ: Giả sử tại thư mục làm việc đã có tệp QLHS.DBF, cần nhập
thêm danh sách học sinh vào tệp ta viết các lệnh:

Vũ Bá Anh – Phan Phước Long 109


Chương 3:Hệ quản trị CSDL Visual FoxPro

USE QLHS
APPEND
Xuất hiện cửa sổ nhập bổ sung bản ghi:

(Nhập dữ liệu lần lượt từng bản ghi kết thúc bấm ^W)
USE
4.1.4. Lệnh APPEND FROM ...
- Dùng để bổ sung các bản ghi vào cuối tệp đang mở nhưng dữ liệu được
lấy từ một tệp dữ liệu khác đã có trên đĩa.
- Dạng:
APPEND FROM <tên tệp> [ FOR <biểu thức logic>]
Trong đó: <tên tệp> là tên của tệp dữ liệu khác chưa mở hoặc mở ở vùng
làm việc khác.
- Tác động : Lệnh sẽ cho bổ sung các bản ghi từ tệp xác định bởi
<tên tệp> vào cuối tệp dữ liệu đang mở. Dữ liệu chỉ có ở những trường giữa hai
tệp trùng tên nhau, ngược lại bỏ trống.
Nếu có mệnh đề FOR <biểu thức logic> thì chỉ những bản ghi thoả mãn
biểu thức logic (làm biểu thức logic đúng) được bổ sung.
- Ví dụ: Giả sử tại A:\ có tệp DSBS.DBF cùng cấu trúc với tệp
QLHS.DBF. Cần bổ sung danh sách học sinh khoá 36 từ tệp DSBS.dbf vào
cuối tệp QLHS.dbf thì viết:
USE QLHS
APPEND FROM A:\DSBS FOR KHOA = ‘36’
USE

Vũ Bá Anh – Phan Phước Long 110


Chương 3:Hệ quản trị CSDL Visual FoxPro

Nếu bỏ FOR ... thì tất cả các bản ghi từ tệp DSBS.dbf sẽ được bổ sung
vào cuối tệp QLHS.dbf
4.1.5. Lệnh COPY STRUCTURE
- Dùng để sao chép cấu trúc tệp dữ liệu đang mở sang một tệp khác
- Dạng: COPY STRUCTURE TO <tên tệp>
Trong đó: <tên tệp> là tên tệp dữ liệu - kết quả của việc sao chép cấu trúc
- Tác động: Lệnh sẽ sao cấu trúc của tệp dữ liệu đang mở để có tệp mới
có tên xác định bởi <tên tệp>
- Ví dụ:
USE QLHS
COPY STRUCTURE TO A:\LUU.DBF
4.1.6. Lệnh COPY
- Lệnh này sẽ sao cả tệp dữ liệu này thành một tệp khác
- Dạng: COPY TO <tên tệp> [FOR <biểu thức logic>]
Trong đó: <tên tệp> là tên tệp dữ liệu kết quả sau khi sao được từ tệp dữ
liệu đang mở.
- Tác động: Lệnh sẽ sao tệp đang mở để có tệp mới xác định bởi tên tệp.
Nếu có FOR <biểu thức logic> thì chỉ các bản ghi thoả mãn biểu thức
logic được sao sang.
Ví dụ 1: USE QLHS
COPY TO A:\BANSAO
Lệnh COPY trên sao toàn bộ tệp QLHS. DBF thành tệp BANSAO.DBF
tại gốc A:
Ví dụ 2: USE QLHS
COPY TO K40 FOR KHOA = ‘40’
Lệnh COPY này sao các bản ghi có trường KHOA nhận giá trị là 40
(nghĩa là khoá 40) từ tệp QLHS.DBF thành tệp K40.DBF đặt tại thư mục làm
việc.

Vũ Bá Anh – Phan Phước Long 111


Chương 3:Hệ quản trị CSDL Visual FoxPro

4.2. Di chuyển con trỏ bản ghi


4.2.1. Khái niệm
Khi làm việc với tệp dữ liệu là ta làm việc với các bản ghi trong tệp. Tại
một thời điểm cụ thể chỉ làm việc với một bản ghi duy nhất. Bản ghi có thể
được xử lý tại thời điểm hiện thời gọi là bản ghi hiện thời. Khi đó con trỏ bản
ghi sẽ được đặt ở bản ghi đó.
Vậy con trỏ bản ghi là cơ chế đánh dấu bản ghi đang làm việc. Khi mới
mở tệp dữ liệu, con trỏ đặt vào bản ghi đầu tiên của tệp. Để làm việc với các
bản ghi nào đó, ta phải di chuyển con trỏ đến đó bằng các lệnh sau:
4.2.2. Lệnh GOTO (GO)
- Dùng để: Di chuyển con trỏ đến một bản ghi có vị trí xác định.
- Dạng:
GOTO <n> /TOP/ BOTTOM
Trong đó:
n là số hiệu bản ghi cần chuyển đến
TOP là từ khoá chỉ bản ghi đầu tiên của tệp
BOTTOM là từ khoá chỉ bản ghi cuối cùng của tệp
- Ví dụ: Giả sử tệp QLHS.DBF có 100 bản ghi.
Lệnh Con trỏ đặt tại bản ghi số
USE QLHS 1
GOTO 50 50
GOTO TOP 1
GOTO BOTTOM 100
4.2.3. Lệnh SKIP
- Dùng để: Di chuyển con trỏ đến một bản ghi có vị trí tương đối so với
bản ghi hiện thời
- Dạng: SKIP [n]
Trong đó n là biểu thức số nhận giá trị nguyên. Giá trị ngầm định của n là
1
- Tác động: Lệnh sẽ di chuyển con trỏ đi n bản ghi kể từ bản ghi hiện thời
Nếu n > 0: Chuyển về phía cuối tệp

Vũ Bá Anh – Phan Phước Long 112


Chương 3:Hệ quản trị CSDL Visual FoxPro

Nếu n < 0: Chuyển về phía đầu tệp


Ví dụ: Giả sử tệp QLHS.DBF có 100 bản ghi
Lệnh Con trỏ đặt ở bản ghi số
USE QLHS 1
SKIP 50 51
SKIP 10 61
SKIP - 5 56
SKIP 57
Chú ý:
Các bản ghi trong tệp được đánh số từ 1 đến hết. Trước bản ghi đầu tiên
có dấu hiệu bắt đầu tệp BOF (viết tắt của Begin of File), sau bản ghi cuối cùng
có dấu hiệu kết thúc tệp EOF (viết tắt của End of File)
Khi con trỏ ở bản ghi cuối cùng nếu dịch chuyển đi một bản ghi về phía
cuối, con trỏ sẽ đặt tại dấu hiệu EOF, khi đó hàm EOF() nhận giá trị .T. (còn
khi con trỏ không đặt tại dấu hiệu EOF thì hàm EOF() sẽ nhận giá trị .F.). Khi
con trỏ ở bản ghi đầu tiên, nếu dịch chuyển lên trên một bản ghi, hàm BOF() sẽ
nhận giá trị .T. (còn khi không ở trường hợp này, hàm BOF() sẽ nhận giá trị
.F.)
Các lệnh GOTO và SKIP sẽ di chuyển con trỏ không phụ thuộc bất kỳ
điều kiện nào nên gọi là các lệnh di chuyển con trỏ vô điều kiện. Ngoài ra còn
có các lệnh để di chuyển con trỏ đến bản ghi thoả mãn một điều kiện nào đó,
các lệnh đó được gọi là các lệnh di chuyển có điều kiện. Các lệnh di chuyển có
điều kiện thực chất là các lệnh tìm kiếm bản ghi, sẽ được giới thiệu ở phần các
lệnh tìm kiếm.
4.3. Xem - Sửa tệp dữ liệu
4.3.1. Lệnh DIR
- Dùng để xem tên các tệp trên đĩa. Lệnh này tương tự lệnh DIR của DOS
- Dạng: DIR [ tên tệp]
Tên tệp ngầm định là ∗.DBF
Ví dụ: DIR \ KT\∗.∗
4.3.2. Hai lệnh LIST STRUCTURE và DIRPLAY STRUCTURE
- Cả hai lệnh đều dùng để xem thông tin về cấu trúc tệp đang mở.

Vũ Bá Anh – Phan Phước Long 113


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Dạng: LIST STRUCTURE [ TO PRINTER]


DISPLAY STRUCTURE [ TO PRINTER]
- Tác động:
Lệnh dùng để xem các thông tin về cấu trúc của tệp đang mở.
Nếu có TO PRINTER thì đưa các thông tin này được đưa ra máy in,
ngược lại thì đưa ra màn hình.
Các thông tin xem được gồm:
 Tên tệp đang mở.
 Số lượng bản ghi dữ liệu.
 Ngày cập nhật gần nhất.
 Danh sách các trường cùng các đặc trưng của các trường.
Hai lệnh LIST STRUCTURE và DISPLAY STRUCTURE chỉ khác
nhau ở cách thức đưa ra. LIST ... sẽ đưa ra tất cả các thông tin một cách liên
tục, còn DISPLAY ... thì đưa ra theo chế độ phân trang nghĩa là cứ đầy trang
màn hình thì dừng lại, chờ bấm phím bất kỳ lại tiếp tục, cứ thế cho đến hết.
Ví dụ: Để in lại bảng cấu trúc của tệp QLHS. DBF , ta viết:
USE QLHS
LIST STRUCTURE TO PRINTER
(Tất nhiên phải có máy in)
4.3.3. Hai lệnh: LIST và DISPLAY
Cả hai lệnh đều để đưa ra màn hình hoặc máy in nội dung các bản ghi
trong tệp dữ lệu đang mở.
- Dạng lệnh:
LIST [ phạm vi] [Fields <ds trường>] [ For <BTlogic>] [ TO
PRINTER]
DISPLAY [phạm vi][Fields <ds trường>][For <BTlogic>][TO
PRINTER]
Trong đó:
 Phạm vi: Để xác định tập hợp các bản ghi cần xem. Phạm vi ngầm
định của LIST là ALL, của DISPLAY là bản ghi hiện thời.
 Danh sách trường: Gồm tập hợp các tên trường cần xem, cách nhau
dấu phẩy. Ngầm định là mọi trường trong tệp đang mở.

Vũ Bá Anh – Phan Phước Long 114


Chương 3:Hệ quản trị CSDL Visual FoxPro

 Biểu thức logic để xác định điều kiện các bản ghi cần xem. (Thoả mãn
biểu thức logic thì đưa ra cho xem, ngược lại thì không đưa ra).
- Tác động: Lệnh sẽ đưa ra màn hình hoặc máy in nội dung các bản ghi
nằm trong <phạm vi> và chỉ gồm các trường theo yêu cầu (có tên trong danh
sách trường).
Nếu có For <BTlogic> thì chỉ cho xem nội dung các bản ghi làm
BTlogic đúng (.T.)
TO PRINTER nếu có thì các thông tin đó được đưa ra máy in, nếu
không thì đưa ra màn hình.
Ví dụ: Xét tệp QLHS.DBF (ở thư mục làm việc)
+ Ví dụ 1: Cần xem bản ghi số 50
USE QLHD
GOTO 50
DISPLAY
USE
+ Ví dụ 2: Cần in danh sách học sinh của khoá 40, gồm họ tên, lớp, số
báo danh, ngày sinh, giới tính.
USE QLHS
LIST FIELDS HTD, TEN, LOP, SDB, NS, GT FOR KHOA = ‘40’ TO
PRINTER
USE
+ Ví dụ 3: Xem danh sách học sinh nữ có điểm trung bình từ 8.5 trở lên
LIST FOR .NOT. GT .AND. DTB > = 8.5
+ Ví dụ 4: Xem danh sách học sinh nam sinh trước ngày 1/1/1970
LIST FOR GT . AND. NS < = {01/01/70}
4.3.4. Lệnh MODIFY STRUCTURE
- Dùng để : Sửa lại cấu trúc tệp trúc tệp dữ liệu đang mở.
- Dạng: MODIFY STRUCTURE
- Tác động: Lệnh cho hiện lại bảng cấu trúc của tệp đang mở để người sử
dụng hiệu chỉnh lại cấu trúc.
Có thể qui về ba thao tác sửa chính sau:

Vũ Bá Anh – Phan Phước Long 115


Chương 3:Hệ quản trị CSDL Visual FoxPro

+ Thêm một trường: Đặt con trỏ màn hình vào trường cần chèn thêm
trường, sau đó ấn Alt+I (hoặc kích chuột vào lựa chọn Insert trên màn hình của
lệnh) khi đó một trường mới có tên <NEW FIELD> được chèn vào và ta sẽ tiến
hành khai báo các đặc trưng của trường cần chèn (gồm tên, loại, độ rộng và số
chữ số thập phân của trường số)
+ Xoá bớt một trường: Đặt trỏ tại trường cần xoá rồi ấn Alt+D ( hoặc
chọn lựa chon Delete trong màn hình của lệnh)
+ Sửa trên một trường, gồm: Đặt con trỏ vào vị trí cần sửa, rồi tiến hành
các sửa chữa cần thiết. Sửa trường thường là: Sửa tên trường, sửa loại trường,
sửa độ rộng và sửa số chữ số thập phân.
Khi đó, trong ba trường hợp sửa loại, độ rộng, phần thập phân có thể gây
mất dữ liệu.
Kết thúc sửa ấn ^W (hoặc ^↵ hoặc kích chuột vào lựa chọn OK)

Chú ý: Khi sửa cấu trúc tệp dữ liệu, máy sẽ tự động sinh ra tệp lưu cất
cùng tên, phần mở rộng .BAK để lưu lại nội dung tệp trước khi sửa chữa .
Khi cần lấy lại tệp cũ, chỉ cần đổi thành phần mở rộng .DBF là có thể sử
dụng được ngay.
4.3.5 Hai lệnh BROWSE và EDIT
- Cả hai lệnh đều dùng để sửa lại nội dung các bản ghi trong tệp đang
mở.
- Dạng:
BROWSE [ Fields < ds trường >] [ FOR < BT logic> ]
EDIT [ fields < ds trường> ] [ For < BT logic>]

Vũ Bá Anh – Phan Phước Long 116


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong đó: Danh sách trường để xác định tên các trường cần hiển thị để
sửa, ngầm định là mọi trường trong tệp đang mở.
- Tác động: Hai lệnh đều cho sửa các bản ghi trong tệp bắt đầu từ bản ghi
hiện thời, bao gồm các trường có tên trong danh sách trường. Nếu có
For < bt logic > thì chỉ cho sửa các biểu ghi hàm biểu thức logic đúng.
Để di chuyển con trỏ đến các trường và bản ghi cần sửa, dùng các phím
dịch chuyển con trỏ .
Kết thúc sửa ấn ^W hoặc ^End.
Hai lệnh BROWSE và EDIT chỉ khác nhau cách hiển thị khi sửa:

BROWSE hiển thị dạng bảng, mỗi bản ghi trên một dòng.

EDIT hiển thị mỗi trường trên một dòng:


- Ví dụ: Xét tệp QLHS.dbf, cần sửa lại điểm thi của học sinh lớp 30
khoá 35, có thể viết:
USE QLHS
EDIT FIELDS HTD, TEN, SBD, D1, D2, D3 FOR KHOA = ‘35’ .
AND. LOP = ‘30’
USE

Vũ Bá Anh – Phan Phước Long 117


Chương 3:Hệ quản trị CSDL Visual FoxPro

4.3.6. Lệnh REPLACE


- Dùng để thay thế nội dung của các trường dữ liệu trong tệp đang mở.
- Dạng:
REPLACE [ phạm vi] < trường 1> WITH < Biểu thức 1>
[, < trường 2> WITH < Biểu thức 2> ] [, ...][ FOR < BT logic> ]
Trong đó:
 Phạm vi: Xác định tập hợp các bản ghi cần thay thế, ngầm định là bản
ghi hiện thời.
 Trường 1, trường 2, ... : Là các tên trường cần thay thế giá trị.
 Biểu thức 1, biểu thức 2,...: Là các biểu thức dùng để lấy giá trị thay
vào các trường 1, 2, ... nên phải cùng loại với trường tương ứng.
- Tác động: Trên các bản ghi thuộc phạm vi, trường 1 được thay thế giá
trị của biểu thức 1, trường 2 được thay thế giá trị của biểu thức 2,... Nếu có For
<BT logic> thì chỉ các bản ghi làm biểu thức logic đúng (. T.) mới được thay
thế. Khi đó phạm vi ngầm định là ALL
- Ví dụ:
+ Ví dụ: Xét tệp QLHS.DBF. Cần tính điểm trung bình và phần loại học
tập của sinh viên theo quy tắc:
Điểm trung bình = (Điểm 1 x 6 + Điểm 2 x 5 + Điểm 3 x 4) / 15
Phân loại =’ Giỏi’ - nếu ĐTB ≥ 9
Phân loại =’Khá’ - nếu 7 ≤ ĐTB < 9
Phân loại =’ Trung bình’ - nếu 5 ≤ ĐTB < 7

Vũ Bá Anh – Phan Phước Long 118


Chương 3:Hệ quản trị CSDL Visual FoxPro

Phân loại =’ Yếu’ - nếu ĐTB < 5


Ta viết các lệnh:
USE QLHS
REPLACE ALL DTB WITH (D1 ∗ 6 + D2 ∗ 5 + D3 ∗ 4)/15
REPLACE PL WITH ‘GIOI’ FOR DTB > = 9
REPLACE PL WITH ‘KHA’ FOR DTB > = 7 . AND. DTB <9
REPLACE PL WITH ‘TB’ FOR DTB > = 5 . AND. DTB < 7
REPLACE PL WITH ‘Yếu’ FOR DTB < 5
USE
+ Ví dụ 2: Giả sử có tệp VATTU.DBF để quản lý tình hình nhập, xuất
vật tư ở một kho, có cấu trúc như sau:

Name Type Width Dec Giải thích


----------- ---------- ---------- -------- ---------------
SOCT C 6 Số chứng từ
NLCT D 8 Ngày lập chứng từ
TENVT C 20 Tên vật tư
MAVT C 6 Mã vật tư
DVT C 3 Đơn vị tính
LNV L 1 Loại nghiệp vụ (N/X)
MADV C 4 Mã đơn vị nhập/ Xuất
KL N 10 0 Khối lượng
DG N 10 2 Đơn giá
TT N 15 0 Thành tiền

Trong đó trường LNV là loại L được mã lại là .T. - nhập


.F. - xuất
Bây giờ ta cần đổi lại các đơn vị tính thống nhất từ tấn (TAN) ra
kilôgam (KG) ở trường DVT rồi tính: Thành tiền = khối lượng x đơn giá.
Ta viết các lệnh:

Vũ Bá Anh – Phan Phước Long 119


Chương 3:Hệ quản trị CSDL Visual FoxPro

USE VATTU
REPLACE KL WITH KL ∗ 1000 FOR DVT = ‘TAN’
REPLACE DG WITH DG /1000 FOR DVT = ‘TAN’
REPLACE DVT WITH ‘KG’ FOR DVT = ‘TAN’
REPLACE ALL TT WITH KL ∗ DG
USE
Tất nhiên ba lệnh REPLACE đầu tiên cùng có mệnh đề For < btlogic>
như nhau, có thể gộp thành một lệnh như sau:
REPLACE KL WITH KL ∗ 1000, DG WITH DG/1000, DVT WITH;
‘KG’ FOR DVT = ‘TAN’
Nhận xét: Với bản chất là để thay thế giá trị cho trường dữ liệu, lệnh
REPLACE thường dùng để tính toán và ghi kết quả vào trường.
4.4. Các lệnh thêm, bớt bản ghi.
4.4.1. Lệnh INSERT
- Dùng để chèn một bản ghi vào bất kỳ vị trí nào trong tệp dữ liệu đang
mở. Tuy nhiên việc này ít dùng máy phải thực hiện ghi chép lại tệp nên tốc độ
rất chậm.
- Dạng:
INSERT [ BEFORE] [ BLANK]
- Tác động: Lệnh sẽ cho chèn một bản ghi vào tệp. Cụ thể:
+ Mệnh đề BEFORE:
 Nếu có: chèn trước bản ghi hiện thời
 Nếu không: Chèn sau bản ghi hiện thời
+ Mệnh đề BLANK :
 Nếu có: Cho chèn một bản ghi trắng (rồng)
Bản ghi rỗng sẽ nhận giá trị là xâu gồm các khoảng trống ở trường kiểu
C, nhận 0 ở trường kiểu N, nhận . F. ở trường kiểu L, nhận .. / .. / .. ở
trường kiểu ngày D.
 Nếu không: sau khi chèn bản ghi trắng cho người sử dụng nhập dữ
liệu vào bản ghi đó, kết thúc ấn ^W
 Ví dụ: Xét tệp VATTU. DBF, cần chèn một bản ghi rỗng để nó là bản
ghi số 150.

Vũ Bá Anh – Phan Phước Long 120


Chương 3:Hệ quản trị CSDL Visual FoxPro

USE VATTU
GOTO 150
INSERT BEFORE BLANK
USE
4.4.2. Lệnh DELETE
- Dùng để: Đánh dấu xoá các bản ghi trong tệp đang mở (chưa xoá hẳn)
- Dạng :DELETE [ phạm vi] [ FOR < BTlogic> ]
Trong đó : Phạm vi ngầm định là bản ghi hiện thời.
Tác động: FOX sẽ đánh dấu xoá các bản ghi thuộc phạm vi.
Nếu có For < BTlogic> thì chỉ các bản ghi làm <BT logic> đúng được
đánh dấu xoá.
- Ví dụ : Xét tệp QLHS.dbf
+ Ví dụ1: Đánh dấu xoá bản ghi số 50
USE QLHS
GOTO 50
DELETE
USE
+ Ví dụ 2: Đánh dấu xoá danh sách học sinh khoá 28
USE QLHS
DELETE FOR KHOA = ‘28’
USE
4.4.4. Lệnh RECALL
- Dùng để gọi lại các bản ghi đã bị đánh dấu xoá, thực chất RECALL huỷ
bỏ việc đánh dấu xoá của DELETE.
- Dạng:
RECALL [phạm vi] [FOR < BT logic> ]
Trong đó: Phạm vi ngầm định là bản ghi hiện thời.
- Tác động: FOX sẽ huỷ bỏ việc đánh dấu xoá trên các bản ghi thuộc
phạm vi đã bị đánh dấu xoá. Nếu có For < BTlogic> thì chỉ huỷ bỏ đánh dấu
xoá trên các bản ghi làm BT logic đúng.

Vũ Bá Anh – Phan Phước Long 121


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Ví dụ: Giả sử Tệp QLHS. DBF đã bị đánh dấu xoá toàn bộ các bản ghi
trong tệp, cần gọi lại các bản trừ các bản ghi có trường KHOA =’ 28’ :
USE QLHS
RECALL FOR KHOA # ‘28’
USE
4.4.5. Lệnh PACK
- Dùng để loại bỏ tất cả các bản ghi đã bị đánh dấu xoá ở tệp đang mở
- Dạng: PACK
Khi thực hiện PACK, các bản ghi bị đánh dấu xoá bị loại bỏ hẳn mà
không có cách nào có thể khôi phục lại được, sau đó số hiệu các bản ghi sẽ
được xác định lại.
4.4.6. Lệnh ZAP
- Dùng để huỷ bỏ tất cả các bản ghi trong tệp, bất kể các bản ghi có bị
đánh dấu xoá hay không.
- Dạng: ZAP
Lệnh ZAP tương đương với hai lệnh
DELETE ALL
PACK
4.5. Sắp xếp và tìm kiếm bản ghi.
4.5.1. Lệnh INDEX
- Dùng để tạo tệp chỉ dẫn để sắp xếp tệp đang mở theo giá trị tăng dần của
tiêu thức sắp xếp.
- Dạng:
INDEX ON <Biểu thức> TO <Tên tệp> [ FOR < BT logic>]
Trong đó:
 Biểu thức: Là một biểu thức bất kỳ dùng làm tiêu thức sắp xếp.
 Tên tệp : Là tên tệp chỉ dẫn, phần mở rộng ngầm định là .IDX
- Tác động: Khi thực hiện INDEX, Fox sẽ dùng giá trị của biểu thức làm
khoá để lập chỉ dẫn, sắp xếp sao cho trên các bản ghi từ đầu đến cuối tệp, biểu
thức có giá trị tăng dần. Nếu có các bản ghi có cùng giá trị của khoá sắp xếp,
Fox sẽ sắp xếp các bản ghi đó theo trật tự vật lý của các bản ghi.

Vũ Bá Anh – Phan Phước Long 122


Chương 3:Hệ quản trị CSDL Visual FoxPro

Khi trong lệnh có mệnh đề For <BTlogic> thì chỉ có các bản ghi làm
biểu thức logic đúng mới được coi là có mặt trong tệp và tham gia sắp xếp.
- Ví dụ:
Ví dụ 1: Xét tệp QLHS .DBF
Cần in một doanh sách học sinh khoá 40 đã xếp theo thứ tự alphabet của
tên học sinh.
USE QLHS
INDEX ON TEN TO CD1. idx FOR KHOA = ‘40’
LIST TO PRINTER
USE
Ví dụ 2: Cần in danh sách khoá 40 xếp theo lớp, cùng lớp xếp theo điểm
trung bình tăng dần.
USE QLHS
INDEX ON LOP + STR (DTB, 5, 2) TO CD 2 FOR KHOA = ‘40’
LIST TO PRINTER
USE
4.5.2. Lệnh SORT
- Dùng để sắp xếp lại tệp dữ liệu, khác với lệnh INDEX, lệnh SORT
không sắp xếp trên các bản ghi của tệp đang mở mà tạo ra một tệp mới với các
bản ghi lấy của tệp dữ liệu đang mở đã được sắp xếp theo yêu cầu của lệnh.
- Dạng:
SORT TO <tên tệp> ON <DS biểu thức khoá [/A/D/C]>[FOR<BT
logic>]
Trong đó:
 Tên tệp: Là tên tệp dữ liệu để ghi kết quả đã sắp xếp.
 Danh sách biểu thức gồm các biểu thức viết cách nhau dấu phảy, dùng
làm tiêu thức sắp xếp. Nếu có nhiều biểu thức thì ưu tiên cho các biểu
thức viết trước.
- Tác động: Lệnh sẽ sắp xếp tệp dữ liệu dựa vào giá trị các biểu thức trong
danh sách biểu thức.
Nếu có /A thì xếp tăng dần. Nếu có /D thì xếp giảm dần. (Ngầm định là
/A)
Nếu có /C thì sẽ không phân biệt sự khác nhau giữa chữ in và thường.

Vũ Bá Anh – Phan Phước Long 123


Chương 3:Hệ quản trị CSDL Visual FoxPro

Kết quả sắp xếp được ghi vào một tệp dữ liệu có tên xác định bởi <tên
tệp>.
Nếu có FOR <BT logic> thì trong tệp kết quả chỉ chứa các bản ghi làm
<BT logic> nhận giá trị đúng.
- Ví dụ: Xét tệp VATTU.DBF
Ta cần xem lại các chứng từ tháng 10/1999 đã nhập vào máy được xếp
theo mã vật tư, nếu cùng mã vật tư, xếp theo số tiền giảm dần.
USE VATTU
SORT TO SXEP ON MAVT, TT/D/C FOR MONTH (NLCT) =
10; .AND. YEAR (NLCT) = 1999
USE SXEP
DISPLAY ALL
USE
Trên thực tế lệnh SORT ít được sử dụng hơn lệnh INDEX vì tốn bộ nhớ
và tốc độ thực hiện chậm.
4.5.3. Lệnh LOCATE
- Dùng để tìm kiếm và định vị con trỏ bản ghi đến bản ghi thoả mãn một
điều kiện nào đó. Lệnh được dùng để tìm kiếm bản ghi.
- Dạng: LOCATE FOR <BTlogic>
Trong đó: BT logic xác định điều kiện tìm kiếm
- Tác động:
FOX sẽ duyệt lần lượt từng bản ghi bắt đầu từ đầu tệp và sẽ dừng lại đặt
con trỏ vào bản ghi đầu tiên thoả mãn biểu thức logic.
Trường hợp có nhiều bản ghi cùng thoả mãn điều kiện tìm kiếm, FOX
vẫn đặt con trỏ vào bản ghi đầu tiên làm biểu thức logic đúng, muốn chuyển
con trỏ đến các bản ghi tiếp theo cũng thỏa mãn biểu thức logic, ta dùng lệnh
CONTINUE. Với cách thức tìm kiếm của LOCATE như vậy, người ta còn gọi
LOCATE là lệnh tìm kiếm theo kiểu tuần tự. Cách này có ưu điểm là tìm kiếm
được trên bất kỳ tệp có được sắp xếp hay không. Tuy nhiên, nhược điểm của
lệnh là tốc độ tìm kiếm rất chậm.
Ví dụ: Xét tệp VATTU.DBF, cần tìm để đưa ra xem số lượng, đơn giá,
số tiền trên chứng từ số 20/VL nhập ngày 15/10/1999
USE VATTU

Vũ Bá Anh – Phan Phước Long 124


Chương 3:Hệ quản trị CSDL Visual FoxPro

LOCATE FOR SOCT = ‘10/VL’ . AND. NLCT = {10/15/99}


? ‘số lượng:’ , KL, ‘ đơn giá:’ , DG, ‘số tiền:’ , TT
USE
4.5.4. Lệnh SEEK và FIND
- Cả hai lệnh đều dùng để tìm kiếm nhanh các bản ghi trên tệp đã được
sắp xếp bởi lệnh INDEX.
- Dạng: SEEK <Biểu thức>
FIND <Biểu thức>
Trong đó:
 Biểu thức của SEEK có thể là biểu thức bất kỳ (Số, xâu, ngày, logic).
 Biểu thức của FIND phải là loại xâu, nếu không bắt đầu là khoảng
trống thì không cần đặt trong cặp dấu nháy.
- Tác động: Xét trên tiêu thức đã dùng để sắp xếp, FOX sẽ tìm từ đầu tệp
và đặt con trỏ vào bản ghi đầu tiên mà tiêu thức đó có giá trị bằng <biểu thức>
viết trong lệnh.
- Ví dụ: Yêu cầu như ở mục 4.5.3, song tìm kiếm nhanh.
USE VATTU
INDEX ON SOCT + DTOC(NLCT) TO CD
SEEK ‘20/VL 10/15/99’
? KL, DG, TT
USE
Dùng FIND cũng tương tự
Ưu điểm của SEEK và FIND là tốc độ tìn kiếm nhanh, nhưng nếu trong
tệp có ít nhất hai bản ghi cùng thoả mãn điều kiện tìm kiếm thì không thực hiện
được, vì nó chỉ tìm tới bản ghi đầu tiên thoả mãn điều kiện. Do vậy các lệnh
này chỉ được sử dụng trong điều kiện giá trị tìm kiếm là duy nhất (không có
quá 2 bản ghi có cùng giá trị khoá tìm kiếm).
4.6. Các lệnh tính toán trên tệp dữ liệu.
4.6.1. Lệnh AVERAGE
- Dùng để : Tính trung bình cộng của các trường số trong tệp dữ liệu.
- Dạng lệnh:
AVERAGE [ DS trường số] [TO < ds biến nhớ>] [ FOR < BT logic]

Vũ Bá Anh – Phan Phước Long 125


Chương 3:Hệ quản trị CSDL Visual FoxPro

Trong đó:
 DS trường số: Xác định tên các trường số cần tính trung bình cộng,
ngầm định là mọi trường số trong tệp đang mở.
 DS biến nhớ: Gồm các tên biến nhớ để lưu giữ kết quả sau khi tính
 Tác động: Lệnh sẽ tính trung bình cộng của các trường số được chỉ
định rồi gửi kết quả vào các biến trong <ds biến>, nếu có For
<BTlogic> thì chỉ tính trên các bản ghi làm biểu thức logic nhận giá
trị đúng (. T.)
- Ví dụ: Giả sử có tệp LUONGCB. DBF để tính lương cho cán bộ có cấu
trúc như sau:

Name Type Width Dec Ghi chú


----------- ----------- ----------- ----------- -------------
HT C 27 Họ tên cán bộ
SH C 5 Số hiệu cán bộ
MADV C 5 Mã đơn vị
HSL N 5 2 Hệ số lương
HSPC N 4 2 Hệ số phụ cấp
PT N 7 0 Các khoản trừ
TL N 8 0 Thực lĩnh
NLL D 8 Ngày lên lương

Cần tính lương (thực lĩnh) bình quân của cán bộ thuộc đơn vị có mã
HCO6
USE LUONGCB
AVERAGE TL TO LTB FOR MADV = ‘HCO6’
? LTB
USE
4.6.2. Lệnh SUM
- Dùng để tính tổng giá trị trong các trường số của tệp dữ liệu.
- Dạng lệnh:
SUM [<DS trường >TO <ds biến>] [ FOR <BT logic>]
Trong đó:

Vũ Bá Anh – Phan Phước Long 126


Chương 3:Hệ quản trị CSDL Visual FoxPro

 DS trường: Xác định tên các trường số cần tính tổng, ngầm định là
mọi trường số của tệp đang mở.
 DS biến: Gồm tên các biến để lưu giữ kết quả sau khi tính tổng.
- Tác động: Lệnh sẽ tính tổng các trường số có tên trong DS trường rồi
gửi kết quả vào các biến trong danh sách biến (nếu có).
Nếu có For <BT logic> thì chỉ tính tổng trên các bản ghi làm BTlogic
đúng.
- Ví dụ:
Xét tệp LUONGCB. DBF, cần tính tổng tiền thực lĩnh và các khoản phải
trừ của đơn vị có mã 01
USE LUONGCB
SUM PT, TL, TO T1, T2 FOR MADV = ‘01’
? ‘Tổng phải trừ:’, T1
? ‘Tổng thực lĩnh:’, T2
USE
4.6.3. Lệnh COUNT
- Dùng để: Đếm số bản ghi trong tệp, từ đó suy ra số đối tượng tương
ứng.
- Dạng lệnh:
COUNT [ TO <Biến> ] [ FOR < BTlogic>]
Trong đó: Biến là một biến bộ nhớ để lưu giữ kết quả sau khi đếm.
- Tác động: Lệnh sẽ đếm số bản ghi trong tệp rồi gửi kết quả vào biến.
 Nếu không có TO <biến> thì hiện kết quả lên màn hình với trạng thái
môi trường đang ở chế độ SET TALK ON
 Nếu có FOR <BT logic> thì chỉ đếm các bản ghi làm biểu thức logic
đúng.
- Ví dụ: Xét tệp QLHS. dbf . Cần tính tỷ lệ (%) học sinh nữ có điểm trung
bình từ 9 trở lên
USE QLHS
COUNT TO TSO FOR .NOT. GT
COUNT TO TGIOI FOR .NOT.GT. AND. DTB > = 9
? ‘Tỷ lệ:’ , TGIOI/TSO ∗ 100, ‘%’

Vũ Bá Anh – Phan Phước Long 127


Chương 3:Hệ quản trị CSDL Visual FoxPro

USE
4.6.4. Lệnh TOTAL
- Dùng để : Tính tổng các trường số trên từng nhóm bản ghi của tệp dữ
liệu.
Nhóm bản ghi gồm tập hợp các bản ghi kế tiếp nhau có cùng giá trị của
tiêu thức phân nhóm. Khi phân nhóm, sẽ xét từ đầu tệp.
Ví dụ: Giả sử tệp LUONGCB. DBF có nội dung

HT MADV ... PT TL
A 01 ... 1 2
B 02 ... 3 4
C 01 ... 5 6

Nếu dựa vào mã đơn vị (trường MADV) để phân nhóm thì Fox sẽ chia
tệp thành ba nhóm bản ghi. Như vậy là không phù hợp với quan niệm chung về
nhóm đối tượng vì Fox không chỉ xét đến giá trị của tiêu thức phân nhóm mà
còn xét cả đến vị trí các bản ghi. Để cho phù hợp, trước khi phân nhóm ta sắp
xếp tệp để các bản ghi không bị ảnh hưởng bởi vị trí khi phân nhóm. Nguyên
tắc là muốn phân nhóm dựa vào tiêu thức nào thì trước đó phải tiến hành sắp
xếp dựa vào tiêu thức đó.
Chẳng hạn tệp LUONGCB.DBF , sau khi thực hiện lệnh: INDEX ON
MADV TO P các bản ghi sẽ có trật tự như sau:
HT MADV ... PT TL
A 01 ... 1 2
C 01 5 6
B 02 3 4
Bây giờ có thể phân nhóm chính xác: Hai bản ghi đầu là một nhóm, bản
ghi thứ ba là một nhóm.
- Dạng lệnh:
TOTAL TO <tên tệp> ON <Biểu thức>[FIELDS<ds trường>][FOR<BT
logic>]
Trong đó:
 Tên tệp: Là tên tệp dữ liệu dùng để lưu giữ kết quả sau khi tính tổng.

Vũ Bá Anh – Phan Phước Long 128


Chương 3:Hệ quản trị CSDL Visual FoxPro

 Biểu thức: Là biểu thức bất kỳ, dùng làm tiêu thức phân nhóm.
 DS trường gồm tập hợp tên các trường số cần tính tổng, ngầm định là
tất cả các trường số trong tệp đang mở.
- Tác động: Dựa vào giá trị của biểu thức để phân tệp dữ liệu thành các
nhóm bản ghi, sau đó tính tổng các trường số có tên trong danh sách trường
của từng nhóm rồi gửi tổng mỗi nhóm vào một bản ghi của tệp có tên xác định
bởi <tên tệp>. Tệp kết quả này có cùng cấu trúc với tệp gốc; Trên các bản ghi,
giá trị các trường cần tính tổng sẽ nhận giá trị là tổng của nhóm tương ứng, còn
các trường không được tính tổng sẽ lấy giá trị trên bản ghi đầu tiên của nhóm.
Trường hợp có For <BT logic> thì chỉ các bản ghi làm biểu thức logic
đúng mới được tham gia tính tổng.
- Ví dụ:
Ví dụ 1: Xét tệp LUONGCB.DBF, cần in ra bảng tổng hợp lương của
từng đơn vị
USE LUONGCB
INDEX ON MADV TO CD1
TOTAL TO KQ1. dbf ON MADV
USE KQ1
LIST FIELDS MADV, PT, TL TO PRINTER
USE
Ví dụ 2: Xét tệp VATTU.DBF, cần lập một báo cáo đơn giản về tổng
khối lượng và số tiền nhập vật tư từng loại trong quí 4/1999
USE VATTU
INDEX ON MAVT TO CD2 FOR LNV. AND. MONTH(NLCT) =
10; . AND. YEAR(NLCT) = 1999
TOTAL TO KQ2 ON MAVT FIELDS KL, TT
USE KQ2
LIST FIELDS TENVT, MAVT, KL, TT
CLOSE ALL

Vũ Bá Anh – Phan Phước Long 129


Chương 3:Hệ quản trị CSDL Visual FoxPro

5. CÁC LỆNH DÙNG CHO LẬP TRÌNH TRÊN FOX.

5.1. Nhóm lệnh gán, vào ra.


5.1.1. Lệnh gán.
Dùng để gán giá trị của biểu thức cho biến nhớ.
Dạng lệnh:
a. <Biến> = < Biểu thức>
b. STORE <Biểu thức> TO <ds biến>
- Tác động:
+ Dạng a: Tính giá trị của biểu thức ở vế phải rồi gán cho biến. Kiểu biến
được Fox tự xác định cho phù hợp loại biểu thức.
+ Dạng b: Máy tính giá trị biểu thức rồi gán cho tất cả các biến trong ds
biến.
- Ví dụ:
A = 10
STORE 1 TO C, D, E
C =C+1
Thực hiện xong lệnh 1 thì biến A thuộc loại số, nhận giá trị là 10; thực
hiện xong lệnh 2 thì các biến C, D, E đều nhận giá trị là 1 thuộc loại số; thực
hiện xong lệnh 3 thì biến C nhận giá trị là 2.
5.1.2. Lệnh INPUT
- Dùng để đưa dữ liệu từ ngoài vào máy bằng bàn phím trong quá trình
thực hiện chương trình.
- Dạng lệnh: INPUT [ lời nhắc] TO <Biến>
Trong đó:
[Lới nhắc] là biểu thức xâu, để nhắc người sử dụng khi vào dữ liệu.
<Biến> là tên biến nhớ cần vào dữ liệu.
- Tác động:
Máy dừng lại chờ người sử dụng vào dữ liệu, trên màn hình sẽ xuất hiện
lời nhắc là giá trị của biểu thức xâu ( nếu có). Người sử dụng vào dữ liệu từ bàn
phím, dữ liệu vào có thể là hằng số, xâu, ngày hay logic, không được là biểu
thức tổng quát. Kết thúc ấn ↵ , máy sẽ gán giá trị dữ liệu cho biến.

Vũ Bá Anh – Phan Phước Long 130


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Ví dụ:
INPUT ‘vào họ tên:’ TO HT
INPUT ‘ Ngày sinh:’ TO NS
INPUT ‘Hệ số lương:’ TO HLS
Chú ý: Khi vào dữ liệu cho INPUT, phải viết hằng theo đúng quy định
của FOX.
5.1.3. Lệnh ACCEPT
- Dùng để nhận một xâu ký tự từ bàn phím trong quá trình thực hiện
chương trình.
- Dạng: ACCEPT [ Lời nhắc] TO <Biến>
- Tác động: Tương tự INPUT, nhưng dữ liệu vào phải là một hằng xâu,
không cần đặt trong cặp dấu nháy.
- Ví dụ:
ACCEPT ‘In cho khoá:’ TO KH
5.1.4. Lệnh ? và lệnh ??
Đều dùng để đưa thông tin ra màn hình hoặc máy in.
Dạng: ? [Danh sách biểu thức] [ FONT ‘Kiểu font’, <cỡ>]
?? [ Danh sách biểu thức] [ FONT ‘Kiểu font’, <cỡ>]
Trong đó: Kiểu Font xác định font chữ cần đưa ra.
Cỡ xác định cỡ chữ đưa ra.
- Tác động: Cả hai lệnh đều đưa ra màn hình hoặc máy in giá trị các
biểu thức trong danh sách biểu thức, song:
 Lệnh ? luôn đưa từ đầu dòng mới;
 Lệnh ?? Đưa tiếp từ vị trí trống còn lại trên dòng hiện tại.
Việc đưa ra thiết bị nào là do lệnh:
SET PRINTER ON /OFF đang có hiệu lực. Ngầm định là SET
PRINTER OFF - nghĩa là đưa ra màn hình, ngược lại nếu là SET PRINTER
ON thì cả hai lệnh đều đẩy thông tin ra máy in.
Mệnh đề [ FONT ‘Kiểu font’, <cỡ> ] nếu có thì thông tin đưa ra sẽ
theo Font và cỡ chữ được chọn.
Nếu trong lệnh không có danh sách biểu thức thì để trắng chỗ đưa ra.

Vũ Bá Anh – Phan Phước Long 131


Chương 3:Hệ quản trị CSDL Visual FoxPro

Ví dụ: In tiêu đề: DANH SÁCH LƯƠNG


Đơn vị: 01
SET PRINTER ON
? ‘ Danh sách lương’ FONT ‘.VntimeH’, 16
? ‘ Đơn vị:’ FONT ‘.Vntime’, 16
?? ‘01’
5.1.5. Lệnh SAY
- Dùng để đưa ra màn hình hoặc máy in giá trị một biểu thức.
- Dạng:
@ <Dòng>, < Cột> SAY [ Biểu thức] [ FONT ‘Kiểu font’, <cỡ> ]
Trong đó:
Biểu thức là một biểu thức bất kỳ cần đưa ra.
Kiểu Font xác định font chữ cần đưa ra.
Cỡ xác định cỡ chữ đưa ra.
- Tác động: Lệnh sẽ đưa ra màn hình hoặc máy in giá trị của biểu thức
bắt đầu từ vị trí xác định bởi tọa độ dòng, cột chỉ ra trong lệnh.
Mệnh đề [ FONT ‘Kiểu font’, <cỡ> ] nếu có thì thông tin đưa ra sẽ
theo Font và cỡ chữ được chọn.
Lệnh chọn thiết bị ra cho lệnh SAY là:
SET DEVICE TO SCREEN / PRINTER
Nếu chọn là SCREEN thì đưa ra màn hình (ngầm định).
Nếu là SET DEVICE TO PRINTER thì đưa ra máy in
Ví dụ: In tiêu đề: Bảng lương tháng10/99
Đơn vị: 02
SET DEVICE TO PRINTER
@ 1, 15 SAY ‘Bảng lương tháng 10/99’;
FONT ‘.VntimeH’, 16
@ 3, 20 SAY ‘Đơn vị: 02’ FONT ‘.Vntime’, 12
SET DEVICE TO SCREEN

Vũ Bá Anh – Phan Phước Long 132


Chương 3:Hệ quản trị CSDL Visual FoxPro

5.1.6. Chương trình có cấu trúc tuần tự.


Đây là cấu trúc mà khi thực hiện chương trình, các lệnh trong chương
trình sẽ được thực hiện tuần tự mỗi lệnh một lần từ đầu đến cuối chương trình.
Ví dụ: Chương trình tìm chu vi và diện tích của tam giác, biết ba cạnh
là a,b,c.
MODIFY COMMAND TAMGIAC . PRG
INPUT ‘vào a:’ TO A
INPUT ‘vào b:’ TO B
INPUT ‘vào c:’ TO C
CV = A + B + C
P = CV/2
S = SQRT (P ∗ (P - A) ∗ ( P - B) ∗ (P - C))
? ‘chu vi tam giác là:’, CV
? ‘ diện tích tam giác là:’, S
∧ w (để máy ghi lên đĩa)
Để chạy chương trình:
DO TAMGIAC
5.2. Các lệnh điều kiện (rẽ nhánh).
Khi cần tổ chức một cấu trúc rẽ nhánh của chương trình, ta lựa chọn một
trong hai lệnh sau đây:
5.2.1. Lệnh IF ... ENDIF
Để kiểm tra một điều kiện có thoả mãn hay không mà quyết định thực
hiện việc này hay việc kia.
Dạng lệnh:
IF <BT logic>
<Nhóm lệnh 1>
[ELSE
Nhóm lệnh 2]
ENDIF
Trong đó: Nhóm lệnh 1,2 gồm tập hợp các lệnh bất kỳ của Fox

Vũ Bá Anh – Phan Phước Long 133


Chương 3:Hệ quản trị CSDL Visual FoxPro

- Tác động: Fox sẽ kiểm tra giá trị của BT logic:


+ Nếu BT logic nhận giá trị .T. (đúng) thì các lệnh Fox trong nhóm 1
được thực hiện.
+ Nếu BT logic nhận giá trị .F. thì:
Nếu có ELSE ... thì các lệnh Fox trong nhóm 2 được thực hiện.
Nếu không có mệnh đề ELSE ... thì thực hiện lệnh đứng ngay sau
ENDIF.
Ví dụ:
Soạn chương trình để giải phương trình bậc 2: ax2 + bx + c = 0 (a ≠0)

MODIFY COMMAND PTB2


INPUT ‘vào a:’ TO A
INPUT ‘vào b:’ TO B
INPUT ‘ vào c:’ TO C
D=B∧2-4 ∗ A ∗ C
IF D < 0
? ‘phương trình vô nghiệm’
ELSE
X1 = ( - B - SQRT (D))/ (2 ∗ A)
X2 = ( - B + SQRT (D))/ (2 ∗ A)
? ‘X1 =’ , X1
? ‘X2 =’ , X2
ENDIF
5.2.3. Lệnh DO CASE ... ENDCASE
- Dùng để tổ chức cấu trúc rẽ nhánh, nhưng bằng DO CASE có thể rẽ
nhiều nhánh khác nhau phụ thuộc vào các trường hợp có thể xảy ra.
- Dạng lệnh:
DO CASE
CASE <BTlogic 1>
Nhóm lệnh 1

Vũ Bá Anh – Phan Phước Long 134


Chương 3:Hệ quản trị CSDL Visual FoxPro

CASE <BTlogic 2>


Nhóm lệnh 2
...
CASE <BT logic n>
Nhóm lệnh n
[ OTHERWISE
nhóm lệnh n + 1]
ENDCASE
- Tác động: Fox sẽ kiểm tra lần lượt các biểu thức logic 1,2,...n để tìm
biểu thức đầu tiên nhận giá trị . T. và cho thực hiện các lệnh thuộc nhóm tương
ứng.
Trường hợp không có biểu thức nào nhận .T. thì nhóm lệnh n + 1 được
thực hiện (nếu có).
Ví dụ: Chương trình giải phương trình bậc nhất ax + b = 0
Modify command PTB1
INPUT ‘vào a:’ TO A
INPUT ‘vào b:’ TO B
DO CASE
CASE A < > 0
x = - B/A
? ‘nghiệm x =’ , x
CASE A = 0 .AND. B = 0
? ‘mọi số thực X đều là nghiệm’
CASE A = 0 . AND. B # 0
? ‘PT vô nghiệm’
ENDCASE
5.3. Lệnh chu trình.
Chu trình là đoạn chương trình được thực hiện lặp lại nhiều lần. Nếu có
thể xác định được số lần thực hiện trước khi thực hiện chu trình đó thì gọi là
chu trình với số lần lặp biết trước, ngược lại gọi là chu trình với số lần lặp
không biết trước. Các lệnh được thực hiện lặp đi lặp lại gọi là thân chu trình
(còn gọi là miền tác động của chu trình).

Vũ Bá Anh – Phan Phước Long 135


Chương 3:Hệ quản trị CSDL Visual FoxPro

5.3.1. Lệnh FOR... ENDFOR


- Dùng để tổ chức các chu trình có số lần lặp biết trước.
- Dạng lệnh:
FOR <Biến> = <BT 1> TO <BT2> [STEP < BT 3>]
Các lệnh Fox
ENDFOR
Trong đó:
Biến: Là biến số, gọi là biến chu trình .
BT1, BT2, BT3: Là các biểu thức số để chỉ giá trị bắt đầu, kết thúc và
bước nhảy của biến chu trình. Nếu không có STEP<BT3> thì coi bước
nhảy là 1
- Tác động: Xét trường hợp bt1≤ bt2 với bt3> 0 còn trường hợp ngược
lại tương tự . Trường hợp này nếu bt1 > bt2 thì chu trình sẽ không được thực
hiện.
Đầu tiên gán cho <Biến> giá trị của biểu thức 1 rồi thực hiện thân chu
trình. Đến khi gặp ENDFOR, máy sẽ tự động kiểm tra:
+ Nếu biến > BT 2 thì đã thực hiện xong chu trình, thực hiện tiếp lệnh
đứng ngay sau ENDFOR.
+ Nếu biến ≤ BT 2 thì tiếp tục thực hiện thân chu trình và lặp lại quá
trình trên.
Chú ý:
a. Không làm thay đổi giá trị biến chu trình bằng các lệnh của người sử
dụng.
b. Các biểu thức 1,2,3 không thay đổi giá trị khi đang thực hiện chu
trình.
c. Nếu trong thân chu trình có chứa lệnh LOOP thì khi gặp LOOP sẽ trả
điều khiển về ENDFOR.
d. Nếu thân chu trình có lệnh EXIT thì khi gặp EXIT sẽ thoát khỏi chu
trình để thực hiện tiếp lệnh ngay sau ENDFOR.
- Ví dụ:
Ví dụ: Chương trình tính tích P = n!
MODIFY COMMAND G T

Vũ Bá Anh – Phan Phước Long 136


Chương 3:Hệ quản trị CSDL Visual FoxPro

INPUT ‘vào n’ TO N
P =1
FOR I = 1 TO N
P =P ∗ I
ENDFOR
? ‘P =’, P
Ví dụ 2: Chương trình xét một số nguyên dương n > 2 có là số nguyên tố
không?
INPUT ‘vào số nguyên dương >2:’ TO N
FOR I = 2 TO N - 1
IF MOD(N, 2) = 0
KQ = ‘N không là’
EXIT
ENDIF
KQ = ‘N là’
ENDFOR
? KQ + ‘số nguyên tố’
5.3.2. Lệnh DO WHILE ... ENDDO
- Dùng để tổ chức tất cả hai loại chu trình (có số lần lặp biết trước và
không biết trước).
- Dạng lệnh:
DO WHILE <BT logic>
<các lệnh Fox>
ENDDO
Tác động:
Gặp DO while, máy kiểm tra giá trị của biểu thức logic
 Nếu biểu thức đúng: Thực hiện <các lệnh Fox> trong thân chu trình,
khi gặp ENDDO, điều khiển lại trả về DO WHILE và tiếp tục lặp lại
quá trình trên
 Nếu biểu thức sai: Đã thực hiện xong chu trình, thực hiện tiếp lệnh
đứng sau ENDDO.

Vũ Bá Anh – Phan Phước Long 137


Chương 3:Hệ quản trị CSDL Visual FoxPro

Chú ý: Tương tự chú ý c và d của lệnh FOR ... ENDFOR :


 Nếu gặp LOOP trong thân chu trình sẽ trả điều khiển về DO
WHILE;
 Nếu gặp EXIT trong thân chu trình sẽ thoát khỏi chu trình, thực hiện
lệnh ngay sau ENDDO.
Ví dụ: Xét tệp VATTU.DBF , ta cần lập bảng báo cáo nhập từng loại vật
tư trong quí 4 năm 1999, theo mẫu:
BÁO CÁO NHẬP VẬT TƯ
QUÍ 4/99
Số TT Tên vật tư Mã vật tư Tổng khối lượng Tổng số tiền
1 . .
2 . .
3 . .
.

Ta soạn một chương trình như sau:


MODIFY COMMAND BAOCAO
SET TALK OFF
USE VATU
INDEX ON MAVT TO CD FOR LNV.AND. MONTH (NLCT) > = 10;
. AND. YEAR (NLCT) = 1999
TOTAL TO KQ ON MAVT
USE KQ
SET DEVICE TO PRINTER
@ PROW ( ) , 10 SAY ‘ BÁO CÁO NHẬP VẬT TƯ ‘ FONT ‘.VntimeH’, 17
@ PROW ( ) + 1, 15 SAY “Quí 4/99’ FONT ‘.Vntime’, 14
@ PROW ( ) + 1, 1 SAY “ STT TÊN VẬT TƯ MÃ VẬT TƯ TỔNG KHỐI LƯỢNG ;
TỔNG SỐ TIỀN” FONT ‘.VntimeH’, 13
TT = 1
DO WHILE . NOT. EOF ( )
@ PROW ( ) + 1,1 SAY STR (TT, 5) + ‘ ‘ + TENVT + ‘ ‘+ MAVT + ‘ ‘ ;
+STR (KL, 10) + ‘ ‘ + STR (TT, 10) FONT ‘.Vntime’, 14
SKIP
TT = TT + 1
ENDDO
SET TALK ON
SET DEVICE TO SCREEN

Vũ Bá Anh – Phan Phước Long 138


Chương 3:Hệ quản trị CSDL Visual FoxPro

EJECT
CLOSEALL
RETURN

5.4. Một số lệnh SET thường dùng.


5.4.1. SET DATE TO <Mã quốc gia>
Lệnh để đặt dạng ngày tháng năm.
Mã quốc gia Dạng ngày
AMERICAN mm/dd/yy
ANSI yy. mm. dd
FRENCH d d/mm/yy
ITALIAN d d - mm - yy
5.4.2. SET DECIMALS TO <BT số>
Dùng để xác định số chữ số thập phân trong kết quả tính toán.
Trong đó giá trị biểu thức số xác định số chữ số thập phận cần dùng, BT
số nhận giá trị từ 0 đến 18.
5.4.3. SET DEFAULT TO <BT xâu>
+ Để xác định thư mục làm việc ngầm định. Ở đây giá trị biểu thức xâu
phải là một đường dẫn xác định một thư mục sẽ được coi là địa chỉ ngầm định
của các tệp và thư mục.
5.4.4. SET ESCAPE ON/ OFF
Để bật hoặc tắt chức năng ngắt thực hiện chương trình của phím ESC.
ON - bật
OFF - tắt
5.4.5. SET FIELDS TO [Danh sách trường]
- Để xác định danh sách các trường cần dùng khi đó chỉ các trường có tên
trong danh sách trường được coi là có mặt trong tệp.
Lệnh set fields to (không có danh sách trường) sẽ huỷ bỏ sự lựa chọn
này.
5.4.6. SET FILTER TO [BT logic]
Để đặt lọc cho tệp dữ liệu.

Vũ Bá Anh – Phan Phước Long 139


Chương 3:Hệ quản trị CSDL Visual FoxPro

Sau khi thực hiện lệnh SET FILTER TO có biểu thức logic thì chỉ những
bản ghi làm BTlogic đúng được coi là có mặt trong tệp. Lệnh SET FILTER
TO (không có BTlogic) sẽ huỷ bỏ lệnh đặt lọc trước đó.
Tuy nhiên lệnh này chỉ có hiệu lực khi con trỏ bản ghi đã được di chuyển.
5.4.7. SET SAFETY ON /OFF
Để bật hoặc tắt chế độ bảo vệ file trước khi ghi đè hay xoá tệp.
Nếu SET SAFETY ON máy sẽ hỏi lại người sử dụng có khẳng định
không trước khi ghi đè hay xoá tệp, nếu SET SAFETY OFF thì máy không
yêu cầu người sử dụng khẳng định một lần nữa.
5.4.8. SET TALK ON/OFF
Để bật hoặc tắt chế độ hiện các kết quả trung gian lên màn hình hay máy
in.
Nếu SET TALK ON thì các kết quả tính toán trung gian được đưa ra màn
hình hay máy in tuỳ SET PRINTER là ON hay OFF, nếu ngược lại thì các kết
quả đó không được đưa ra.
5.4.9. SET STATUS ON /OFF
Để bật hoặc tắt dòng trạng thái làm việc của FOX.
Dòng trạng thái là dòng 22 trên màn hình để thông báo một số trạng thái
làm việc với FOX.
Nếu SET STATUS ON thì dòng trạng thái được bật.
Nếu SET STATUS OFF thì dòng trạng thái tắt.
6. ỨNG DỤNG FOX ĐỂ XÂY DỰNG BỘ CHƯƠNG TRÌNH CHO CÁC BÀI
TOÁN QUẢN TRỊ DỮ LIỆU.

6.1. Bài toán quản trị dữ liệu.


6.1.1 Ví dụ về một số bài toán quản trị dữ liệu.
Bài toán lương cán bộ các đơn vị hành chính sự nghiệp.
Để tính và in ra bảng lương hàng tháng cho từng cán bộ và từng bộ phận
trong đơn vị trên máy tính, ta phải làm như sau: lưu trữ các thông tin cần thiết
của các cán bộ vào trong máy, trên cơ sở các thông tin được lưu trữ trong máy
hàng tháng ta xử lý tính toán để có được các thông tin cần thiết trên bảng lương
rồi in ra. Chẳng hạn để tính và in ra bảng lương, mỗi cán bộ cần phải lưu trữ
các thông tin sau: Họ và tên, đơn vị công tác, hệ số lương, phụ cấp thường

Vũ Bá Anh – Phan Phước Long 140


Chương 3:Hệ quản trị CSDL Visual FoxPro

xuyên, phụ cấp khác, khấu trừ thường xuyên, khấu trừ khác. Yêu cầu hàng
tháng phải in ra các bảng biểu sau:
Bảng 1.1
Bảng lương tháng .... năm .......
Đơn vị: <Tên đơn vị>
Các khoản Các khoản Được lĩnh
ST Họ và C H L phụ cấp khấu trừ
T tên V SL C
TX Khác TX Khác ST Ký

1
..
Cộng * * * * * *

Bảng 1.2
Bảng tổng hợp lương các đơn vị tháng .... năm ......
Các khoản phụ Các khoản khấu Được lĩnh
Số Tên đơn L cấp trừ
tt vị C
TX Khác TX Khác ST Ký

1
..
Cộng * * * * * *

Bài toán quản lý xuất - nhập vật tư.


Để quản lý việc nhập – xuất vật tư tại một kho vật tư, trước hết ta phải
nhập số tồn đầu kỳ của từng loại vật tư vào trong máy và hàng ngày ta phải
nhập các phiếu nhập, phiếu xuất kho vào trong máy. Cuối mỗi kỳ ta phải in ra
các báo biểu sổ sách về tình hình xuất – nhập – tồn vật tư. Giả sử cuối mỗi kỳ
ta phải in ra một số sổ sách báo cáo như sau:
Biểu 2.1: Sổ theo dõi tình hình nhập vật tư
Từ ngày .... đến ngày.... năm ...
SP Ngày Tên VT ĐVT ĐG Số lượng Tiền
..

Vũ Bá Anh – Phan Phước Long 141


Chương 3:Hệ quản trị CSDL Visual FoxPro

...
Cộng ****

Biểu 2.2: Sổ theo dõi tình hình nhập vật tư theo loại
Loại vật tư <Tên vật tư>
Từ ngày .... đến ngày.... năm ...
Số Phiếu Ngày Số lượng Tiền
..
...
Cộng ***** ****

Biểu 2.3: Sổ theo dõi tình hình xuất vật tư


Từ ngày .... đến ngày.... năm ...
SP Ngày Tên VT ĐVT ĐG Số lượng Tiền
..
...
Cộng ****

Biểu 2.4: Sổ theo dõi tình hình xuất vật tư theo loại
Loại vật tư <Tên vật tư>
Từ ngày .... đến ngày.... năm ...
Số Phiếu Ngày Số lượng Tiền
..
...
Cộng ***** ****

Biểu 2.5: Biểu theo dõi tình hình Nhập – Xuất – Tồn
Từ ngày ..... dến ngày ..... năm ......
Tên ĐV Tồn ĐK Nhập TK Xuất TK Tồn CK

Vũ Bá Anh – Phan Phước Long 142


Chương 3:Hệ quản trị CSDL Visual FoxPro

vật tư T SL Tiền SL Tiền SL Tiền SL Tiền

Cộng ** ** ** **

6.1.2 Đặc điểm của các bài toán quản trị dữ liệu.
Qua 2 ví dụ trên và một số các bài toán quản trị dữ liệu khác như bài toán
quản lý nhân sự, bài toán tài chính kế toán... ta thấy các bài toán này có một số
đặc điểm như sau:
 Các bài toán đều yêu cầu lưu trữ một khối lượng lớn các dữ liệu, các
dữ liệu được lưu trữ trong các tệp dữ liệu, số lượng các bản ghi trong
các tệp được coi là khối lượng dữ liệu cần xử lý của bài toán. Chẳng
hạn bài toán lương, số lượng cán bộ và số lượng các đơn vị phòng ban
chính là khối lượng dữ liệu của bài toán, còn bài toán quản lý vật tư
thì số lượng các phiếu nhập, phiếu xuất và số lượng danh mục vật tư là
khối lượng của bài toán.
 Một bài toán quản trị dữ liệu thường phải xử lý trên nhiều tệp dữ liệu,
các tệp dữ liệu phải có sự liên kết móc nối với nhau thông qua các
trường kho. Trong các tệp các trường khoá dùng để móc nối các tệp
thường để dưới dạng mã để đảm bảo tính chuẩn của thông tin.
 Kết quả của bài toán quản trị dữ liệu chủ yếu là các bảng biểu in ra
trên giấy hoặc các xem trên màn hình của máy tính.
 Các thao tác xử lý của bài toán quản lý dữ liệu không đòi hỏi các phép
tính phức tạp, mà chủ yếu là các phếp toán cộng trừ, nhân chia đơn
giản, các thao tác thương gặp nhiều trong các bài toán quản trị dữ liệu
là các thao tác lọc bản ghi, phân nhóm, tìm kiếm, xắp xếp lại dữ liệu,
liên kết dữ liệu, lập các báo cáo (REPORT), cung cấp thông tin nhanh
.
6.2. Tổ chức xây dựng bộ chương trình cho bài toán quản trị
dữ liệu.
Để xây dựng một bài toán quản trị dữ liệu ta phải thực hiện hai công việc
cơ bản đó là tạo lập một cơ sở dữ liệu và xây dựng một bộ chương trình xử lý
cơ sở dữ liệu đáp ứng được yêu cầu quản lý. Các công việc đó được thực hiện
như sau:
6.2.1 Tạo cơ sở dữ liệu.
Căn cứ vào yêu cầu của bài toán và tính chất từng loại thông tin, trong
quá trình tạo các tệp dữ liệu ta thường chia thành ba nhóm. Đó là nhóm tệp mã

Vũ Bá Anh – Phan Phước Long 143


Chương 3:Hệ quản trị CSDL Visual FoxPro

đối tượng, nhóm tệp dữ liệu chính, nhóm tệp kết quả, thông thường mỗi nhóm
tệp ta đặt riêng một thư mục. Đặc trưng của các nhóm như sau:
 Nhóm tệp mã hoá đối tượng, chứa các dữ liệu phục vụ việc mã hoá
các dữ liệu của bài toán. Trong các bài toán quản trị dữ liệu có các
thông tin cần có độ chuẩn dùng làm các trường khoá cho việc liên kết,
tìm kiếm và xử lý dữ liệu. Những thông tin đó khi đưa vào máy ta phải
đưa ở dạng mã, nhưng khi in ra ta lại phải trả lại đúng giá trị của nó.
Để thực hiện việc đó trong khi tạo cơ sở dữ liệu ta tạo các tệp mã đối
tượng, mỗi dữ liệu cần mã hoá ta phải tạo cho nó một tệp mã, trong
tệp đó có tối thiểu hai trường là trường mã đối tượng và trường tên đối
tượng. Chẳng hạn trong bài toán lương ở trên thì có hai thông tin cần
được mã đó là thông tin về đơn vị làm việc của cán bộ và tên cán bộ
và vì vậy ta sẽ tạo hai tệp mã, một tệp dùng để tra mã của đơn vị, một
tệp dùng để tra mã cán bộ, hoặc trong bài toán quản lý vật tư thì tên
vật tư phải được mã hoá, như vậy, ta phải tạo một tệp mã tên vật tư.
Thông tin trong các tệp mã có thể được sử dụng lâu dài trong nhiều
năm.
 Nhóm dữ liệu chính của bài toán đó là các dữ liệu phục vụ cho xử lý
thông tin hàng ngày và dùng để tạo các thông tin kết quả theo yêu cầu
quản lý. Đó chính là các dữ liệu đầu vào của bài toán. Các dữ liệu này
có tính rất động, nó được cập nhật thường xuyên. Số lượng tệp dữ liệu
nhóm này tuỳ thuộc vào từng bài toán. Chẳng hạn bài toán lương ở
trên ta chỉ cần 1 tệp chứa các thông tin cần thiết về từng cán bộ (Như:
Họ và tên, đơn vị công tác, hệ số lương, phụ cấp thường xuyên, phụ
cấp khác, khấu trừ thường xuyên, khấu trừ khác) để tính và in ra đưọc
các bảng biểu kết quả, còn bài toán quản lý vật tư thì phải cần tới ba
tệp, một tệp chứa số tồn đầu kỳ, một tệp chứa các phiếu nhập vật tư,
một tệp chứa các phiếu xuất vật tư. Các thông tin trong các tệp này
thường chỉ có giá trị trong một niên độ nhất định.
 Nhóm dữ liệu kết quả, đó chính là các tệp chứa các thông tin kết quả
của một yêu cầu xử lý nào đó để chuẩn bị in ra máy in hoặc đưa ra
trên màn hình, hoặc chuyển tiếp cho quá trình xử lý tiếp theo. Các tệp
chứa thông tin kết quả chỉ là các tệp trung gian, các thông tin trong đó
được tạo khi thực hiện một yêu cầu nào đó, nên các thông tin trong
các tệp kết quả chỉ có giá trị tạm thời tại một thời điểm.
6.2.2 Xây dựng bộ chương trình xử lý.
Căn cứ vào đặc điểm và các yêu cầu của bài toán quản lý khi xây dựng bộ
chương trình ta phải phân chia bộ chương trình thành nhiều Modun chương
trình nhỏ, mỗi Modun sẽ giải quyết một yêu cầu của bài toán, số lượng các
Modun trong mỗi bộ chương trình tuỳ thuộc vào từng bài toán, song trong mọi
bài toán các Modun thường được phân thành ba nhóm chính. Đó là nhóm hệ
thống, nhóm dữ liệu, nhóm kết quả. Đặc trưng của các nhóm như sau:

Vũ Bá Anh – Phan Phước Long 144


Chương 3:Hệ quản trị CSDL Visual FoxPro

 Nhóm hệ thống, chứa các Modun dùng để thiết lập chung cho chương
trình. Trong nhóm này thường có các Modun về thiết lập năm làm
việc, ngày làm việc, các khai báo phần cứng, khai báo về người sử
dụng, tạo lập các tệp mã, thiết lập các tuỳ chọn .... Nhóm Modun này
rất ít khi thao tác khi thực hiện chương trình, nếu có thao tác thường
hay thực hiện khi mới vào chương trình.
 Nhóm dữ liệu, nhóm này thường chứa các Modun về các thao tác trên
tệp dữ liệu. Các Modun đó có thể là Modun nhập dữ liệu, sửa dữ liệu,
tìm kiếm dữ liệu, lọc dữ liệu trên các tệp dữ liệu chính hoặc các
Modun về sao lưu, khôi phục, xoá bỏ dữ liệu.
 Nhóm kết quả, nhóm này chứa các Modun về các thao tác tạo các tệp
kết quả và đưa các thông tin trong các tệp kết quả ra máy in (màn
hình) theo yêu cầu quản lý.
6.2.3 Qui trình xây dựng một bộ chương trình quản trị cơ sở dữ
liệu.
Để tiến hành xây dựng một bộ chương trình quản trị dữ liệu trên máy
tính, căn cứ vào đặc điểm của bài toán quản trị dữ liệu, căn cứ vào các công
việc cần tiến hành để xây dựng một hệ quản trị cơ sở dữ liệu, ta thấy qui trình
để tiến hành xây dựng bộ chương trình quản trị dữ liệu gồm các bước sau:
 Bước 1: Lập bài toán, trong bước này căn cứ vào tình hình cụ thể của
công việc để xác định các yêu cầu cần thực hiện trong chương trình,
trên cơ sở đó xác định các tệp dữ liệu của bài toán, qui trình và thuật
toán xử lý các thông tin ban đầu để có các thông tin kết quả.
 Bước 2: Trên cơ sở xác định dữ liệu vào và ra của bài toán và qui trình
xử lý thông tin, ta xây dựng cơ sở dữ liệu thông qua việc thiết kế cấu
trúc các tệp
 Bước 3: Xây dựng mô hình, thiết kế hệ thống. Trong bước này ta căn
cứ vào yêu cầu của bài toán ta xây dựng mô hình liên kết dữ liệu và
thuật toán xử lý các công việc từ đó xác định số lượng các Modun
chương trính trong từng nhóm Modun và sự liên kết giữa các Modun
trong quá trình xử lý.
 Bước 4: Chọn ngôn ngữ để xây dựng chương trình. Để thực hiện xây
dựng chương trình cho các bài toán quản trị dữ liệu trên máy tính hiện
nay có rất nhiều ngôn ngữ quản trị dữ liệu (Như FOX, ACCESS,
ORACLE, LOTUS NOTE, SQL Server.....). Việc lựa chọn ngôn ngữ
lập trình phải căn cứ vào tình hình cụ thể của từng doanh nghiệp, từng
thời kỳ, từng cấu hình máy.
 Bước 5: Chạy thử và hiệu chỉnh chương trình. Sau khi các Modun đã
hoàn tất và đã kết nối với nhau thành bộ chương trình, ta phải chạy thử
(TEST) trên số liệu giả định để thử tất cả các Modun khi đã thấy ổn thì
ta lại tiếp tục cho hạy thử trên số liệu thật của đơn vị trong một thời

Vũ Bá Anh – Phan Phước Long 145


Chương 3:Hệ quản trị CSDL Visual FoxPro

gian có sự kiểm chứng song song với kết quả thực hiện bằng tay. Qua
quá trình chạy thử có các vướng mắc, sai sót ta chỉnh sửa lại chương
trình và dữ liệu để bộ chương trình hoàn chỉnh.
 Bước 6: Tập huấn cho các cán bộ sử dụng bộ chương trình và bàn giao
bộ chương trình cho người sử dụng.

3.1 Giới thiệu chung về hệ quản trị CSDL FoxPro

3.1.1 Các khái niệm chung

3.1.2 Khởi động và thoát

3.1.3 Các chế độ làm việc

3.1.4 Các yếu tố cơ bản của ngôn ngữ

3.2 Làm việc với một tệp cơ sở dữ liệu

3.2.1 Tạo tệp cơ sở dữ liệu


CREATE DATABASE [DatabaseName | ?]

CREATE TABLE | DBF TableName1 [NAME LongTableName] [FREE]


[CODEPAGE = nCodePage]
( FieldName1 FieldType [( nFieldWidth [, nPrecision] )] [NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[AUTOINC [NEXTVALUE NextValue [STEP StepValue]]] [DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE [COLLATE cCollateSequence]]
[REFERENCES TableName2 [TAG TagName1]] [NOCPTRANS]
[, FieldName2 ... ]
[, PRIMARY KEY eExpression2 TAG TagName2 |, UNIQUE eExpression3 TAG TagName3
[COLLATE cCollateSequence]]
[, FOREIGN KEY eExpression4 TAG TagName4 [NODUP]
[COLLATE cCollateSequence]
REFERENCES TableName3 [TAG TagName5]] [, CHECK lExpression2 [ERROR cMessageText2]] )
| FROM ARRAY ArrayName

OPEN DATABASE [FileName | ?] [EXCLUSIVE | SHARED] [NOUPDATE] [VALIDATE]

USE [[DatabaseName!] TableName | SQLViewName | ?]


[IN nWorkArea | cTableAlias] [ONLINE] [ADMIN] [AGAIN]
[NOREQUERY [nDataSessionNumber]] [NODATA]
[INDEX IndexFileList | ? [ORDER [nIndexNumber | IDXFileName
| [TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]]]]
[ALIAS cTableAlias] [EXCLUSIVE] [SHARED] [NOUPDATE]
[CONNSTRING cConnectionString | nStatementHandle ]

APPEND [BLANK] [IN nWorkArea | cTableAlias] [NOMENU]

Vũ Bá Anh – Phan Phước Long 146


Chương 3:Hệ quản trị CSDL Visual FoxPro

APPEND FROM FileName | ?[FIELDS FieldList] [FOR lExpression]


[[TYPE] [DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB
| WITH CHARACTER Delimiter] | DIF | FW2 | MOD | PDOX | RPD |
SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CSV | XLS | XL5
[SHEET cSheetName] | XL8 [SHEET cSheetName]]] [AS nCodePage]

COPY STRUCTURE TO TableName [FIELDS FieldList]


[[WITH] CDX | [WITH] PRODUCTION]
[DATABASE cDatabaseName [NAME cTableName]]

COPY TO FileName [DATABASE DatabaseName [NAME LongTableName]]


[FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[ [WITH] CDX ] | [ [WITH] PRODUCTION ] [NOOPTIMIZE]
[ [TYPE] [ FOXPLUS | FOX2X | DIF | MOD | SDF | SYLK | WK1 | WKS | WR1
| WRK | CSV | XLS | XL5 | DELIMITED [ WITH Delimiter | WITH BLANK
| WITH TAB | WITH CHARACTER Delimiter ] ] ] [AS nCodePage]

3.2.2 Di chuyển con trỏ bản ghi


GO [RECORD] nRecordNumber [IN nWorkArea | IN cTableAlias]

GO TOP | BOTTOM [IN nWorkArea | IN cTableAlias]

GOTO [RECORD] nRecordNumber [IN nWorkArea | IN cTableAlias]

GOTO TOP | BOTTOM [IN nWorkArea | IN cTableAlias]


SKIP [nRecords] [IN nWorkArea | cTableAlias]

3.2.3 Xem/sửa tệp cơ sở dữ liệu


DISPLAY STRUCTURE [IN nWorkArea | cTableAlias]
[TO PRINTER [PROMPT] | TO FILE FileName [ADDITIVE]] [NOCONSOLE]
LIST STRUCTURE [IN nWorkArea | cTableAlias] [NOCONSOLE]
[TO PRINTER [PROMPT] | TO FILE FileName [ADDITIVE]]

MODIFY STRUCTURE

DISPLAY [[FIELDS] FieldList] [Scope] [FOR lExpression1]


[WHILE lExpression2] [OFF] [NOCONSOLE] [NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE FileName [ADDITIVE]]
LIST [FIELDS FieldList] [Scope] [FOR lExpression1]
[WHILE lExpression2] [OFF] [NOCONSOLE] [NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE FileName [ADDITIVE]]

EDIT [FIELDS FieldList] [Scope] [FOR lExpression1] [WHILE lExpression2]


[FONT cFontName[, nFontSize [, nFontCharSet]]] [STYLE cFontStyle] [FREEZE
FieldName]
[KEY eExpression1[, eExpression2]] [LAST | NOINIT] [LPARTITION]
[NAME ObjectName] [NOAPPEND] [NOCAPTION] [NODELETE] [NOEDIT | NOMODIFY]
[NOLINK] [NOMENU] [NOOPTIMIZE] [NORMAL] [NOWAIT]
[PARTITION nColumnNumber [LEDIT] [REDIT]]
[PREFERENCE PreferenceName] [REST] [SAVE] [TIMEOUT nSeconds]
[TITLE cTitleText] [VALID [:F] lExpression3 [ERROR cMessageText]]
[WHEN lExpression4] [WIDTH nFieldWidth] [WINDOW WindowName1]
[IN [WINDOW] WindowName2 | IN SCREEN [COLOR SCHEME nSchemeNumber]
BROWSE [FIELDS FieldList] [FONT cFontName [, nFontSize [, nFontCharSet]]]
[STYLE cFontStyle] [FOR lExpression1 [REST]] [FORMAT]
[FREEZE FieldName] [KEY eExpression1 [, eExpression2]] [LAST | NOINIT]
[LOCK nNumberOfFields] [LPARTITION] [NAME ObjectName] [NOAPPEND]
[NOCAPTIONS] [NODELETE] [NOEDIT | NOMODIFY] [NOLGRID] [NORGRID]
[NOLINK] [NOMENU] [NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT]
[PARTITION nColumnNumber [LEDIT] [REDIT]]
[PREFERENCE PreferenceName] [SAVE] [TIMEOUT nSeconds]
[TITLE cTitleText] [VALID [:F] lExpression2 [ERROR cMessageText]]
[WHEN lExpression3] [WIDTH nFieldWidth] [WINDOW WindowName1]
[IN [WINDOW] WindowName2 | IN SCREEN] [COLOR SCHEME nSchemeNumber]

Vũ Bá Anh – Phan Phước Long 147


Chương 3:Hệ quản trị CSDL Visual FoxPro

REPLACE FieldName1 WITH eExpression1 [ADDITIVE]


[, FieldName2 WITH eExpression2 [ADDITIVE]] ... [Scope]
[FOR lExpression1] [WHILE lExpression2] [IN nWorkArea | cTableAlias]
[NOOPTIMIZE]
UPDATE Target
SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]
[FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

3.2.4 Thêm/bớt bản ghi


INSERT INTO dbf_name [(FieldName1 [, FieldName2, ...])]
VALUES (eExpression1 [, eExpression2, ...])
DELETE [Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias] [NOOPTIMIZE]

RECALL [Scope] [FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]


[IN nWorkArea | cTableAlias]

PACK [MEMO | DBF] [Tablename ] [IN nWorkarea | cTableAlias]


ZAP [IN nWorkArea | cTableAlias]

3.2.5 Sắp xếp và tìm kiếm bản ghi


INDEX ON eExpression TO IDXFileName | TAG TagName [BINARY]
[COLLATE cCollateSequence] [OF CDXFileName] [FOR lExpression]
[COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE]
SET INDEX TO [IndexFileList | ? ] [ORDER nIndexNumber
| IDXIndexFileName | [TAG] TagName [OF CDXFileName] [ASCENDING
| DESCENDING]] [ADDITIVE]
SET ORDER TO [nIndexNumber | IDXIndexFileName | [TAG] TagName
[OF CDXFileName] [IN nWorkArea | cTableAlias]
[ASCENDING | DESCENDING]]
SORT TO TableName ON FieldName1 [/A | /D] [/C]
[, FieldName2 [/A | /D] [/C] ...] [ASCENDING | DESCENDING]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[FIELDS FieldNameList | FIELDS LIKE Skeleton
| FIELDS EXCEPT Skeleton] [NOOPTIMIZE]
LOCATE [FOR lExpression1] [Scope] [WHILE lExpression2] [NOOPTIMIZE]
SEEK eExpression [ORDER nIndexNumber | IDXIndexFileName
| [TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]]
[IN nWorkArea | cTableAlias]

3.2.6 Tính toán trên tệp cơ sở dữ liệu


COUNT [Scope] [FOR lExpression1] [WHILE lExpression2] [TO VarName]
[NOOPTIMIZE]
CALCULATE eExpressionList [Scope] [FOR lExpression1] [WHILE lExpression2]
[TO VarList | TO ARRAY ArrayName] [NOOPTIMIZE]
[IN nWorkArea | cTableAlias]

eExpressionList
Specifies the expressions that can contain any combination of the following functions:
AVG(nExpression)
CNT( ) or COUNT( )
MAX(eExpression)
MIN(eExpression)
NPV(nExpression1, nExpression2 [, nExpression3])
STD(nExpression)
SUM(nExpression)
VAR(nExpression)
Functions in the expression list eExpressionList are separated by commas. These functions are specific to
CALCULATE and are described in detail later in this section. They should not be confused with similarly named
independent functions. For example, CALCULATE MIN( ) is not the same as MIN( ).

SUM [eExpressionList] [Scope] [FOR lExpression1] [WHILE lExpression2]


[TO MemVarNameList | TO ARRAY ArrayName] [NOOPTIMIZE]
AVERAGE [ExpressionList] [Scope] [FOR lExpression1] [WHILElExpression2]
[TO VarList | TO ARRAY ArrayName] [NOOPTIMIZE]

Vũ Bá Anh – Phan Phước Long 148


Chương 3:Hệ quản trị CSDL Visual FoxPro

TOTAL TO TableName ON FieldName [FIELDS FieldNameList] [Scope]


[FOR lExpression1] [WHILE lExpression2] [NOOPTIMIZE]

3.3 Làm việc với nhiều tệp cơ sở dữ liệu

3.3.1 Định nghĩa vùng làm việc cho cơ sở dữ liệu

3.3.2 Gán bí danh cho tệp cơ sở dữ liệu

3.3.3 Cập nhật từ tệp cơ sở dữ liệu khác

3.3.4 Kết nối hai tệp cơ sở dữ liệu khác


SELECT nWorkArea | cTableAlias
SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1
[, eExpression2 INTO nWorkArea2 | cTableAlias2 ...]
[IN nWorkArea | cTableAlias] [ADDITIVE]]
SET SKIP TO [TableAlias1 [, TableAlias2] ...]

3.3.5 Thiết kế quan hệ giữa các tệp cơ sở dữ liệu khác

3.4 Lập trình trong FoxPro

3.4.1 Cách tạo một chương trình

3.4.2 Thiết lập môi trường làm việc


SET(cSETCommand [, 1 | cExpression | 2 | 3 | 4])
SET CLASSLIB TO ClassLibraryName [IN APPFileName | EXEFileName]
[ADDITIVE] [ALIAS AliasName]
SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITALIAN
| JAPAN | TAIWAN | USA | MDY | DMY | YMD| SHORT | LONG
SET DECIMALS TO [nDecimalPlaces]
SET DEFAULT TO [cPath]
SET DELETED ON | OFF
SET EXACT ON | OFF
SET EXCLUSIVE ON | OFF
SET FIELDS TO [[FieldName1 [, FieldName2 ...]]
| ALL [LIKE Skeleton | EXCEPT Skeleton]]
SET FILTER TO [lExpression] [IN nWorkArea | cTableAlias]
SET PATH TO [Path] [ADDITIVE]
SET PROCEDURE TO [FileName1 [, FileName2, ...]] [ADDITIVE]
SET SAFETY ON | OFF
SET SYSMENU ON | OFF | AUTOMATIC | TO [MenuList] | TO [MenuTitleList]
| TO [DEFAULT] | TO LTRJUSTIFY | TO RTLJUSTIFY | SAVE | NOSAVE
SET TALK ON | OFF | WINDOW [WindowName] | NOWINDOW

Vũ Bá Anh – Phan Phước Long 149


Chương 3:Hệ quản trị CSDL Visual FoxPro

3.4.3 Lệnh gán và các lệnh vào ra


STORE eExpression TO VarNameList | ArrayNameList-or-
VarName | ArrayName = eExpression

3.4.4 Các lệnh điều khiển


IF lExpression [THEN]
Commands
[ELSE
Commands]
ENDIF

DO CASE
CASE lExpression1
[Commands]
[CASE lExpression2
[Commands]]
...
[CASE lExpressionN
[Commands]]
[OTHERWISE
[Commands]]
ENDCASE

3.4.5 Các lệnh chu trình


FOR VarName = nInitialValue TO nFinalValue [STEP nIncrement]
Commands
[EXIT]
[LOOP]
ENDFOR | NEXT
DO WHILE lExpression
Commands
[LOOP]
[EXIT]
ENDDO
SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
[LOOP]
[EXIT]
ENDSCAN

3.4.6 Định nghĩa cửa sổ


DEFINE WINDOW WindowName1 FROM nRow1, nColumn1 TO nRow2, nColumn2
| AT nRow3, nColumn3 SIZE nRow4, nColumn4
[IN [WINDOW] WindowName2 | IN SCREEN | IN DESKTOP [NAME ObjectName]
[FONT cFontName [, nFontSize [, nFontCharSet]]] [STYLE cFontStyle]
[FOOTER cFooterText] [TITLE cTitleText] [HALFHEIGHT]
[DOUBLE | PANEL | NONE | SYSTEM | cBorderString]
[CLOSE | NOCLOSE] [FLOAT | NOFLOAT] [GROW | NOGROW] [MDI | NOMDI]
[MINIMIZE | NOMINIMIZE] [ZOOM | NOZOOM] [ICON FILE FileName1]
[FILL cFillCharacter | FILL FILE FileName2]
[COLOR SCHEME nSchemeNumber | COLOR ColorPairList]]

ACTIVATE WINDOW WindowName1 [, WindowName2 ...]


| ALL [IN [WINDOW] WindowName3 | IN SCREEN
[BOTTOM | TOP | SAME] [NOSHOW]

Vũ Bá Anh – Phan Phước Long 150


Chương 3:Hệ quản trị CSDL Visual FoxPro

DEACTIVATE WINDOW WindowName1 [, WindowName2 ...] | ALL


SHOW WINDOW WindowName1 [, WindowName2 ...] | ALL | SCREEN
[IN [WINDOW] WindowName3 [REFRESH] [TOP | BOTTOM | SAME] [SAVE]
HIDE WINDOW WindowName1 [, WindowName2 ... ] | ALL | SCREEN
[ IN [WINDOW] WindowNameN | IN [WINDOW] SCREEN | IN [WINDOW]
[BOTTOM | TOP | SAME]

MODIFY WINDOW WindowName | SCREEN


[FROM nRow1, nColumn1 TO nRow2, nColumn2
| AT nRow3, nColumn3 SIZE nRow4, nColumn4]
[FONT cFontName [, nFontSize [, nFontCharSet]]] [STYLE cFontStyle]
[TITLE cTitleText] [HALFHEIGHT] [DOUBLE | PANEL | NONE | SYSTEM]
[CLOSE | NOCLOSE] [FLOAT | NOFLOAT] [GROW | NOGROW]
[MINIMIZE | NOMINIMIZE] [ZOOM | NOZOOM] [ICON FILE FileName1]
[FILL FILE FileName2]
[COLOR SCHEME nSchemeNumber | COLOR ColorPairList]
MOVE WINDOW WindowName TO nRow1, nColumn1 | BY nRow2, nColumn2 | CENTER

RELEASE WINDOWS [WindowNameList]

3.4.7 Thiết kế một chương trình FoxPro

Vũ Bá Anh – Phan Phước Long 151

You might also like