Toán tử UNION trong MySQL

Toán tử UNION trong MySQL
Toán tử UNION trong MySQL

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 BYLIMIT 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
CEO Bùi Tấn Lực | Founder Web Mới
Bùi Tấn Lực
Tìm hiểu về CEO Bùi Tấn Lực, Founder Web Mới với nhiều năm kinh nghiệm trong lĩnh vực phát triển website, SEO và chia sẻ kiến thức công nghệ
Chia sẻ nội dung đánh giá của bạn về Toán tử UNION trong MySQL
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 *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Đăng ký tư vấn thiết kế website
Tìm hiểu 1 năm không bằng lắng nghe 1 câu tư vấn