HƯỚNG DẪN ÔN TẬP
THI HẾT MÔN - THI TỐT NGHIỆP
MÔN CƠ SỞ DỮ LIỆU QUAN HỆ
(Lưu hành nội bộ) Hệ: Cao Đẳng – Đại học
Biên soạn: ThS. Nguyễn Mạnh Cường Tài liệu bao gồm:
- Giới thiệu các dạng bài tập môn cơ sở dữ liệu quan hệ.
- Giới thiệu phương pháp giải các dạng bài tập.
- Phụ lục 1: Các lỗi thường gặp khi giải bài tập CSDL.
- Phụ lục 2: Một số bài tập sinh viên tự ôn tập.
- Bài tập thực hành SQL và thiết kế CSDL.
- Một số bài tập tổng hợp
Tài liệu sinh viên nên tham khảo:
- Nhập môn CSDL quan hệ - Lê Tiến Vương
- Đề cương chi tiết môn Cơ sở dữ liệu quan hệ - Ngô Thị Bích Thuý - Đại
học Công nghiệp Hà Nội - 2004
....
Hà Nội 5-2009
LỜI NÓI ĐẦU
Trong mỗi dạng bài tập là tóm tắt kiến thức liên quan và
phương pháp giải của từng loại bài tập đó. Tuy nhiên, có những
phương pháp chỉ áp dụng trên một lớp rộng các bài tập mà không
phải áp dụng cho tất cả các bài tập trong dạng bài tập đó. Do vậy,
sinh viên cần nắm vững phương pháp và mở rộng ra các trường hợp
đặc biệt.
Mỗi dạng bài tập lại có thể có nhiều phương pháp giải, trong
tài liệu này chỉ trình bày một hoặc một số phương pháp cho một dạng
bài tập mà tác giả cho là phù hợp. Thiết nghĩ cũng tốt với một đề
cương ôn tập do thời gian ôn tập không nhiều.
Do thời gian hạn hẹp, tài liệu không tránh khỏi những sai sót.
Rất cảm ơn các đóng góp của các độc giả để tài liệu được tiếp tục
hoàn thiện.
Sinh viên chỉ nên coi đây là tài liệu tham khảo.
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 4
DẠNG 1: THỰC HIỆN BIỂU THỨC ĐẠI SỐ QUAN HỆ
Đề bài: Cho một số lược đồ quan hệ và một số biểu thức đại số quan hệ. Hãy thực
hiện các biểu thức đại số quan hệ đó.
Kiến thức liên quan:
Trong đại số quan hệ có 8 phép toán chia làm hai nhóm:
- Các phép toán tập hợp: Phép hợp (∪), phép giao (∩), phép trừ (-), phép tích đề
- Phép giao giữa R và S thực chất là việc chọn ra trong hai quan hệ R và S những
bản ghi trùng nhau.
Ví dụ:
R A B C S A B C
a1 b1 1 a1 b1 1
a2 b1 2 a2 b2 3
a1 b2 3 a1 b1 2
a1 b1 2 a3 b3 1
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 5
Tính Q = R ∩ S
Q A B C
a1 b1 1
a1 b1 2
[3]. Phép trừ:
- Chỉ thực hiện trên các quan hệ khả hợp.
- Phép trừ R - S thực chất là việc chọn ra các bản ghi chỉ có ở R mà không có ở S.
Ví dụ:
Với hai quan hệ R và S trên, Q = R-S sẽ có dạng:
Q A B C
a2 b1 2
a1 b2 3
[4]. Phép tích đề các:Thực hiện trên 2 quan hệ bất kỳ.
- Phép tích đề các của hai quan hệ R và S thực chất là việc lấy mọi bản ghi của R
"gắn" với mọi bản ghi của S.
- Tập các thuộc tính của bảng quan hệ kết quả là tất cả các thuộc tính của quan hệ
R và các thuộc tính của quan hệ S, xếp theo thứ tự: các thuộc tính của R trước, các thuộc
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 6
- Bảng kết quả có thể xuất hiện các bản ghi trùng nhau. Khi đó, phải loại bỏ các
bản ghi trùng.
Ví dụ:
R A B C
a1 b1 1
a2 b2 2
a1 b1 3
∏
AB
(R) thu được:
[6]. Phép chọn:
- Chọn ra các bản ghi thoả mãn điều kiện chọn.
- Nếu không có bản ghi nào thoả mãn điều kiện chọn thì bảng kết quả thu được là
rỗng ( ∅ ).
- Điều kiện chọn là một biểu thức Logic.
Ví dụ:
R A B C
A1 b1 1
A2 b2 2
A1 b1 3
δ
A=a2 v C =1
(R) thu được:
hơn giá trị thuộc tính C của S. Thu được:
Q A B C B C D
a1 b1 1 b2 2 d3
a1 b1 1 b1 3 d2
a1 b1 1 b1 2 d1
a2 b1 2 b1 3 d2
a1 b1 2 b1 3 d2
- Kết nối tự nhiên (*) là kết nối bằng (=) trên các thuộc tính cùng tên. Tức phép so
sánh θ là phép so sánh “=”, và 2 quan hệ chỉ kết nối tự nhiên được nếu nó có các thuộc
tính chung.
- Có thể bỏ đi các thuộc tính (cột) trùng nhau sau khi kết nối tự nhiên.
Ví dụ:
Với hai quan hệ R và S ở trên, thì R S = R * S
R A B C S B C D
A1 b1 1 b1 1 d1
A2 b1 2 b2 2 d3
A1 b2 3 b1 3 d2
A1 b1 2 b1 2 d1
Thu được:
R*S A B C D
a1 b1 1 d1
a2 b1 2 d1
a1 b1 2 d1
[8]. Phép chia:
- Quan hệ R có tập thuộc tính U và quan hệ S có tập thuộc tính V. Phép chia R ÷ S
chỉ có thể thực hiện được nếu: V là tập con thực sự của U.
- Quan hệ kết quả thu được có tập thuộc tính là U - V.
- Bản ghi t nằm trong quan hệ kết quả nếu và chỉ nếu: với mọi bản ghi t' thuộc S thì
A1 b1 2 b1 2 d1
Hãy tính: P = ∏
AB
(δ
A=a1V B=b1
(R*S))
B1: Tính R1 = R*S
R1 A B C D
a1 b1 1 d1
a2 b1 2 d1
a1 b1 2 d1
B2: Tính R2 = δ
A=a1V B=b1
(R1)
R2 A B C D
a1 b1 1 d1
a2 b1 2 d1
a1 b1 2 d1
B3: Tính P = ∏
AB
(R2)
P A B
a1 b1
a2 b1
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
màu sắc, trọng lượng:
P(P#, PName, Color, Weight).
Bảng SP chứa thông tin về nhà cung cấp nào đã cung cấp sản phẩm nào với số
lượng bao nhiêu:
SP(S#, P#, QTY). Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 10
Ví dụ 1:
Cho biết tên hàng và màu sắc của các mặt hàng có trọng lượng
∈
[20, 30]?
B1: Các thông tin liên quan: tên hàng, màu sắc, trọng lượng. Tương ứng với
PName, Color, Weight. Các thông tin này thuộc ít nhất 1 bảng, đó là bảng P. Vậy biểu
thức được xây dựng:
(P)
B2: Các bản ghi lấy ra cần thoả mãn điều kiện: Weight
≥
20 ∧ Weight
≤
30. Vậy
biểu thức được xây dựng:
δ
Weight ≥ 20 ∧ Weight ≤ 30
(P)
B3: Ta chỉ lấy 2 thông tin trong số 4 thông tin của bảng P (PName, Color) do đó có
phép chiếu. Biểu thức được xây dựng: ∏
S#
(δ
P#='P2'
(SP))
∏
S#
(δ
P#='P1'
(SP))
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 11 Vòng tròn thứ nhất tượng trưng cho mã của các nhà cung cấp đã cung cấp P1.
Vòng tròn thứ 2 là mã các nhà cung cấp đã cung cấp P2. Vậy giao của 2 vòng tròn này
là mã các nhà cung đã cung cấp cấp cả P1 và P2.
∏
S#
(δ
P#='P1'
(SP)) ∩ ∏
(SP))
Cho biết mã hàng được tất cả các nhà cung ứng cung cấp?
Ta hiểu rằng đó là những P# mà sao cho nếu ta ghép nó với mọi S# của bảng S thì
ta luôn thu được cặp S#, P# có trong bảng SP. Do đó, đây là một ví dụ về phép chia
trong ĐSQH:
∏
S#, P#
(SP) ÷ ∏
S#
(S)
Phương pháp 3 bước trên là rất quan trọng giúp hình thành biểu thức đại số quan
hệ và cũng giúp khởi động quá trình tư duy khi làm bài tập dạng này. Khi sử dụng nó,
điểm quan trọng nhất là việc xác định đúng biểu thức điều kiện chọn.
Sau đây là một số chú ý khi viết biểu thức điều kiện chọn:
[1]. Khi nói “A và B” ta có thể hiểu theo 3 cách:
- A và B.
Ví dụ ta nói: Cho biết các tên hàng màu đỏ Và có trọng lượng nhỏ hơn 20!
- A hoặc B.
Ví dụ ta nói: Cho biết thông tin của các mặt hàng có trọng lượng là 20 Và 30! Ta
cần hiểu rằng phải đưa ra thông tin của các mặt hàng có trọng lượng 20 hoặc
30.
- A giao B
Ví dụ ta nói: Đưa ra tên hàng được cả nhà cung cấp S01 Và S02 cung ứng! Khi
đó ta cần lấy giao của 2 tập hợp. Tập thứ nhất là tất cả các tên hàng do nhà cung cấp
S01 cung ứng. Tập thứ 2 gồm toàn bộ các tên hàng do nhà cung cấp S02 cung ứng.
[2]. Sai lầm khi sử dụng hàm trong biểu thức điều kiện chọn
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Phách(SBD, SPH) – (Số báo danh, số phách)
Kết quả(SPH, M1, M2, M3) – (Số phách, điểm môn 1, điểm môn 2, điểm môn 3)
Hãy so sánh đáp án của 3 ví dụ sau:
- Cho biết Họ tên thí sinh sinh tháng 3 năm 1990 và có quê là “Hà Nam”.
∏
Hoten
(δ
NS ≥ ‘1/3/1990’ ∧ NS ≤ ‘31/3/1990’ ∧ Que = ‘Ha Nam’
(ThiSinh))
Trong ví dụ trên, ta sử dụng các toán tử ≥ và ≤ để biểu diễn điều kiện thí sinh có
ngày sinh trong tháng 3 năm 1990 mà không sử dụng hàm month, year;
- Cho biết Họ tên các thí sinh quê ở Hà Nam và Hải Dương.
∏
Hoten
(δ
Que = ‘Ha Nam’ ∨ Que = “Hai Duong’
(ThiSinh))
Trong ví dụ trên, 2 vế của điều kiện cùng áp dụng trên một trường
, vì vậy cách
nói “và” có thể hiểu là phép ∨ hoặc ∩, và trong trường hợp này chúng ta cần sử dụng
phép ∨.
- Cho biết Họ tên của các thí sinh mà điểm 3 môn có cả điểm 0 và điểm 10.
Ta tìm các thí sinh có điểm 0 trước:
∏
HoTen
(δ
M1=0 ∨ M2=0 ∨ M3=0
(ThiSinh*Phach*Ketqua))
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
(M1=0 ∨ M2=0 ∨ M3=0)
(ThiSinh*Phach*Ketqua))
Biểu thức sẽ sai khi bạn không sử dụng dấu ngoặc đơn khi viết biểu thức có cả toán
tử ∧ và ∨ trong trường hợp này.
Với các ví dụ trên, bạn dễ dàng hoàn thành được ví dụ tổng hợp sau đây (hãy trao
đổi với mọi người về đáp án của mình):
Cho biết họ tên các thí sinh của các tỉnh Hải phòng và Quảng Ninh mà các thí
sinh đó sinh nửa đầu năm 1989 và không có điểm nào liệt (điểm 0).
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 14
DẠNG 3: BIỂU DIỄN YÊU CẦU BẰNG SQL
Bài toán: Cho một hoặc nhiều lược đồ quan hệ và một số yêu cầu dữ liệu. Hãy
biểu diễn các yêu cầu dữ liệu đó bằng câu truy vấn SQL sao cho kết quả của câu SQL đó
thoả mãn yêu cầu đặt ra.
Phương pháp:
Tài liệu này chỉ tập trung vào câu Select. Các dạng khác sinh viên tự tham khảo
trong các tài liệu khác.
Ta tạm phân chia các câu truy vấn Select thành 5 loại:
[1]. Chiếu, chọn trên một bảng.
[2]. Chiếu chọn trên nhiều bảng.
[3]. Sử dụng các hàm, các vị từ.
[4]. Select lồng nhau.
[5]. Tạo nhóm sử dụng Group by.
Tuy nhiên, một câu Select thông thường sẽ là câu select tổng hợp. Việc tách
SUM, MAX, MIN, AVG, COUNT(*), COUNT(<Cột>).
- Các hàm được sử dụng ngay sau SELECT
SELECT <Tên trường> / <Hàm> … FROM …
- Có 3 Vị từ chính: IN, BETWEEN, LIKE. Trong đó, IN và BETWEEN không bắt
buộc phải dùng.
- Khi dùng LIKE cần chú ý:
+ LIKE chỉ dùng cho dữ liệu kiểu xâu.
+ Hai ký tự đại diện trong xâu tìm kiếm sau LIKE: “%” đại diện cho 1 xâu ký
tự bất kỳ. “_” đại diện cho 1 ký tự bất kỳ.
Cho biết tên các nhà cung cấp ở Hà Tây:
SELECT SName FROM S WHERE City Like '%Hà Tây%'
Cho biết tên các nhà cung cấp có City là Hà Tây:
SELECT SName FROM S WHERE City = 'Hà Tây'
Cho biết tổng số nhà cung cấp có trong CSDL?
SELECT Count (*) FROM S
Khi sử dụng hàm cần lưu ý 2 nguyên tắc sau:
- Hàm không được sử dụng trực tiếp trong biểu thức điều kiện chọn của mệnh đề where.
- Không được viết hàm lồng vào hàm: ví dụ SELECT Max(Count(…)) …
[4]. Câu SELECT con cần phải được đặt giữa hai ngoặc đơn ().
Câu Select lồng nhau có 4 dạng chính như sau:
(1). Lồng nhau do sử dụng hàm trong biểu thức điều kiện chọn:
Biểu thức điều kiện chọn sau where không thể sử dụng hàm một cách trực tiếp.
Nhưng nó có thể sử dụng các kết quả của một câu lệnh Select nào đó. Do vậy, người ta
thường sử dụng Select lồng nhau trong trường hợp này.
Cho biết Tên hàng có trọng lượng lớn nhất?
Câu SELECT sau là sai trong khi đa số sinh viên mắc phải:
Select PName From P Where Weight = Max(Weight)
Câu SELECT sau cho biết trọng lượng lớn nhất là bao nhiêu:
SELECT Max(Weight) FROM P
Generated by Foxit PDF Creator © Foxit Software
trong trường hợp này, cần nhớ: câu select luôn có dạng: X IN (SELECT X …) mà không
được phép viết X IN (SELECT Y ….) với Y khác X.
Tương tự ta có thể biểu diễn được phép trừ một cách dễ dàng:
Cho biết tên hàng được nhà cung cấp S01 cung ứng mà không được nhà cung cấp
S02 cung ứng:
SELECT Pname FROM P WHERE
P# IN (SELECT P# From SP WHERE S#= ‘S01’) AND
P# NOT IN
(SELECT P# From SP WHERE S#= ‘S02’)
Generated by Foxit PDF Creator © Foxit Software
For evaluation only.
H-íng dÉn «n tËp CSDL quan hÖ
Tµi liÖu tham kh¶o Trang 17
Các vị từ IN – NOT IN cho phép ta thể hiện phép trừ một cách dễ dàng.
(4). Lồng nhau do SELECT từ một query (tức select từ 1 câu select)
Thông thường, sau FROM là tên các bảng quan hệ (tables). Tuy nhiên, đôi khi ta
có thể thay tên bảng quan hệ bằng một query tức là 1 câu truy vấn Select. Sở dĩ như vậy
là vì kết quả của câu Select cũng cho ta một bảng quan hệ (hay nói đúng hơn là 1 tập
hợp các bản ghi có dạng 1 quan hệ).
Ví dụ:
Cho biết Tổng số lượng hàng lớn nhất mà một nhà cung cấp đã cung
ứng!
Ta hiểu rằng mỗi nhà cung cấp có thể cung ứng nhiều mặt hàng khác nhau. Mỗi
mặt hàng lại cung cấp làm nhiều đợt với số lượng mỗi đợt khác nhau. Tuy nhiên, mỗi
nhà cung cấp đều xác định một tổng số lượng hàng hóa đã cung cấp của mình. Muốn
xác định tổng số lượng hàng cung ứng cho từng nhà cung cấp, ta chỉ việc cộng dồn tất
cả các số lượng của tất cả các mặt hàng, các lần cung ứng của từng nhà sản xuất. Do
vậy, ta cần nhóm theo từng nhà sản xuất (nhóm – Group by – xin xem mục sau).
Ví dụ ta xét bảng SP như sau:
FROM (SELECT S#, SUM(QTY) as Tong FROM SP GROUP BY S#)
[5]. Cú pháp GROUP BY:
GROUP BY <Tên cột> [HAVING <Điều kiện>]
Chức năng: Tất cả các bản ghi có giá trị trùng nhau trên cột đã chỉ ra sau GROUP
BY sẽ được nhóm vào một nhóm.
Nếu có [HAVING <Điều kiện>] thì chỉ những nhóm thoả mãn điều kiện sau
HAVING mới được lấy ra.
Đặc biệt: Nếu có GROUP BY thì các hàm sẽ thực hiện trên từng nhóm thay vì trên
toàn bảng.
Cho biếtmã hàng và tổng số lượng của từng mặt hàng đã cung ứng?
Câu Select sau là sai do nó đưa ra tổng số lượng của mọi mặt hàng:
SELECTP#, SUM(QTY) FROM SP
Nhưng nếu có GROUP BY theo Mã hàng (P#) thì tất cả các bản ghi của cùng một
mã hàng sẽ được nhóm thành 1 nhóm (nói khác đi, mỗi mặt hàng thuộc một nhóm) và
hàm SUM() sẽ tính SUM trên từng nhóm và câu SQL sau là chính xác:
SELECT P#, SUM(QTY) FROM SP GROUP BY P#
Cho biết Mã nhà cung cấp đã cung cấp tổng số lượng hàng lớn hơn 300?
Câu SELECT sau sẽ đưa ra các tất cả các mã nhà cung cấp có trong SP (tức đã
cung cấp hàng) nhưng mỗi nhà cung cấp là một nhóm:
SELECT S# FROM SP GROUP BY S#
Nhưng câu sau chỉ đưa ra mã nhà cung cấp thuộc nhóm có tổng số lượng lớn hơn
300:
SELECT S# FROM SP GROUP BY S# HAVING SUM(QTY) >300
Khi dùng GROUP BY, cũng có những chú ý mà ta không thể bỏ qua:
(1). Select trường nào, Group by theo trường đó:
Sau SELECT, có thể là các trường hoặc các hàm. Ví dụ: SELECT S#, SUM(SL)…
thì S# là tên trường còn SUM(SL) là hàm. Nguyên tắc trên chỉ cho ta thấy: ta luôn phải
Group by theo tên các trường (không phải hàm) mà ta đã liệt kê sau Select ở trên. Có
bao nhiêu trường trong câu Select thì phải Group by theo bấy nhiêu trường.
thì AC → BC
- Tiên đề phản xạ: Tập X sẽ xác định hàm mọi tập con của nó. Tức là nếu Y ⊆ X
thì X → Y.
- Tiên đề bắc cầu: Nếu X → Y và Y → Z thì X → Z.
- Luật tách: Nếu A → BC thì ta có A → B và A → C.
- Luật hợp: Nếu A → B và C → D thì AC → BD.
- Luật tựa bắc cầu: Nếu A → B và WB → C thì WA → C.
Ví dụ:
Cho quan hệ R(U, F): U={A, B, C, D, E, G, H} và F={AB → C, B → E, CE → G,
CB → H}. Chứng minh rằng nếu R thoả F thì R cũng thoả AB → GH.
Ta chứng minh:
→
→
HAB
GAB
Ta CM (1): AB → C (gt)
B→ E (gt)
AB → E (TT và tách)
AB → CE (Hợp)
CE → G (gt)
AB → G (BC)
Ta CM (2):
AB → C (gt)
AB → CB (TT)
CB → H (gt)