Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Chào mọi người, lại là tớ, Loser1 đây, blogger AI “chuyên nghiệp” (này mõm thôi ae 🙁 viết dăm ba bài rồi mõm đúng là loser1 ae à ) đến từ vũ trụ “Learning AI With Losers. Hôm nay, chúng ta sẽ tiếp tục hành trình khám phá thế giới dữ liệu mênh mông trong series đình đám 📌 Series: Database for Data Science. Nếu bạn nào còn đang ngơ ngác chưa biết series này là gì, hoặc lỡ quên mất tớ là ai (huhu), thì hãy nhanh tay lội ngược dòng về Bài 3: Relational Database nhé. Tớ đã “múa rìu qua mắt thợ” giải thích cặn kẽ về cơ sở dữ liệu quan hệ ở bài trước rồi đó.
Hôm nay, chúng ta sẽ “lên level” một chút, đi sâu vào “bí kíp võ công” mang tên Đại số quan hệ (Relational Algebra). Nghe tên có vẻ “hàn lâm” đúng không? Đừng lo, tớ sẽ “bình dân hóa” hết mức có thể, đảm bảo ai đọc cũng hiểu, ai học cũng “vào”, và quan trọng nhất là… ai làm Data Science cũng thấy “ngon lành cành đào”!
Bài viết này của chúng ta được “chắp bút” dựa trên bài giảng môn Cơ sở dữ liệu siêu chất lượng từ các thầy cô Bộ môn Hệ Thống Thông Tin – Khoa Công Nghệ Thông Tin – Trường Đại học Khoa học Tự nhiên đó nha. Nội dung “xịn sò” thế này mà tớ “mần” lại theo phong cách “loser” thì còn gì bằng, đúng không? 😉 (Thật ra là loser1 ăn cướp trắng trợn ….. rồi copy spam content cho ae :(** , thầy cô sẽ bùn lắm đây)
Trước khi đi vào chi tiết “từng chiêu thức”, chúng ta cần “khởi động” một chút để hiểu rõ “Đại số quan hệ” là gì và tại sao nó lại quan trọng với dân Data Science chúng ta.
Hãy tưởng tượng bạn có một “kho báu” dữ liệu khổng lồ được sắp xếp gọn gàng trong các “bảng” (quan hệ) như bảng KHOA
trong ví dụ dưới đây:
MÃKHOA | TÊNKHOA | NĂMTL | PHÒNG | ĐIỆNTHOAI | TRƯỞNGKHOA | NGÀYNHẬNCHỨC |
---|---|---|---|---|---|---|
CNTT | Công nghệ thông tin | 1995 | B11 | 0838123456 | 002 | 20/02/2005 |
VL | Vật lý | 1976 | B21 | 0838223223 | 005 | 18/09/2003 |
SH | Sinh học | 1980 | B31 | 0838454545 | 004 | 11/10/2000 |
HH | Hóa học | 1980 | B41 | NULL | 007 | 15/10/2001 |
Bây giờ, bạn muốn “khai thác” kho báu này, ví dụ như:
Đó chính là lúc chúng ta cần đến ngôn ngữ truy vấn (Query Language). Ngôn ngữ truy vấn giúp chúng ta “ra lệnh” cho hệ thống quản lý cơ sở dữ liệu (DBMS) để lấy ra thông tin mình cần hoặc thay đổi dữ liệu.
Trong thế giới cơ sở dữ liệu quan hệ, có hai “trường phái” ngôn ngữ truy vấn chính:
Trong bài viết này, chúng ta sẽ tập trung “luyện công” Đại số quan hệ. Hiểu rõ Đại số quan hệ sẽ giúp bạn “nắm vững” bản chất của việc truy vấn dữ liệu, và từ đó “chinh phục” SQL dễ dàng hơn đó!
Để hiểu Đại số quan hệ, chúng ta cần “ôn lại bài cũ” về Đại số trong toán học một chút. Đại số bao gồm:
+, -, *, /
trong số học.(x, y, z)
hoặc hằng số (7, 3, 150)
trong số học.(x+7) / (y-3)
hoặc (x+y)*z
.Trong Đại số quan hệ, mọi thứ cũng tương tự, nhưng “toán hạng” và “toán tử” sẽ “chuyên ngành” hơn một chút:
+, -, *, /
, chúng ta có các phép toán quan hệ (relational operations), được thiết kế đặc biệt để “xử lý” các quan hệ.Đại số quan hệ cung cấp một “bộ sưu tập” các phép toán mạnh mẽ để “múa may” trên dữ liệu. Chúng ta có thể chia chúng thành các nhóm chính như sau:
Giờ thì chúng ta sẽ “luyện tập” từng phép toán một nhé. Tớ sẽ cố gắng giải thích thật dễ hiểu, kèm theo ví dụ minh họa “siêu thực tế” để các bạn dễ hình dung.
Để thực hiện các phép toán tập hợp (Hội, Giao, Trừ) trên quan hệ, chúng ta cần đảm bảo hai quan hệ đó phải khả hợp (Union Compatibility). Điều kiện “khả hợp” rất đơn giản thôi:
Ví dụ, hai quan hệ SINHVIEN
và GIAOVIEN
dưới đây là khả hợp vì chúng cùng có 3 thuộc tính và các thuộc tính tương ứng có kiểu dữ liệu tương tự:
TENSV | NGSINH | PHAI |
---|---|---|
Tung | 12/08/1955 | Nam |
Hang | 07/19/1968 | Nu |
Nhu | 06/20/1951 | Nu |
Hung | 09/15/1962 | Nam |
Chau | 12/30/1988 | Nu |
TENGV | NG_SINH | GIOITINH |
---|---|---|
Trinh | 04/05/1986 | Nu |
Khang | 10/25/1983 | Nam |
Phuong | 05/03/1958 | Nu |
Minh | 02/28/1942 | Nam |
Phép hội r ∪ s
sẽ “gom” tất cả các bộ (hàng) từ quan hệ r
và quan hệ s
lại với nhau. Nếu có bộ nào trùng lặp, phép hội sẽ tự động loại bỏ, chỉ giữ lại một bản duy nhất.
Ví dụ:
Cho hai quan hệ r
và s
như sau:
A | B |
---|---|
α | 1 |
α | 2 |
β | 1 |
A | B |
---|---|
α | 2 |
β | 3 |
Phép hội r ∪ s
sẽ cho ra quan hệ:
A | B |
---|---|
α | 1 |
α | 2 |
β | 1 |
β | 3 |
Ứng dụng Data Science: Phép hội rất hữu ích khi bạn muốn kết hợp dữ liệu từ nhiều nguồn khác nhau thành một tập dữ liệu duy nhất. Ví dụ, bạn có dữ liệu khách hàng từ website và dữ liệu khách hàng từ ứng dụng di động, bạn có thể dùng phép hội để “gộp” chúng lại.
Ví dụ thực tế hơn:
HOTEN | DIACHI |
---|---|
Đinh Bá Tiến | 119 Cống Quỳnh, Tp HCM |
Nguyễn Thanh Tùng | 222 Nguyễn Văn Cừ, Tp HCM |
Lê Quỳnh Như | 291 Hồ Văn Huê, Tp HCM |
HOTEN | DIACHI |
---|---|
Đinh Bá Tiến | 119 Cống Quỳnh, Tp HCM |
Trần Thanh Tâm | 553 Mai Thị Lựu, Tp HCM |
SinhVien ∪ GiaoVien
sẽ cho ra danh sách tất cả những người là sinh viên hoặc giáo viên (hoặc cả hai) trong trường:
HOTEN | DIACHI |
---|---|
Đinh Bá Tiến | 119 Cống Quỳnh, Tp HCM |
Nguyễn Thanh Tùng | 222 Nguyễn Văn Cừ, Tp HCM |
Lê Quỳnh Như | 291 Hồ Văn Huê, Tp HCM |
Trần Thanh Tâm | 553 Mai Thị Lựu, Tp HCM |
Phép giao r ∩ s
sẽ “lọc” ra các bộ (hàng) vừa có trong quan hệ r
, vừa có trong quan hệ s
. Nói cách khác, nó tìm ra những bộ (hàng) “chung” giữa hai quan hệ.
Ví dụ:
Cho hai quan hệ r
và s
như trên.
Phép giao r ∩ s
sẽ cho ra quan hệ:
A | B |
---|---|
α | 2 |
Ứng dụng Data Science: Phép giao giúp bạn tìm ra điểm chung giữa các tập dữ liệu. Ví dụ, bạn có danh sách khách hàng “VIP” và danh sách khách hàng “thân thiết”, bạn có thể dùng phép giao để tìm ra những khách hàng vừa “VIP” vừa “thân thiết”.
Ví dụ thực tế hơn:
Với quan hệ SinhVien
và GiaoVien
như trên, SinhVien ∩ GiaoVien
sẽ cho ra danh sách những người vừa là sinh viên, vừa là giáo viên (trong trường hợp này là Đinh Bá Tiến):
HOTEN | DIACHI |
---|---|
Đinh Bá Tiến | 119 Cống Quỳnh, Tp HCM |
Phép trừ r - s
sẽ “lấy” các bộ (hàng) có trong quan hệ r
nhưng không có trong quan hệ s
. Nó giống như việc bạn “loại bỏ” những bộ (hàng) của s
ra khỏi r
.
Ví dụ:
Cho hai quan hệ r
và s
như trên.
Phép trừ r - s
sẽ cho ra quan hệ:
A | B |
---|---|
α | 1 |
β | 1 |
Ứng dụng Data Science: Phép trừ giúp bạn tìm ra sự khác biệt giữa các tập dữ liệu. Ví dụ, bạn có danh sách khách hàng của tháng này và danh sách khách hàng của tháng trước, bạn có thể dùng phép trừ để tìm ra những khách hàng mới của tháng này.
Ví dụ thực tế hơn:
Với quan hệ SinhVien
và GiaoVien
như trên, SinhVien - GiaoVien
sẽ cho ra danh sách những người chỉ là sinh viên, không phải giáo viên:
HOTEN | DIACHI |
---|---|
Nguyễn Thanh Tùng | 222 Nguyễn Văn Cừ, Tp HCM |
Lê Quỳnh Như | 291 Hồ Văn Huê, Tp HCM |
Tính chất “bá đạo” của phép toán tập hợp:
r ∪ s = s ∪ r
và r ∩ s = s ∩ r
(Thứ tự không quan trọng!)r ∪ (s ∪ t) = (r ∪ s) ∪ t
và r ∩ (s ∩ t) = (r ∩ s) ∩ t
(Có thể kết hợp nhiều phép toán liên tiếp!)Phép chọn σP(r)
sẽ “lọc” ra các bộ (hàng) trong quan hệ r
thỏa mãn điều kiện chọn P
. Điều kiện P
có thể là một biểu thức logic phức tạp, kết hợp các phép so sánh (<, >, =, ≠, ≤, ≥
) và các phép logic (∧ - AND, ∨ - OR, ¬ - NOT
).
Ký hiệu: σP(r)
σ
(sigma) là ký hiệu của phép chọn.P
là điều kiện chọn.r
là quan hệ đầu vào.Ví dụ:
Cho quan hệ r
như sau:
A | B | C | D |
---|---|---|---|
α | α | 1 | 7 |
α | β | 5 | 7 |
β | β | 12 | 3 |
β | β | 23 | 10 |
Phép chọn σ(A=B)∧(D>5)(r)
sẽ lọc ra các bộ (hàng) thỏa mãn cả hai điều kiện: A=B
VÀ D>5
. Kết quả là:
A | B | C | D |
---|---|---|---|
α | α | 1 | 7 |
β | β | 23 | 10 |
Ứng dụng Data Science: Phép chọn là “vũ khí” lợi hại để lọc dữ liệu theo các tiêu chí nhất định. Ví dụ, bạn muốn tìm tất cả khách hàng ở độ tuổi từ 25 đến 35, hoặc tất cả sản phẩm có giá trên 100 đô la, bạn sẽ dùng phép chọn.
Ví dụ thực tế hơn:
Cho bảng GIAOVIEN
(như slide)
Để tìm thông tin giáo viên nữ, ta dùng phép chọn: SELECT[PHAI='Nữ'](GIAOVIEN)
Tính chất “hay ho” của phép chọn:
σp1(σp2(r)) = σp2(σp1(r)) = σp1∧p2(r)
(Có thể “chồng” nhiều phép chọn lên nhau, thứ tự không quan trọng!)Phép chiếu πA1, A2, ..., Ak(r)
sẽ “chọn” ra một số cột nhất định (A1, A2, ..., Ak
) từ quan hệ r
. Nó giống như việc bạn “cắt” bớt các cột không cần thiết, chỉ giữ lại những cột mình quan tâm.
Ký hiệu: πA1, A2, ..., Ak(r)
π
(pi) là ký hiệu của phép chiếu.A1, A2, ..., Ak
là danh sách các thuộc tính (cột) cần chọn.r
là quan hệ đầu vào.Ví dụ:
Cho quan hệ r
như sau:
A | B | C |
---|---|---|
α | 10 | 1 |
α | 20 | 1 |
β | 30 | 1 |
β | 40 | 2 |
Phép chiếu πA,C(r)
sẽ chọn ra cột A
và cột C
, loại bỏ cột B
. Kết quả là:
A | C |
---|---|
α | 1 |
β | 1 |
β | 2 |
Ứng dụng Data Science: Phép chiếu giúp bạn chọn ra các “features” (đặc trưng) quan trọng từ dữ liệu. Ví dụ, trong bài toán dự đoán giá nhà, bạn có thể chỉ quan tâm đến các cột “diện tích”, “số phòng ngủ”, “vị trí”, mà không cần quan tâm đến các cột khác như “mô tả chi tiết” hay “lịch sử giao dịch”.
Ví dụ thực tế hơn:
Cho bảng GIAOVIEN
(như slide)
Để lấy ra họ tên và lương của giáo viên nữ, ta kết hợp phép chọn và phép chiếu: PROJECT[HOTEN, LUONG](SELECT[PHAI='Nữ'](GIAOVIEN))
Lưu ý quan trọng: Phép chiếu không có tính giao hoán. πX,Y(r)
KHÔNG chắc chắn bằng πX(πY(r))
. Thực tế, πA1, A2, ..., An(πA1, A2, ..., Am(r)) = πA1, A2, ..., An(r)
với n ≤ m
. Tức là, nếu bạn chiếu nhiều lần, thì chỉ lần chiếu “cuối cùng” (với ít cột nhất) có hiệu lực thôi!
Phép chiếu tổng quát:
Phép chiếu còn có thể “mạnh mẽ” hơn nữa khi cho phép bạn tính toán trên các cột trong quá trình chiếu. Ví dụ, bạn có thể tính lương sau khi tăng 10% bằng phép chiếu tổng quát: PROJECT[HOTEN, LUONG*1.1](GIAOVIEN)
.
Chuỗi các phép toán và phép gán:
Trong thực tế, chúng ta thường kết hợp nhiều phép toán Đại số quan hệ lại với nhau để tạo ra các truy vấn phức tạp. Để dễ quản lý, chúng ta có thể dùng phép gán (assignment) <-
để “đặt tên” cho kết quả trung gian của mỗi phép toán.
Ví dụ, để tìm mã số và họ tên giáo viên thuộc bộ môn “HTTT”, ta có thể viết:
GV_HTTT <- SELECT[MABM='HTTT'](GIAOVIEN) // Chọn giáo viên bộ môn HTTT
KQ <- PROJECT[MAGV, HOTEN](GV_HTTT) // Chiếu ra mã GV và họ tên
Phép đổi tên (Rename) ρ:
Đôi khi, chúng ta cần đổi tên quan hệ hoặc thuộc tính để dễ dàng thao tác hoặc tránh nhầm lẫn. Phép đổi tên ρ
sẽ giúp chúng ta làm điều đó.
ρs(r)
: Đổi tên quan hệ r
thành s
.ρX, C, D(r)
: Đổi tên thuộc tính B
thành X
trong quan hệ r(B, C, D)
.ρs(X,C,D)(r)
: Đổi tên cả quan hệ r
thành s
và thuộc tính B
thành X
.Phép tích Cartesian r × s
sẽ “ghép” mọi bộ (hàng) của quan hệ r
với mọi bộ (hàng) của quan hệ s
. Nếu r
có u
bộ và s
có v
bộ, thì r × s
sẽ có u × v
bộ. Số lượng thuộc tính của r × s
sẽ là tổng số thuộc tính của r
và s
(với điều kiện tên thuộc tính không trùng nhau).
Ký hiệu: r × s
Ví dụ:
Cho quan hệ r
và s
như sau:
A | B |
---|---|
α | 1 |
β | 2 |
B | C | D |
---|---|---|
α | 10 | + |
β | 10 | + |
β | 20 | – |
γ | 10 | – |
Phép tích Cartesian r × s
sẽ cho ra quan hệ:
A | R.B | S.B | C | D |
---|---|---|---|---|
α | 1 | α | 10 | + |
α | 1 | β | 10 | + |
α | 1 | β | 20 | – |
α | 1 | γ | 10 | – |
β | 2 | α | 10 | + |
β | 2 | β | 10 | + |
β | 2 | β | 20 | – |
β | 2 | γ | 10 | – |
Lưu ý: Khi hai quan hệ có thuộc tính trùng tên (ví dụ cột B
trong r
và s
), chúng ta cần phân biệt chúng bằng cách thêm tiền tố tên quan hệ (ví dụ R.B
và S.B
).
Ứng dụng Data Science: Bản thân phép tích Cartesian ít khi được dùng trực tiếp trong Data Science vì nó tạo ra quá nhiều bộ (hàng) không cần thiết. Tuy nhiên, nó thường là bước trung gian để thực hiện các phép toán khác, đặc biệt là phép kết (Join) mà chúng ta sẽ học ngay sau đây.
Ví dụ thực tế hơn:
Để tìm thông tin bộ môn và thông tin trưởng bộ môn, ta có thể dùng tích Cartesian của BOMON
và GIAOVIEN
, sau đó dùng phép chọn để lọc ra các bộ thỏa mãn điều kiện TRUONGBM = MAGV
.
Phép kết r ⋈ s
là một phép toán vô cùng quan trọng trong Đại số quan hệ và trong Data Science. Nó giúp chúng ta kết hợp dữ liệu từ hai hoặc nhiều quan hệ dựa trên một điều kiện kết nối. Phép kết “thông minh” hơn phép tích Cartesian vì nó chỉ “ghép” những bộ (hàng) có liên quan đến nhau, thay vì “ghép” tất cả với nhau.
Có nhiều loại phép kết khác nhau, nhưng phổ biến nhất là:
θ
. Ký hiệu: r ⋈θ s
.θ
chỉ là phép so sánh bằng (=
).Ví dụ phép kết theta:
Cho quan hệ r
và s
như sau:
A | B |
---|---|
1 | 3 |
2 | 4 |
4 | 6 |
5 | 8 |
D | E |
---|---|
3 | 1 |
6 | 2 |
Phép kết theta r ⋈r.B < s.D s
sẽ kết hợp các bộ (hàng) từ r
và s
thỏa mãn điều kiện r.B < s.D
. Kết quả là:
A | B | D | E |
---|---|---|---|
1 | 3 | 6 | 2 |
2 | 4 | 6 | 2 |
Ví dụ phép kết tự nhiên:
Cho quan hệ GIAOVIEN
và BOMON
(như slide). Cả hai quan hệ đều có thuộc tính MABM
(Mã bộ môn). Phép kết tự nhiên GIAOVIEN ⋈ BOMON
sẽ kết hợp các bộ (hàng) dựa trên thuộc tính MABM
, và tự động loại bỏ một cột MABM
trùng lặp.
Ứng dụng Data Science: Phép kết là “xương sống” của việc kết hợp dữ liệu từ nhiều bảng trong cơ sở dữ liệu quan hệ. Trong Data Science, dữ liệu thường được phân chia thành nhiều bảng để đảm bảo tính cấu trúc và tránh dư thừa. Phép kết giúp chúng ta “tái cấu trúc” dữ liệu, “gom” thông tin liên quan từ các bảng khác nhau lại để phân tích và khai thác.
Ví dụ thực tế hơn:
GIAOVIEN JOIN BOMON
(Chúng ta dùng JOIN
thay cho ⋈
trong ký hiệu text)DETAI JOIN[GVCNĐT=MAGV] GIAOVIEN
(Kết theta, điều kiện kết trong ngoặc vuông)Phép chia r ÷ s
là một phép toán “khó nhằn” hơn, nhưng lại rất hữu ích trong một số trường hợp đặc biệt. Phép chia r ÷ s
sẽ tìm ra các bộ (hàng) trong quan hệ r
mà liên quan đến tất cả các bộ (hàng) trong quan hệ s
.
Ký hiệu: r ÷ s
r(Z)
và s(X)
: r
và s
là hai quan hệ, Z
là tập thuộc tính của r
, X
là tập thuộc tính của s
.X ⊆ Z
(Tập thuộc tính của s
phải là tập con của tập thuộc tính của r
).t(Y)
với Y = Z - X
. t
chứa các bộ t0
sao cho với mọi bộ tS
trong s
, tồn tại bộ tR
trong r
thỏa mãn:
tR(Y) = t0
(Phần thuộc tính Y
của tR
bằng t0
)tR(X) = tS(X)
(Phần thuộc tính X
của tR
bằng tS
)Ví dụ:
Cho quan hệ r
và s
như sau:
A | B | C |
---|---|---|
α | a | γ |
α | a | β |
α | a | α |
α | a | α |
β | a | α |
β | a | β |
γ | a | α |
γ | a | β |
γ | a | γ |
D | E |
---|---|
a | 1 |
a | 2 |
Phép chia r ÷ s
sẽ cho ra quan hệ:
A | B | C |
---|---|---|
α | a | γ |
γ | a | γ |
Ứng dụng Data Science: Phép chia thường được dùng để trả lời các câu hỏi dạng “tìm những đối tượng thỏa mãn tất cả các điều kiện nào đó”.
Ví dụ thực tế hơn:
Ngoài các phép toán cơ bản trên, Đại số quan hệ còn cung cấp các phép toán “nâng cao” để mở rộng khả năng truy vấn:
Các hàm kết hợp giúp chúng ta tính toán các giá trị tổng hợp trên một tập hợp các giá trị. Các hàm kết hợp phổ biến bao gồm:
AVG
: Tính giá trị trung bình.MIN
: Tìm giá trị nhỏ nhất.MAX
: Tìm giá trị lớn nhất.SUM
: Tính tổng.COUNT
: Đếm số lượng.Ví dụ:
Cho quan hệ r
như sau:
A | B |
---|---|
1 | 2 |
1 | 4 |
2 | 1 |
2 | 3 |
SUM(B)
= 2 + 4 + 1 + 3 = 10AVG(A)
= (1 + 1 + 2 + 2) / 4 = 1.5MIN(A)
= 1MAX(B)
= 4COUNT(A)
= 4Phép gom nhóm giúp chúng ta chia các bộ (hàng) thành các nhóm dựa trên một hoặc nhiều thuộc tính, sau đó thực hiện các hàm kết hợp trên từng nhóm.
Ký hiệu: G1, G2, ..., Gn F1(A1), F2(A2), ..., Fn(An)(E)
G1, G2, ..., Gn
: Các thuộc tính gom nhóm.F1(A1), F2(A2), ..., Fn(An)
: Các hàm kết hợp và thuộc tính tương ứng.E
: Biểu thức Đại số quan hệ đầu vào.Ví dụ:
Cho quan hệ r
như sau:
A | B | C |
---|---|---|
α | 2 | 7 |
α | 4 | 7 |
β | 2 | 3 |
γ | 2 | 10 |
GROUP_SUM(C)(r)
: Tính tổng cột C
cho toàn bộ quan hệ. Kết quả: 27. (Chúng ta dùng GROUP_SUM
để phân biệt với hàm SUM
thông thường trong ký hiệu text)GROUP_BY[A](GROUP_SUM(C))(r)
: Gom nhóm theo cột A
, rồi tính tổng cột C
cho mỗi nhóm. Kết quả:A | SUM_C |
---|---|
α | 14 |
β | 3 |
γ | 10 |
Ứng dụng Data Science: Hàm kết hợp và phép gom nhóm rất quan trọng trong việc tổng hợp và phân tích dữ liệu. Ví dụ, bạn có thể tính doanh thu trung bình theo từng khu vực, số lượng khách hàng theo từng độ tuổi, hoặc tìm ra sản phẩm bán chạy nhất theo từng tháng.
Ví dụ thực tế hơn:
GROUP_SUM(LUONG)(GIAOVIEN)
GROUP_BY[MABM](COUNT(*), AVG(LUONG))(GIAOVIEN)
Phép kết ngoài là một “biến thể” của phép kết, giúp chúng ta giữ lại thông tin từ cả hai quan hệ, ngay cả khi không có bộ (hàng) nào “khớp” với nhau theo điều kiện kết. Có 3 loại phép kết ngoài:
NULL
vào các thuộc tính của quan hệ bên phải nếu không có bộ (hàng) nào khớp.NULL
vào các thuộc tính của quan hệ bên trái nếu không có bộ (hàng) nào khớp.NULL
vào các thuộc tính của quan hệ còn lại nếu không có bộ (hàng) nào khớp.Ví dụ:
Cho quan hệ GIAOVIEN
và BOMON
. Để tìm họ tên giáo viên và tên bộ môn mà họ làm trưởng bộ môn (nếu có), ta có thể dùng phép kết ngoài trái: GIAOVIEN LEFT_OUTER_JOIN[MAGV=TRUONGBM] BOMON
. Phép kết ngoài trái sẽ giữ lại tất cả giáo viên, kể cả những giáo viên không làm trưởng bộ môn, và điền NULL
vào cột TENBM
của những giáo viên đó. (Chúng ta dùng LEFT_OUTER_JOIN
, RIGHT_OUTER_JOIN
, FULL_OUTER_JOIN
để thay thế cho ⟕
, ⟖
, ⟗
trong ký hiệu text)
Ứng dụng Data Science: Phép kết ngoài hữu ích khi bạn muốn kết hợp dữ liệu từ nhiều nguồn, nhưng vẫn muốn giữ lại thông tin đầy đủ từ mỗi nguồn, ngay cả khi không có sự “liên kết” hoàn hảo giữa chúng.
Đại số quan hệ không chỉ dùng để truy vấn dữ liệu, mà còn có thể dùng để cập nhật dữ liệu trong cơ sở dữ liệu. Các thao tác cập nhật cơ bản bao gồm:
rnew <- rold UNION E
, trong đó E
là quan hệ chứa các bộ (hàng) cần thêm.
<-
(mũi tên trái) thay cho ký hiệu
(phép gán).UNION
thay cho ký hiệu ∪
(phép hợp).rnew <- rold - E
, trong đó E
là quan hệ chứa các bộ (hàng) cần xóa.
<-
(mũi tên trái) thay cho ký hiệu
(phép gán).-
(dấu trừ) thay cho ký hiệu -
(phép trừ).rnew <- PROJECT[F1, F2, ..., Fn](rold)
, trong đó Fi
là biểu thức tính toán giá trị mới cho thuộc tính thứ i
.
<-
(mũi tên trái) thay cho ký hiệu
(phép gán).PROJECT[...]
thay cho ký hiệu π[...]
(phép chiếu). Chúng ta dùng PROJECT
để dễ đọc hơn trong text.[F1, F2, ..., Fn]
là danh sách các biểu thức tính toán cho từng thuộc tính, được đặt trong dấu ngoặc vuông để rõ ràng hơn.Ví dụ (với ký hiệu text – ĐÃ SỬA LỖI):
GIAOVIEN <- GIAOVIEN UNION ('010', 'Nguyễn Văn Z', 'Nam', ...)
GIAOVIEN <- GIAOVIEN - SELECT[MABM='VS'](GIAOVIEN)
SELECT[điều_kiện](quan_hệ)
để thay thế cho phép chọn σđiều_kiện(quan_hệ)
trong ký hiệu text. Như vậy sẽ rõ ràng hơn về ý nghĩa của phép toán.GIAOVIEN <- PROJECT[MAGV, HOTEN, LUONG*1.1, PHAI, ...](GIAOVIEN)
PROJECT[danh_sách_thuộc_tính](quan_hệ)
để thay thế cho phép chiếu πdanh_sách_thuộc_tính(quan_ệ)
trong ký hiệu text. Cũng giúp người đọc dễ hình dung hơn về việc “chọn cột”.Để bài viết thêm phần “học thuật” và “đẳng cấp”, sau đây tớ sẽ bổ sung phần Định nghĩa kiểu Formal cho từng phép toán Đại số quan hệ. Yên tâm là tớ sẽ cố gắng diễn giải sao cho “dân thường” cũng hiểu được, chứ không “cao siêu” quá đà đâu! 😉
(Nhớ là phần này hơi “khoai” một chút, bạn nào “ngại” toán thì có thể “lướt nhanh” cũng được, nhưng nếu “nuốt” được thì “level” Data Science của bạn sẽ tăng vùn vụt đó!)
Trước khi “đi sâu” vào định nghĩa formal, chúng ta cần nhắc lại khái niệm quan hệ trong toán học. Trong Đại số quan hệ, một quan hệ có thể được xem như một tập hợp các bộ (tuple). Do đó, chúng ta có thể áp dụng các phép toán tập hợp quen thuộc lên các quan hệ.
Cho hai quan hệ r(R)
và s(S)
khả hợp. Phép hội của r
và s
, ký hiệu r ∪ s
, là một quan hệ mới, ký hiệu là u(R)
, được định nghĩa như sau:
u = { t | t ∈ r ∨ t ∈ s }
Giải thích “dịch nôm na”: Quan hệ u
chứa tất cả các bộ t
mà bộ t
đó hoặc thuộc quan hệ r
, hoặc thuộc quan hệ s
, hoặc thuộc cả hai. Các bộ trùng lặp sẽ chỉ xuất hiện một lần trong u
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 1), (α, 2) }
và s = { (α, 2), (β, 3) }
thì r ∪ s = { (α, 1), (α, 2), (β, 3) }
.
Cho hai quan hệ r(R)
và s(S)
khả hợp. Phép giao của r
và s
, ký hiệu r ∩ s
, là một quan hệ mới, ký hiệu là i(R)
, được định nghĩa như sau:
i = { t | t ∈ r ∧ t ∈ s }
Giải thích “dịch nôm na”: Quan hệ i
chứa tất cả các bộ t
mà bộ t
đó vừa thuộc quan hệ r
, vừa thuộc quan hệ s
. Nói cách khác, i
chứa các bộ chung của r
và s
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 1), (α, 2) }
và s = { (α, 2), (β, 3) }
thì r ∩ s = { (α, 2) }
.
Cho hai quan hệ r(R)
và s(S)
khả hợp. Phép trừ của r
và s
, ký hiệu r - s
, là một quan hệ mới, ký hiệu là d(R)
, được định nghĩa như sau:
d = { t | t ∈ r ∧ t ∉ s }
Giải thích “dịch nôm na”: Quan hệ d
chứa tất cả các bộ t
mà bộ t
đó thuộc quan hệ r
nhưng không thuộc quan hệ s
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 1), (α, 2) }
và s = { (α, 2), (β, 3) }
thì r - s = { (α, 1) }
.
Cho một quan hệ r(R)
và một điều kiện chọn P
. Phép chọn trên r
với điều kiện P
, ký hiệu σP(r)
, là một quan hệ mới, ký hiệu là s(R)
, được định nghĩa như sau:
s = { t | t ∈ r ∧ P(t) }
Trong đó, P(t)
là một vị từ (predicate) được đánh giá trên bộ t
. P(t)
trả về giá trị true nếu bộ t
thỏa mãn điều kiện P
, và false nếu không thỏa mãn.
Giải thích “dịch nôm na”: Quan hệ s
chứa tất cả các bộ t
từ quan hệ r
mà thỏa mãn điều kiện P
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 1, 7), (α, 5, 7), (β, 12, 3), (β, 23, 10) }
và P
là điều kiện (A=B) ∧ (D>5)
(với giả sử các thuộc tính là A, B, C, D theo thứ tự cột), thì σP(r) = { (α, 1, 7), (β, 23, 10) }
.
Cho một quan hệ r(R)
và một danh sách thuộc tính A = {A1, A2, ..., Ak}
là tập con của R
(A ⊆ R
). Phép chiếu trên r
với danh sách thuộc tính A
, ký hiệu πA(r)
, là một quan hệ mới, ký hiệu là s(A)
, được định nghĩa như sau:
s = { π<sub>A</sub>(t) | t ∈ r }
Trong đó, πA(t)
là phép chiếu bộ t
lên các thuộc tính trong danh sách A
. Nói cách khác, πA(t)
là một bộ mới chỉ chứa các giá trị của bộ t
tương ứng với các thuộc tính trong A
.
Giải thích “dịch nôm na”: Quan hệ s
được tạo ra bằng cách lấy tất cả các bộ từ quan hệ r
, sau đó giữ lại giá trị của các thuộc tính trong danh sách A
và loại bỏ các thuộc tính còn lại. Các bộ trùng lặp trong kết quả sẽ bị loại bỏ.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 10, 1), (α, 20, 1), (β, 30, 1), (β, 40, 2) }
và A = {A, C}
(với giả sử các thuộc tính là A, B, C theo thứ tự cột), thì πA,C(r) = { (α, 1), (β, 1), (β, 2) }
.
Cho hai quan hệ r(R)
và s(S)
. Phép tích Cartesian của r
và s
, ký hiệu r × s
, là một quan hệ mới, ký hiệu là p(R ∪ S)
, được định nghĩa như sau:
p = { t | ∃u ∈ r, ∃v ∈ s sao cho t = u ∪ v }
Trong đó, u ∪ v
là phép kết hợp bộ u
và bộ v
. Nếu bộ u
có n
thuộc tính và bộ v
có m
thuộc tính, thì bộ u ∪ v
sẽ có n + m
thuộc tính, được tạo ra bằng cách “ghép” các giá trị của u
và v
lại với nhau.
Giải thích “dịch nôm na”: Quan hệ p
được tạo ra bằng cách ghép mọi bộ từ quan hệ r
với mọi bộ từ quan hệ s
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, 1), (β, 2) }
và s = { (α, 10), (β, 20) }
thì r × s = { (α, 1, α, 10), (α, 1, β, 20), (β, 2, α, 10), (β, 2, β, 20) }
.
Ở đây, chúng ta sẽ xét định nghĩa formal cho phép kết theta (Theta-join), vì các loại kết khác (kết bằng, kết tự nhiên) là các trường hợp đặc biệt của kết theta.
Cho hai quan hệ r(R)
và s(S)
và một điều kiện kết θ
. Phép kết theta của r
và s
với điều kiện θ
, ký hiệu r ⋈θ s
, là một quan hệ mới, ký hiệu là j(R ∪ S)
, được định nghĩa như sau:
j = { t | ∃u ∈ r, ∃v ∈ s sao cho t = u ∪ v ∧ θ(u, v) }
Trong đó, θ(u, v)
là một vị từ được đánh giá trên cặp bộ (u, v)
. θ(u, v)
trả về true nếu cặp bộ (u, v)
thỏa mãn điều kiện kết θ
, và false nếu không thỏa mãn.
Giải thích “dịch nôm na”: Quan hệ j
được tạo ra bằng cách ghép các bộ u
từ r
và bộ v
từ s
lại với nhau, chỉ khi cặp bộ (u, v)
thỏa mãn điều kiện kết θ
.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (1, 3), (2, 4), (4, 6), (5, 8) }
, s = { (3, 1), (6, 2) }
và θ
là điều kiện r.B < s.D
(với giả sử các thuộc tính của r
là A, B và của s
là D, E), thì r ⋈θ s = { (1, 3, 6, 2), (2, 4, 6, 2) }
.
Cho hai quan hệ r(Z)
và s(X)
với X ⊆ Z
. Gọi Y = Z - X
. Phép chia của r
cho s
, ký hiệu r ÷ s
, là một quan hệ mới, ký hiệu là q(Y)
, được định nghĩa như sau:
q = { t | t là một bộ trên Y ∧ ∀u ∈ s, ∃v ∈ r sao cho v[Y] = t ∧ v[X] = u }
Trong đó:
v[Y]
là phép chiếu bộ v
lên tập thuộc tính Y
.v[X]
là phép chiếu bộ v
lên tập thuộc tính X
.Giải thích “dịch nôm na”: Quan hệ q
chứa tất cả các bộ t
trên tập thuộc tính Y
sao cho với mọi bộ u
trong quan hệ s
, tồn tại một bộ v
trong quan hệ r
mà bộ v
đó “kết hợp” được với bộ u
theo nghĩa là phần thuộc tính Y
của v
bằng t
và phần thuộc tính X
của v
bằng u
. Phép chia này hơi “lằng nhằng” một chút, nhưng bạn cứ hình dung nó như là phép toán tìm kiếm các đối tượng “liên quan đến tất cả” các đối tượng khác trong một tập hợp nào đó.
Ví dụ minh họa (toán học hơn một chút):
Nếu r = { (α, a, γ), (α, a, β), (α, a, α), (β, a, α), (β, a, β), (γ, a, α), (γ, a, β), (γ, a, γ) }
và s = { (a, 1), (a, 2) }
(với giả sử các thuộc tính của r
là A, B, C và của s
là D, E, và B tương ứng với D), thì r ÷ s = { (α, a, γ), (γ, a, γ) }
. (Ở đây, kết quả chỉ chứa các bộ có giá trị thuộc tính A là α
hoặc γ
, vì chỉ có những bộ này “kết hợp” được với cả hai bộ trong s
).
Phù! “Vượt ải” định nghĩa formal cũng “toát mồ hôi hột” phết nhỉ? Nhưng mà “công sức” bỏ ra là “xứng đáng” đó! Nắm vững các định nghĩa này, bạn sẽ thấy Đại số quan hệ không chỉ là “mấy cái ký hiệu” khô khan, mà là một hệ thống “logic” và “chặt chẽ” để thao tác với dữ liệu. Và quan trọng hơn, nó là nền tảng để bạn “chinh phục” các ngôn ngữ truy vấn dữ liệu “xịn sò” như SQL đó!
(Bạn nào “ngấm” được phần này thì “comment” cho tớ biết nhé! Để tớ có thêm động lực “mần” tiếp các bài blog “chất lượng cao” hơn nữa! 😉)
Vậy là bài blog của chúng ta đã “full option” rồi đó! Vừa có giải thích “dễ hiểu”, vừa có ví dụ “thực tế”, lại vừa có định nghĩa “formal” chuẩn chỉnh. Hy vọng bài viết này sẽ giúp các bạn “loser” như tớ “bớt loser” hơn một chút trên con đường Data Science nhé!
Nói tóm lại, Đại số quan hệ giống như “bài tập thể dục buổi sáng” cho não bộ của dân Data Science vậy! Luyện tập Đại số quan hệ thường xuyên sẽ giúp bạn “khỏe mạnh” hơn trong việc xử lý và phân tích dữ liệu đó!
Bài viết hôm nay đến đây là “hết phim” rồi. Hẹn gặp lại mọi người ở các bài viết tiếp theo trong series 📌 Series: Database for Data Science nhé! Chúng ta sẽ còn nhiều điều thú vị để khám phá lắm đó!
Thân ái và quyết thắng!
Loser1 – Đến từ “Learning AI With Losers.biết”