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ư UNION và UNION 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 UNION và UNION 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_2023 và employees_2024, đại diện cho hồ sơ nhân viên của hai năm khác nhau.
SELECT employee_id, name, department FROM employees_2023
UNIONSELECT employee_id, name, department FROM employees_2024;Được hỗ trợ bởi
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
UNIONALLSELECT employee_id, name, department FROM employees_2024;Được hỗ trợ bởi
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.
Đâ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
UNIONSELECT employee_id, employee_name
FROM support_team;Được hỗ trợ bởi
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
UNIONALLSELECT employee_id, employee_name
FROM support_team;Được hỗ trợ bởi
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
UNIONALLSELECT employee_id, employee_name
FROM support_team;Được hỗ trợ bởi
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:
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.
Tối ưu hóa hiệu năng: Tối ưu và hiệu quả thực thi có thể khác nhau.
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.
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 UNION và UNION 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 df1 và df2 là tên hai DataFrame chứa hai bảng chúng ta đã tạo ở trên:
Mặc dù UNION và UNION 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 matchSELECT employee_id, name, department
FROM employees_2023
UNIONSELECT employee_id, name
FROM employees_2024;Được hỗ trợ bởi
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
UNIONSELECT employee_id, name,NULLas department FROM employees_2024;Được hỗ trợ bởi
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
UNIONSELECT name, employee_id FROM employees_2024;Được hỗ trợ bởi
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 SYNTAXSELECT employee_id, name FROM employees_2023
ORDERBY employee_id -- You cannot sort here!UNIONSELECT employee_id, name FROM employees_2024;Được hỗ trợ bởi
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 SYNTAXSELECT employee_id, name FROM employees_2023
UNIONSELECT employee_id, name FROM employees_2024
ORDERBY employee_id;-- Sorts the final resultĐược hỗ trợ bởi
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.
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.
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ư
UNIONvàUNION 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
UNIONvàUNION ALLtrong 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à
UNIONloại bỏ các bản ghi trùng lặp, cònUNION ALLgiữ 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.Hãy xét hai bảng mẫu,
employees_2023vàemployees_2024, đại diện cho hồ sơ nhân viên của hai năm khác nhau.employee_id
name
department
1
Alice
HR
2
Bob
IT
3
Charlie
Finance
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.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.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
UNIONkết hợp kết quả của hai hoặc nhiều truy vấnSELECTthà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ệnhSELECTtrongUNIONphả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.Đ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_teamvàsupport_team. Bạn có thể xem các bảng bằng đoạn mã dưới đây.Các bản ghi trong bảng sales_team. Ảnh: Tác giả
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.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_idcó 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,
UNIONlà lựa chọn phù hợp.Xử lý các nguồn dữ liệu khác nhau:
UNIONhữ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 ALLkết hợp kết quả của hai hoặc nhiều truy vấnSELECT, bao gồm tất cả các hàng trùng lặp. Hàm này nhanh hơnUNIONvì không tốn công loại bỏ trùng lặp.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.UNION ALLkhi 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.UNION ALLtiết kiệm thời gian hơnUNIONvì không cần bước bổ sung để loại bỏ trùng lặp.UNION ALL.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.
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:
NULLvà đối chiếu chuỗi.UNIONvàUNION ALLcho 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
df1vàdf2là tên hai DataFrame chứa hai bảng chúng ta đã tạo ở trên:3 quy tắc và lỗi thường gặp khi dùng SQL UNION
Mặc dù
UNIONvàUNION ALLrấ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:
Cách khắc phục: Đảm bảo cả hai câu lệnh
SELECTyê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ọnNULLlàm giá trị giữ chỗ để khớp số cột: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.
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
SELECTtrongUNION.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épUNION; 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 BYtrước truy vấn cuối sẽ gây lỗi cú pháp.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.Lời kết
Điều quan trọng là hiểu cách áp dụng
UNIONso vớiUNION ALLđể quản lý dữ liệu hiệu quả bằng SQL. NếuUNIONchỉ chọn các bản ghi khác biệt, thìUNION ALLchọ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: