Chuyển đến nội dung chính

UNION và UNION ALL trong SQL

Tìm hiểu sự khác biệt về kết quả và hiệu năng giữa UNION và UNION ALL: UNION loại bỏ trùng lặp còn UNION ALL giữ nguyên.
Đã cập nhật 5 thg 6, 2026  · 8 phút đọc

Trong thế giới SQL, khả năng kết hợp dữ liệu từ nhiều truy vấn là một yêu cầu cơ bản, và SQL cung cấp các hàm mạnh mẽ như UNIONUNION ALL để thực hiện điều này. 

Như bạn sẽ thấy, hiểu rõ những khác biệt tinh tế giữa các hàm UNIONUNION ALL trong SQL là điều bắt buộc để truy vấn và quản lý dữ liệu hiệu quả. Hướng dẫn này giải thích các điểm giống nhau, khác nhau và tình huống sử dụng điển hình bằng các bộ dữ liệu minh họa, giúp bạn tối ưu hóa các truy vấn SQL.

Câu trả lời ngắn gọn: SQL UNION vs. UNION ALL 

Khác biệt chính là UNION loại bỏ các bản ghi trùng lặp, còn UNION ALL giữ lại tất cả, kể cả trùng lặp. Sự khác biệt này không chỉ làm thay đổi số lượng hàng trong kết quả truy vấn mà còn ảnh hưởng đến hiệu năng.

Tính năng UNION UNION ALL
Trùng lặp Loại bỏ bản ghi trùng lặp Giữ tất cả bản ghi (bao gồm trùng lặp)
Hiệu năng Chậm hơn (Phải sắp xếp/băm dữ liệu để tìm trùng lặp) Nhanh hơn (Chỉ nối thêm dữ liệu vào kết quả)
Hoạt động Lý thuyết tập hợp (Hợp toán) Nối/Chồng kết quả

Hãy xét hai bảng mẫu, employees_2023employees_2024, đại diện cho hồ sơ nhân viên của hai năm khác nhau.

SELECT *
FROM employees_2023

employee_id

name

department

1

Alice

HR

2

Bob

IT

3

Charlie

Finance

SELECT *
FROM employees_2024

employee_id

name

department

2

Bob

IT

3

Charlie

Finance

4

David

Marketing

Giờ hãy kết hợp hai bảng bằng hàm UNION.

SELECT employee_id, name, department FROM employees_2023 
UNION 
SELECT employee_id, name, department FROM employees_2024;

employee_id

name

department

1

Alice

HR

2

Bob

IT

3

Charlie

Finance

4

David

Marketing

Trong kết quả này, các bản ghi trùng lặp đã bị loại bỏ. Bây giờ, hãy so sánh với kết quả khi dùng UNION ALL.

SELECT employee_id, name, department FROM employees_2023 
UNION ALL 
SELECT employee_id, name, department FROM employees_2024;

employee_id

name

department

1

Alive

HR

2

Bob

IT

3

Charlie

Finance

2

Bob

IT

3

Charlie

Finance

4

David

Marketing

Trong kết quả này, tất cả bản ghi đều được giữ lại và không loại bỏ trùng lặp.

UNION trong SQL là gì?

Hàm UNION kết hợp kết quả của hai hoặc nhiều truy vấn SELECT thành một tập kết quả duy nhất, đồng thời loại bỏ các hàng trùng lặp. Mỗi câu lệnh SELECT trong UNION phải có cùng số cột. Ngoài ra, chúng cần có kiểu dữ liệu tương tự và các cột phải ở cùng thứ tự. Để hiểu rõ hơn, hãy tạo hai bảng mẫu dưới đây.

