Mệnh đề RIGHT JOIN trong MySQL
Bùi Tấn Lực
- 915
- 25/09/2025
Chức năng của Mệnh đề RIGHT JOIN trong MySQL
Mệnh đề RIGHT JOIN trong MySQL dùng để lấy các hàng có liên quan ở bảng bên phải kèm với các thông tin liên quan ở bảng bên trái.
Cú pháp của Mệnh đề RIGHT JOIN trong MySQL
select bảng_bêntrái.cộtbêntrái, bảng_bênphải.cộtbênphải, bảng_bênphải.cộtbênphải from bảng_bêntrái RIGHT JOIN bảng_bênphải ON bảng_bêntrái.idkhoáchính = bảng_bênphải.idkhóaphụ;
Code Mệnh đề RIGHT JOIN trong MySQL
select tb_khachhang.ten,tb_donhang.madonhang,tb_donhang.idsanpham from tb_khachhang RIGHT JOIN tb_donhang ON tb_khachhang.id = tb_donhang.idkhachhang;
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'IhNRcn9n'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Truy vấn bảng
$sql = "select tb_khachhang.ten,tb_donhang.madonhang,tb_donhang.idsanpham from tb_khachhang RIGHT JOIN tb_donhang ON tb_khachhang.id = tb_donhang.idkhachhang";
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// Kết quả truy vấn trả về mảng
$ketqua = mysql_query($sql,$conn);
if(!$ketqua){
die('Không thể lấy dữ liệu: ' . mysql_error());
}
// Dùng vòng lặp để lấy ra từng hàng trong bảng
while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
echo "Tên sản phẩm: {$row['ten']} <br> ".
"madonhang : {$row['madonhang']} <br> ".
"idsanpham : {$row['idsanpham']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
Tên sản phẩm: Bùi Đan Trúc Quỳnh
madonhang : DH01
idsanpham : 1
--------------------------------
Tên sản phẩm: Bùi Đan Trúc Quỳnh
madonhang : DH01
idsanpham : 2
--------------------------------
Tên sản phẩm: Nguyễn Thảo Nhật Hạ
madonhang : DH02
idsanpham : 2
--------------------------------
Thực hành RIGHT JOIN trong MySQL qua các tình huống thực tế
RIGHT JOIN phát huy tác dụng khi cần giữ lại toàn bộ bản ghi của bảng nằm bên phải, kể cả những bản ghi chưa có dữ liệu tương ứng ở bảng bên trái. Khi kết hợp với các điều kiện lọc và sắp xếp, RIGHT JOIN có thể xử lý nhiều tình huống truy vấn dữ liệu thực tế.
RIGHT JOIN để tìm dữ liệu có và không có dữ liệu liên quan
Một ứng dụng phổ biến là kiểm tra bảng bên phải có những bản ghi nào đã liên kết với bảng bên trái và bản ghi nào chưa có dữ liệu tương ứng. Chẳng hạn, bảng don_hang lưu đơn hàng còn bảng khach_hang lưu thông tin khách hàng.
Nếu muốn lấy toàn bộ khách hàng, đồng thời hiển thị đơn hàng nếu có, có thể sử dụng RIGHT JOIN như sau:
SELECT khach_hang.id, khach_hang.ho_ten, don_hang.id AS ma_don
FROM don_hang
RIGHT JOIN khach_hang
ON don_hang.khach_hang_id = khach_hang.id;
Kết quả vẫn giữ đầy đủ khách hàng trong bảng khach_hang. Với khách hàng chưa từng phát sinh đơn hàng, các cột lấy từ bảng don_hang sẽ có giá trị NULL. Đây là cách hữu ích để phát hiện những dữ liệu chưa phát sinh quan hệ.
Nếu chỉ muốn tìm khách hàng chưa có đơn hàng, có thể kết hợp RIGHT JOIN với điều kiện IS NULL:
SELECT khach_hang.id, khach_hang.ho_ten
FROM don_hang
RIGHT JOIN khach_hang
ON don_hang.khach_hang_id = khach_hang.id
WHERE don_hang.id IS NULL;
Cách này phù hợp khi cần lập danh sách khách hàng chưa mua hàng, sản phẩm chưa phát sinh giao dịch hoặc các bản ghi đang thiếu dữ liệu liên kết.
Kết hợp RIGHT JOIN với WHERE và ORDER BY
RIGHT JOIN có thể kết hợp với WHERE để lọc kết quả và ORDER BY để sắp xếp dữ liệu. Tuy nhiên, cần đặt điều kiện đúng vị trí để không vô tình làm mất các bản ghi mà RIGHT JOIN có nhiệm vụ giữ lại.
Ví dụ, lấy toàn bộ khách hàng và chỉ hiển thị các đơn hàng có giá trị từ 500000 trở lên:
SELECT khach_hang.ho_ten, don_hang.id AS ma_don, don_hang.tong_tien
FROM don_hang
RIGHT JOIN khach_hang
ON don_hang.khach_hang_id = khach_hang.id
WHERE don_hang.tong_tien >= 500000
ORDER BY don_hang.tong_tien DESC;
Điểm cần lưu ý là điều kiện trong WHERE được áp dụng sau khi JOIN tạo ra kết quả. Vì vậy, những khách hàng không có đơn hàng sẽ có NULL ở cột tong_tien và không vượt qua điều kiện lọc trên.
Nếu mục tiêu là vẫn giữ khách hàng chưa có đơn hàng nhưng chỉ ghép những đơn hàng từ 500000 trở lên, điều kiện phù hợp hơn là đưa vào phần ON:
SELECT khach_hang.ho_ten, don_hang.id AS ma_don, don_hang.tong_tien
FROM don_hang
RIGHT JOIN khach_hang
ON don_hang.khach_hang_id = khach_hang.id
AND don_hang.tong_tien >= 500000
ORDER BY don_hang.tong_tien DESC;
Sự khác biệt này rất quan trọng khi truy vấn cần bảo toàn toàn bộ dữ liệu của bảng bên phải.
So sánh RIGHT JOIN với LEFT JOIN trong cùng một truy vấn
RIGHT JOIN và LEFT JOIN thực chất khác nhau chủ yếu ở phía bảng được ưu tiên giữ lại. Với cùng một mối quan hệ, RIGHT JOIN có thể chuyển thành LEFT JOIN bằng cách đổi vị trí hai bảng.
SELECT don_hang.id, khach_hang.ho_ten
FROM don_hang
RIGHT JOIN khach_hang
ON don_hang.khach_hang_id = khach_hang.id;
Có thể viết lại tương đương bằng LEFT JOIN:
SELECT don_hang.id, khach_hang.ho_ten
FROM khach_hang
LEFT JOIN don_hang
ON don_hang.khach_hang_id = khach_hang.id;
Hai cách trên cho cùng mục đích: giữ toàn bộ bản ghi của khach_hang và ghép dữ liệu từ don_hang khi có quan hệ phù hợp.
Trong thực tế, LEFT JOIN thường được sử dụng nhiều hơn vì cách đọc truy vấn trực quan: bảng chính đặt bên trái và bảng cần ghép đặt bên phải. Tuy nhiên, hiểu RIGHT JOIN vẫn rất cần thiết khi gặp truy vấn có sẵn hoặc khi làm việc với cấu trúc dữ liệu mà bảng cần bảo toàn nằm ở phía bên phải.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Mệnh đề RIGHT JOIN trong MySQL.
Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *