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

Cách truy vấn nhiều bảng, sử dụng những loại JOIN như LEFT JOIN, RIGHT JOIN, INNER JOIN trong SQL để lấy tài liệu tích 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 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 Donhang.DonhangID, Khachhang.Hoten, Donhang.Ngaydathang
FROM Donhang, Khachhang
WHERE Donhang.KhachhangID=Khachhang.KhachhangID

Chạy thử

Ở mệnh đề where ở câu truy vấn trên thì đoạn mã Donhang.KhachhangID=Khachhang.KhachhangID
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 Donhang, bản ghi ở Khachhang có cùng giá trị KhachhangID
sẽ kết hợp với nhau để tạo ra dòng dữ liệu tạm thời để
select chọn:

DonhangID HoTen Ngaydathang
10248 Nguyễn Bích Thủy 2019-07-04
10249 Hoàng Thị Bích Ngọc 2019-07-05
10250 Phạm Thu Huyền 2019-07-08
10251 Trần Diễm Thùy Dương 2019-07-08

Kết quả trên bạn thấy tên khách hàng (Hoten) lấy ở bảng Khachhang,
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 (Ngaydathang,DonhangID)
của khách hàng đó được lấy ở bảng Donhang

Ở đây có một file CSDL mẫu dạng SQLite, bạn hoàn toàn có thể tải về nghiên cứu và điều tra, thực hành thực tế : 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.DonhangID, c.Hoten, o.Ngaydathang
FROM Donhang As o, Khachhang AS c
WHERE o.KhachhangID=c.KhachhangID

Chạy thử

Bảng Donhang đã đổi tên thành o,
bảng Khachhang 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 những trường hợp JOIN trên :
cac kieu join

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

inner join

Ví dụ INNER JOIN hai bảng

SELECT Donhang.DonhangID, Khachhang.Hoten, Donhang.Ngaydathang
FROM Donhang
INNER JOIN Khachhang ON Donhang.KhachhangID = Khachhang.KhachhangID

Chạy thử

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

DonhangID HoTen Ngaydathang
10248 Nguyễn Bích Thủy 2019-07-04
10249 Hoàng Thị Bích Ngọc 2019-07-05
10250 Phạm Thu Huyền 2019-07-08
10251 Trần Diễm Thùy Dương 2019-07-08

Ví dụ INNER JOIN ba bảng

SELECT Donhang.DonhangID, Khachhang.HoTen, Shippers.Hoten AS TenShipper
FROM ((Donhang
INNER JOIN Khachhang ON Donhang.KhachhangID = Khachhang.KhachhangID)
INNER JOIN Shippers ON Donhang.ShipperID = Shippers.ShipperID)

Chạy thử
Kết quả

DonhangID HoTen TenShipper
10248 Nguyễn Bích Thủy GoViet
10249 Hoàng Thị Bích Ngọc Grab
10250 Phạm Thu Huyền Bee
10251 Trần Diễm Thùy Dương Grab

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 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 Khachhang.Hoten, Donhang.DonhangID
FROM Khachhang
LEFT JOIN Donhang ON Khachhang.KhachhangID = Donhang.KhachhangID
ORDER BY Khachhang.Hoten

Chạy thử

HoTen DonhangID
Bùi Nam Khánh
Bùi Thị Kim Oanh 10266
Bùi Thị Kim Oanh 10270
Hồ Nguyễn Minh Khuê

Quan sát kết quả ta thấy mọi HoTen ở bảng bên trái được lấy ra,
sau đó DonhangID ở bảng bên phải phù hợp được dùng để kết hợp với HoTen
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ải trí giống với LEFT JOIN theo chiều ngược lại .
Ví dụ :

SELECT Donhang.OrderID, NhanVien.Ten, NhanVien.Ho
FROM Donhang
RIGHT JOIN NhanVien
ON Donhang.NhanvienID = NhanVien.NhanvienID
ORDER BY Donhang.DonhangID

Chạy thử

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 Khachhang.HoTen, Donhang.DonhangID
FROM Khachhang
FULL OUTER JOIN Donhang ON Khachhang.KhachhangID=Donhang.KhachhangID
ORDER BY Khachhang.HoTen

Chạy thử
ĐĂNG KÝ KÊNH, XEM CÁC VIDEO TRÊN XUANTHULAB

Đăng ký nhận bài viết mới