Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

database4.png

📌 Series: Database for Data Science: Bài 4. Đại số quan hệ

Table Of Contents
  1. CHƯƠNG 4: ĐẠI SỐ QUAN HỆ – "VÕ CÔNG" BÍ TRUYỀN CỦA DÂN DATA SCIENCE
  2. Đi sâu vào "từng chiêu thức" – Các phép toán Đại số quan hệ
  3. Đại số quan hệ: Định nghĩa kiểu Formal
  4. Kết luận: Đại số quan hệ – "Nền tảng võ học" vững chắc cho Data Science

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)

CHƯƠNG 4: ĐẠI SỐ QUAN HỆ – “VÕ CÔNG” BÍ TRUYỀN CỦA DÂN DATA SCIENCE

Giới thiệu sơ lược: Đại số quan hệ là cái “quái” gì?

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ÃKHOATÊNKHOANĂMTLPHÒNGĐIỆNTHOAITRƯỞNGKHOANGÀYNHẬNCHỨC
CNTTCông nghệ thông tin1995B11083812345600220/02/2005
VLVật lý1976B21083822322300518/09/2003
SHSinh học1980B31083845454500411/10/2000
HHHóa học1980B41NULL00715/10/2001

Bây giờ, bạn muốn “khai thác” kho báu này, ví dụ như:

  • Thêm một khoa mới “Hóa học” vào bảng.
  • Chuyển khoa “CNTT” sang phòng “B12”.
  • Tìm tên các khoa được thành lập từ năm 1980.

Đó 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:

  1. Đại số quan hệ (Relational Algebra): Đây là “võ công chính thống”, biểu diễn truy vấn dưới dạng các biểu thức. Nó giống như việc bạn “lắp ráp” các “mảnh ghép” phép toán lại với nhau để tạo ra kết quả mong muốn. Đại số quan hệ cho phép bạn “điều khiển” từng bước thực hiện truy vấn.
  1. Phép tính quan hệ (Relational Calculus): Đây là “tà đạo ngoại bang” (đùa thôi!), biểu diễn kết quả truy vấn dựa trên logic vị từ. Nó giống như việc bạn “mô tả” kết quả mình muốn, còn hệ thống sẽ tự động tìm cách “lấy” kết quả đó ra. Phép tính quan hệ tập trung vào cái gì bạn muốn, hơn là làm thế nào để lấy nó.
  1. SQL (Structured Query Language): “Siêu sao” của làng truy vấn dữ liệu! SQL kết hợp “sức mạnh” của cả Đại số quan hệ và Phép tính quan hệ, vừa mạnh mẽ, vừa dễ dùng. SQL chính là “vũ khí” chính của dân Data Science khi làm việc với cơ sở dữ liệu quan hệ.

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 đó!

Đại số – Toán tử và Toán hạng: “Công thức” bí mật của Đại số quan hệ

