Toán tử UNION trong MySQL
Bùi Tấn Lực
- 905
- 23/09/2025
Chức năng của Toán tử UNION trong MySQL
Toán tử UNION trong MySQL dùng để nối 2 hoặc nhiều câu lệnh select sau đó lấy các cột giống nhau của các bảng và loại bỏ các hàng trùng lặp, các cột khi select phải có thứ tự giống nhau và kiểu dữ liệu cũng giống nhau, các số lượng cột của các câu lệnh select phải giống nhau.
Code Toán tử UNION trong MySQL
Toán tử UNION một cột trong MySQL
select tinhthanh from tb_daily UNION select tinhthanh from tb_khachhang;
<?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 tinhthanh from tb_daily UNION select tinhthanh from tb_khachhang";
// 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ỉnh/Thành: {$row['tinhthanh']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
Tỉnh/Thành: Hồ Chí Minh
--------------------------------
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tỉnh/Thành: Đà Nẳng
--------------------------------
Toán tử UNION hai cột trong MySQL
select xaphuong,tinhthanh from tb_daily UNION select xaphuong,tinhthanh from tb_khachhang;
<?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 xaphuong,tinhthanh from tb_daily UNION select xaphuong,tinhthanh from tb_khachhang";
// 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 "Xã/Phường: {$row['xaphuong']} <br> ".
"Tỉnh/Thành: {$row['tinhthanh']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
Xã/Phường: Tân Vĩnh Lộc
Tỉnh/Thành: Hồ Chí Minh
--------------------------------
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Xã/Phường: Long Phụng
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Xã/Phường: Đông Dương
Tỉnh/Thành: Đà Nẳng
--------------------------------
Toán tử UNION ba cột trong MySQL
select ten,xaphuong,tinhthanh from tb_daily UNION select ten,xaphuong,tinhthanh from tb_khachhang;
<?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 ten,xaphuong,tinhthanh from tb_daily UNION select ten,xaphuong,tinhthanh from tb_khachhang";
// 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: {$row['ten']} <br> ".
"Xã/Phường: {$row['xaphuong']} <br> ".
"Tỉnh/Thành: {$row['tinhthanh']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
Tên: Bùi Tấn Lực
Xã/Phường: Tân Vĩnh Lộc
Tỉnh/Thành: Hồ Chí Minh
--------------------------------
Tên: Trần Thị Vân
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên: Nguyễn Thùy Dung
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên: Bùi Thị Nhím
Xã/Phường: Long Phụng
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên: Nguyễn Thị Cherry
Xã/Phường: Long Phụng
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên: Bùi Đan Trúc Quỳnh
Xã/Phường: Đông Dương
Tỉnh/Thành: Đà Nẳng
--------------------------------
Tên: Nguyễn Thảo Nhật Hạ
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Toán tử UNION phân bảng trong MySQL
Ở đây mình AS để đặt tên cứng cho cột lấy ra, tên cứng đó sẽ theo từng hàng của mỗi bảng:
select 'Đại lý' AS tenbang,xaphuong,tinhthanh from tb_daily UNION select 'Khách hàng' AS tenbang,xaphuong,tinhthanh from tb_khachhang;
<?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 'Đại lý' AS tenbang,xaphuong,tinhthanh from tb_daily UNION select 'Khách hàng' AS tenbang,xaphuong,tinhthanh from tb_khachhang";
// 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 Bảng: {$row['tenbang']} <br> ".
"Xã/Phường: {$row['xaphuong']} <br> ".
"Tỉnh/Thành: {$row['tinhthanh']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
Tên Bảng: Đại lý
Xã/Phường: Tân Vĩnh Lộc
Tỉnh/Thành: Hồ Chí Minh
--------------------------------
Tên Bảng: Đại lý
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên Bảng: Đại lý
Xã/Phường: Long Phụng
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Tên Bảng: Khách hàng
Xã/Phường: Đông Dương
Tỉnh/Thành: Đà Nẳng
--------------------------------
Tên Bảng: Khách hàng
Xã/Phường: Mỏ Cày
Tỉnh/Thành: Quảng Ngãi
--------------------------------
Ứng dụng UNION MySQL trong truy vấn dữ liệu thực tế
UNION phát huy hiệu quả khi cần gom kết quả từ nhiều câu lệnh SELECT thành một tập dữ liệu thống nhất. Cách này phù hợp với các hệ thống có dữ liệu được chia theo thời gian, nhóm nghiệp vụ hoặc lưu ở nhiều bảng có cấu trúc tương đồng.
Gộp dữ liệu từ nhiều bảng có cấu trúc tương đồng
Khi các bảng có những cột cần lấy tương ứng nhau, UNION có thể đưa dữ liệu từ nhiều nguồn về cùng một kết quả. Các câu lệnh SELECT phải trả về cùng số lượng cột và các kiểu dữ liệu ở những vị trí tương ứng cần tương thích.
SELECT ma_don_hang, ma_khach_hang, tong_tien
FROM don_hang_2025
UNION
SELECT ma_don_hang, ma_khach_hang, tong_tien
FROM don_hang_2026;
Cách làm này hữu ích khi dữ liệu được tách thành các bảng riêng, chẳng hạn mỗi năm một bảng. Thay vì xử lý từng bảng độc lập, truy vấn có thể tạo ra một danh sách chung để tiếp tục lọc, sắp xếp hoặc phân tích.
Kết hợp UNION với WHERE, ORDER BY và LIMIT
UNION có thể kết hợp với các mệnh đề xử lý dữ liệu để tạo truy vấn linh hoạt hơn. WHERE thường được đặt trong từng câu SELECT nhằm lọc dữ liệu trước khi gộp, trong khi ORDER BY và LIMIT thường được dùng cho toàn bộ kết quả sau khi các phần dữ liệu đã được kết hợp.
SELECT ma_don_hang, tong_tien
FROM don_hang_2025
WHERE tong_tien >= 1000000
UNION
SELECT ma_don_hang, tong_tien
FROM don_hang_2026
WHERE tong_tien >= 1000000
ORDER BY tong_tien DESC
LIMIT 10;
Điểm cần chú ý là ORDER BY ở cuối truy vấn sẽ sắp xếp tập kết quả sau UNION. Nhờ đó có thể dễ dàng lấy ra một số lượng bản ghi giới hạn theo tiêu chí chung thay vì chỉ giới hạn từng bảng riêng lẻ.
Xử lý dữ liệu trùng lặp sau khi UNION
UNION mặc định loại bỏ các dòng trùng nhau trong kết quả cuối cùng. Ngược lại, UNION ALL giữ nguyên toàn bộ dòng được trả về, kể cả khi cùng một dữ liệu xuất hiện ở nhiều nguồn.
SELECT ma_khach_hang
FROM khach_hang_2025
UNION
SELECT ma_khach_hang
FROM khach_hang_2026;
Trong trường hợp mục tiêu là tạo danh sách khách hàng duy nhất, UNION là lựa chọn phù hợp. Nếu cần giữ đầy đủ số lần xuất hiện để thống kê hoặc đối chiếu dữ liệu, UNION ALL sẽ phù hợp hơn và thường tránh được bước loại bỏ bản ghi trùng.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Toán tử UNION 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 *