Codd, khi ñề xuất mô hình quan hệ ñã ñặt vấn ñề về các phép toán giữa các quan hệ với nhau và ñó ñược xem là bản gốc của ñại số quan hệ Relational Algebra.. ■ Giải thích Hình 1: trong ph
Trang 1Bà i 4
1./ S l!"c v$ ñ(i s* quan h-
TS Codd, khi ñề xuất mô hình quan hệ ñã ñặt vấn ñề về các phép toán giữa các quan hệ với nhau và ñó ñược xem là bản gốc của ñại số quan hệ (Relational Algebra)
■ Các phép toán cổ ñiển gồm: union (hợp), intersection (giao), difference
(hiệu), và Cartesian product (tích Đề các)
■ Các phép toán ñặc biệt gồm: restrict (trích), project (chiếu), join (ghép),
và divide (chia)
Như vậy có tổng tất cả là 8 toán tử Chú ý rằng các toán hạng của ñại số quan
hệ ñều là các bảng
Hình 1: Tổng quan về các toán tử quan hệ
Union Intersection Difference
a
b
c
x
y
a
a
b
b
c
c
x
y
x
y
x
y Product
a1
a2
a3
b1
b2
b3
Join
c1 c2 c3
b1 b2 b3
a1 a2 a3
b1 b2 b3
c1 c2 c3
x
y
x
y
z
x
y Divide
a
Trang 2■ Giải thích Hình 1: (trong phần này các quan hệ toán hạng ñược gọi là quan
hệ gốc)
Restrict Cho kết quả là một quan hệ gồm tất cả các tuple của quan hệ gốc
thỏa mãn một ñiều kiện cho trước
Project Cho kết quả là một quan hệ gồm tất cả các bản ghi của quan hệ
gốc, nhưng loại trừ một số trường
Product Cho kết quả là một quan hệ gồm tất cả các trường và tất cả các
bản ghi của các quan hệ gốc Kết quả gồm tất cả các tổ hợp của hai quan hệ gốc
Union Cho kết quả là một quan hệ gồm tất cả các bản ghi nằm ở trong
hai quan hệ ñó (các quan hệ gốc có cấu trúc giống nhau)
Intersection Cho kết quả là một quan hệ mà các bản ghi phải thuộc vào cả
hai quan hệ gốc
Difference Cho kết quả là một quan hệ mà các bản ghi nằm trong quan hệ
thứ nhất nhưng lại không nằm trong quan hệ thứ hai
Join Cho kết quả là một quan hệ Chú ý rằng hai quan hệ gốc phải có
một hoặc nhiều trường chung Quan hệ kết quả gồm tất cả các trường riêng của các quan hệ gốc, cộng với các trường chung của chúng Các bản ghi của quan hệ kết quả là các bản ghi có giá trị trong các trường chung giống nhau
Divide Trong phép chia ta có quan hệ bị chia và quan hệ chia Quan hệ
bị chia phải có một hoặc nhiều trường phủ lên quan hệ chia Quan hệ kết quả gồm các trường của quan hệ bị chia nhưng không chung với các trường của quan hệ chia Các bản ghi của quan hệ kết quả là các bản ghi sao cho các giá trị các trường chung trong quan hệ bị chia xuất hiện một cách tương ứng ở tất
cả các bản ghi của quan hệ chia (xem ví dụ trong Hình 1)
Chú ý: Trong ñại số quan hệ, người ta không thể thực hiện một phép
toán lên các quan hệ bất kỳ Ví dụ, trong phép union, các quan hệ toán hạng phải có cấu trúc giống nhau cả về số lượng các trường,
cả về miền giá trị của các trường ñó và cả về tên của trường
Trang 3■ Cú pháp hình thức của ñại số quan hệ
expression
::= monadic-expression | dyadic expression
monadic-expression
::= renaming | restriction | projection
renaming
::= term RENAME atrtribute AS attribute
term
::= relation | (expression)
restriction
::= term WHERE condition
projection
::= term | term [ attribute-commalist ]
dyadic-expression
::= projection dyadic-operation expression
dyadic-operation
::= UNION | INTERSECT | MINUS | TIMES | JOIN | DIVIDEBY
Hình 2: Cú pháp hình thức của ñại số quan hệ
■ Ví dụ về các toán tử Union, Intersection, Difference
A
s_id sname status city
S1 Smith 20 London
S4 Clark 20 London
B
s_id sname status city
S1 Smith 20 London S2 Jones 10 Paris
Union
(A UNION B)
s_id sname status city
S1 Smith 20 London S4 Clark 20 London S2 Jones 10 Paris
Intersection
(A INTERSECT B)
s_id sname status city
S1 Smith 20 London
Difference
(A MINUS B)
s_id sname status city
S4 Clark 20 London
(B MINUS A) s_id sname status city
S2 Jones 10 Paris
Trang 4■ Tích Đề-các
Giả thiết ta có cấu trúc của bảng A là { a1, a2, , am } và cấu trúc của bảng
B là { b1, b2, , bn}, thì cấu trúc của tích sẽ là:
{ a1, a2, , am , b1, b2, , bn }
trong ñó ai, bj là các trường của bảng A và B
Một trong các vấn ñề phát sinh ñối với bảng tích, ñó là tên của các trường Trong CSDL quan hệ, trong một bảng, tên các trường không ñược trùng nhau Khi gộp lại các trường trong bảng tích sẽ có trường hợp tên trường trùng nhau Để giải quyết vấn ñề này người ta sinh ra một toán tử mới có tên
là RENAME (ñặt tên – xem phần cú pháp hình thức) Mục tiêu của toán tử này này là ñể ñặt lại tên trường trong trường hợp tên các trường của bảng tích trùng nhau
Cũng cần lưu ý thêm là trong thực tế, tich Đề-các rất ít ñược sử dụng
■ Toán tử Restriction
Toán tử restriction còn gọi là toán tử θ -restriction, trong ñó θ là các toán tử so sánh như =, ≠, >, ≥, <, ≤,
Cho bảng A, các thuộc tính (trường) X, Y, phép toán:
A WHERE X θ Y
cho một bảng có các thuộc tính giống với các thuộc tính của bảng A sao cho biểu thức ñiều kiện X θ Y cho giá trị true (ñúng)
Ngoài lề: Các biểu thức so sánh cho lại kết quả là một
trong hai giá trị: true (ñúng) hoặc false (sai)
Trong phần ñiều kiện X θ Y ta có thể thay X hoặc Y bằng các giá trị:
A WHERE X θ literal
A WHERE literal θ Y
VD1: supplier WHERE city = 'London'
Trang 5s_id sname status city
S1 Smith 20 London S4 Clark 20 London VD2: part WHERE weight < 14
p_id pname color weight city
P1 Nut Red 12 London P5 Cam Blue 12 Paris
VD3: sp WHERE s_id = 'S1' AND p_id = 'P1'
s_id p_id qty
S1 P1 300
■ Toán tử Projection
Phép chiếu của quan hệ A lên các thuộc tính x, y, z, viết là:
A [x, y, , z]
cho một quan hệ với các thuộc tính x, y, z và ứng với tất cả các bản ghi của
A
VD1: supplier [city]
city
London Paris Athens
VD2: part [color, city]
color city
Red London Green Paris Blue Rome Blue Paris VD3: (supplier WHERE city='London') [s_id]
s_id
S1 S4
Trang 6■ Toán tử Join
Giả thiết ta có cấu trúc của bảng A là { a1, a2, , am , c1, c2, , cp} và cấu trúc của bảng B là { c1, c2, , cp,b1, b2, , bn}, thì cấu trúc của kết quả liên kết JOIN sẽ là:
{ a1, a2, , am , c1, c2, , cp, b1, b2, , bn }
trong ñó ai, bj là các trường của bảng A và B và ck là các trường chung cho
cả A và B sao cho các giá trị ck của bảng A bằng các giá trị ck trong bảng B một cách tương ứng
Toán tử JOIN theo kiểu này gọi là JOIN tự nhiên (NATURAL JOIN)
VD: supplier JOIN part
s_id sname status city p_id pname color weight
S1 Smith 20 London P1 Nut Red 12
S4 Clark 20 London P1 Nut Red 12
S2 Jones 10 Paris P2 Bolt Green 17
S3 Blake 30 Paris P2 Bolt Green 17
S1 Smith 20 London P4 Screw Red 14
S4 Clark 20 London P4 Screw Red 14
S2 Jones 10 Paris P5 Cam Blue 12
S3 Blake 30 Paris P5 Cam Blue 12
S1 Smith 20 London P6 Cog Red 19
S4 Clark 20 London P6 Cog Red 19
■ Toán tử θ-Join
Khi sử dụng toán tử JOIN như trên, các cột c1, c2, , cp, ñược so sánh với toán tử = Câu hỏi ñặt ra là liệu có thể sử dụng các toán tử so sánh khác không Câu trả lời ñương nhiên là ñược Toán tử JOIN trong trường hợp này gọi là θ-Join
Người ta thay thế toán tử θ-Join bằng biểu thức sau:
(A TIMES B) WHERE x θ y
trong ñó x là một trường của A và y là một trường của B và liên kết là liên kết x θ y
Trang 7Giả thiết ta muôn kết nối hai bảng supplier và part sao cho city trong supplier khác với city trong part (ngược lại với ví dụ trên) Ta có thể lập biểu thức sau:
( (supplier RENAME city AS scity)
TIMES
(part RENAME city AS pcity) )
WHERE scity ≠ pcity
s_id sname status scity p_id pname color weight pcity
S2 Jones 10 Paris P1 Nut Red 12 London S3 Blake 30 Paris P1 Nut Red 12 London S5 Adams 30 Athens P1 Nut Red 12 London S1 Smith 20 London P2 Bolt Green 17 Paris S4 Clark 20 London P2 Bolt Green 17 Paris S5 Adams 30 Athens P2 Bolt Green 17 Paris S1 Smith 20 London P3 Screw Blue 17 Rome S2 Jones 10 Paris P3 Screw Blue 17 Rome S3 Blake 30 Paris P3 Screw Blue 17 Rome S4 Clark 20 London P3 Screw Blue 17 Rome S5 Adams 30 Athens P3 Screw Blue 17 Rome S2 Jones 10 Paris P4 Screw Red 14 London S3 Blake 30 Paris P4 Screw Red 14 London S5 Adams 30 Athens P4 Screw Red 14 London S1 Smith 20 London P5 Cam Blue 12 Paris S4 Clark 20 London P5 Cam Blue 12 Paris S5 Adams 30 Athens P5 Cam Blue 12 Paris S2 Jones 10 Paris P6 Cog Red 19 London S3 Blake 30 Paris P6 Cog Red 19 London S5 Adams 30 Athens P6 Cog Red 19 London
■ Toán tử chia
Trong phép chia ta có quan hệ bị chia và quan hệ chia Quan hệ bị chia phải
có một hoặc nhiều trường phủ lên quan hệ chia Quan hệ kết quả gồm các trường của quan hệ bị chia nhưng không chung với các trường của quan hệ chia Các bản ghi của quan hệ kết quả là các bản ghi sao cho các giá trị các trường chung trong quan hệ bị chia xuất hiện một cách tương ứng ở tất cả các bản ghi của quan hệ chia (xem ví dụ trong Hình 1)
Trang 8Giả thiết ta có cấu trúc của bảng A là { a1, a2, , am , c1, c2, , cp} và cấu trúc của bảng C là { c1, c2, , cp}, thì cấu trúc của kết quả
A DIVIDEBY B
sẽ là { a1, a2, , am }
trong ñó ai là các trường của bảng A và ck là các trường chung cho cả A và
C sao cho tất cả các giá trị cvk của bảng C xuất hiện trong bảng A (avi, cvk) một cách tương ứng (cvk là ký hiệu giá trị của ck )
■ Các ví dụ ứng dụng ñại số quan hệ
VD1 Tìm tên các nhà cung cấp bán loại phụ tùng mã số P2:
( (sp JOIN supplier) WHERE p_id='P2') [ sname ]
Giải thích: Toán tử NATURAL JOIN nối sp với supplier thông qua trường s_id (xem lại cấu trúc của các bảng supplier,sp) Từ kết quả này, phần tiếp theo chỉ lấy ra các tuple sao cho giá trị của p_id
là P2 Sau ñó ta dùng phép chiếu và chỉ lấy ra thuộc tính sname (Tham khảo kết quả dưới ñây.)
sname
Smith
Jones
Blake
Clark
Ghi nhớ: Câu lệnh SQL tương ñương:
SELECT DISTINCT supplier.sname
FROM supplier NATURAL JOIN sp
WHERE sp.p_id = 'P2';
VD2 Tìm tên các nhà cung cấp bán các loại phụ tùng mầu ñỏ (Red)
( ( ( part WHERE color = 'Red' ) JOIN sp ) [s_id] JOIN supplier) [sname]
hoặc tương ñương:
( ( ( part WHERE color = 'Red' ) [p_id] JOIN sp ) JOIN supplier) [sname]
Trang 9Giải thích: (SV ghi chép tại lớp)
Ghi nhớ: Câu lệnh SQL tương ñương
SELECT DISTINCT supplier.sname
FROM sp, part, supplier
WHERE sp.p_id = part.p_id
AND supplier.s_id = sp.s_id AND part.color='Red';
VD3 Tìm tên các nhà cung cấp bán tất cả các loại phụ tùng
( ( sp [s_id, p_id] DIVIDEBY part [p_id] )
JOIN supplier [sname]
Giải thích: Phép chiếu sp [s_id, p_id] lập bảng mới chỉ lấy hai trường từ bảng sp, tạm gọi bảng này là A Phép chiếu part [p_id] lập bảng mới chỉ lấy trường p_id, tạm gọi bảng này là C Kết quả là lấy
A chia cho C, ghép với supplier và chỉ lấy trường sname của bảng kết quả
Thực chất ý nghĩa của phép toán trên là tìm các nhà cung cấp sao cho
mã số của nhà cung cấp ñó xuất hiện ở tất cả các bản ghi của bảng phụ tùng
2./ Đ(i s* quan h- m0 r2ng
Người ta nhận thấy 8 toán tử do TS Codd ñề ra lúc ñầu là chưa ñủ và cần mở rộng Sau ñây là một số các toán tử mở rộng
■ Toán tử Extend
Các toán tử ñề cập trong các phần trước ñều chỉ có thể lấy giá trị các trường gốc Nếu ta muốn hiển thị biểu thức của một hoặc nhiều trường thì các phép toán ñó chưa cho phép Ví dụ ta có bảng A(ma_so, ten, so_luong, don_gia) và ta muon hiển thị biểu thức so_luong * don_gia Phép toán Extend lấp chỗ trống cho vấn ñề còn thiếu này
Ta có thể bổ sung vào cú pháp hình thức cho toán tử Extend:
Extend term ADD scalar-expression AS attribute
Giải thích cú pháp: (SV ghi chép tại lớp)
VD1 Xem thêm một thuộc tính: trọng lượng các mặt hàng trong kho:
EXTEND (part JOIN sp) ADD (weight * qty) AS
store_weight
Trang 10Câu lệnh trên cho kết quả là bảng sau:
p_id pname color weight city store_weight
P1 Nut Red 12 London 3600
P2 Bolt Green 17 Paris 3400
P3 Screw Blue 17 Rome 6800
P4 Screw Red 14 London 2800
P5 Cam Blue 12 Paris 1200
P6 Cog Red 19 London 1900
P1 Nut Red 12 London 3600
P2 Bolt Green 17 Paris 6800
P2 Bolt Green 17 Paris 3400
P2 Bolt Green 17 Paris 3400
P4 Screw Red 14 London 4200
P5 Cam Blue 12 Paris 4800
Ghi nhớ: Câu lệnh SQL tương ñương
SELECT part.*, weight*qty AS store_weight
FROM part NATURAL JOIN sp;
VD2 Xem số lượng các loại phụ tùng trong kho của từng nhà cung cấp
EXTEND supplier ADD COUNT ((sp RENAME s_id AS x) WHERE x = s_id) AS np;
Chú ý hàm tính theo nhóm có tên là COUNT Hàm này ñếm các loại phụ tùng trong bảng sp ứng với từng bản ghi của supplier
Câu lệnh trên cho kết quả là bảng sau:
s_id sname status city np
S1 Smith 20 London 6
S2 Jones 10 Paris 2
S3 Blake 30 Paris 1
S4 Clark 20 London 3
S5 Adams 30 Athens 0
Ghi nhớ: Câu lệnh SQL tương ñương
SELECT supplier.*, count(supplier.s_id = sp.s_id) AS np FROM supplier LEFT JOIN sp ON supplier.s_id = sp.s_id GROUP BY s_id;
Trang 11■ Toán tử Summarize
Khác với toán tử Extend là cho phép tính toán các giá trị trên cùng một bản ghi, toán tử Summarize cho phép tính toán trên một nhóm các bản ghi Ví dụ:
SUMMARIZE sp BY (p_id) ADD SUM(qty) AS total_qty
cho kết quả là bảng với các thuộc tính {p_id, total_qty} trong ñó SUM là hàm tổng Phép tính trên tính tổng các loại phụ tùng trong kho và kết quả là bảng gồm 2 trường: mã phụ tùng (p_id) và tổng số lượng của loại phụ tùng ñó (total_qty)
Cú pháp hình thức của SUMMARIZE:
SUMMARIZE term BY (attribute-commalist)
ADD aggregate-expression AS attribute;
Giải thích cú pháp: (SV ghi chép tại lớp)
VD1 Tính tổng toàn bộ
SUMMARIZE sp BY () ADD SUM (qty) AS grandtotal; Câu lệnh trên tính tổng của trường qty trên toàn bảng sp Kết quả là:
grandtotal
3100
Ghi nhớ: Câu lệnh SQL tương ñương
SELECT SUM(qty) AS grandtotal FROM sp;
VD2 Tính tổng theo nhóm
SUMMARIZE sp BY (s_id) ADD COUNT AS np;
Câu lệnh trên ñếm số loại phụ tùng theo từng nhà cung cấp Kết quả là:
s_id np
S1 6
S2 2
S3 1
S4 3
Ghi nhớ: Câu lệnh SQL tương ñương
Trang 12SELECT s_id, COUNT(*) AS np FROM sp GROUP BY s_id;
3./ Các toán t3 c4p nh4t
Có thể nói, một phần của ñại số quan hệ là các phép toán cho phép nhập giá trị vào các quan hệ Các phép toán này có tên gọi là các toán tử gán (assignment)
target := source
trong ñó, target và source là các quan hệ cùng loại, nghĩa là chúng có cấu trúc giống nhau
■ Toán tử INSERT
Cú pháp hình thức:
INSERT source INTO target;
VD:
INSERT (supplier WHERE city = 'London')
into temp;
■ Toán tử UPDATE
Cú pháp hình thức:
UPDATE target assignment-commalist;
trong ñó, mỗi một assignment có dạng:
attribute := scalar-expression
VD:
UPDATE part WHERE color = 'Red'
city := 'Paris';
■ Toán tử DELETE
Cú pháp hình thức:
DELETE target;
VD:
DELETE supplier WHERE status < 20;