Để 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:

  • Toán tử (operator): Các “ký hiệu” để thực hiện phép toán, ví dụ như +, -, *, / trong số học.
  • Toán hạng (operand): Những “thứ” mà toán tử tác động lên, ví dụ như biến số (x, y, z) hoặc hằng số (7, 3, 150) trong số học.
  • Biểu thức (expression): Sự kết hợp giữa toán tử và toán hạng, ví dụ như (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:

  • Toán hạng: Thay vì biến số và hằng số, chúng ta có quan hệ (relation), chính là các “bảng” dữ liệu của chúng ta đó!
  • Toán tử: Thay vì +, -, *, /, 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ệ.

Các phép toán “thần thánh” của Đại số 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:

  • Phép toán tập hợp (Set operations): “Mượn” từ lý thuyết tập hợp, giúp chúng ta “kết hợp”, “giao nhau”, “loại trừ” các quan hệ. Gồm có:
    • Hội (Union) ∪: “Gom” tất cả các bộ (hàng) từ hai quan hệ lại, loại bỏ các bộ trùng lặp.
    • Giao (Intersection) ∩: “Lọc” ra các bộ (hàng) chung giữa hai quan hệ.
    • Trừ (Difference) -: “Lấy” các bộ (hàng) chỉ có trong quan hệ thứ nhất mà không có trong quan hệ thứ hai.
  • Phép toán “rút trích” (Relational operations for extracting parts of a relation): Giúp chúng ta “chọn lọc” dữ liệu theo hàng hoặc cột. Gồm có:
    • Chọn (Selection) σ: “Lọc” ra các bộ (hàng) thỏa mãn một điều kiện nhất định.
    • Chiếu (Projection) π: “Chọn” ra một số cột nhất định từ quan hệ.
  • Phép toán “kết hợp” (Relational operations for combining relations): Giúp chúng ta “ghép nối” dữ liệu từ nhiều quan hệ lại với nhau. Gồm có:
    • Tích Cartesian (Cartesian Product) ×: “Ghép” mọi bộ (hàng) của quan hệ thứ nhất với mọi bộ (hàng) của quan hệ thứ hai.
  • Kết (Join) ⋈: “Ghép” các bộ (hàng) từ hai quan hệ dựa trên một điều kiện kết nối nhất định.
  • Phép chia (Division) ÷: Một phép toán “nâng cao”, dùng để tìm các bộ (hàng) trong một quan hệ mà “liên quan” đến tất cả các bộ (hàng) trong một quan hệ khác.
  • Các phép toán khác (Other operations): “Mở rộng” khả năng của Đại số quan hệ, ví dụ như:
    • Hàm kết hợp (Aggregation function): Tính toán các giá trị tổng hợp như trung bình, tổng, min, max, count.
    • Phép gom nhóm (Grouping): Chia các bộ (hàng) thành nhóm dựa trên một thuộc tính nào đó, rồi thực hiện các hàm kết hợp trên từng nhóm.
    • Phép kết ngoài (Outer join): Mở rộng phép kết để “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.

Đi sâu vào “từng chiêu thức” – Các phép toán Đại số quan hệ

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.

1. Phép toán tập hợp (Set operations): Hội, Giao, Trừ

Để 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:

  • Cùng bậc (degree): Hai quan hệ phải có cùng số lượng thuộc tính (cột).
  • Tương thích miền giá trị (Domain Compatibility): Các thuộc tính tương ứng ở hai quan hệ phải có cùng kiểu dữ liệu (miền giá trị).

Ví dụ, hai quan hệ SINHVIENGIAOVIEN 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ự:

SINHVIEN

TENSVNGSINHPHAI
Tung12/08/1955Nam
Hang07/19/1968Nu
Nhu06/20/1951Nu
Hung09/15/1962Nam
Chau12/30/1988Nu

GIAOVIEN

TENGVNG_SINHGIOITINH
Trinh04/05/1986Nu
Khang10/25/1983Nam
Phuong05/03/1958Nu
Minh02/28/1942Nam

a. Phép hội (Union) ∪

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ệ rs như sau:

r
AB
α1
α2
β1
s
AB
α2
β3

Phép hội r ∪ s sẽ cho ra quan hệ:

r ∪ s
AB
α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:

SinhVien
HOTENDIACHI
Đinh Bá Tiến119 Cống Quỳnh, Tp HCM
Nguyễn Thanh Tùng222 Nguyễn Văn Cừ, Tp HCM
Lê Quỳnh Như291 Hồ Văn Huê, Tp HCM
GiaoVien
HOTENDIACHI
Đinh Bá Tiến119 Cống Quỳnh, Tp HCM
Trần Thanh Tâm553 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:

SinhVien ∪ GiaoVien
HOTENDIACHI
Đinh Bá Tiến119 Cống Quỳnh, Tp HCM
Nguyễn Thanh Tùng222 Nguyễn Văn Cừ, Tp HCM
Lê Quỳnh Như291 Hồ Văn Huê, Tp HCM
Trần Thanh Tâm553 Mai Thị Lựu, Tp HCM

b. Phép giao (Intersection) ∩

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ệ rs như trên.

Phép giao r ∩ s sẽ cho ra quan hệ:

r ∩ s
AB
α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ệ SinhVienGiaoVien 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):

SinhVien ∩ GiaoVien
HOTENDIACHI
Đinh Bá Tiến119 Cống Quỳnh, Tp HCM

c. Phép trừ (Difference) –

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ệ rs như trên.

Phép trừ r - s sẽ cho ra quan hệ:

r – s
AB
α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ệ SinhVienGiaoVien 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:

SinhVien – GiaoVien
HOTENDIACHI
Nguyễn Thanh Tùng222 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:

  • Giao hoán: r ∪ s = s ∪ rr ∩ s = s ∩ r (Thứ tự không quan trọng!)
  • Kết hợp: r ∪ (s ∪ t) = (r ∪ s) ∪ tr ∩ (s ∩ t) = (r ∩ s) ∩ t (Có thể kết hợp nhiều phép toán liên tiếp!)

2. Phép chọn (Selection) σ

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:

r
ABCD
αα17
αβ57
ββ123
ββ2310

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 D>5. Kết quả là:

σ(A=B)∧(D>5)(r)
ABCD
αα17
ββ2310

Ứ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:

  • Giao hoá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!)

3. Phép chiếu (Projection) π

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:

r
ABC
α101
α201
β301
β402

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(r)
AC
α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.

4. Phép tích Cartesian (Cartesian Product) ×

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 ru bộ và sv 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 rs (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ệ rs như sau:

r
AB
α1
β2
s
BCD
α10+
β10+
β20
γ10

Phép tích Cartesian r × s sẽ cho ra quan hệ:

r × s
AR.BS.BCD
α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 rs), 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.BS.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 BOMONGIAOVIEN, sau đó dùng phép chọn để lọc ra các bộ thỏa mãn điều kiện TRUONGBM = MAGV.

5. Phép kết (Join) ⋈

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ết theta (Theta join) ⋈θ: Kết hợp các bộ (hàng) thỏa mãn điều kiện kết θ. Ký hiệu: r ⋈θ s.
  • Kết bằng (Equi join): Trường hợp đặc biệt của kết theta, khi điều kiện kết θ chỉ là phép so sánh bằng (=).
  • Kết tự nhiên (Natural join) ⋈ hoặc ⋈N: Trường hợp đặc biệt của kết bằng, khi điều kiện kết là tất cả các thuộc tính có tên giống nhau giữa hai quan hệ. Kết tự nhiên còn “thông minh” hơn nữa khi tự động loại bỏ các cột trùng lặp sau khi kết.

Ví dụ phép kết theta:

Cho quan hệ rs như sau:

r
AB
13
24
46
58
s
DE
31
62

Phép kết theta r ⋈r.B < s.D s sẽ kết hợp các bộ (hàng) từ rs thỏa mãn điều kiện r.B < s.D. Kết quả là:

r ⋈r.B < s.D s
ABDE
1362
2462

Ví dụ phép kết tự nhiên:

Cho quan hệ GIAOVIENBOMON (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:

  • Để tìm thông tin giáo viên và bộ môn mà họ làm việc: GIAOVIEN JOIN BOMON (Chúng ta dùng JOIN thay cho trong ký hiệu text)
  • Để tìm thông tin đề tài và giáo viên chủ nhiệm đề tài: DETAI JOIN[GVCNĐT=MAGV] GIAOVIEN (Kết theta, điều kiện kết trong ngoặc vuông)

6. Phép chia (Division) ÷

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ệ rliên quan đến tất cả các bộ (hàng) trong quan hệ s.

Ký hiệu: r ÷ s

  • r(Z)s(X): rs 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.
  • Điều kiện: 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).
  • Kết quả: Quan hệ 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ệ rs như sau:

r
ABC
αaγ
αaβ
αaα
αaα
βaα
βaβ
γaα
γaβ
γaγ
s
DE
a1
a2

Phép chia r ÷ s sẽ cho ra quan hệ:

r ÷ s
ABC
α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:

  • Tìm mã giáo viên tham gia tất cả công việc thuộc đề tài 001.
  • Tìm tên đề tài có tất cả giảng viên bộ môn “Hệ thống thông tin” tham gia.

7. Các phép toán khác: Hàm kết hợp, Phép gom nhóm, Phép kết ngoài

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:

a. Hàm kết hợp (Aggregation function):

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:

r
AB
12
14
21
23
  • SUM(B) = 2 + 4 + 1 + 3 = 10
  • AVG(A) = (1 + 1 + 2 + 2) / 4 = 1.5
  • MIN(A) = 1
  • MAX(B) = 4
  • COUNT(A) = 4

b. Phép gom nhóm (Grouping):

Phé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:

r
ABC
α27
α47
β23
γ210
  • 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)(r)
ASUM_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:

  • Tính tổng lương của tất cả giáo viên: GROUP_SUM(LUONG)(GIAOVIEN)
  • Tính số lượng giáo viên và lương trung bình của từng bộ môn: GROUP_BY[MABM](COUNT(*), AVG(LUONG))(GIAOVIEN)

c. Phép kết ngoài (Outer join):

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:

  • Kết ngoài trái (Left outer join) ⟕: Giữ lại tất cả các bộ (hàng) từ quan hệ bên trái, và thêm giá trị 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.
  • Kết ngoài phải (Right outer join) ⟖: Giữ lại tất cả các bộ (hàng) từ quan hệ bên phải, và thêm giá trị 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.
  • Kết ngoài đầy đủ (Full outer join) ⟗: Giữ lại tất cả các bộ (hàng) từ cả hai quan hệ, và thêm giá trị 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ệ GIAOVIENBOMON. Để 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.

