Mục lục
ToggleĐể kết thúc seri bài viết lên quan tới JOIN thì hôm nay trong bài viết này, bạn sẽ học cách sử dụng MySQL Self Join để nối một bảng với chính nó bằng phép nối bên trong hoặc nối trái.
Trong các bài viết trước, bạn đã học cách nối một bảng với các bảng khác bằng mệnh đề INNER JOIN
, LEFT JOIN
, RIGHT JOIN
hoặc CROSS JOIN
. Tuy nhiên, có một trường hợp đặc biệt mà bạn cần nối một bảng với chính nó, trường hợp này được gọi là tự nối.
Self Join thường được sử dụng để truy vấn dữ liệu phân cấp hoặc để so sánh một hàng với các hàng khác trong cùng một bảng.
Để thực hiện tự nối, bạn phải sử dụng alias để không lặp lại cùng một tên bảng hai lần trong một truy vấn. Lưu ý rằng việc tham chiếu một bảng hai lần trở lên trong truy vấn mà không sử dụng bí danh bảng sẽ gây ra lỗi.
Trong các hướng dẫn trước, bạn đã học cách nối một bảng với các bảng khác bằng mệnh đề INNER JOIN
, LEFT JOIN
, RIGHT JOIN
hoặc CROSS JOIN
. Tuy nhiên, có một trường hợp đặc biệt mà bạn cần nối một bảng với chính nó, trường hợp này được gọi là tự nối.
Tự nối thường được sử dụng để truy vấn dữ liệu phân cấp hoặc để so sánh một hàng với các hàng khác trong cùng một bảng.
Để thực hiện tự nối, bạn phải sử dụng bí danh bảng để không lặp lại cùng một tên bảng hai lần trong một truy vấn. Lưu ý rằng việc tham chiếu một bảng hai lần trở lên trong truy vấn mà không sử dụng bí danh bảng sẽ gây ra lỗi.
Hãy xem bảng employees
trong cơ sở dữ liệu mẫu .
Bảng employees
không chỉ lưu trữ dữ liệu nhân viên mà còn cả dữ liệu cấu trúc tổ chức. Cột reportsto
được sử dụng để xác định id người quản lý của một nhân viên.
Để có được toàn bộ cấu trúc tổ chức, bạn có thể nối bảng employees
với chính nó bằng cách sử dụng các cột employeeNumber
và reportsTo
. Bảng employees
có hai vai trò: một là Người quản lý và vai trò còn lại là Báo cáo trực tiếp.
SELECT CONCAT(m.lastName, ', ', m.firstName) AS Manager, CONCAT(e.lastName, ', ', e.firstName) AS 'Direct report' FROM employees e INNER JOIN employees m ON m.employeeNumber = e.reportsTo ORDER BY Manager;
Kết quả:
Kết quả chỉ hiển thị những nhân viên có người quản lý. Tuy nhiên, bạn không nhìn thấy President vì tên của ông ấy bị lọc ra do điều kiện INNER JOIN
.
President là nhân viên không có bất kỳ người quản lý hoặc giá trị trong cột reportsTo
là NULL
.
Câu lệnh dưới đây sử dụng mệnh đề LEFT JOIN
thay vì INNER JOIN
để bao gồm President:
SELECT IFNULL(CONCAT(m.lastname, ', ', m.firstname), 'Top Manager') AS 'Manager', CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report' FROM employees e LEFT JOIN employees m ON m.employeeNumber = e.reportsto ORDER BY manager DESC;
Kết quả:
Bằng cách sử dụng MySQL SELF JOIN, bạn có thể hiển thị danh sách khách hàng ở cùng một thành phố bằng cách JOIN bảng customers
với chính nó.
SELECT c1.city, c1.customerName, c2.customerName FROM customers c1 INNER JOIN customers c2 ON c1.city = c2.city AND c1.customername > c2.customerName ORDER BY c1.city;
Kết quả:
Trong ví dụ này, bảng customers
được nối với chính nó bằng các điều kiện nối sau:
c1.city = c2.city
đảm bảo rằng cả hai khách hàng đều có cùng một thành phố.c.customerName > c2.customerName
đảm bảo rằng không có cùng một khách hàng được bao gồm.Trong hướng dẫn này, bạn đã học cách MySQL tự nối bảng đó để nối một bảng với chính nó bằng cách sử dụng mệnh đề INNER JOIN
hoặc LEFT JOIN
.
Bàn có thể xem chi tiết tại: https://www.mysqltutorial.org/mysql-self-join/
Các bài viết liên quan:
Bình luận: