Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (356.27 KB, 85 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
Chương II: CÁC CÁCH TIẾP CẬN MỘT CSDL
Chương III. MƠ HÌNH DỮ LIỆU QUAN HỆ
Chương IV: RAØNG BUỘC TOAØN VẸN
ChươngV: CHUẨN HÓA LƯỢC ĐỒ QUAN HỆ
Chương VI : ĐẠI SỐ QUAN HỆ
Chương VII: NGÔN NGỮ TRUY VẤN CSDL
Chương VIII: TỐI ƯU HÓA CÂU TRUY VẤN
Phịng Tổ chức – Hành chính: Lý lịch chi tiết của CBCNV;
– It tốn thời gian. Đầu tư & chi phí thấp.
– Khả năng đáp ứng khai thác nhanh chóng và kịp thời.
<i><b>**Nhược điểm</b></i>:
Thông tin lưu nhiều nơi <sub></sub> dư thừa <sub></sub> khơng nhất
quán
Lãng phí thời gian nhập, cập nhật dữ liệu & lưu trữ.
Sự phối hợp tổ chức và khai thác là khó khăn.
Thiếu sự chia sẻ thông tin giữa các đơn vị bộ phận.
Khó khăn khi nâng cấp ứng dụng.
<i>Lưu ý</i>: Các tính chất: <i>Hệ thống, có cấu trúc, nhiều người sử </i>
<i>dụng, khai thác đồng thời, nhiều mục đích khác nhau.</i>
<i><b>**Các vấn đề phát sinh cần giải quyết</b></i>
Tính chủ quyền bị vi phạm
Tính nhất quán của dữ liệu
Vấn đề bảo mật
Tính an toàn dữ liệu
Vấn đề tranh chấp dữ liệu khi truy xuất đồng thời
<i><b>Hệ quản trị CSDL cần có</b></i><b>:</b>
<b>a) Từ điển dữ liệu (</b><i><b>Data Dictionary</b></i><b>)</b>
<b>b) Cơ chế giải quyết tranh chấp. (</b><i><b>Quyền và mức độ ưu tiên</b></i><b>)</b>
<b>c) Cơ chế bảo mật dữ liệu. (</b><i><b>Bức tường lửa + mật khẩu</b></i><b>)</b>
<b>d) Cơ chế tự động sao lưu (</b><i><b>Backup</b></i><b>) và phục hồi (</b><i><b>Restore</b></i><b>) dữ liệu </b>
<b>khi có sự cố. (</b><i><b>Định kỳ theo thời gian</b></i><b>)</b>
<b>e) Ngơn ngữ giao tiếp người sử dụng (NSD) với CSDL. (</b><i><b>SQL</b></i><b>)</b>
<b>f) Đảm bảo tính độc lập giữa dữ liệu và chương trình.</b>
<b>g) Có thể, cần có giao diện tốt với người dùng không chuyên.</b>
–
–
–
- Loại mẫu tin (<i><b>Record Type</b></i>) là đặc trưng cho 1 loại đối tượng
riêng biệt, được biểu thị bởi một hình chữ nhật.
-Loại liên hệ (<i><b>Set Type</b></i>) là sự liên kết giữa 1 loại mẫu tin với 1
loại mẫu tin khác (gọi là mẫu tin thành viên). 4 loại liên hệ:
<i>1 </i><sub></sub><i> 1</i> : 1 mẫu tin chủ chỉ kết hợp với 1 mẫu tin thành viên.
<i>1 </i><sub></sub><i> n</i> : 1 mẫu tin chủ kết hợp với nhiều mẫu tin thành viên.
<i>n </i><sub></sub><i> 1</i> : n mẫu tin chủ kết hợp với chỉ 1 mẫu tin thành viên.
<i>Đệ quy (Recursive)</i>: Mẫu tin chủ có thể là thành viên của nó.
<i><b>Mơ hình này đơn giản nhưng khơng thích hợp để biểu diễn các CSDL lớn.</b></i>
Mẫu tin thành viên chỉ đóng vai trị thành viên của 1 mối liên
hệ duy nhất, tức là thuộc một chủ duy nhất. Mối liên hệ từ mẫu
tin chủ tới các mẫu tin thành viên là 1 n, ngược lại, từ mẫu
tin thành viên tới mẫu tin chủ là 1 1.
Giữa 2 loại mẫu tin chỉ tồn tại một mối liên hệ duy nhất.
<i><b>Mơ hình phân cấp được sử dụng chủ yếu cho các tổ chức có cấu trúc phân </b></i>
<i><b>cấp, như ngành thống kê chẳng hạn. Dữ liệu của loại mẫu tin chủ thường </b></i>
<i><b>chứa các kết quả tổng hợp được từ dữ liệu của các mẫu tin thành viên, do </b></i>
<i><b>đó có rất nhiều nhược điểm khi dữ liệu thường xuyên có biến động.</b></i>
Mơ hình quan hệ do E.F.Codd đề xuất năm 1970. Nền tảng
của nó là lý thuyết tập hợp trên các quan hệ. Các khái niệm
cơ bản gồm: <i><b>Thuộc tính </b></i>(<i><b>Attribute</b></i>), <i><b>Quan hệ </b></i>(<i><b>Relation</b></i>), <i><b>Bộ </b></i>
<i><b>giá </b></i> <i><b>trị </b></i> (<i><b>Value</b></i> <i><b>Tuple</b></i>), <i><b>Lược đồ quan hệ </b></i> (<i><b>Relation</b></i> <i><b>Schema</b></i>),
<i><b>Khoá (</b><b>Key</b></i>), phụ thuộc hàm (<i><b>Functional</b></i> <i><b>Dependency</b></i>), ...
Mơ hình thực thể kết hợp do P.P.Chen đề xuất năm 1976. Các
khái niệm chủ yếu được sử dụng bao gồm: Loại thực thể
(<i><b>Entity Type</b></i>), Thực thể (<i><b>Entity</b></i>), Thuộc tính của loại thực thể
(<i><b>Entity Attribute</b></i>), Khóa của loại thực thể (<i><b>Entity Key</b></i>), Loại
mối kết hợp (<i><b>Entity Relationship</b></i>), Số ngôi của mối kết hợp
(<i><b>Relationship Degree</b></i>), Thuộc tính của mối kết hợp
(<i><b>Relationship Attribute</b></i>), Bản số của mỗi nhánh kết hợp
(<i><b>Relationship Cardinal</b></i>). Từ năm 1980, các khái niệm mới
được bổ sung như Loại thực thể chuyên biệt hóa (<i><b>Specialized</b></i>
<i><b>Entity</b></i>), Mối kết hợp đệ quy (<i><b>Recursive Relationship</b></i>)
Đây là mơ hình tiên tiến nhất hiện nay. Những ưu điểm
lớn của kỹ thuật hướng đối tượng là:
(1) Tính đóng gói (<i><b>Encapsulation</b></i>): Dữ liệu và các thao tác xử
lý cấu trúc dữ liệu đó được “<i>hịa quyện</i>” với nhau thành một
thể thống nhất.
(2) Tính kế thừa (<i><b>Inheritance</b></i>): Một cấu trúc dữ liệu mới có thể
được xây dựng và phát triển từ các cấu trúc dữ liệu đã có
trước đó, có thể kế thừa các thành phần dữ liệu và phương
thức từ các kiểu dữ liệu cơ sở.
(3) Tính tương ứng bội (<i><b>Polymorphism</b></i>).
(4) Tính tái sử dụng (<i><b>Reusability</b></i>).
<b>2.1. MỘT SỐ KHÁI NIỆM VÀ ĐỊNH NGHĨA</b>
<b>1. Thuộc tính</b>
<b>2. Quan hệ</b>
<b>3. Bộ giá trị</b>
<b>4. Thể hiện</b>
<b>5. Khoá</b>
<b>6. Lược đồ quan hệ & lược đồ CSDL ...</b>
<b>2.2. CÁC THAO TÁC CƠ BẢN TRÊN MỘT QUAN HỆ</b>
1. THUỘC TÍNH (<i><b>Attribute</b></i>): Là một đặc tính của đối tượng
cần được phản ánh trong CSDL phục vụ việc khai thác
thơng tin về sau.
<i>Ví dụ</i>: Họ tên, Giới tính, Ngày sinh, Nơi sinh, ...
<i>a. Tên gọi</i>: Một dãy ký tự bất kỳ. Nên đặt tên gợi nhớ.
<i>b. Kiểu giá trị</i>: Số, Chuỗi, Ngày, Logic
<i>c. Miền giá trị</i>: Xác định tập giá trị thuộc tính có thể nhận.
<b>1. PhongBan (MaPB, TenPB, DiaDiem, MaNQL, KinhPhi, DoanhThu)</b>
<i><b>Tân từ: Mỗi phòng ban có một tên gọi (</b><b>TenPB</b><b>) đầy đủ, một địa điểm </b></i>
<i><b>trú đóng (</b><b>DiaDiem</b><b>), một mã số của nhân viên phụ trách phịng </b></i>
<i><b>(MaNQL), một khoản kinh phí (</b><b>KinhPhi</b><b>) để hoạt động, một khoản </b></i>
<i><b>doanh thu (</b><b>DoanhThu</b><b>) nếu có, và một mã số (</b><b>MaPB</b><b>) duy nhất để </b></i>
<i><b>phân biệt với các phịng ban khác trong cơng ty.</b></i>
<b>2. CongViec (MaCV, TenCV, LuongMin, LuongMax, MgrFlag)</b>
<b>3. NhanVien (MaNV, TenNV, MaCV, Luong, HoaHong, MaPB, </b>
<b>GioiTinh)</b>
<i><b>Tân từ: Mỗi nhân viên (</b><b>NhanVien</b><b>) được cấp một mã số (</b><b>MaNV</b><b>) duy nhất để </b></i>
<i><b>phân biệt với mọi nhân viên khác. Nhân viên phải có một tên gọi (</b><b>TenNV</b><b>) </b></i>
<i><b>cụ thể, đảm nhận một công việc là </b></i> <i><b>MaCV</b><b>, được hưởng một mức lương </b></i>
<b>4. QuaTrinh(MaNV, Seq, Ngay_BD, Ngay_KT, Luong, FrJob, ToJob, </b>
<b>FrPB, ToPB)</b>
<i><b>Tân từ: Nhân viên có mã số </b><b>MaNV </b><b>có thể có nhiều quá trình thay đổi được </b></i>
<i><b>đánh số thứ tự (</b><b>Seq</b><b>) từ 1 trở đi. Một quá trình diễn ra từ ngày (</b><b>Ngay_BD</b><b>) </b></i>
<i><b>đến ngày (</b><b>Ngay_KT</b><b>), có thể do thay đổi lương (</b><b>Salary</b><b>) có thể do thay đổi từ </b></i>
<i><b>cơng việc này (</b><b>FrJob</b><b>) sang công việc khác (</b><b>ToJob</b><b>), hoặc thuyên chuyển từ </b></i>
<i><b>phòng này (</b><b>FrPB</b><b>) sang phòng khác (</b><b>ToPB</b><b>).</b></i>
3. BỘ GIÁ TRỊ (<i><b>Tuple</b></i><b> </b> Record Row)
Là tổ hợp giá trị của các thuộc tính <i>thỏa tân từ</i>.
<i><b>Ví dụ: Giả sử đã có một bộ giá trị của qhệ </b></i><b>PhongBan:</b>
<b>(10, ‘Tổ Chức’, …). Khi đó các bộ gía trị sau:</b>
<b>(10, ‘Kinh Doanh’, … ); vaø </b>
<b>(20, ‘ ’, … )</b>
<b>là khơng hợp lệ.</b>
4. THỂ HIỆN (<i><b>Instance </b></i>hay <i><b>Occurence</b></i>)
<b>Là tập hợp các bộ giá trị của quan hệ tại một thời điểm. </b>
<b>Như vậy một quan hệ có rất nhiều thể hiện.</b>
5. KHỐ (<i><b>Key</b></i>)
a. Khóa là tổ hợp các thuộc tính mà giá trị của chúng xác
định duy nhất 1 bộ gía trị.
Ví dụ:. <b>MaPB</b> là khóa của <b>PhongBan.</b>
Giả sử các phịng ban đều có tên khác nhau, khi đó:
<b>TenPB</b>: cũng là khóa
<b>MaPB</b>, <b>DiaDiem</b>: cũng là khóa
<b>MaPB</b>, <b>TenPB</b>: cũng là khóa
Cho <b>R (A<sub>1</sub>, A<sub>2</sub>, A<sub>n</sub>) </b>là quan hệ. <b>A<sub>1</sub></b> là khóa. Khi đó cũng có:
<b>A<sub>1</sub>A<sub>2</sub>, A<sub>1</sub>A<sub>3</sub>, A<sub>1</sub>A<sub>4</sub>, A<sub>1</sub>A<sub>n</sub></b>: là khóa
<b>A<sub>1</sub>A<sub>2</sub>A<sub>3</sub>, …, A<sub>1</sub>A<sub>2</sub>A<sub>n</sub></b> là các khóa. Vậy có bao nhiêu khóa?
Trả lời: 2n-1 . Với n=32 thuộc tính thì có hơn 2 tỷ khóa!!!
<b>R (A<sub>1</sub>,A<sub>2</sub>, …, A<sub>n</sub>) </b>là quan hệ.<b> K</b> <b>{ A<sub>1</sub>,A<sub>2</sub>, A<sub>n</sub></b> <b>}</b>
<b>K </b>là khóa của <b>R</b> nếu và chỉ nếu thỏa:
1) <b>K</b> là khóa theo đ/n 1
2) <b>K<sub>1</sub></b> <b> K</b> mà <b>K<sub>1</sub></b> là khóa theo đ/n 1
<b>MaPB </b>hoặc<b> TenPB </b>là khóa của quan hệ <b>PhongBan</b>
Nếu <b>K </b>là khóa thì<b> K </b><b> A<sub>i</sub></b> được gọi là siêu khóa.
c. Khóa chỉ định (<i><b>Candidate Key</b></i>): Các khóa thỏa đ/n 2.
d. Khóa chính (<i><b>Primary Key</b></i>): Trong số các khóa chỉ định có thể
chọn 1 khóa tiện lợi nhất nhất cho việc sử dụng để sắp xếp các
bộ giá trị (theo thứ tự tăng dần) phục vụ cho việc tìm kiếm và
kết nối thơng tin nhanh chóng, gọi nó là khóa chính.
Khóa chính của quan hệ (thì) được gạch chân.
Khơng được phép sửa đổi giá trị khóa chính.
e. Khóa ngoại (<i>Foreign Key</i>):
Cho<b> R(U) </b>và<b> S(V); K1 </b><b>U, K2</b><b>V; K1 </b>là khóa chính của<b> R</b>.
Nếu thỏa:
<b> </b>(i) <b>K1, K2 </b>có cùng số lượng cùng ý nghĩa của các thuộc tính.
(ii) Giữa <b>R</b> và <b>S</b> có mối quan hệ 1:n
Khi đó <b>K2</b> là khóa ngọai của <b>S</b> khi tham cham chiếu tới<b> K1 </b>của<b> R.</b>
<i>Ví du</i>ï: <b>MaPB </b>của<b> NhanVien </b>là khóa ngọai khi tham chiếu tới <b>MaPB </b>của
<b>PhongBan.</b>
<b>MaNQL</b> của <b>PhongBan</b> là khóa ngọai khi tham chiếu tới <b>MaNV </b>của quan
hệ <b>NhanVien</b>.
<b>R(U), K1</b><b>U </b>là khóa chính của<b> R.</b>
<b>S(V), K2</b><b>V </b>là khóa ngọai của<b> S</b> khi tham chiếu tới <b>K1</b> của<b> R.</b>
<b>K3</b><b>K2</b> là những thuộc tính khóa chính của <b>S.</b> Khi đó<b> K3</b> được
gọi là thuộc tính khóa lồng.
<i>Ví du</i>ï: <b>MaNV </b>của <b>QuaTrinh </b>là thuộc tính khóa lồng vì vừa là
khóa ngọai vừa là thuộc tính khóa chính của <b>QuaTrinh.</b>
6. PHỤ THUỘC HÀM (<i><b>Functional Dependency</b></i>)
R(U); X, Y U. Nếu tồn tại một ánh xạ f từ X vào Y thì ta nói
rằng X xác định hàm Y hay Y phụ thuộc hàm vào X và ký hiệu
là X Y.
7. RAØNG BUỘC TOAØN VẸN (<i><b>Integrity Rule / Constraint</b></i>)
Là một quy tắc bất biến mà tất cả các thao tác trên CSDL phải
tn theo nhằm đảm bảo tính đúng đắn, an tồn và toàn vẹn dữ
8. LƯỢC ĐỒ QUAN HỆ (<i><b>Relation Schema</b></i>)
Là sự trừu tượng hoá của quan hệ. Khi nói đến lược đồ quan hệ
tức là đề cập đến cấu trúc tổng quát của một quan hệ, là một
ma trận hai chiều.
Lược đồ CSDL là tập hợp các lược đồ quan hệ {Ri}
<i>Ví dụ</i>: “<i>Thêm vào phịng số 10 nhân viên mới có mã số 300, tên là </i>
<i>Hồng Duy làm nhân viên kế tốn với lương 2700$.</i>”
INSERT (NhanVien; 300, ‘Hoàng Duy’, ‘KeToan’, 2700, 10,
NULL, ‘M’)
UPDATE (R; A<sub>1</sub>=e<sub>1</sub>, A<sub>2</sub>=e<sub>2</sub>, ..., A<sub>n</sub>=e<sub>n</sub>; <i>điều kiện sửa</i>)
<i>Ví dụ</i>: “<i>Tăng lương 10% cho các nhân viên phụ trách các </i>
<i>phoøng/ban</i>”
UPDATE (NhanVien; Luong = Luong*1.1; MaCV = ‘QuanLi’)
<i>Ví dụ</i>: “<i>Xóa các nhan viên phụ trách các phòng/ban</i>”
DELETE (NhanVien; MaCV = ‘QuanLi’)
4.1. ĐỊNH NGHĨA – CÁC YẾU TỐ CỦA MỘT RBTV
o Định nghóa RBTV
o Các yếu tố của RBTV
4.2. PHÂN LOẠI CÁC RBTV
o RBTV có bối cảnh trên một quan hệ
o RBTV có bối cảnh trên nhiều quan hệ
<i>1. Định nghóa</i>.
Ràng buộc tồn vẹn (RBTV – <i>Integrity Constraint</i>) là một
<i>2. Các yếu tố của một RBTV</i>.
<i>a) Nội dung của RBTV.</i>
<i>Ví dụ R1</i>:
“<i>Mỗi phịng ban phải có một khoản kinh phí tối thiểu là 10,000$ </i>
<i>để hoạt động”</i>. (<i>Theo tân từ của PhongBan</i>)
Hoặc bằng biểu thức toán học chặt chẽ hơn:
<i>d</i><i> PhongBan : d.kinhPhi </i><i> 10,000</i>
<i>Ví dụ R2</i>:
<i>“Mỗi nhân viên phải có giới tính xác định là ‘F’ (‘F’ = Female = </i>
<i>Nữ) hoặc ‘M’ (‘M’ = Male = ‘Nam’)</i>”
<i>e</i><i> NhanVien: e.GioiTinh </i><i> { ‘F’, ‘M’ }</i>
<i>b) Boái caûnh xaûy ra RBTV</i>.
Xác định rõ RBTV có liên quan đến mấy quan hệ và đó là
những quan hệ nào.
<i>c) Tầm ảnh hưởng của RBTV</i>.
Caăn xađy dựng bạng goăm 4 ct: Teđn quan h, Theđm, Xóa, Sửa.
Nêu thao tác nào vi phám RBTV đôi với quan h nào thì tái giao
đieơm dòng và ct đó được ghi dâu cng (+). Nêu chư ạnh hưởng
tređn các thuc tính nào thođi thì ghi teđn các thuc tính đó ở phía
dưới dâu cng. Nêu khođng ạnh hưởng thì ghi daẫu trừ (-); và nêu
khođng ạnh hưởng vì lý do khođng sửa được thì ghi theđm dâu sao (*)
ở phía tređn cụa dâu trừ đó.
<i>Ví dụ</i>: Ảnh hưởng trên thuộc tính MaPB: +<sub>(MaPB)</sub>
Và khơng ảnh hưởng do khơng thể sửa được: -(*).
<b>Quan hệ</b> <b>Thêm</b> <b>Xóa</b> <b>Sửa</b>
<i>PhongBan</i> - + -(*)
<i>NhanVien</i> +<sub>(MaPB)</sub> - +<sub>(MaPB)</sub>
<i>e</i><i> NhanVien, </i><i> d </i><i> PhongBan: e.MaPB = d.MaPB</i>
<i>NhanVien[MaPB] </i><i> PhongBan[MaPB]</i>
<i>d) Hành động cần tiến hành khi RBTV bị vi phạm.</i>
Thông thường là:
Thông báo lỗi
Từ chối thao tác.
Thông báo lỗi phải đầy đủ, rõ ràng và lịch sự.
Hai trường hợp xử lý:
<sub>Trực tuyến</sub><sub> (On-line </sub><i><sub>InterActive</sub></i><sub>): Ra màn hình</sub>
<i>1. RBTV có bối cảnh là một quan hệ</i>.
a) RBTV về miền giá trị: Thuộc tính khơng chỉ đặc trưng
bởi kiểu dữ liệu mà nó cịn bị giới hạn bởi miền giá trị
trong kiểu dữ liệu đó.
<i>“Mỗi nhân viên phải có giới tính xác định là ‘F’ (‘F’ = </i>
<i>Female = Nữ) hoặc ‘M’ (‘M’ = Male = ‘Nam’)</i>”
<i>e</i><i> NhanVien: e.GioiTinh </i><i> { ‘F’, ‘M’ }</i>
<i>2. RBTV có bối cảnh trên nhiều quan hệ</i>.
a) RBTV về khóa ngoại cịn gọi là RBTV phụ thuộc tồn tại
hay RBTV tham chiếu.
RBTV tham chiếu xảy ra nếu có 1 trong 2 trường hợp sau:
Có sự hiện diện của khố ngoại
Có sự lồng khoá giữa các quan hệ
<i>NhanVien[MaPB] </i><i> PhongBan[MaPB]</i>
<b>Quan hệ</b> <b>Thêm</b> <b>Xóa</b> <b>Sửa</b>
<i>PhongBan</i> - + -(*)
Do sự hiện diện của thuộc tính tính tốn (giá trị của thuộc tính
đó được tính tốn từ các thuộc tính khác).
Ví dụ: Xét quan hệ
SINHVIEN (MaSV, TenSV, DTB)
DIEM_SV(MaSV, MaMon, Diem)
Biểu diễn:
Quan hệ Thêm Xoá Sửa
SINHVIEN + - +
DIEM_SV + + +(Diem, <sub>MaSV)</sub>
Bảng tầm ảnh hưởng:
<i>1. Phụ thuộc hàm F (Functional Dependency)</i>
<i>a)Định nghóa</i>.
R(U); X, Y U. Nếu tồn tại một ánh xạ f từ X vào Y thì ta nói
rằng X xác định hàm Y hay Y phụ thuộc hàm vào X và ký hiệu
là X Y.
<i>b) Phụ thuộc hàm hiển nhiên: </i>X Y đươc gọi PTH hiển nhiên
nếu Y X
<i>c) Phụ thuộc hàm được suy diễn lơgíc từ tập PTH đã cho</i>
<i>d) Bao đóng của tập PTH F: </i>tức là tập các PTH được suy diễn
logic từ F. Nếu F = F+ thì ta nói F là họ đầy đủ của PTH.
<i>2. Hệ tiên đề Armstrong.</i>
<i><b>a) Hệ 3 tiên đề cơ bản.</b></i>
<i>Luật phản xạ: </i> X, Y U. Nếu Y X thì XY
<i>Luật tăng trưởng:</i> X, Y, W U. Nếu XY thì XWYW
<i>Luật bắc cầu: </i>X, Y, Z U. Nếu XY YZ thì XZ
<i><b>b) Bổ đề, 3 tiên đề mở rộng.</b></i>
<i>(iv) Luật tách: </i>X, Y, Z U. Nếu XYZ thì X Y XZ
<i>(v) Luật gộp: </i>X, Y, Z U. Nếu XY XZ thì XYZ
<i>(vi) Luật tựa bắc cầu</i>:
X, Y, Z, W U. Nếu XY YWZ thì XWZ
R (U) là một quan hệ được định nghĩa trên tập thuộc tính U.
F là tập phụ thuộc hàm xác định trên R; và X U.
X+
F = A U: X A F+
<i>Bài toán thành viên: </i>X A F+ nếu và chỉ nếu A X+
F.
<i><b>d) Ứng dụng bao đóng để tìm một khóa của lược đồ quan hệ:</b></i>
Khóa là tập thuộc tính K mà bao đóng của K đúng bằng
R(K+=R) và nếu bớt khỏi K một phần tử bất kỳ thì bao đóng
của nó khác R.
Từ định nghĩa ta thấy có thể tìm khóa bắt đầu từ tập R vì và ta
bớt dần các phần tử của R để nhận được tập bé nhất mà bao
đóng của nó đúng bằng R.
Trong công tác quản lý và xử lý các hệ cơ sở dữ liệu, chúng ta
thường phải đưa CSDL về dạng đơn giản nhất, xử lý nhanh nhất.
Để thực hiện mục đích đó chúng ta phải tiến hành “chuẩn hóa”
các hệ CSDL. Tức là chúng ta sẽ xét một số dạng quen thuộc
mà trong CSDL gọi là các dạng chuẩn.
Daïng chuẩn 1 (first Norm Form) ký hiệu là 1NF.
Cho lược đồ CSDL R, Q là một quan hệ trên R được gọi là
đạt dạng chuẩn 1NF nếu và chỉ nếu tồn bộ các miền giá trị
có mặt trong Q đều chỉ chứa các giá trị nguyên tố (giá trị
nguyên tố là giá trị không thể tách thành các giá trị khác –
giá trị đơn).
<b>Thuộc tính phụ thuộc đầy đủ</b>
Y phụ thuộc hoàn toàn vào X nếu:
<b>Quan hệ Q được gọi là đạt dạng chuẩn 2NF khi thỏa 2 </b>
<b>điều kiện:</b>
Q đạt dạng chuẩn 1NF
Tất cả các thuộc tính khơng khóa phải phụ thuộc đầy đủ vào
khóa.
<b>Ví dụ: Cho quan hệ Q(A,B,C,D,E,F,G)</b>
F = {ABCDEFG, BG}
F = {AE, CD, EDH}
Khóa của quan hệ Q là ABC vì tồn tại CD là phụ thuộc hàm
khơng đầy đủ vào khóa. Vậy Q khơng đạt chuẩn 2NF
<b>Lưu ý</b><i>: Trong một số trường hợp nếu tất cả các phần tử của Q </i>
<i>đều là khóa, tức là tập các phần tử khơng khóa bằng rỗng nên Q </i>
<i>đạt chuẩn 2NF.</i>
<b>Quan hệ Q đạt chuẩn 3NF nếu thỏa 2 điều kiện</b>
- Đạt chuẩn 2NF
- Tất cả các thuộc tính không khóa phải không phụ
thuộc bắt cầu vào khóa.
<b>Ví d :ụ</b> SinhVien(MaSV, HoTen, NgaySinh, MaLop)
<i>cau</i>
<i>bac</i>
<i>PTH</i>
<i>TenLop</i>
<i>MaSV</i>
<i>MaLop</i>
<i>MaSV</i>
<i>TenLop</i>
<i>MaLop</i>
<i>TenLop</i>
<i>MaSV</i>
- Đạt chuẩn 3NF
- Quan hệ Q không tồn tại PTH dạng Xx với x X
và
<b>Ví dụ: Cho quan heä R = {A, B, C, D}</b>
F = {ABC, CABD}
Các tập có bao đóng khác R là: X = {A}, X = {B}, X= {D},
X= {A, D}, X= {B, D} và trong các tập trên khơng có PTH
dạng Xx với x X
Vậy R đạt chuẩn BCNF.
Dạng chuẩn của một lược đồ CSDL là dạng chuẩn thấp nhất
của các dạng chuẩn của các quan hệ con của lược đồ đó.
<i>Q</i>
<i>X</i>
<b>6.1 CÁC PHÉP TOÁN TẬP HỢP TRÊN CÁC QUAN HỆ</b>
<b>6.2 CÁC THAO TÁC CƠ SỞ TRÊN QUAN HỆ</b>
1. Phép hợp nhất 2 quan hệ (UNION).
Cho R và S là 2 quan hệ được định nghĩa trên cùng một tập
thuộc tính U = { A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>n</sub> }.
Phép hợp nhất 2 quan hệ R và S, ký hiệu R S, là một quan hệ
Q cũng được định nghĩa trên cùng tập thuộc tính U, mà
T<sub>Q</sub> = { t : t T<sub>R</sub> t T<sub>S</sub> }
2. Phép trừ 2 quan hệ (MINUS).
Cho R(U) và S(U) là 2 quan hệ. Hiệu của 2 quan hệ R và S, ký
hiệu R \ S, là một quan hệ Q được định nghĩa trên cùng tập
thuộc tính U, mà
3. Pheùp giao (INTERSECTION).
Cho R(U) và S(U) là 2 quan hệ. Phép giao của 2 quan hệ R và
T<sub>Q</sub> = { t : t T<sub>R</sub> t T<sub>S</sub> }
4. Phép tích Đề Các (Des CARTESIAN).
Cho R(A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>n</sub>) vaø S(B<sub>1</sub>, B<sub>2</sub>, ..., B<sub>n</sub>) là 2 quan hệ.
Tích Đề các của 2 quan hệ R và S, ký hiệu R x S, là một quan
hệ Q được định nghĩa trên tập thuộc tính {A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>n</sub>, B<sub>1</sub>,
B<sub>2</sub>, ..., B<sub>n</sub>)}, mà
Khơng làm mất tính tổng qt, giả sử R (A,B) và S(B) là 2 quan
hệ. Thương của 2 quan hệ R và S, ký hiệu là R S, là một quan
hệ Q được định nghĩa trên thuộc tính A, mà
T<sub>Q</sub> = { t =r.A: r T<sub>R</sub> u T<sub>S</sub> (t,u) T<sub>R</sub>},
Tức là: Q x S R
Quan hệ phi công: PhiCong (#p) = { 30, 31, 32 }
Quan hệ máy bay MayBay (#m) = { 100, 101, 102, 103 }
Khả năng lái máy bay của các phi công: KhaNang (#p, #m )
(31,100), (31,102), (32,100), (32,101) }
Câu hỏi: “<i>Cho danh sách các phi cơng có khả năng lái được </i>
<i>tất cả các máy bay?</i>”
Trả lời: “<i>Phi cơng số 30<b>. Đó là kết quả của phép chia quan hệ </b></i>
<i><b>KhaNang cho quan hệ MayBay (KN </b></i><i><b> MB) ”</b></i>
Cho R (U) là quan hệ được định nghĩa trên tập thuộc tính
U = (A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>n</sub>); và K U.
Phép chiếu quan hệ R trên tập thuộc tính K, ký hiệu là R[K]
hoặc <sub>K</sub>(R), là một quan hệ Q (K), mà T<sub>Q</sub> = { t = r.K, r T<sub>R</sub> }
Nói đơn giản, là một quan hệ mới lấy từ R sau khi đã loại bỏ
đi các cột không cần giữ lại, và loại bỏ các dòng giống nhau.
2. Phép chọn (SELECTION)
Phép chọn các bộ của quan hệ R thỏa điều kiện <i>e</i> đã cho, ký
hiệu là R : (<i>e</i>), hoặc
<i><b>Theo định nghóa, trong kết quả của phép chiếu và phép chọn sẽ không có </b></i>
<i><b>các bộ giá trị giống nhau</b></i>.
Ví dụ 1: “<i><b>Cho biết mã số và tên của các phòng ban trong công ty?</b></i>”.
<i><b>Phép tốn</b></i>: <b>PhongBan [ MaPB, TenPB]</b>
Ví dụ 2: “<i><b>Cho biết các nhân viên của Cty hiện đang làm công việc gì ?</b></i>”.
<i><b>Phép tốn</b></i>: <b>NhanVien [MaCV]</b>
Ví dụ 3: “<i><b>Cho biết mã số và tên, công việc, tiền lương của các nhân viên </b></i>
<i><b>trong công ty?</b></i>”.
<i><b>Phép tốn</b></i>: <b>NhanVien</b> <b>[</b> <b>MaNV</b>, <b>TenNV</b>, <b>MaCV,</b> <b>Luong]</b>
Ví dụ 4: “<i><b>Cho tên và tiền lương của các nhân viên của phòng số 40?</b></i>”.
<i><b>Phép tốn</b></i>: <b>(</b> <b>NhanVien: (MaPB = 40))[</b> <b>TenNV</b>,<b>Luong]</b>
Ở đây là một trong các phép so sánh: >, >=, <, <=, =
Cho R (U) và S (V) là các quan hệ được định nghĩa trên tập
thuộc tính U ={A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>n</sub>} và V = {B<sub>1</sub>, B<sub>2</sub>, ..., B<sub>n</sub>)}. AU,
B V là 2 thuộc tính của 2 quan hệ.
Phép - kết giữa quan hệ R và S, ký hiệu là R S, là
moät quan hệ Q (UV), mà T<sub>Q</sub> = { t = (u, v): u T<sub>R</sub> v T<sub>S</sub>
u.A v.B}
Phép - kết R và S có thể được biểu diễn tương đương:
R S = (R x S) : (R.A S.B)
Nếu là phép so sánh bằng nhau (=) thì phép kết được gọi là
phép kết bằng nhau, hay phép kết tương đương.
Nếu là phép so sánh bằng nhau (=) và 2 thuộc tính A, B có
tên giống nhau thì gọi đó là phép kết tự nhiên (NATURAL
JOIN), và ký hiệu là R S.
<i>Ví dụ</i>: “<i>Cho tên phòng ban cùng danh sách tên các nhân viên</i>”:
PhongBan NhanVien [TePB, TenNV]
1. Phép kết trong (INNER JOIN). Thực chất là phép bằng nhau,
hay phép kết tương đương EQUI-JOIN. Có thể ký hiệu phép
tốn này bằng dấu sao (*).
Kết quả của phép kết trong giữa R và S:
Q(A, X, B, Y)
(1, x1, 1, y1)
(2, x2, 2, y2)
R(A, X)
(1, x1)
(2, x2)
(3, x3)
Phép kết vế trái giữa R và S, ký hiệu R S, là 1 quan hệ Q
định nghĩa trên tập thuộc tính U V, mà
T<sub>Q</sub> = { t = (u, v): u T<sub>R</sub> v T<sub>S</sub> u.A = v.B
Kết quả phép kết vế trái giữa R và S là:
Q(A, X, B, Y)
(1, x1, 1, y1)
(2, x2, 2, y2)
(3, x3, <i>Null, Null</i>) <i>(1)</i>
Phép kết vế phải giữa R và S, ký hiệu R S, là 1 quan hệ Q
định nghĩa trên tập thuộc tính U V, mà
T<sub>Q</sub> = { t = (u, v): u T<sub>R</sub> v T<sub>S</sub> u.A = v.B
Q(A, X, B, Y)
(1, x1, 1, y1)
(2, x2, 2, y2)
(<i>Null, Null</i>, 4, y4) <i>(2)</i>
Suy ra, có thể dễ dàng tìm được các bộ của S mà khơng có bộ
giá trị tương ứng trong quan hệ R.
1: “<i>Cho danh sách nhân viên làm cùng phòng với Watson</i>”.
(NhanVien : (TenNV = ‘Watson’))[MaPB] NhanVien
2: “<i>Cho tên của người lãnh đạo Smith</i>”.
<b>(((</b>(NhanVien : (TenNV =‘Smith’))[MaPB] PhongBan)[MaNQL])
NhanVien<b>)</b> [TenNV]
3: “<i>Cho danh sách nhân viên có lương trên 4000</i>”
NhanVien : (Luong > 4000)
<b>7.1 TRUY VẤN ĐỂ TÌM KIẾM THƠNG TIN</b>
<b>7.2 TRUY VẤN ĐỂ THAY ĐỔI DỮ LIỆU</b>
<i><b>Tư tưởng chủ đạo:</b></i><b> Cần cái gì? Từ đâu mà có?</b>
<i><b>1. Truy Vấn Đơn Giản:</b></i>
Cú pháp:
SELECT <<i>biểu thức1</i>>, <<i>biểu thức2</i>>, … <<i>biểu thức n</i>>
FROM <<i>quan heä</i>> ;
(<i><b>Những cái ta </b></i><b>CẦN</b><i><b> thì đặt sau SELECT. Cái </b></i><b>TỪ ĐÂU</b><i><b> mà có đặt sau FROM</b></i>)
<i><b>Ghi chuù: </b></i>
(*) Nếu các <<i>biểu thức</i>> là tên tất cả các <i>field</i> thì dùng *
(*) Đặt tên lại cho biểu thức thì thêm AS <<i>tên</i>> sau <<i>biểu thức</i>>
(*) Sử dụng DISTINCT ngay sau SELECT để lấy dòng nhau
1. “<i>Cho mã số, tên, cơng việc, lương, h hồng, mã phịng, giới </i>
<i>tính của các nhân viên của Cty”</i>.
<b>SELECT MaNV, TenNC, MaCV, Luong, HoaHong, MaPB, GioiTinh</b>
<b>FROM NhanVien;</b>
<b> SELECT * FROM NhanVien;</b>
2. “<i>Cho tên và tiền lương 1 năm của các nhân viên?</i>”
<b>SELECT TenNV, Luong*12 AS LuongCaNam</b>
<b>FROM NhanVien;</b>
3. “<i>Cho biết mã hiệu các công việc mà các nhân viên của Công </i>
<i>ty hiện đang làm?</i>”
<b>SELECT DISTINCT MaCV FROM NhanVien;</b>
Cú pháp mệnh đề:
ORDER BY <<i>bthức 1</i>>[ASC | DESC], … <<i>bthức<sub>n</sub></i>>[ASC | DESC]
<i><b>Ghi chú: </b></i>
(*) Có thể thay <<i>bthức</i>> bằng số thứ tự của nó trong mệnh đề
SELECT.
(*) Có thể dùng với TOP n [ PERCENT] để lấy các dịng đầu.
<i><b>Ví dụ:</b></i>
1. “<i>Cho danh sách các nhân viên theo từng phòng ban.</i>”
<b>SELECT * FROM NhanVien ORDER BY MaPB;</b>
<b>SELECT * FROM NhanVien ORDER BY 6;</b>
<i><b>(Vì </b></i><b>MaPB </b><i><b> là thuộc tính thứ 6 trong danh sách biểu thức sau </b></i><b>SELECT</b><i><b>)</b></i>
Cú pháp mệnh đề: WHERE <điều kiện chọn >
Điều kiện là một biểu thức lơgíc có dạng:
p<sub>1</sub> AND | OR p<sub>2</sub> AND | OR p<sub>3</sub> … And | Or p<sub>n</sub>
Ở đây p<sub>i</sub> (i = 1, 2, …, n) là các biểu thức lơgíc cơ sở, thường có
dạng:
[NOT] <<i>biểu thức 1</i>> <<i>phép so sánh</i>> <<i>biểu thức 2</i>>
[NOT] EXISTS (<<i>câu truy vấn SQL</i>>)
Ở đây: <<i>phép so sánh</i>> có thể là:
<, <=, >, >=, =, <>
IN (<<i>danh sách giá trị cách nhau bởi dấu phảy</i>>)
BETWEEN <<i>giá trị</i> <i>thấp</i>> AND < <i>giá trị</i> <i>cao</i>>
LIKE <<i>mẫu - Pattern</i>>
<i>1) Liệt kê những nhân viên của phòng 40</i>
<b>SELECT * FROM NhanVien WHERE MaPB=40</b>
<i>2) Liệt kê những nhân viên quản lý và có lương lớn hơn 4000</i>
<b>SELECT * FROM NhanVien WHERE MaCV=’QuanLi’ </b>
<b>AND Luong>4000</b>
<i>3) Cho thông tin những nhân viên có lương lớn hơn 4000 hoặc </i>
<i>nhân viên thuộc phịng 40</i>
<b>SELECT * FROM NhanVien WHERE MaPB=40 OR Luong </b>
<b>> 4000</b>
Cú pháp mệnh đề:
FROM <<i>quan heä<sub> 1</sub></i>> [<<i>bí danh</i>>], …, <<i>quan hệ<sub> n</sub></i>> [<<i>bí danh</i>>]
(*) Việc liệt kê danh sách quan hệ sau FROM ln địi hỏi phải
thể hiện mối quan hệ giữa chúng trong mệnh đề WHERE và
sẽ khiến máy phải thực hiện một phép tích Des Cartesian.
(*) Nên dùng bí danh cho quan hệ để tiện lợi cho cách viết lệnh.
SUM (<biểu thức số>): Hàm tính tổng
COUNT (* | [DISTINCT] <tên field>): Đếm số lượng mẫu tin
AVG (<biểu thức số>): Hàm tính giá trị trung bình
MIN (<biểu thức>) : Lấy giá trị nhỏ nhất
MAX (<biểu thức>): Lấy giá trị lớn nhất
<i>Cú pháp mệnh đề</i>:
GROUP BY <biểu thức 1>, <biểu thức 2> , …
(*) Nếu khơng có GROUP BY thì tồn bộ là một nhóm
(*) Ngoại trừ các biểu thức có hàm tích hợp thì các biểu thức
cịn lại phải có mặt trong mệnh đề GROUP BY.
<i>Cú pháp mệnh đề</i>:
HAVING <điều kiện chọn các bản ghi kết quả>
(*) HAVING phải đi kèm với mệnh đề GROUP BY
Tóm lại, cú pháp tổng quát của câu lệnh truy vấn tìm kiếm laø:
SELECT [DISTINCT] [TOP n [PERCENT]] <các biểu thức>
FROM <quan hệ 1>[<bí danh>], <quan hệ 1>[<bí danh>], …
[WHERE <điều kiện chọn bản ghi để xử lý>]
[GROUP BY <các biểu thức phân nhóm> ]
[HAVING <điều kiện chọn bản ghi kết quả> ]
[ORDER BY <các biểu thức sắp xếp> ]
<i><b>Định nghĩa: </b></i> Là một câu truy vấn mà kết quả của nó được
dùng trong một câu truy vấn khác. Câu truy vấn con phải
được đặt trong cặp dấu ngoặc tròn ( ).
<b>Trong SQL-SERVER, ORACLE, DB2, INFORMIX, …</b>
Câu truy vấn con có thể được dùng để tạo nguồn dữ liệu cho
một câu truy vấn khác, có nghĩa là nó có thể có mặt trong
mệnh đề FROM.
Có thể được dùng nhiều biểu thức sau SELECT trong câu truy
vấn con, xem như đó là một bộ giá trị. Các phép toán so
sánh với một bộ giá trị vẫn được viết một cách bình thường.
Các phép so sánh có thể dùng với câu truy vấn con là:
>, >=, =, <, <=, <> (Nếu Subquery cho lại duy nhất 1 giá trị)
IN, =Some, =Any: Các phép tốn tương đương nhau, dùng để
kiểm tra xem một giá trị có nằm trong tập giá trị của
Subquery.
> All, >=All, <All, <=All
[Not] Exists : Kieåm tra SubQuery có trả về mẫu tin nào
<i><b>Công ty”</b></i>
Q1: Tìm mức lương cao nhất (x) và thấp nhất (y) cơng ty.
Q2: Tìm các nhân viên có lương = (x) hoặc lương = (y).
SELECT * FROM NhanVien
WHERE Luong = (SELECT MAX(Luong)
FROM NhanVien)
OR Luong = (SELECT MIN(Luong) FROM NhanVien)
1. Tạo bảng từ dữ liệu của câu truy vấn
<i><b>Cú pháp: </b></i>
SELECT <các biểu thức> INTO <tên quan hệ>
FROM <các quan hệ>
[<i>Mệnh đề</i> WHERE>]
[<i>Mệnh đề</i> GROUP BY]
[<i>Mệnh đề</i> HAVING]
[<i>Mệnh đề</i> ORDER BY]
<i><b>Ví dụ: “</b>Tạo quan hệ có tên là Manager để lưu các n/v phụ </i>
<i>trách các phòng/ban</i>”.
Select * into Manager from NhanVien where
a. Thêm 1 bộ từ giá trị đã cho:
<i><b>Cú pháp: </b></i>
INSERT INTO <tên quan hệ>[(<các field>)]VALUES (<các giá trị>)
<i><b>Ví dụ: “</b>Thêm nhân viên mới có tên là Hồng Duy mã số 300 </i>
<i>vào phịng số 10 làm n/v kế tốn với lương 2700$</i>”.
INSERT INTO NhanVien
VALUES (300, ‘Hoàng Duy’, ‘KeToan’, 2700, NULL, 10, ‘M’);
<i>* Nên viết</i>:
Insert Into NhanVien(MaNV, TenNV, MaCV, Luong,
HoaHong, MaPB, GioiTinh)
Values (300, ‘Hoàng Duy’, ‘KeToan’, 2700, NuLL, 10, ‘M’)
<i>b. Thêm các bộ từ CSDL</i>:
<i><b>Cú pháp: </b></i>
INSERT INTO <tên quan hệ>[(<các field>)]
Select (<các biểu thức>)
From <các quan hệ>
[Where <điều kiện>]
[Group by <các biểu thức phân nhóm>]
[Having <điều kiện chọn bản ghi cuối cùng>];
<i><b>Ví dụ: “</b><b>Thêm vào quan hệ Manager các nhân viên có lương > 4000$</b></i>”
INSERT INTO MANAGER
SELECT * FROM NhanVien
WHERE Luong > 4000
<i>4. Xóa các bộ trong CSDL</i>:
<i><b>Cú pháp: </b></i>
DELETE FROM <tên quan hệ>
[WHERE <điều kiện xóa các bộ>];
(*) Nếu không có điều kiện sau WHERE thì tất cả các bộ giá
trị của quan hệ sẽ bị xóa.
<i><b>Ví dụ: “</b>Xóa khỏi quan hệ NhanVien các nhân viên phụ trách </i>
<i>các phòng ban</i>”.
DELETE FROM NhanVien
WHERE MaCV = ‘QuanLi’;
2. Sửa đổi cấu trúc bảng.
a) Sửa kích thước các cột (<i>Field Size</i>)
b) Thêm cột mới vào bảng (Add Column).
c) Xác định miền giá trị (Domain).
d) Thiết lập giá trị mặc định (Default Value).
e) Thiết lập khóa chính (Primary Key).
3. Thiết lập khóa ngoại (Foreign Key).
4. Bổ sung chỉ mục (Index).
5. Tạo và cấp quyền hạn cho người sử dụng.
6. Hủy bỏ Khóa, Chỉ mục, Quan hệ, Người dùng...
MỞ ĐẦU
CÁC NGUN TẮC TỔNG QT ĐỂ TỐI ƯU HĨA
CÂU TRUY VẤN
– Các nguyên tắc cơ bản
– Các biểu thức tương đương
Tối ưu hóa câu truy vấn là các phép biến đổi (tương đương)
các câu truy vấn nhằm giảm thời gian xử lý và không gian
lưu trữ.
Tối ưu
<b>Thời gian xử lý</b>
Khơng gian lưu trữ
Thực hiện các phép chọn càng sớm càng tốt
Tồ hợp các phép chọn và phép tích Đề-Các thành phép
kết
Tồ hợp các phép quan hệ một ngơi như phép chọn và
phép chiếu
Tìm biểu thức con chung trong một biểu thức
Tiền xử lý bảng <sub></sub> indexes
Hai biểu thức được gọi là tương đương nếu với cùng thể
hiện CSDL sẽ trả về cùng kết quả.
Kí hieäu:
Với định nghĩa tương đương này ta có một số quy tắc
chuyển dịch đại số thông thường sau đây.
2
1 <i>E</i>
Các nguyên tắc liên quan đến phép kết và phép tích đề các
(E<sub>1</sub>⋈E<sub>2</sub>) ⋈E<sub>3</sub>
<b>Qui tắc kết hợp</b>
1
2
2
1
Các ngun tắc liên quan đến phép chọn và phép chiếu
Dãy các phép chọn
Dãy các phép chiếu
Giao hoán phép chọn và phép chiếu
<i>n</i>
<i>n</i>
1 ])[ ] [ ]
[
(
<b>Giao hốn giữa phép chọn và phép hợp</b>
2
1
2
1
1
2
2
1
<b>Giao hốn phép chiếu với phép tích Đề-các</b>
<b>Giao hốn giữa phép chiếu và phép hợp</b>
với <i>A</i>1 <i>An</i> là thuộc tính bao gồm <i>B</i>1 <i>Bm</i> <i>R</i>1 và
2
1
1. Nguyễn Đăng Tỵ,<i> Giáo trình CSDL, ĐHQG Tp.HCM, 2001</i>
2. Lê Tiến Vương, <i>Nhập môn CSDL, NXB Thống kê, 2000</i>
<i>3. Bùi Minh Từ Diễm, Bài giảng nhập môn CSDL, KHTN, 2002</i>
<i>4. Nguyễn Bá Tường, CSDL Lý thuyết và thực hành, NXB Khoa </i>
<i>học kỹ thuật</i>