Truy vấn nhiều bảng với JOIN trong SQL
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 khi truy vấn 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à ở mệnh đề where
là điều kiện khớp nối.
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
dùng để khớp nối bảng.
Mọi cặp bản ghi (dòng dữ liệu): bản ghi ở bảng Order, bản ghi ở Customers có cùng giá trị CustomerID sẽ kết hợp với nhau để tạo ra dòng dữ liệu tạm thờ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
Ở đây có một file CSDL mẫu dạng SQLite, bạn có thể tải về nghiên cứu, thực hành: CSDL SQLite mẫu. Hoặc sử dụng trực tiếp công cụ Online: Chạy 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 phức tạp, dài trở lê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 điều kiện khớp nối ở mệnh đề where
)
sử dụng với khớp nối thông thường, thực tế 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 (nhớ lại phép giao hai tập hợp).
- left join : mọi bản ghi bảng bên trái được trả về, bản ghi nào phù hợp với bản ghi bên phải thì nó được bổ sung thêm dữ liệu từ bản ghi bảng bên phải (nếu không có thì nhận NULL)
- right join : mọi bản ghi bảng bên phải được trả về, sau bổ sung dữ liệu phù hợp từ bảng bên 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:
Quy tắc chung viết join : bảng trái là bảng nằm bên trái (phía trước) từ khóa join
,
bảng phái là bảng sau (bên phải) từ khóa join
, trong mệnh đề join
thì điều kiện kết hợp vết
sau từ khóa on
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
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
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 thì 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;
Gửi bài viết tới Facebook