Liên hệ
sql

Truy vấn nhiều bảng với JOIN trong SQL

Cách truy vấn nhiều bảng, sử dụng các loại JOIN như LEFT JOIN, RIGHT JOIN, INNER JOIN trong SQL để lấy dữ liệu kết hợp

Truy vấn nhiều bảng, Tự khớp nối các bảng

Một trong nhưng lợi ích chính của SQL là khả năng kết hợp dữ liệu từ hai hay nhiều bảng lại với nhau. Việc kết hợp các bảng lại như vậy gọi là JOIN, SQL sẽ tạo ra một bảng tạm thời chứa dữ liệu kết quả từ JOIN

Khớp nối hai bảng

Khớp nối hai bảng với nhau thì ở mệnh đề FROM chỉ ra tên hai bảng cần kết nối (cách nhau bởi dấu phảy)

Ví dụ:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders, Customers
WHERE Orders.CustomerID=Customers.CustomerID

Ở mệnh đề WHERE ở câu truy vấn trên thì đoạn mã Orders.CustomerID=Customers.CustomerID là dùng để khớp nối bảng.

Mọi cặp bản ghi: bản ghi (dòng dữ liệu) ở bảng Order, bản ghi (dòng dữ liệu) ở Customers có cùng giá trị CustomerID sẽ kết hợp với nhau để tạo ra dữ liệu dòng mới để Select chọn:

OrderID CustomerName OrderDate
10248 Wilman Kala 1996-07-04
10249 Tradição Hipermercados 1996-07-05
10250 Hanari Carnes 1996-07-08
... ... ...

Kết quả trên bạn thấy tên khách hàng (CustomerName) lấy ở bảng Customers, với mỗi khách hàng lấy được thì các ngày đặt hàng và ID của đơn hàng (OrderDate,OrderID) của khách hàng đó được lấy ở bảng Order

Bạn có thể thực hành các câu lệnh SQL ví dụ trên CSDL mẫu SQLite có sẵn tại SQLite và thực hành lệnh SQL

Đặt lại tên bảng khi truy vấn với AS

Từ khóa AS bạn đã từng dùng để đặt tên cột tùy biến, với tên bảng, bảng tạm thời cũng có thể dùng AS để đặt tên tùy biến, mục đích để câu truy vấn ngắn gọn, dễ đọc hơn.

Ví dụ trên viết có đặt thêm tên bảng tùy biến

SELECT o.OrderID, c.CustomerName, o.OrderDate
FROM Orders As o, Customers AS c
WHERE o.CustomerID=c.CustomerID;

Bảng Orders đã đổi tên thành o, bảng Customers thành c

Các kiểu JOIN

Cách khớp nối bảng ở trên sử dụng với khớp nối thông thường, tuy nhiên SQL sử dụng từ khóa JOIN với nhiều cách kết nối bảng khách nhau. Gồm có:

  • INNER JOIN trả về các bản ghi có giá trị phù hợp giữa hai bảng
  • LEFT JOIN mọi bản ghi bảng bên trái trả về kết hợp với bản ghi phù hợp với bên phải nếu có (nếu không có thì nhận NULL)
  • RIGHT JOIN mọi bản ghi bảng bên phải trả về có kết hợp với giá trị phù hợp nếu có ở bảng trái
  • OUTER JOIN (full join) mọi bản ghi ở bảng trái và bảng phải kết hợp lại

Hình ảnh trực quan cho các trường hợp JOIN trên:

cac kieu join

Sử dụng INNER JOIN

Xem lại hình ảnh về Inner Join, nó giống với phép toán giao tập hợp

inner join

INNER JOIN chọn các bản ghi mà phải phù hợp ở tất cả các bảng

Ví dụ INNER JOIN hai bảng

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

Trong đó bảng Orders là bảng trái vì bên trái từ khóa INNER JOIN, Customers là bảng phải. Biểu thức sau từ khóa ON cụ thể Orders.CustomerID = Customers.CustomerID là biểu thức khớp nối.

OrderID CustomerName OrderDate
10248 Wilman Kala 1996-07-04
10249 Tradição Hipermercados 1996-07-05
... ... ...

Ví dụ INNER JOIN ba bảng

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);

Kết quả

OrderID CustomerName ShipperName
10248 Wilman Kala Federal Shipping
10249 Tradição Hipermercados Speedy Express
10250 Hanari Carnes United Package

Sử dụng LEFT JOIN

inner join

LEFT JOIN trả về tất cả bản ghi bảng bên trái kể cả bản ghi đó không tương ứng với bảng bên phải, còn bảng bên phải những bản ghi nào phù hợp với bảng trái thì dữ liệu bản ghi đó được dùng để kết hợp với bản ghi bảng trái, nếu không có dữ liệu sẽ NULL

Ví dụ:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
CustomerName OrderID
Alfreds Futterkiste null
Ana Trujillo Emparedados y helados 10308
Antonio Moreno Taquería 10365
... ...

Quan sát kết quả ta thấy mọi CustomerName ở bảng bên trái được lấy ra, sau đó OrderID ở bảng bên phải phù hợp được dùng để kết hợp với CustomerName nếu không có giá trị nào phù hợp thì nhận giá trị null

Sử dụng RIGHT JOIN

Trường hợp này hoạt động giống với LEFT JOIN theo chiều ngược lại.

Ví dụ:

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees
ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;

FULL OUTER JOIN

Xét tất cả các kết quả, với SQLite không hỗ trợ (có thể thay thế bằng LEFT JOIN kết hợp với UNION)

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

Vui lòng đăng ký ủng hộ kênh