Bài này cafedev chia sẻ cho ace vềmọi thứ về JOIN với SELECT trong SQL để lấy ra dữ liệu theo ý muốn của mình. Các loại join: (INNER) JOIN, LEFT (OUTER) JOIN, RIGHT (OUTER) JOIN, FULL (OUTER) JOIN, SELF JOIN.

Sau đây chúng ta sẽ tìm hiểu chi tiết về từng loại join.

Lưu ý: Các bạn tham khảo bài giới thiệu này để lấy dữ liệu mẫu và chạy các ví dụ của toàn bộ series này nha. Khi bạn thực hành mà không tìm thấy kết quả và không xảy ra lỗi thì có thể dữ liệu của bạn không tồn tại, vì vậy, bạn có thể insert thêm data vào bảng và thực hành lại nha.

1. JOIN trong là gì?

Mệnh đề JOIN được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng, dựa trên một cột có liên quan giữa chúng.

Lưu ý rằng cột “CustomerID” trong bảng “Orders” tham chiếu đến “CustomerID” trong bảng “Customers”. Mối quan hệ giữa hai bảng trên là cột “CustomerID”.

Về các bảng này bạn nên tham khảo bài đầu trong file sql để xem cấu trúc của nó.

Sau đó, chúng ta có thể tạo câu lệnh SQL sau (có chứa INNER JOIN), chọn các bản ghi có giá trị phù hợp trong cả hai bảng:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

2. Sự khác nhau của các loại JOIN

Dưới đây là các kiểu khác nhau của các JOIN trong SQL:

  • (INNER) JOIN: Trả về các dữ liệu có giá trị phù hợp trong cả hai bảng
  • JOIN LEFT (OUTER): Trả về tất cả các dữ liệu từ bảng bên trái và các dữ liệu đã khớp từ bảng bên phải
  • RIGHT (OUTER) JOIN: Trả về tất cả các dữ liệu từ bảng bên phải và các dữ liệu phù hợp từ bảng bên trái
  • FULL (OUTER) JOIN: Trả về tất cả các dữ liệu khi có sự trùng khớp trong bảng bên trái hoặc bên phải

3. INNER JOIN trong SQL

Từ khóa INNER JOIN chọn các dữ liệu có giá trị phù hợp trong cả hai bảng.

Cú pháp

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

Ví dụ:

  • Câu lệnh SQL sau chọn tất cả các đơn hàng có thông tin khách hàng:

Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; 

Lưu ý: Từ khóa INNER JOIN chọn tất cả các hàng từ cả hai bảng miễn là có sự trùng khớp giữa các cột. Nếu có dữ liệu trong bảng “Orders” không khớp trong “Customers”, những đơn đặt hàng này sẽ không được hiển thị!

Join 3 bảng

Câu lệnh SQL sau chọn tất cả các đơn đặt hàng có thông tin về khách hàng và người giao hàng:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID); 

4. LEFT JOIN trong SQL

Từ khóa LEFT JOIN trả về tất cả các dữ liệu từ bảng bên trái (table1) và các dữ liệu được so khớp từ bảng bên phải (table2). Kết quả là NULL từ phía bên phải, nếu không có kết quả phù hợp.

Cú pháp

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

Lưu ý: Trong một số cơ sở dữ liệu, LEFT JOIN được gọi là LEFT OUTER JOIN.

Ví dụ:

Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.

Câu lệnh SQL sau sẽ chọn tất cả khách hàng và bất kỳ đơn hàng nào mà họ có thể có:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

Lưu ý: Từ khóa LEFT JOIN trả về tất cả các dữ liệu từ bảng bên trái (Khách hàng), ngay cả khi không có dữ liệu nào phù hợp trong bảng bên phải (Đơn hàng).

5. RIGHT JOIN trong SQL

Từ khóa RIGHT JOIN trả về tất cả các dữ liệu từ bảng bên phải (table2) và các dữ liệu được so khớp từ bảng bên trái (table1). Kết quả là NULL từ phía bên trái, khi không có kết quả phù hợp.

Cú pháp

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

Lưu ý: Trong một số cơ sở dữ liệu, RIGHT JOIN được gọi là RIGHT OUTER JOIN.

Ví dụ:

Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.

  • Câu lệnh SQL sau sẽ trả về tất cả nhân viên và bất kỳ đơn hàng nào họ có thể đã đặt:
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID; 

Lưu ý: Từ khóa RIGHT JOIN trả về tất cả các dữ liệu từ bảng bên phải (Nhân viên), ngay cả khi không có dữ liệu nào phù hợp trong bảng bên trái (Đơn hàng).

6. FULL OUTER JOIN trong SQL

Từ khóa FULL OUTER JOIN trả về tất cả các dữ liệu khi có sự trùng khớp trong các dữ liệu bảng bên trái (table1) hoặc bên phải (table2).

Lưu ý: FULL OUTER JOIN có thể trả về tập kết quả rất lớn!

Mẹo: FULL OUTER JOIN và FULL JOIN giống nhau.

Cú pháp

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition; 

Ví dụ:

Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.

  • Câu lệnh SQL sau chọn tất cả khách hàng và tất cả các đơn đặt hàng:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

Lưu ý: Từ khóa FULL OUTER JOIN trả về tất cả các dữ liệu phù hợp từ cả hai bảng cho dù bảng khác có khớp hay không. Vì vậy, nếu có hàng trong “Customers” không khớp trong “Orders” hoặc nếu có hàng trong “Orders” không khớp trong “Customers”, những hàng đó cũng sẽ được liệt kê.

7. SELF JOIN trong SQL

Một self JOIN là một phép nối thông thường, nhưng bảng được nối với chính nó.

Cú pháp

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

T1 và T2 là các bí danh bảng khác nhau cho cùng một bảng.

Ví dụ:

Câu lệnh SQL sau phù hợp với khách hàng đến từ cùng một thành phố:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;

Lưu ý: Các bạn tham khảo bài giới thiệu này để lấy dữ liệu mẫu và chạy các ví dụ của toàn bộ series này nha. Khi bạn thực hành mà không tìm thấy kết quả và không xảy ra lỗi thì có thể dữ liệu của bạn không tồn tại, vì vậy, bạn có thể insert thêm data vào bảng và thực hành lại nha.

Full series tự học SQL từ cơ bản tới nâng cao tại đây nha.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!