So sánh join và where trong mysql

SELF-JOIN là một trường hợp đặc biệt của truy vấn SQL JOIN. Trong khi các cú pháp của hàm JOIN khác cần liên kết từ 2 bảng trở lên để thể hiện các dữ liệu chung, đúng như tên gọi. SELF-JOIN trong SQL lại tự “liên kết” với chính nó.

Thông thường, mỗi bảng trong cơ sở dữ liệu lưu trữ một dạng thông tin khác nhau. Do đó, trên thực tế, sẽ có tới hàng trăm bảng có mối quan hệ với nhau trong cơ sở dữ liệu. Ta có thể join các bảng khác nhau có cùng cột bằng cách sử dụng cú pháp JOIN trong SQL. Điều này cũng có thể được thực hiện nếu muốn tự join một bảng với chính nó bằng cách sử dụng cú pháp SELF-JOIN trong SQL. Trong bài này, chúng ta sẽ cùng đi tìm hiểu cách thức hoạt động và cách sử dụng của SELF-JOIN cũng như một số trường hợp áp dụng cụ thể

Mục lục

Định nghĩa SELF-JOIN trong SQL

Như tên gọi của nó, SELF-JOIN trong SQL có nghĩa là tự kết nối một bảng với chính nó. Để sử dụng SELF-JOIN, bảng được sử dụng phải của một cột (tạm gọi là X) hoạt động như 1 primary key và một cột khác (gọi là Y) chứa dữ liệu có liên kết với cột X. Giá trị trong 2 cột X và Y này không nhất thiết phải giống nhau và giá trị tại cột Y thậm chí còn có thể là NULL.

Ví dụ: Ta có bảng Employees dưới đây

So sánh join và where trong mysql

Mỗi một nhân viên (employee) sẽ có ID cá nhân riêng (Cột X) và được quản lý bởi một người quản lý cũng thuộc danh sách nhân viên đó. Người quản lý này được gắn cho một mã định danh của quản lý là ManagerID (Cột Y) có giá trị trùng khớp với EmployeeID. Ta có thể thấy một vài mối quan hệ trong bảng như sau:

  • Người quản lý của nhân viên John Smith chính là nhân viên với ID số 3, Tom Lanon.
  • Người quản lý của nhân viên Jane Anderson cũng là nhân viên với ID số 3, Tom Lanon.
  • Nhân viên Anne Connor không có quản lý, ID người quản lý của cô ấy được để giá trị NULL

Loại bảng này rất phổ biến trong thang cấp bậc (hierachy). Bây giờ, để tìm được tên của người quản lý ứng với từng nhân viên trong từng hàng, ta có thể chạy truy vấn sau đây:

So sánh join và where trong mysql

Kết quả trả về như sau:

So sánh join và where trong mysql

Như có thể thấy, truy vấn trên đã lựa chọn cột ID, FullName và ManagerId từ bảng gốc nhưng được định danh tạm thời (aliase) là employee. Nó cũng lựa chọn cột FullName từ bảng gốc nhưng định danh tạm thời (aliase) thành một bảng khác tên là manager. Kêt quả trả về như ta thấy, mỗi nhân viên được gán với tên đầy đủ của một quản lý tương ứng với ManagerId đã cho trong bảng gốc.

Trong truy vấn này, ta đã thực hiện join bảng Employees với chính nó, bảng gốc Employees được sử dụng với 2 mục đích như sau:

  • Mục đích thứ nhất: Lưu trữ thông tin của nhân viên (được định danh là bảng employee)
  • Mục đích thứ hai: Lưu trữ thông tin của quản lý (được định danh là bảng manager)

Với cách này, ta có thể coi 2 bản sao của bảng gốc Employees là 2 bảng khác nhau, một cho nhân viên và một cho quản lý và tiến hành JOIN chúng lại với nhau như bình thường.

Từ ví dụ trên, ta có thể thấy, cú pháp cơ bản của SELF-JOIN như sau:

So sánh join và where trong mysql

Biểu thức trong mệnh đề WHERE có thể là bất kì biểu thức nào theo nhu cầu cần sử dụng.

Ngoài ra, có thể thay thế WHERE bằng JOIN theo cú pháp:

So sánh join và where trong mysql

Table Aliases trong SELF-JOIN

Khi đề cập tới cùng một bảng nhiều hơn 1 lần trong truy vấn SQL, ta cần phân biệt rõ ràng chúng. Do đó, ta cần sự dụng aliases để phân biệt nguồn lấy đối với từng bảng trong truy vấn SQL. Aliase nên chỉ rõ chức năng của từng bảng tham chiếu trong truy vấn.

Ví dụ: các Aliases được highlight màu đỏ trong truy vấn dưới đây. Ta có thể thấy chúng thể hiện ý nghĩa (chức năng) của chúng trong mệnh đề Join và From:

So sánh join và where trong mysql

Phép JOIN được sử dụng để liên kết 2 bảng và thường theo sau bởi mệnh đề On hoặc Using để trỏ tới các cột chung được sử dụng để liên kết 2 bảng lại với nhau. Trong ví dụ này, ta có thể thấy 2 aliase đều tham chiếu tới bảng Employees và liên kết với nhau bởi điều kiện ManagerID trùng khớp với Employee ID của các manager

Kết luận

Thông qua các ví dụ trên, ta có thể thấy, SELF-JOIN trong SQL là một trường hợp đặc biệt của phép JOIN. Phép SELF-JOIN thường được ứng dụng rất nhiều trong việc xử lý các dữ liệu liên quan đến cấp bậc hoặc kết nối dữ liệu thuộc 2 hàng trong cùng một bảng. Ta có thể JOIN một bảng với chính nó bao nhiêu lần cũng được, miễn là ta có thể định danh nó bằng aliase đủ rõ ràng để chỉ ra chứng năng sử dụng của nó. Các aliase đó được sử dụng để “nạp” dữ liệu trong các cột từ các bảng này lại với nhau dựa trên vai trò mà nó được sử dụng để tham chiếu.