Mệnh đề INNER JOIN
trong SQL được sử dụng để ghép (kết hợp) các hàng từ hai hoặc nhiều bảng dựa trên một điều kiện liên kết cụ thể. Khi sử dụng INNER JOIN
, chỉ những hàng thỏa mãn điều kiện liên kết từ cả hai bảng mới được đưa vào kết quả truy vấn.
Cú pháp cơ bản
SELECT cot1, cot2, ... FROM bang1 INNER JOIN bang2 ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
bang1
,bang2
: Tên của các bảng muốn kết hợp.cot_khoa_ngoai
: Cột trongbang1
mà chứa giá trị liên kết.cot_khoa_chinh
: Cột trongbang2
mà chứa giá trị liên kết.
Ví dụ Cơ Bản
Giả sử bạn có hai bảng:
- Bảng
NhanVien
:
MaNhanVien
TenNhanVien
MaPhongBan
(khóa ngoại liên kết với bảngPhongBan
)
- Bảng
PhongBan
:
MaPhongBan
(khóa chính)TenPhongBan
Để lấy danh sách nhân viên cùng với tên phòng ban của họ, bạn có thể sử dụng INNER JOIN
như sau:
SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM NhanVien INNER JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu lệnh này sẽ kết hợp các hàng từ bảng NhanVien
và bảng PhongBan
dựa trên sự liên kết giữa MaPhongBan
của NhanVien
và MaPhongBan
của PhongBan
, và trả về tên nhân viên cùng với tên phòng ban của họ.
Kết Hợp Với Nhiều Bảng
Bạn cũng có thể sử dụng INNER JOIN
để kết hợp nhiều hơn hai bảng. Ví dụ, nếu bạn có một bảng DonHang
và bạn muốn kết hợp tất cả các bảng để lấy thông tin đơn hàng cùng với thông tin nhân viên và phòng ban:
- Bảng
DonHang
:
MaDonHang
MaNhanVien
(khóa ngoại liên kết với bảngNhanVien
)NgayDat
SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan, DonHang.MaDonHang, DonHang.NgayDat FROM DonHang INNER JOIN NhanVien ON DonHang.MaNhanVien = NhanVien.MaNhanVien INNER JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu lệnh này sẽ kết hợp bảng DonHang
với NhanVien
và sau đó kết hợp với PhongBan
, và trả về thông tin đầy đủ về đơn hàng, nhân viên và phòng ban.
Lưu Ý
- Chỉ những hàng khớp:
INNER JOIN
chỉ trả về những hàng mà có sự khớp nhau trong điều kiện liên kết. Nếu không có sự khớp, hàng đó sẽ không xuất hiện trong kết quả. - Hiệu suất: Các phép nối (
JOIN
) có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất. - Tên bảng và cột: Khi kết hợp nhiều bảng, nếu các bảng có cùng tên cột, bạn cần chỉ định rõ tên bảng (hoặc bí danh) để tránh nhầm lẫn. Ví dụ:
NhanVien.TenNhanVien
vàPhongBan.TenPhongBan
.
Tóm tắt
- Mệnh đề
INNER 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 điều kiện liên kết. - Chỉ những hàng thỏa mãn điều kiện liên kết từ cả hai bảng mới được đưa vào kết quả.
- Có thể kết hợp nhiều bảng cùng lúc để lấy dữ liệu liên quan từ nhiều nguồn.
- Kết hợp với các điều kiện và chỉ mục để cải thiện hiệu suất và độ chính xác của truy vấn.
Mệnh đề LEFT JOIN
(hoặc LEFT OUTER JOIN
) trong SQL được sử dụng để kết hợp các hàng từ hai bảng dựa trên một điều kiện liên kết, tương tự như INNER JOIN
. Tuy nhiên, khác với INNER JOIN
, LEFT JOIN
trả về tất cả các hàng từ bảng bên trái (bảng đầu tiên) và các hàng khớp từ bảng bên phải (bảng thứ hai). Nếu không có hàng khớp trong bảng bên phải, thì các giá trị trong các cột của bảng bên phải sẽ được điền là NULL
.
Cú pháp cơ bản
SELECT cot1, cot2, ... FROM bang1 LEFT JOIN bang2 ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
bang1
,bang2
: Tên của các bảng muốn kết hợp.cot_khoa_ngoai
: Cột trongbang1
mà chứa giá trị liên kết.cot_khoa_chinh
: Cột trongbang2
mà chứa giá trị liên kết.
Ví dụ Cơ Bản
Giả sử bạn có hai bảng:
- Bảng
NhanVien
:
MaNhanVien
TenNhanVien
MaPhongBan
(khóa ngoại liên kết với bảngPhongBan
)
- Bảng
PhongBan
:
MaPhongBan
(khóa chính)TenPhongBan
Để lấy danh sách tất cả nhân viên cùng với tên phòng ban của họ, kể cả những nhân viên không thuộc bất kỳ phòng ban nào, bạn có thể sử dụng LEFT JOIN
như sau:
SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM NhanVien LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu lệnh này sẽ trả về tất cả nhân viên và tên phòng ban của họ. Nếu một nhân viên không thuộc bất kỳ phòng ban nào, trường TenPhongBan
sẽ có giá trị NULL
.
Kết Hợp Với Nhiều Bảng
Bạn cũng có thể kết hợp nhiều bảng với LEFT JOIN
. Ví dụ, nếu bạn có một bảng DonHang
và bạn muốn lấy thông tin đơn hàng cùng với thông tin nhân viên và phòng ban, nhưng vẫn muốn thấy tất cả các đơn hàng, kể cả những đơn hàng không có thông tin nhân viên hoặc phòng ban:
- Bảng
DonHang
:
MaDonHang
MaNhanVien
(khóa ngoại liên kết với bảngNhanVien
)NgayDat
SELECT DonHang.MaDonHang, DonHang.NgayDat, NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM DonHang LEFT JOIN NhanVien ON DonHang.MaNhanVien = NhanVien.MaNhanVien LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu lệnh này sẽ trả về tất cả các đơn hàng. Nếu một đơn hàng không có thông tin về nhân viên hoặc phòng ban, các cột tương ứng sẽ có giá trị NULL
.
Lưu Ý
- Kết quả không khớp:
LEFT JOIN
đảm bảo rằng tất cả các hàng từ bảng bên trái được trả về, ngay cả khi không có sự khớp ở bảng bên phải. Nếu không có khớp, các giá trị của các cột từ bảng bên phải sẽ làNULL
. - Hiệu suất:
LEFT JOIN
có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất. - Sử dụng với các điều kiện khác:
LEFT JOIN
có thể kết hợp với các điều kiện lọc khác nhưWHERE
,ORDER BY
, vàGROUP BY
để điều chỉnh kết quả.
Tóm tắt
- Mệnh đề
LEFT JOIN
kết hợp tất cả các hàng từ bảng bên trái với các hàng khớp từ bảng bên phải, và trả về các hàng từ bảng bên trái ngay cả khi không có khớp ở bảng bên phải. - Nếu không có khớp, các giá trị của các cột từ bảng bên phải sẽ là
NULL
. - Kết hợp
LEFT JOIN
với các điều kiện và mệnh đề khác để lấy dữ liệu đầy đủ và chính xác theo yêu cầu.
Mệnh đề RIGHT JOIN
(hoặc RIGHT OUTER JOIN
) trong SQL được sử dụng để kết hợp các hàng từ hai bảng dựa trên một điều kiện liên kết, tương tự như LEFT JOIN
. Tuy nhiên, khác với LEFT JOIN
, RIGHT JOIN
trả về tất cả các hàng từ bảng bên phải (bảng thứ hai) và các hàng khớp từ bảng bên trái (bảng đầu tiên). Nếu không có hàng khớp trong bảng bên trái, thì các giá trị trong các cột của bảng bên trái sẽ được điền là NULL
.
Cú pháp cơ bản
SELECT cot1, cot2, ... FROM bang1 RIGHT JOIN bang2 ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
bang1
,bang2
: Tên của các bảng muốn kết hợp.cot_khoa_ngoai
: Cột trongbang1
mà chứa giá trị liên kết.cot_khoa_chinh
: Cột trongbang2
mà chứa giá trị liên kết.
Ví dụ Cơ Bản
Giả sử bạn có hai bảng:
- Bảng
NhanVien
:
MaNhanVien
TenNhanVien
MaPhongBan
(khóa ngoại liên kết với bảngPhongBan
)
- Bảng
PhongBan
:
MaPhongBan
(khóa chính)TenPhongBan
Để lấy danh sách tất cả phòng ban cùng với tên nhân viên thuộc các phòng ban đó, kể cả những phòng ban không có nhân viên, bạn có thể sử dụng RIGHT JOIN
như sau:
SELECT NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM NhanVien RIGHT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu lệnh này sẽ trả về tất cả các phòng ban và tên nhân viên của họ. Nếu một phòng ban không có nhân viên, trường TenNhanVien
sẽ có giá trị NULL
.
Kết Hợp Với Nhiều Bảng
Bạn cũng có thể kết hợp nhiều bảng với RIGHT JOIN
. Ví dụ, nếu bạn có bảng DonHang
và muốn lấy tất cả các phòng ban và thông tin đơn hàng, kể cả những phòng ban không có đơn hàng:
- Bảng
DonHang
:
MaDonHang
MaNhanVien
(khóa ngoại liên kết với bảngNhanVien
)NgayDat
SELECT PhongBan.TenPhongBan, DonHang.MaDonHang, DonHang.NgayDat FROM PhongBan RIGHT JOIN NhanVien ON PhongBan.MaPhongBan = NhanVien.MaPhongBan RIGHT JOIN DonHang ON NhanVien.MaNhanVien = DonHang.MaNhanVien;
Câu lệnh này sẽ trả về tất cả các đơn hàng và thông tin phòng ban liên quan, kể cả những phòng ban không có đơn hàng.
Lưu Ý
- Kết quả không khớp:
RIGHT JOIN
đảm bảo rằng tất cả các hàng từ bảng bên phải được trả về, ngay cả khi không có sự khớp ở bảng bên trái. Nếu không có khớp, các giá trị của các cột từ bảng bên trái sẽ làNULL
. - Hiệu suất:
RIGHT JOIN
có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột được liên kết có chỉ mục để cải thiện hiệu suất. - Sử dụng với các điều kiện khác:
RIGHT JOIN
có thể kết hợp với các điều kiện lọc khác nhưWHERE
,ORDER BY
, vàGROUP BY
để điều chỉnh kết quả.
Tóm tắt
- Mệnh đề
RIGHT JOIN
kết hợp tất cả các hàng từ bảng bên phải với các hàng khớp từ bảng bên trái, và trả về các hàng từ bảng bên phải ngay cả khi không có khớp ở bảng bên trái. - Nếu không có khớp, các giá trị của các cột từ bảng bên trái sẽ là
NULL
. - Kết hợp
RIGHT JOIN
với các điều kiện và mệnh đề khác để lấy dữ liệu đầy đủ và chính xác theo yêu cầu.
Trong MySQL, không có mệnh đề FULL JOIN
(hoặc FULL OUTER JOIN
) như trong một số hệ quản trị cơ sở dữ liệu khác như SQL Server hay PostgreSQL. Tuy nhiên, bạn có thể đạt được hiệu ứng tương tự bằng cách kết hợp kết quả của LEFT JOIN
và RIGHT JOIN
thông qua một phép hợp (UNION).
Khái Niệm về FULL JOIN
FULL JOIN
(hoặc FULL OUTER JOIN
) kết hợp tất cả các hàng từ cả hai bảng, bao gồm các hàng không có sự khớp ở cả hai bảng. Nếu một bảng không có hàng khớp, các cột của bảng đó sẽ được điền là NULL
.
Tạo Kết Quả Tương Tự FULL JOIN
Trong MySQL
Để mô phỏng FULL JOIN
trong MySQL, bạn có thể sử dụng phép hợp (UNION) của LEFT JOIN
và RIGHT JOIN
. Đây là cách kết hợp kết quả từ LEFT JOIN
và RIGHT JOIN
để đảm bảo rằng tất cả các hàng từ cả hai bảng đều được bao gồm.
Cú Pháp Mô Phỏng FULL JOIN
SELECT bang1.*, bang2.* FROM bang1 LEFT JOIN bang2 ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh UNION SELECT bang1.*, bang2.* FROM bang1 RIGHT JOIN bang2 ON bang1.cot_khoa_ngoai = bang2.cot_khoa_chinh;
Ví Dụ
Giả sử bạn có hai bảng:
- Bảng
NhanVien
:
MaNhanVien
TenNhanVien
MaPhongBan
(khóa ngoại liên kết với bảngPhongBan
)
- Bảng
PhongBan
:
MaPhongBan
(khóa chính)TenPhongBan
Để lấy danh sách tất cả nhân viên và phòng ban, bao gồm cả những nhân viên không thuộc bất kỳ phòng ban nào và các phòng ban không có nhân viên, bạn có thể sử dụng cú pháp mô phỏng FULL JOIN
:
-- Kết quả của LEFT JOIN SELECT NhanVien.MaNhanVien, NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM NhanVien LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan UNION -- Kết quả của RIGHT JOIN SELECT NhanVien.MaNhanVien, NhanVien.TenNhanVien, PhongBan.TenPhongBan FROM NhanVien RIGHT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Giải Thích
LEFT JOIN
: Trả về tất cả các hàng từ bảng bên trái (NhanVien
) và các hàng khớp từ bảng bên phải (PhongBan
). Nếu không có khớp, các cột từ bảng bên phải sẽ làNULL
.RIGHT JOIN
: Trả về tất cả các hàng từ bảng bên phải (PhongBan
) và các hàng khớp từ bảng bên trái (NhanVien
). Nếu không có khớp, các cột từ bảng bên trái sẽ làNULL
.UNION
: Kết hợp kết quả từ hai truy vấn và loại bỏ các hàng trùng lặp.
Lưu Ý
- Hiệu suất: Kết hợp
LEFT JOIN
vàRIGHT JOIN
có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt khi làm việc với các bảng lớn. Đảm bảo rằng các cột liên kết có chỉ mục để cải thiện hiệu suất. - Dữ liệu trùng lặp: Khi sử dụng
UNION
, các hàng trùng lặp sẽ bị loại bỏ. Nếu bạn muốn giữ các hàng trùng lặp, hãy sử dụngUNION ALL
thay vìUNION
.
Tóm tắt
- MySQL không hỗ trợ trực tiếp
FULL JOIN
. Để đạt được hiệu ứng tương tự, bạn cần kết hợp kết quả củaLEFT JOIN
vàRIGHT JOIN
bằng cách sử dụngUNION
. - Sử dụng cú pháp mô phỏng
FULL JOIN
để bao gồm tất cả các hàng từ cả hai bảng, bao gồm cả các hàng không có khớp. - Lưu ý hiệu suất và các điều kiện khi sử dụng phương pháp này, đặc biệt với các bảng lớn.