Câu hỏi Sự khác nhau giữa UNION và UNION ALL là gì?


Sự khác biệt giữa UNION và UNION ALL?


1116
2017-09-08 15:19


gốc


Liên kết này có thể giúp bạn codefari.com/2015/10/what-is-difference-between-union-and.html - Singh


Các câu trả lời:


UNION loại bỏ các bản ghi trùng lặp (trong đó tất cả các cột trong các kết quả đều giống nhau), UNION ALL không làm.

Có hiệu suất khi sử dụng UNION thay vì UNION ALL, vì máy chủ cơ sở dữ liệu phải thực hiện công việc bổ sung để loại bỏ các hàng trùng lặp, nhưng thông thường bạn không muốn các bản sao (đặc biệt là khi phát triển các báo cáo).

Ví dụ UNION:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Kết quả: 

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

UNION ALL ví dụ:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

Kết quả:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

1373
2017-10-14 16:09



Hàm ý của điều này, là sự kết hợp kém hiệu quả hơn nhiều vì nó phải quét kết quả để sao y - Matthew Watson
UNION ALL thực sự sẽ biểu diễn nhiều hơn, đặc biệt là do thiếu loại phân biệt. Thực hành chung của tôi là sử dụng UNION ALL trừ khi tôi đặc biệt muốn các bản sao. - Adam Caviness
Chỉ cần nhận thấy rằng có rất nhiều ý kiến ​​tốt / câu trả lời ở đây, vì vậy tôi bật cờ wiki và thêm một lưu ý về hiệu suất ... - Jim Harte
UNION ALL có thể chậm hơn UNION trong các trường hợp trong thế giới thực, nơi mạng như internet, là một nút cổ chai. Chi phí chuyển nhiều hàng trùng lặp có thể vượt quá lợi ích thời gian thực hiện truy vấn. Điều này phải được phân tích theo từng trường hợp cụ thể. - Charles Burns
Dường như cũng có tác động đến thứ tự sắp xếp mặc định. Ví dụ. 'chọn 9 công đoàn chọn 8 công đoàn chọn 7' trả về kết quả theo thứ tự ngược lại để 'chọn 9 công đoàn tất cả chọn 8 công đoàn tất cả chọn 7'. - Nine Tails


Cả hai UNION và UNION đều kết nối hai kết quả SQL khác nhau. Chúng khác nhau theo cách chúng xử lý các bản sao.

  • UNION thực hiện DISTINCT trên tập kết quả, loại bỏ bất kỳ hàng trùng lặp nào.

  • UNION ALL không loại bỏ các bản sao và do đó nhanh hơn UNION.

Chú thích: Trong khi sử dụng lệnh này, tất cả các cột được chọn cần phải có cùng kiểu dữ liệu.

Ví dụ: Nếu chúng tôi có hai bảng, 1) Nhân viên và 2) Khách hàng

  1. Dữ liệu bảng nhân viên:

enter image description here

  1. Dữ liệu bảng khách hàng:

enter image description here

  1. Ví dụ UNION (Nó loại bỏ tất cả các bản ghi trùng lặp):

enter image description here

  1. UNION ALL Example (Nó chỉ nối các bản ghi, không loại bỏ các bản sao, vì vậy nó nhanh hơn UNION):

enter image description here


235
2017-09-18 12:34



"tất cả các cột được chọn cần phải có cùng kiểu dữ liệu" - thực ra, mọi thứ không nghiêm ngặt (không phải là một điều tốt từ quan điểm mô hình quan hệ!). Chuẩn SQL nói tương ứng của chúng bộ mô tả cột phải giống nhau trừ tên. - onedaywhen


UNION loại bỏ các bản sao, trong khi UNION ALL không làm.

Để xóa các bản sao, tập hợp kết quả phải được sắp xếp và điều này có thể có tác động đến hiệu suất của UNION, tùy thuộc vào khối lượng dữ liệu đang được sắp xếp và các thiết lập của các tham số RDBMS khác nhau (Đối với Oracle PGA_AGGREGATE_TARGET với WORKAREA_SIZE_POLICY=AUTO hoặc là SORT_AREA_SIZE và SOR_AREA_RETAINED_SIZE nếu WORKAREA_SIZE_POLICY=MANUAL ).