CREATE TABLE sales_team (
    employee_id INT,
    employee_name VARCHAR(50)
);
INSERT INTO sales_team (employee_id, employee_name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');
CREATE TABLE support_team ( 
employee_id INT, 
employee_name VARCHAR(50)
 );
INSERT INTO support_team (employee_id, employee_name) VALUES 
(3, 'Charlie'), 
(4, 'David'), 
(5, 'Eve');

Đoạn mã trên sẽ tạo hai bảng chúng ta dùng trong hướng dẫn này, lần lượt là sales_teamsupport_team. Bạn có thể xem các bảng bằng đoạn mã dưới đây.

SELECT * 
FROM sales_team

Records in the <code624

Các bản ghi trong bảng sales_team. Ảnh: Tác giả 

SELECT * 
FROM support_team

Records in the <code624

Các bản ghi trong bảng support_team. Ảnh: Tác giả 

Đây là các bảng nhỏ với ba bản ghi mỗi bảng và tên cột tự nói lên ý nghĩa. Giờ chúng ta đã có hai bảng, hãy áp dụng hàm UNION.

SELECT employee_id, employee_name
    FROM sales_team
   UNION
SELECT employee_id, employee_name
    FROM support_team;

Output from the <code624

Kết quả của hàm UNION. Ảnh: Tác giả 

Bạn có thể thấy bản ghi trùng lặp của employee_id có giá trị 3 đã bị loại bỏ. 

Các trường hợp sử dụng UNION trong SQL là gì?

Dưới đây là một số trường hợp sử dụng phổ biến của hàm UNION.

  • Kết hợp kết quả từ các bảng khác nhau: Khi bạn muốn kết hợp dữ liệu từ nhiều bảng và đảm bảo không có bản ghi trùng lặp, UNION là lựa chọn phù hợp.

  • Xử lý các nguồn dữ liệu khác nhau: UNION hữu ích khi kết hợp các bảng từ những nguồn dữ liệu khác nhau. 

  • Loại bỏ trùng lặp giữa các truy vấn: Khi bạn muốn đảm bảo tính duy nhất của tập kết quả kết hợp, hãy dùng UNION.

UNION ALL trong SQL là gì?

Hàm UNION ALL kết hợp kết quả của hai hoặc nhiều truy vấn SELECT, bao gồm tất cả các hàng trùng lặp. Hàm này nhanh hơn UNION vì không tốn công loại bỏ trùng lặp.

SELECT employee_id, employee_name
    FROM sales_team
UNION ALL
SELECT employee_id, employee_name
    FROM support_team;

Output from the <code624

Kết quả của hàm UNION ALL. Ảnh: Tác giả 

Bạn có thể thấy trong trường hợp này, các bản ghi trùng lặp được lặp lại và không bị loại bỏ.

Các trường hợp sử dụng UNION ALL trong SQL là gì?

Dưới đây là một số trường hợp sử dụng phổ biến của hàm UNION ALL.

  • Kết hợp kết quả có trùng lặp: Dùng UNION ALL khi bạn cần kết hợp kết quả từ nhiều truy vấn và giữ nguyên tất cả các hàng trùng lặp.
  • Cân nhắc hiệu năng: UNION ALL tiết kiệm thời gian hơn UNION vì không cần bước bổ sung để loại bỏ trùng lặp.
  • Tổng hợp dữ liệu theo giai đoạn: Khi tổng hợp dữ liệu từ các giai đoạn hoặc nguồn khác nhau và bạn cần giữ lại các mục trùng lặp, hãy ưu tiên UNION ALL.
  • Báo cáo và phân tích: Phù hợp cho báo cáo khi mọi bản ghi, bao gồm cả trùng lặp, đều cần thiết.

UNION và UNION ALL: Điểm giống và khác

Hãy tạo một bảng tóm tắt về các điểm giống và khác. 

Tính năng

UNION

UNION ALL

Các hàng trùng lặp

Bị loại bỏ

Được giữ lại

Hiệu năng

Chậm hơn

Nhanh hơn

Trường hợp sử dụng

Khi bạn cần bản ghi duy nhất

Khi bạn cần tất cả bản ghi

Kích thước kết quả

Nhỏ hơn

Lớn hơn

Khác biệt cú pháp UNION và UNION ALL giữa các biến thể SQL 

Trong khi cú pháp cơ bản giống nhau giữa các biến thể SQL khác nhau, vẫn có những khác biệt nhỏ tùy nền tảng. Nếu xem mã, trên hầu hết các nền tảng như SQL Server, Oracle, MySQL, PostgreSQL hoặc BigQuery, mã sẽ trông tương tự như dưới đây. 

SELECT employee_id, employee_name
    FROM sales_team
UNION ALL
SELECT employee_id, employee_name
    FROM support_team;

Các lệnh cơ bản trong các biến thể SQL này vẫn giống nhau, với một số sắc thái và khác biệt:

  1. Xử lý NULL và đối chiếu chuỗi (collation): Các biến thể SQL có thể có quy tắc khác nhau khi xử lý giá trị NULL và đối chiếu chuỗi.
  2. Tối ưu hóa hiệu năng: Tối ưu và hiệu quả thực thi có thể khác nhau.
  3. Xử lý lỗi và cảnh báo: Các biến thể có thể xử lý lỗi và cảnh báo khác nhau khi dùng các hàm này.
  4. Hàm và tính năng đặc thù nền tảng: Một số biến thể có thể cung cấp thêm hàm/tính năng dùng kèm UNIONUNION ALL cho các kịch bản phức tạp hơn.

Cú pháp khác biệt đáng kể trong trường hợp PySpark, vốn hoạt động trên môi trường phân tán. Mã dưới đây giả định df1df2 là tên hai DataFrame chứa hai bảng chúng ta đã tạo ở trên:

df1.union(df2)

3 quy tắc và lỗi thường gặp khi dùng SQL UNION

Mặc dù UNIONUNION ALL rất mạnh mẽ, chúng lại khắt khe về cú pháp. Nếu truy vấn của bạn báo lỗi, rất có thể bạn đã vi phạm một trong ba quy tắc vàng sau.

1. Số lượng cột không khớp

Lỗi thường gặp nhất là số lượng cột không khớp. Để kết hợp hai tập dữ liệu, "hình dạng" của bảng phải giống hệt nhau. Bạn không thể chồng một bảng có 3 cột lên trên một bảng có 2 cột.

Lỗi:

-- This will fail because the column counts do not match
SELECT employee_id, name, department 
FROM employees_2023
UNION
SELECT employee_id, name 
FROM employees_2024;

Cách khắc phục: Đảm bảo cả hai câu lệnh SELECT yêu cầu đúng cùng số lượng cột. Nếu bảng thứ hai thiếu dữ liệu (như department), bạn có thể chọn NULL làm giá trị giữ chỗ để khớp số cột:

SELECT employee_id, name, department FROM employees_2023
UNION
SELECT employee_id, name, NULL as department FROM employees_2024;

2. Tương thích kiểu dữ liệu

SQL kết hợp kết quả dựa trên vị trí, không phải tên cột. Kiểu dữ liệu của cột đầu tiên trong truy vấn thứ nhất phải khớp (hoặc tương thích) với kiểu dữ liệu của cột đầu tiên trong truy vấn thứ hai.

Lỗi: Nếu bạn vô tình tráo thứ tự cột, SQL sẽ cố chồng một Số (ID) lên trên một Chuỗi (Tên), gây lỗi chuyển đổi kiểu dữ liệu.

-- This fails because Column 1 (ID - INT) cannot combine with Column 1 (Name - VARCHAR)
SELECT employee_id, name FROM employees_2023
UNION
SELECT name, employee_id FROM employees_2024;

Cách khắc phục: Luôn kiểm tra rằng các cột được liệt kê theo đúng cùng thứ tự trong mọi câu lệnh SELECT trong UNION.

3. Giới hạn của ORDER BY

Điểm dễ gây nhầm lẫn là vị trí đặt mệnh đề ORDER BY. Bạn không thể sắp xếp các truy vấn con riêng lẻ bên trong một phép UNION; bạn chỉ có thể sắp xếp kết quả kết hợp cuối cùng.

Lỗi: Dùng ORDER BY trước truy vấn cuối sẽ gây lỗi cú pháp.

-- INCORRECT SYNTAX
SELECT employee_id, name FROM employees_2023 
ORDER BY employee_id -- You cannot sort here!
UNION
SELECT employee_id, name FROM employees_2024;

Cách khắc phục: Đặt mệnh đề ORDER BY ở cuối cùng của truy vấn. Điều này áp dụng sắp xếp cho toàn bộ tập kết quả kết hợp.

-- CORRECT SYNTAX
SELECT employee_id, name FROM employees_2023
UNION
SELECT employee_id, name FROM employees_2024
ORDER BY employee_id; -- Sorts the final result

Lời kết

Điều quan trọng là hiểu cách áp dụng UNION so với UNION ALL để quản lý dữ liệu hiệu quả bằng SQL. Nếu UNION chỉ chọn các bản ghi khác biệt, thì UNION ALL chọn tất cả, ảnh hưởng đến hiệu năng và kích thước tập kết quả. Hãy dùng kiến thức này để chọn hàm phù hợp với yêu cầu cụ thể của bạn. 

Để học thêm, bạn có thể tham khảo các nguồn sau:

  • Nhập môn SQL: Học cách tạo và truy vấn cơ sở dữ liệu quan hệ bằng SQL.
  • Những điều căn bản về SQL: Nắm vững các kỹ năng SQL nền tảng để tương tác và truy vấn dữ liệu của bạn. 
  • Chứng chỉ SQL Associate: Chứng minh khả năng SQL của bạn bằng cách trích xuất dữ liệu phù hợp từ cơ sở dữ liệu và dùng nó để trả lời các câu hỏi dữ liệu phổ biến.
  • SQL trung cấp: Với khóa học thực hành này, bạn sẽ học mọi thứ cần thiết để phân tích dữ liệu bằng chính mã SQL của mình ngay hôm nay.

Vikash Singh's photo
Author
Vikash Singh
LinkedIn

Chuyên gia dày dạn kinh nghiệm trong khoa học dữ liệu, trí tuệ nhân tạo, phân tích và chiến lược dữ liệu.

Câu hỏi thường gặp

Sự khác biệt chính giữa SQL UNION và UNION ALL là gì?

UNION loại bỏ các bản ghi trùng lặp, còn UNION ALL giữ lại tất cả các bản ghi trùng lặp.

Có sự khác biệt về hiệu năng giữa UNION và UNION ALL không?

Có, UNION thường chậm hơn vì nó loại bỏ trùng lặp.

Có trường hợp cụ thể nào nên ưu tiên dùng UNION ALL hơn UNION không?

UNION ALL được ưu tiên khi bạn cần tất cả bản ghi, bao gồm cả trùng lặp, như trong báo cáo và phân tích.

Khi nào tôi nên dùng SQL UNION thay vì UNION ALL?

Hãy dùng UNION khi bạn cần một tập kết quả kết hợp không có trùng lặp.

Các biến thể SQL khác nhau ảnh hưởng thế nào đến việc dùng UNION và UNION ALL?

Mặc dù cú pháp cơ bản nhất quán, vẫn có khác biệt nhỏ về hiệu năng, cách xử lý NULL và đối chiếu giữa các biến thể SQL.

Chủ đề

Học SQL với DataCamp

Courses

Xử lý dữ liệu trong SQL

4 giờ
324.1K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow