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 kết quả là như nhau), UNION ALL
không.
Có một hiệu suất nhấn khi sử dụng UNION
thay vìUNION ALL
, vì máy chủ cơ sở dữ liệu phải thực hiện thêm công việc để 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 báo cáo).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Kết quả:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Kết quả:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Cả UNION và UNION ALL đều nối kết quả của hai SQL khác nhau. Họ khác nhau trong cách họ xử lý các bản sao.
UNION thực hiện DISTINCT trên tập kết quả, loại bỏ mọi hàng trùng lặp.
UNION ALL không loại bỏ các bản sao và do đó nhanh hơn UNION.
Lưu ý: Trong khi sử dụng lệnh này, tất cả các cột được chọn cần phải cùng loại 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
UNION
loại bỏ trùng lặp, trong khi UNION ALL
không.
Để loại bỏ bản sao các tập kết quả phải được sắp xếp, và điều này có thể có ảnh hưởng đến việc thực hiện các UNION, tùy thuộc vào số lượng dữ liệu được sắp xếp, và các thiết lập các thông số RDBMS khác nhau (Đối với Oracle PGA_AGGREGATE_TARGET
với WORKAREA_SIZE_POLICY=AUTO
hay 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 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ả về mà không trùng lặp 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 đã có ý kiến về bài đăng đầu tiên để đủ điều kiện nhận xét "ít hiệu quả hơn nhiều", nhưng không đủ danh tiếng (điểm) để làm như vậy.
Trong ORACLE: UNION không hỗ trợ các loại cột BLOB (hoặc CLOB), UNION ALL cũng vậy.
Sự khác biệt cơ bản giữa UNION và UNION ALL là hoạt động hợp nhất giúp loại bỏ các hàng trùng lặp khỏi tập kết quả nhưng liên minh 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/
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 tế giống như UNION) bằng cách chạy truy vấn như thế này:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Chú ý AND a!=X
một phần. Điều này nhanh hơn nhiều so với UNION.
UNION
- UNION
cũng loại bỏ các bản sao được trả về bởi các truy vấn con, trong khi phương pháp của bạn sẽ không.
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 UNION
toán tử là một UNION thuần túy, theo định hướng SET - ví dụ: đặt A = {2,4,6,8}, đặt B = {1,2,3,4 }, ĐOÀN B = {1,2,3,4,6,8}
Khi giao dịch với bộ, bạn sẽ không muốn số 2 và 4 xuất hiện hai lần, như là một yếu tố hoặc là hoặc 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 thấy tất cả các yếu 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
.
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 SQL ANSI và không dành riêng cho MS SQL Server.
UNION
Các UNION
lệnh được sử dụng để chọn các thông tin có liên quan từ hai bảng, giống như các JOIN
lệnh. 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ùng loại dữ liệu. VớiUNION
, chỉ có các giá trị riêng biệt được chọn.
UNION ALL
Các UNION ALL
lệnh tương đương với UNION
lệnh, ngoại trừ việcUNION 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ó chỉ kéo tất cả các hàng từ tất cả các bảng phù hợp với chi tiết truy vấn của bạn và kết hợp chúng vào một bảng.
Một UNION
tuyên bố có hiệu quả làm một SELECT DISTINCT
trên các kết quả thiết lập. Nếu bạn biết rằng tất cả các hồ sơ được trả về là duy nhất từ liên minh của bạn, UNION ALL
thay vào đó, hãy sử dụng , nó sẽ cho kết quả nhanh hơn.
Không chắc chắn rằng nó quan trọng cơ sở dữ liệu nào
UNION
và UNION ALL
nên hoạt động 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 UNION
vì chúng bị rò rỉ hiệu năng rất lớn. Như một 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.
UNION - kết quả trong các bản ghi riêng biệt
trong khi
UNION ALL - kết quả trong tất cả các bản ghi bao gồm các bản sao.
Cả hai đều chặn các toán tử và do đó cá nhân tôi thích sử dụng THAM GIA hơn các Toán tử chặn (UNION, INTERSECT, UNION ALL, v.v.) bất cứ lúc nào.
Để minh họa tại sao hoạt động của Union hoạt động kém so với Union All kiểm tra ví dụ sau đây.
CREATE TABLE #T1 (data VARCHAR(10))
INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'
CREATE TABLE #T2 (data VARCHAR(10))
INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'
Sau đây là kết quả của hoạt động UNION ALL và UNION.
Một tuyên bố UNION thực hiện một cách hiệu quả CHỌN 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ả về là duy nhất từ liên minh của bạn, thay vào đó, hãy sử dụng UNION ALL, nó sẽ cho kết quả nhanh hơn.
Sử dụng kết quả UNION trong các hoạt động Sắp xếp riêng biệt trong Kế hoạch thực hiện. Bằng chứng để chứng minh tuyên bố này được hiển thị dưới đây:
UNION
/ UNION ALL
).
union
việc sử dụng kết hợp giữa join
s và một số s thực sự khó chịu case
, nhưng nó khiến cho truy vấn gần như không thể đọc và duy trì, và theo kinh nghiệm của tôi, nó cũng rất tệ đối với hiệu suất. So sánh: select foo.bar from foo union select fizz.buzz from fizz
vớiselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
union được sử dụng để chọn các giá trị riêng biệt từ hai bảng trong đó liên kết được sử dụng để chọn tất cả các giá trị bao gồm các giá trị trùng lặp từ các bảng
()
được hiển thị lần thứ hai. Trên thực tế, trên suy nghĩ thứ hai, vì union all
kết quả không phải là một tập hợp, bạn không nên cố gắng vẽ nó bằng sơ đồ Venn!
(Từ Microsoft SQL Server Book trực tuyến)
ĐOÀN [TẤT CẢ]
Chỉ định rằng nhiều bộ kết quả sẽ được kết hợp và trả về dưới dạng một tập kết quả.
TẤT 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 khi một hàng trùng lặp tìm kiếm DISTINCT
được áp dụng trên 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
trên kết quả là một hoạt động sắp xếp trên kết quả.
UNION ALL
kết quả sẽ được hiển thị theo thứ tự tùy ý trên kết quả Nhưng UNION
kết quả sẽ được hiển thị như ORDER BY 1, 2, 3, ..., n (n = column number of Tables)
được áp dụng trên kết quả. Bạn có thể thấy tác dụng phụ này khi bạn không có bất kỳ hàng trùng lặp nào.
Tôi thêm một ví dụ,
UNION , nó được hợp nhất với riêng biệt -> chậm hơn, vì nó cần so sánh (Trong nhà phát triển Oracle SQL, chọn truy vấn, nhấn F10 để xem phân tích chi phí).
UNION ALL , nó được hợp nhất mà không có sự khác biệt -> nhanh hơn.
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
và
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
hợp nhất nội dung của hai bảng tương thích cấu trúc thành một bảng kết hợp duy nhất.
Sự khác biệt giữa UNION
và UNION ALL
là UNION will
bỏ qua các bản ghi trùng lặp trong khi UNION ALL
sẽ bao gồm các bản ghi trùng lặp.
Union
Tập kết quả được sắp xếp theo thứ tự tăng dần trong khi UNION ALL
tập kết quả không được sắp xếp
UNION
thực hiện một DISTINCT
tập kết quả để nó sẽ loại bỏ bất kỳ hàng trùng lặp nào. Trong khi đó UNION ALL
sẽ không loại bỏ trùng lặp và do đó nó nhanh hơn UNION
. *
Lưu ý : Hiệu suất của UNION ALL
thông thường sẽ tốt hơn UNION
, vì UNION
yêu cầu máy chủ thực hiện công việc bổ sung để loại bỏ bất kỳ bản sao nào. Vì vậy, trong trường hợp chắc chắn rằng sẽ không có bất kỳ sự trùng lặp nào hoặc khi có sự trùng lặp không phải là vấn đề, việc sử dụng UNION ALL
sẽ được khuyến nghị vì lý do hiệu suất.
ORDER BY
, kết quả được sắp xếp không được đảm bảo. Có thể bạn có một nhà cung cấp SQL cụ thể (thậm chí sau đó, tăng dần thứ tự chính xác ...?) Nhưng câu hỏi này không có nhà cung cấp = thẻ cụ thể.
Giả sử bạn có hai bảng Giáo viên & Học sinh
Cả hai đều có 4 Cột với Tên khác nhau như thế này.
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
Bạn có thể áp dụng UNION hoặc UNION ALL cho hai bảng có cùng số cột. Nhưng họ có tên hoặc kiểu dữ liệu khác nhau.
Khi bạn áp dụng UNION
thao tác trên 2 bảng, nó sẽ bỏ qua tất cả các mục trùng lặp (tất cả các giá trị cột của hàng trong một bảng giống với bảng khác). Như thế này
SELECT * FROM Student
UNION
SELECT * FROM Teacher
kết quả sẽ là
Khi bạn áp dụng UNION ALL
thao tác trên 2 bảng, nó sẽ trả về tất cả các mục có trùng lặp (nếu có bất kỳ sự khác biệt nào giữa bất kỳ giá trị cột nào của một hàng trong 2 bảng). Như thế này
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
Hiệu suất:
Rõ ràng hiệu suất của UNION ALL tốt hơn là UNION khi họ thực hiện nhiệm vụ bổ sung để loại bỏ các giá trị trùng lặp. Bạn có thể kiểm tra xem từ Thời gian thực hiện ước tính bằng cách nhấn ctrl + L tại MSSQL
UNION
để truyền đạt ý định (nghĩa là không có sự trùng lặp) bởi vì UNION ALL
không có khả năng đưa ra bất kỳ hiệu suất thực tế nào trong cuộc sống một cách tuyệt đối.
Nói một cách rất đơn giản, điểm khác biệt giữa UNION và UNION ALL là UNION sẽ bỏ qua các bản ghi trùng lặp trong khi UNION ALL sẽ bao gồm các bản ghi trùng lặp.
Một điều nữa tôi muốn thêm-
liên hiệp : - Tập kết quả được sắp xếp theo thứ tự tăng dần.
Liên minh Tất cả : - Tập kết quả không được sắp xếp. hai đầu ra truy vấn chỉ được nối thêm.
UNION
sẽ KHÔNG sắp xếp kết quả theo thứ tự tăng dần. Bất kỳ thứ tự bạn nhìn thấy trong một kết quả mà không sử dụng order by
là hoàn toàn ngẫu nhiên. DBMS có thể tự do sử dụng bất kỳ chiến lược nào mà họ cho là hiệu quả để loại bỏ các bản sao. Điều này có thể được sắp xếp, nhưng nó cũng có thể là một thuật toán băm hoặc một cái gì đó hoàn toàn khác - và chiến lược sẽ thay đổi theo số lượng hàng. Một union
mà xuất hiện được sắp xếp với 100 dòng có thể không phải với 100.000 hàng
ORDER BY
mệnh đề thích hợp .
Sự khác biệt giữa Union Vs Union ALL trong Sql
Liên minh trong SQL là gì?
Toán tử UNION được sử dụng để kết hợp tập kết quả của hai hoặc nhiều tập dữ liệu.
Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order
Quan trọng! Sự khác biệt giữa Oracle và Mysql: Giả sử t1 t2 không có các hàng trùng lặp giữa chúng nhưng chúng có các hàng trùng lặp riêng lẻ. Ví dụ: t1 có doanh số từ năm 2017 và t2 từ năm 2018
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
Trong ORACLE UNION ALL tìm nạp tất cả các hàng từ cả hai bảng. Điều tương tự sẽ xảy ra trong MySQL.
Tuy nhiên:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
Trong ORACLE , UNION tìm nạp tất cả các hàng từ cả hai bảng vì không có giá trị trùng lặp giữa t1 và t2. Mặt khác, trong MySQL, tập kết quả sẽ có ít hàng hơn vì sẽ có các hàng trùng lặp trong bảng t1 và cả trong bảng t2!
UNION loại bỏ các hồ sơ trùng lặp trong mặt khác UNION ALL không. Nhưng người ta cần kiểm tra phần lớn dữ liệu sẽ được xử lý và cột và kiểu dữ liệu phải giống nhau.
vì liên minh sử dụng nội bộ "khác biệt" để chọn các hàng do đó tốn kém hơn về thời gian và hiệu suất. giống
select project_id from t_project
union
select project_id from t_project_contact
điều này mang lại cho tôi năm 2020 hồ sơ
mặt khác
select project_id from t_project
union all
select project_id from t_project_contact
mang lại cho tôi hơn 17402 hàng
trên quan điểm ưu tiên cả hai có cùng ưu tiên.
Nếu không có ORDER BY
, a UNION ALL
có thể đưa các hàng trở lại khi nó đi, trong khi đó UNION
sẽ khiến bạn phải đợi cho đến khi kết thúc truy vấn trước khi đưa cho bạn toàn bộ kết quả được đặt cùng một lúc. Điều này có thể tạo ra sự khác biệt trong một tình huống hết thời gian - UNION ALL
giữ cho kết nối vẫn tồn tại như cũ.
Vì vậy, nếu bạn có một vấn đề hết thời gian, và không có sự sắp xếp, và các bản sao không phải là một vấn đề, UNION ALL
có thể khá hữu ích.
Như một thói quen, Luôn luôn sử dụng UNION ALL . Chỉ sử dụng UNION trong các trường hợp đặc biệt khi bạn cần loại bỏ các bản sao có thể cực kỳ lộn xộn và bạn có thể đọc tất cả về các bình luận khác ở đây.
UNION ALL
cũng hoạt động trên nhiều loại dữ liệu là tốt. Ví dụ khi cố gắng kết hợp các loại dữ liệu không gian. Ví dụ:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
sẽ ném
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Tuy nhiên union all
sẽ không.
Sự khác biệt duy nhất là:
"UNION" xóa các hàng trùng lặp.
"UNION ALL" không xóa các hàng trùng lặp.