Về cơ bản, sắp xếp nhanh hơn nếu nó có thể được thực hiện trong bộ nhớ, nhưng cùng một cảnh báo về khối lượng dữ liệu được áp dụng.

Tất nhiên, nếu bạn cần dữ liệu được trả lại mà không có bản sao thì bạn phải sử dụng UNION, tùy thuộc vào nguồn dữ liệu của bạn.

Tôi đã nhận xét về bài đăng đầu tiên để đủ điều kiện nhận xét "kém hiệu quả hơn nhiều", nhưng không đủ danh tiếng (điểm) để làm như vậy.


42
2017-09-08 17:10



"Để loại bỏ các bản sao, tập hợp kết quả phải được sắp xếp" - có thể bạn có một nhà cung cấp cụ thể trong đầu nhưng không có thẻ nhà cung cấp cụ thể nào về câu hỏi. Ngay cả khi có, bạn có thể chứng minh rằng các bản sao không thể bị xóa mà không cần phân loại? - onedaywhen
khác biệt sẽ "ngầm" sắp xếp các kết quả, bởi vì loại bỏ các bản sao nhanh hơn trên một tập hợp được sắp xếp. điều này không có nghĩa là kết quả trả về thực sự được sắp xếp theo cách đó, nhưng trong hầu hết các trường hợp riêng biệt (và do đó, UNION) sẽ phân loại nội bộ các kết quả. - DevilSuichiro


Trong ORACLE: UNION không hỗ trợ các loại cột BLOB (hoặc CLOB), UNION ALL thực hiện.


27
2017-09-08 15:20





Sự khác biệt cơ bản giữa UNION và UNION ALL là hoạt động nghiệp đoàn loại bỏ các hàng trùng lặp khỏi tập hợp kết quả nhưng tất cả các công đoàn trả về tất cả các hàng sau khi tham gia.

từ http://zengin.wordpress.com/2007/07/31/union-vs-union-all/


18
2017-08-13 00:03





Bạn có thể tránh trùng lặp và vẫn chạy nhanh hơn nhiều so với UNION DISTINCT (thực sự giống như UNION) bằng cách chạy truy vấn như sau:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Lưu ý AND a!=X phần. Đây là UNION nhanh hơn nhiều.


12
2018-06-06 09:55



Điều này sẽ bỏ qua các hàng và do đó không tạo ra kết quả mong đợi nếu chứa các giá trị NULL. Ngoài ra, nó vẫn không trả lại kết quả tương tự như UNION - - UNION cũng loại bỏ các bản sao được trả về bởi các truy vấn phụ, trong khi cách tiếp cận của bạn sẽ không. - Frank Schmitt
@FrankSchmitt - cảm ơn câu trả lời này; bit này về các truy vấn con là chính xác những gì tôi muốn biết! - Doradus


Chỉ cần thêm hai xu của tôi vào cuộc thảo luận ở đây: người ta có thể hiểu được UNION toán tử như một UNION theo định hướng SET thuần túy - ví dụ: đặt A = {2,4,6,8}, đặt B = {1,2,3,4}, A UNION B = {1,2,3,4,6,8}

Khi giao dịch với các bộ, bạn sẽ không muốn số 2 và 4 xuất hiện hai lần, như một phần tử  hoặc là không phải là trong một bộ.

Tuy nhiên, trong thế giới của SQL, bạn có thể muốn xem tất cả các phần tử từ hai bộ cùng nhau trong một "túi" {2,4,6,8,1,2,3,4}. Và với mục đích này, T-SQL cung cấp toán tử UNION ALL.


12
2017-08-16 16:50



Nitpick: UNION ALL không được "cung cấp" bởi T-SQL. UNION ALL là một phần của tiêu chuẩn ANSI SQL và không cụ thể cho MS SQL Server. - Frank Schmitt