8. Các thao tác cập nhật trên quan hệ: Thêm, Xóa, Sửa (Ký hiệu Text)

Đạ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:

  • Thêm (Insertion): Thêm bộ (hàng) mới vào quan hệ. Ký hiệu text: rnew <- rold UNION E, trong đó E là quan hệ chứa các bộ (hàng) cần thêm.
    • Giải thích:
      • <- (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).
  • Xóa (Deletion): Xóa các bộ (hàng) thỏa mãn một điều kiện nào đó khỏi quan hệ. Ký hiệu text: rnew <- rold - E, trong đó E là quan hệ chứa các bộ (hàng) cần xóa.
    • Giải thích:
      • <- (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ừ).
  • Sửa (Updating): Sửa giá trị của một hoặc nhiều thuộc tính trong các bộ (hàng) thỏa mãn một điều kiện nào đó. Ký hiệu text: 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.
    • Giải thích:
      • <- (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):

  • Thêm giáo viên mới vào bảng GIAOVIEN: GIAOVIEN <- GIAOVIEN UNION ('010', 'Nguyễn Văn Z', 'Nam', ...)
  • Xóa tất cả giáo viên thuộc bộ môn “VS”:GIAOVIEN <- GIAOVIEN - SELECT[MABM='VS'](GIAOVIEN)
    • Giải thích thêm: Chúng ta dùng 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.
  • Tăng lương 10% cho tất cả giáo viên:GIAOVIEN <- PROJECT[MAGV, HOTEN, LUONG*1.1, PHAI, ...](GIAOVIEN)
    • Giải thích thêm: Chúng ta dùng 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”.

Đại số quan hệ: Định nghĩa kiểu Formal

Để 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 đó!)

1. Phép toán tập hợp (Set operations): Hội, Giao, Trừ

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ệ.

a. Phép hội (Union) ∪

  • Định nghĩa kiểu Formal:

Cho hai quan hệ r(R)s(S) khả hợp. Phép hội của rs, 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) }s = { (α, 2), (β, 3) } thì r ∪ s = { (α, 1), (α, 2), (β, 3) }.

b. Phép giao (Intersection) ∩

  • Định nghĩa kiểu Formal:

Cho hai quan hệ r(R)s(S) khả hợp. Phép giao của rs, 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 rs.

Ví dụ minh họa (toán học hơn một chút):

Nếu r = { (α, 1), (α, 2) }s = { (α, 2), (β, 3) } thì r ∩ s = { (α, 2) }.

c. Phép trừ (Difference) –

  • Định nghĩa kiểu Formal:

Cho hai quan hệ r(R)s(S) khả hợp. Phép trừ của rs, 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) }s = { (α, 2), (β, 3) } thì r - s = { (α, 1) }.

2. Phép chọn (Selection) σ

  • Định nghĩa kiểu Formal:

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ệ rthỏ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) }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) }.

3. Phép chiếu (Projection) π

  • Định nghĩa kiểu Formal:

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)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 Aloạ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) }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) }.

4. Phép tích Cartesian (Cartesian Product) ×

  • Định nghĩa kiểu Formal:

Cho hai quan hệ r(R)s(S). Phép tích Cartesian của rs, 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 ∪ vphép kết hợp bộ u và bộ v. Nếu bộ un thuộc tính và bộ vm 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 uv 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) }s = { (α, 10), (β, 20) } thì r × s = { (α, 1, α, 10), (α, 1, β, 20), (β, 2, α, 10), (β, 2, β, 20) }.

5. Phép kết (Join) ⋈

Ở đâ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.

  • Định nghĩa kiểu Formal (Kết Theta):

Cho hai quan hệ r(R)s(S) và một điều kiện kết θ. Phép kết theta của rs 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) }θ 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) }.

6. Phép chia (Division) ÷

  • Định nghĩa kiểu Formal:

Cho hai quan hệ r(Z)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]phép chiếu bộ v lên tập thuộc tính Y.
  • v[X]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, γ) }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).

Kết luận: Đại số quan hệ – “Nền tảng võ học” vững chắc cho Data Science

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”

quyminhhuy0@gmail.com
quyminhhuy0@gmail.com
Articles: 54

Newsletter Updates

Enter your email address below and subscribe to our newsletter

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
AI Assistant
Hi! How can I help you today?
Apúntate a nuestro boletín de novedades blockytoys coolector y te llevas un vale por dos euros en tu próxima compra.