SQL - Truy vấn tự join: Hướng dẫn thân thiện cho người mới bắt đầu

Xin chào các bạn đam mê SQL! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình thú vị vào thế giới của SQL Self Joins. Là một người đã dạy khoa học máy tính trong nhiều năm, tôi đã chứng kiến rất nhiều khoảnh khắc "aha!" khi học sinh lĩnh hội được khái niệm này. Hãy cùng nhau lặn sâu và tạo ra một chút phép màu SQL nhé!

SQL - Self Join

什么是 Self Join?

Trước khi chúng ta nhảy vào chi tiết, hãy bắt đầu với một ví dụ đơn giản. Hãy tưởng tượng bạn đang tham gia một buổi gặp gỡ gia đình và bạn muốn tạo một danh sách tất cả các mối quan hệ cha-con. Bạn có một bảng lớn của các thành viên gia đình, nhưng bạn cần kết nối người với cha mẹ của họ trong cùng một bảng. Đó chính là điều mà Self Join thực hiện trong SQL!

Self Join là khi một bảng được kết hợp với chính nó. Nó giống như bảng đang nhìn vào gương và kết nối với chính phản chiếu của mình. Có vẻ kỳ lạ phải không? Đừng lo lắng; mọi thứ sẽ trở nên rõ ràng sớm thôi!

Tại sao sử dụng Self Join?

Self Joins rất hữu ích khi bạn có dữ liệu hierarchial hoặc dữ liệu đệ quy trong một bảng duy nhất. Hãy nghĩ về:

  1. Mối quan hệ nhân viên - quản lý
  2. Cây gia đình
  3. Phần và phụ phần trong sản xuất
  4. Trả lời theo chủ đề trong diễn đàn

Self Join trong SQL trong hành động

Hãy tạo một ví dụ đơn giản để minh họa cách Self Join hoạt động. Chúng ta sẽ sử dụng bảng nhân viên cho các minh họa.

Đầu tiên, hãy tạo bảng của chúng ta:

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);

INSERT INTO employees (employee_id, name, manager_id)
VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Bob Johnson', 1),
(4, 'Alice Brown', 2),
(5, 'Charlie Davis', 2);

Bây giờ, hãy giả sử chúng ta muốn liệt kê mỗi nhân viên cùng với tên quản lý của họ. Đây là nơi Self Join trở nên hữu ích:

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id;

Hãy phân tích truy vấn này:

  1. Chúng ta đang chọn từ bảng employees hai lần, đặt biệt danh là e1e2.
  2. e1 đại diện cho nhân viên, và e2 đại diện cho quản lý tiềm năng.
  3. Chúng ta kết hợp hai bảng này theo điều kiện e1's manager_id khớp với e2's employee_id.
  4. Chúng ta sử dụng LEFT JOIN để đảm bảo chúng ta nhận được tất cả các nhân viên, ngay cả những người không có quản lý.

Kết quả sẽ trông như thế này:

employee manager
John Doe NULL
Jane Smith John Doe
Bob Johnson John Doe
Alice Brown Jane Smith
Charlie Davis Jane Smith

Thật tuyệt vời phải không? Chỉ với một truy vấn, chúng ta đã vẽ ra toàn bộ cấu trúc quản lý của công ty nhỏ của chúng ta!

Self Join với mệnh đề ORDER BY

Bây giờ, hãy thêm một chút gia vị vào truy vấn của chúng ta bằng cách sắp xếp kết quả. Chúng ta có thể muốn xem nhân viên được liệt kê theo thứ tự bảng chữ cái:

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id
ORDER BY
e1.name ASC;

Truy vấn này identically identically với truy vấn trước của chúng ta, ngoại trừ việc thêm mệnh đề ORDER BY ở cuối. Nó sắp xếp kết quả của chúng ta theo thứ tự bảng chữ cái theo tên nhân viên.

Kết quả bây giờ sẽ trông như thế này:

employee manager
Alice Brown Jane Smith
Bob Johnson John Doe
Charlie Davis Jane Smith
Jane Smith John Doe
John Doe NULL

Tuyệt vời hơn rồi! Bây giờ chúng ta có thể dễ dàng tìm thấy bất kỳ nhân viên nào và quản lý của họ.

Kỹ thuật Self Join nâng cao

Bạn đã sẵn sàng nâng cấp? Hãy thử một điều gì đó phức tạp hơn. Giả sử chúng ta muốn tìm nhân viên có cùng quản lý?

SELECT
e1.name AS employee1,
e2.name AS employee2,
m.name AS shared_manager
FROM
employees e1
JOIN
employees e2 ON e1.manager_id = e2.manager_id AND e1.employee_id < e2.employee_id
JOIN
employees m ON e1.manager_id = m.employee_id;

Truy vấn này có thể trông đáng sợ, nhưng hãy phân tích nó:

  1. Chúng ta đang kết hợp bảng employees với chính nó hai lần (e1 và e2) để so sánh nhân viên.
  2. Điều kiện e1.employee_id < e2.employee_id đảm bảo chúng ta không nhận được cặp trùng lặp (như "Alice và Bob" và "Bob và Alice").
  3. Chúng ta kết hợp lần thứ ba (m) để lấy tên quản lý.

Kết quả có thể trông như thế này:

employee1 employee2 shared_manager
Jane Smith Bob Johnson John Doe
Alice Brown Charlie Davis Jane Smith

Và thế là xong! Chúng ta đã tìm thấy nhân viên có cùng quản lý.

Kết luận

Self Joins có thể看起来 khó khăn ban đầu, nhưng chúng là một công cụ vô cùng mạnh mẽ trong bộ công cụ SQL của bạn. Chúng cho phép bạn truy vấn dữ liệu hierarchial một cách hiệu quả và phát hiện mối quan hệ trong một bảng duy nhất.

Nhớ rằng, thực hành là chìa khóa! Hãy thử tạo bảng của riêng bạn và thử nghiệm với các truy vấn Self Join khác nhau. Trước khi bạn biết điều gì, bạn sẽ tự join như một chuyên gia!

Chúc các bạn may mắn trong việc truy vấn, các nhà SQL tương lai! Và hãy nhớ, trong thế giới cơ sở dữ liệu, hoàn toàn bình thường khi nói chuyện với chính mình... Tôi có nghĩa là, tự join với chính mình!

Credits: Image by storyset