LIÊN HIỆP
Các UNION lệnh được sử dụng để chọn thông tin liên quan từ hai bảng, giống như JOIN chỉ huy. Tuy nhiên, khi sử dụng UNION lệnh tất cả các cột được chọn cần phải có cùng loại dữ liệu. Với UNION, chỉ các giá trị khác biệt được chọn.

UNION ALL
Các UNION ALL lệnh bằng với UNION lệnh, ngoại trừ UNION ALL chọn tất cả các giá trị.

Sự khác biệt giữa Union và Union all đó là Union all sẽ không loại bỏ các hàng trùng lặp, thay vào đó nó sẽ kéo tất cả các hàng từ tất cả các bảng phù hợp với các chi tiết truy vấn của bạn và kết hợp chúng thành một bảng.

A UNION tuyên bố hiệu quả làm một SELECT DISTINCT trên tập kết quả. Nếu bạn biết rằng tất cả các hồ sơ được trả lại là duy nhất từ ​​công đoàn của bạn, hãy sử dụng UNION ALL thay vào đó, nó cho kết quả nhanh hơn.


9
2017-09-08 15:43





Không chắc rằng nó quan trọng cơ sở dữ liệu nào

UNION và UNION ALL nên làm việc trên tất cả các máy chủ SQL.

Bạn nên tránh những thứ không cần thiết UNIONHọ đang bị rò rỉ hiệu suất rất lớn. Theo quy tắc sử dụng ngón tay cái UNION ALL nếu bạn không chắc chắn nên sử dụng cái gì.


6
2018-06-15 10:42



Không có thẻ SQL Server nào về câu hỏi này. Tôi nghĩ tùy chọn trả về bản sao chỉ vì nó thường hoạt động tốt nhất là lời khuyên sai. - onedaywhen
@onedaywhen Tôi đoán OP đã sử dụng cụm từ "Máy chủ SQL" làm từ đồng nghĩa cho tất cả các RDBMS (ví dụ: MySQL, PostGreSQL, Oracle, SQL Server). Các từ ngữ là không may, mặc dù (và tất nhiên, tôi có thể bị nhầm lẫn). - Frank Schmitt
@ FrankSchmitt: không có sản phẩm nào bạn liệt kê thực sự là RDBMSs :) - onedaywhen
@onedaywhen chăm sóc để xây dựng? Ít nhất en.wikipedia.org/wiki/Relational_database_management_system dường như đồng ý với tôi - nó đề cập một cách rõ ràng Microsoft SQL Server, Cơ sở dữ liệu Oracle và MySQL. Hoặc bạn có nitpicky về sự khác biệt giữa Oracle và Cơ sở dữ liệu Oracle, ví dụ: ? - Frank Schmitt


union được sử dụng để chọn các giá trị khác biệt từ hai bảng nơi mà tất cả các công đoàn được sử dụng để chọn tất cả các giá trị bao gồm trùng lặp từ các bảng


5
2018-04-12 08:34





(Từ Microsoft SQL Server Book trực tuyến)

UNION [ALL] 

Chỉ định rằng nhiều tập hợp kết quả sẽ được kết hợp và trả về dưới dạng một tập kết quả duy nhất.

TẤT CẢ CÁC 

Kết hợp tất cả các hàng vào kết quả. Điều này bao gồm các bản sao. Nếu không được chỉ định, các hàng trùng lặp sẽ bị xóa.

UNION sẽ mất quá nhiều thời gian để tìm các hàng trùng lặp giống như DISTINCT được áp dụng trên các kết quả.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

tương đương với:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

Một tác dụng phụ của việc áp dụng DISTINCT hơn kết quả là phân loại hoạt động về kết quả.

UNION ALL kết quả sẽ được hiển thị dưới dạng tùy ý thứ tự trên kết quả Nhưng UNION kết quả sẽ được hiển thị dưới dạng ORDER BY 1, 2, 3, ..., n (n = column number of Tables) áp dụng trên kết quả. Bạn có thể thấy hiệu ứng phụ này khi bạn không có bất kỳ hàng trùng lặp nào.


5
2018-05-17 05:59