Antworten:
UNION
Entfernt doppelte Datensätze (wobei alle Spalten in den Ergebnissen gleich sind), UNION ALL
nicht.
Es gibt einen Leistungseinbruch bei der Verwendung von UNION
anstelle von UNION ALL
, da der Datenbankserver zusätzliche Arbeit leisten muss, um die doppelten Zeilen zu entfernen, aber normalerweise möchten Sie die doppelten nicht (insbesondere beim Entwickeln von Berichten).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Ergebnis:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Ergebnis:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Sowohl UNION als auch UNION ALL verketten das Ergebnis von zwei verschiedenen SQLs. Sie unterscheiden sich in der Art und Weise, wie sie mit Duplikaten umgehen.
UNION führt eine DISTINCT für die Ergebnismenge durch, wodurch doppelte Zeilen entfernt werden.
UNION ALL entfernt keine Duplikate und ist daher schneller als UNION.
Hinweis: Bei Verwendung dieser Befehle müssen alle ausgewählten Spalten vom gleichen Datentyp sein.
Beispiel: Wenn wir zwei Tabellen haben, 1) Mitarbeiter und 2) Kunde
UNION
Entfernt Duplikate, UNION ALL
nicht jedoch.
Um Duplikate zu entfernen, muss die Ergebnismenge sortiert werden. Dies kann sich je nach dem zu sortierenden Datenvolumen und den Einstellungen verschiedener RDBMS-Parameter (für Oracle PGA_AGGREGATE_TARGET
mit WORKAREA_SIZE_POLICY=AUTO
oder SORT_AREA_SIZE
und) auf die Leistung der UNION auswirkenSOR_AREA_RETAINED_SIZE
wenn WORKAREA_SIZE_POLICY=MANUAL
) .
Grundsätzlich ist die Sortierung schneller, wenn sie im Speicher ausgeführt werden kann, es gilt jedoch die gleiche Einschränkung hinsichtlich des Datenvolumens.
Wenn Sie Daten benötigen, die ohne Duplikate zurückgegeben werden, müssen Sie dies natürlich tun UNION verwenden, abhängig von der Quelle Ihrer Daten.
Ich hätte den ersten Beitrag kommentiert, um den Kommentar "ist viel weniger performant" zu qualifizieren, habe aber nicht genügend Ruf (Punkte), um dies zu tun.
In ORACLE: UNION werden BLOB- (oder CLOB-) Spaltentypen nicht unterstützt, UNION ALL jedoch.
Der grundlegende Unterschied zwischen UNION und UNION ALL besteht darin, dass durch die Union-Operation die doppelten Zeilen aus der Ergebnismenge entfernt werden. Union all gibt jedoch alle Zeilen nach dem Beitritt zurück.
von http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
Sie können Duplikate vermeiden und trotzdem viel schneller als UNION DISTINCT (das eigentlich mit UNION identisch ist) ausführen, indem Sie die folgende Abfrage ausführen:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Beachten Sie das AND a!=X
Teil. Das ist viel schneller als UNION.
UNION
- UNION
auch Duplikate entfernt , die durch die Unterabfragen zurückgegeben werden, während Ihr Ansatz nicht.
Um meine zwei Cent zur Diskussion hier hinzuzufügen: Man könnte den UNION
Operator als reine, SET-orientierte UNION verstehen - zB set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}
Wenn Sie mit Mengen arbeiten, möchten Sie nicht, dass die Zahlen 2 und 4 zweimal erscheinen, da sich ein Element entweder in einer Menge befindet oder nicht .
In der SQL-Welt möchten Sie möglicherweise alle Elemente aus den beiden Sätzen zusammen in einer "Tasche" anzeigen {2,4,6,8,1,2,3,4}. Und zu diesem Zweck bietet T-SQL dem Bediener UNION ALL
.
UNION ALL
wird von T-SQL nicht "angeboten". UNION ALL
ist Teil des ANSI SQL-Standards und nicht spezifisch für MS SQL Server.
UNION
Der UNION
Befehl wird verwendet, um verwandte Informationen aus zwei Tabellen auszuwählen, ähnlich wie der JOIN
Befehl. Bei Verwendung des UNION
Befehls müssen jedoch alle ausgewählten Spalten vom gleichen Datentyp sein. MitUNION
werden nur unterschiedliche Werte ausgewählt.
UNION ALL
Der UNION ALL
Befehl entspricht dem UNION
Befehl, außer dassUNION ALL
alle Werte ausgewählt werden.
Der Unterschied zwischen Union
und Union all
besteht darin, dass Union all
keine doppelten Zeilen entfernt werden. Stattdessen werden nur alle Zeilen aus allen Tabellen abgerufen, die Ihren Abfragespezifikationen entsprechen, und sie werden zu einer Tabelle kombiniert.
Eine UNION
Anweisung wirkt sich effektiv SELECT DISTINCT
auf die Ergebnismenge aus. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie UNION ALL
stattdessen, um schnellere Ergebnisse zu erzielen.
Nicht sicher, ob es darauf ankommt, welche Datenbank
UNION
und UNION ALL
sollte auf allen SQL Servern funktionieren.
Sie sollten unnötige UNION
s vermeiden, da diese ein großes Leistungsleck darstellen. Als Faustregel verwenden, UNION ALL
wenn Sie nicht sicher sind, welche Sie verwenden sollen.
UNION - führt zu unterschiedlichen Datensätzen,
während
UNION ALL - zu allen Datensätzen einschließlich Duplikaten führt.
Beide sind blockierende Operatoren und daher bevorzuge ich persönlich die Verwendung von JOINS gegenüber blockierenden Operatoren (UNION, INTERSECT, UNION ALL usw.) jederzeit.
Um zu veranschaulichen, warum der Betrieb der Union im Vergleich zum Auschecken der Union All eine schlechte Leistung erbringt, sehen Sie sich das folgende Beispiel an.
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'
Es folgen die Ergebnisse der Operationen UNION ALL und UNION.
Eine UNION-Anweisung führt effektiv ein SELECT DISTINCT für die Ergebnismenge durch. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie stattdessen UNION ALL, um schnellere Ergebnisse zu erzielen.
Die Verwendung von UNION führt zu eindeutigen Sortiervorgängen im Ausführungsplan. Der Beweis, um diese Aussage zu beweisen, ist unten gezeigt:
UNION
/ UNION ALL
).
union
Verwendung einer Kombination aus join
s und einigen wirklich bösen case
s erzeugen , aber es macht es nahezu unmöglich, die Abfrage zu lesen und zu pflegen, und meiner Erfahrung nach ist sie auch für die Leistung schrecklich. Vergleichen Sie: select foo.bar from foo union select fizz.buzz from fizz
gegenselect 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
Mit union werden unterschiedliche Werte aus zwei Tabellen ausgewählt, wobei mit union all alle Werte einschließlich Duplikate aus den Tabellen ausgewählt werden
Es ist gut, mit einem Venn-Diagramm zu verstehen.
Hier ist der Link zur Quelle. Es gibt eine gute Beschreibung.
()
wird ein zweites Mal gezeigt. Da das union all
Ergebnis keine Menge ist, sollten Sie eigentlich nicht versuchen, es mit einem Venn-Diagramm zu zeichnen!
(Aus Microsoft SQL Server Book Online)
UNION [ALL]
Gibt an, dass mehrere Ergebnismengen kombiniert und als einzelne Ergebnismenge zurückgegeben werden sollen.
ALLE
Integriert alle Zeilen in die Ergebnisse. Dies schließt Duplikate ein. Wenn nicht angegeben, werden doppelte Zeilen entfernt.
UNION
Dies dauert zu lange, da DISTINCT
auf die Ergebnisse doppelte Zeilen angewendet werden.
SELECT * FROM Table1
UNION
SELECT * FROM Table2
ist äquivalent zu:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
Ein Nebeneffekt beim Anwenden
DISTINCT
auf Ergebnisse ist eine Sortieroperation für Ergebnisse.
UNION ALL
Die Ergebnisse werden in beliebiger Reihenfolge für die Ergebnisse UNION
angezeigt. Die Ergebnisse werden jedoch so angezeigt, wie ORDER BY 1, 2, 3, ..., n (n = column number of Tables)
sie auf die Ergebnisse angewendet werden. Sie können diesen Nebeneffekt sehen, wenn Sie keine doppelte Zeile haben.
Ich füge ein Beispiel hinzu,
UNION wird mit eindeutig -> langsamer zusammengeführt, da ein Vergleich erforderlich ist (Wählen Sie in Oracle SQL Developer die Abfrage aus und drücken Sie F10, um die Kostenanalyse anzuzeigen).
UNION ALL , es verschmilzt ohne Unterschied -> schneller.
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
und
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
führt den Inhalt zweier strukturkompatibler Tabellen zu einer einzigen kombinierten Tabelle zusammen.
Der Unterschied zwischen UNION
und UNION ALL
besteht darin, dass UNION will
doppelte Datensätze weggelassen UNION ALL
werden, während doppelte Datensätze enthalten sind.
Union
Die Ergebnismenge ist in aufsteigender Reihenfolge sortiert, während die UNION ALL
Ergebnismenge nicht sortiert ist
UNION
führt eine DISTINCT
Ergebnismenge durch, um doppelte Zeilen zu entfernen. Während UNION ALL
nicht Duplikate entfernen und daher ist es schneller als UNION
. *
Hinweis : Die Leistung von ist UNION ALL
in der Regel besser als UNION
, da UNION
der Server die zusätzliche Arbeit zum Entfernen von Duplikaten ausführen muss. In Fällen, in denen sicher ist, dass keine Duplikate vorhanden sind oder in denen Duplikate kein Problem darstellen, wird die Verwendung von UNION ALL
aus Leistungsgründen empfohlen.
ORDER BY
, werden sortierte Ergebnisse nicht garantiert. Vielleicht haben Sie einen bestimmten SQL-Anbieter im Sinn (selbst dann in aufsteigender Reihenfolge, was genau ...?), Aber diese Frage hat keine herstellerspezifischen Tags.
Angenommen, Sie haben zwei Tischlehrer und -schüler
Beide haben 4 Spalten mit unterschiedlichen Namen wie diesen
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
Sie können UNION oder UNION ALL für die beiden Tabellen anwenden, die dieselbe Anzahl von Spalten haben. Sie haben jedoch einen anderen Namen oder Datentyp.
Wenn Sie eine UNION
Operation auf 2 Tabellen anwenden , werden alle doppelten Einträge vernachlässigt (alle Spaltenwerte der Zeile in einer Tabelle sind mit denen einer anderen Tabelle identisch). So was
SELECT * FROM Student
UNION
SELECT * FROM Teacher
das Ergebnis wird sein
Wenn Sie eine UNION ALL
Operation auf 2 Tabellen anwenden , werden alle Einträge mit Duplikaten zurückgegeben (wenn zwischen einem Spaltenwert einer Zeile in 2 Tabellen ein Unterschied besteht). So was
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
Performance:
Offensichtlich ist die Leistung von UNION ALL besser als die von UNION, da sie zusätzliche Aufgaben zum Entfernen der doppelten Werte ausführen. Sie können dies anhand der geschätzten Ausführungszeit überprüfen, indem Sie bei MSSQL Strg + L drücken
UNION
Absichten vermitteln möchten (dh keine Duplikate), da UNION ALL
es unwahrscheinlich ist, dass in absoluten Zahlen ein realer Leistungsgewinn erzielt wird.
In sehr einfachen Worten besteht der Unterschied zwischen UNION und UNION ALL darin, dass UNION doppelte Datensätze weglässt, während UNION ALL doppelte Datensätze enthält.
Eine weitere Sache, die ich hinzufügen möchte-
Union : - Die Ergebnismenge ist in aufsteigender Reihenfolge sortiert.
Union All : - Die Ergebnismenge ist nicht sortiert. Zwei Abfrage-Ausgaben werden nur angehängt.
UNION
wird NICHT sortiert das Ergebnis in aufsteigender Reihenfolge. Jede Bestellung, die Sie in einem Ergebnis ohne Verwendung sehen, order by
ist reiner Zufall. Dem DBMS steht es frei, jede Strategie zu verwenden, die es für effizient hält, um die Duplikate zu entfernen. Dies könnte eine Sortierung sein, aber es könnte auch ein Hashing-Algorithmus oder etwas ganz anderes sein - und die Strategie ändert sich mit der Anzahl der Zeilen. Eine union
, die mit 100 Zeilen sortiert erscheint, ist möglicherweise nicht mit 100.000 Zeilen versehen
ORDER BY
Klausel hinzu.
Unterschied zwischen Union und Union ALL In Sql
Was ist Union in SQL?
Der UNION-Operator wird verwendet, um die Ergebnismenge von zwei oder mehr Datensätzen zu kombinieren.
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
Wichtig! Unterschied zwischen Oracle und MySQL: Nehmen wir an, dass t1 t2 keine doppelten Zeilen enthält, sondern einzelne Zeilen. Beispiel: t1 hat Verkäufe ab 2017 und t2 ab 2018
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
In ORACLE UNION ALL werden alle Zeilen aus beiden Tabellen abgerufen. Das gleiche wird in MySQL auftreten.
Jedoch:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
In ORACLE ruft UNION alle Zeilen aus beiden Tabellen ab, da zwischen t1 und t2 keine doppelten Werte vorhanden sind. Andererseits hat die Ergebnismenge in MySQL weniger Zeilen, da es doppelte Zeilen in Tabelle t1 und auch in Tabelle t2 gibt!
UNION entfernt doppelte Datensätze, UNION ALL hingegen nicht. Es muss jedoch der Großteil der Daten überprüft werden, die verarbeitet werden sollen, und die Spalte und der Datentyp müssen identisch sein.
Da Union intern "unterschiedliches" Verhalten verwendet, um die Zeilen auszuwählen, ist dies in Bezug auf Zeit und Leistung teurer. mögen
select project_id from t_project
union
select project_id from t_project_contact
Das gibt mir 2020 Rekorde
andererseits
select project_id from t_project
union all
select project_id from t_project_contact
gibt mir mehr als 17402 Zeilen
In der Prioritätsperspektive haben beide die gleiche Priorität.
Wenn dies nicht der Fall ist ORDER BY
, UNION ALL
kann a Zeilen nach und nach zurückbringen, während a UNION
Sie bis zum Ende der Abfrage warten lässt, bevor Sie die gesamte Ergebnismenge auf einmal erhalten. Dies kann in einer Auszeitsituation einen Unterschied machen - a UNION ALL
hält die Verbindung sozusagen am Leben.
Wenn Sie also ein Timeout-Problem haben und es keine Sortierung gibt und Duplikate kein Problem sind, UNION ALL
kann dies hilfreich sein.
UNION und UNION ALL werden verwendet, um zwei oder mehr Abfrageergebnisse zu kombinieren.
Der Befehl UNION wählt unterschiedliche und verwandte Informationen aus zwei Tabellen aus, wodurch doppelte Zeilen eliminiert werden.
Auf der anderen Seite wählt der Befehl UNION ALL alle Werte aus beiden Tabellen aus, wodurch alle Zeilen angezeigt werden.
Verwenden Sie aus Gewohnheit immer UNION ALL . Verwenden Sie UNION nur in besonderen Fällen, wenn Sie Duplikate entfernen müssen, die extrem chaotisch sein können, und Sie können alles in den anderen Kommentaren hier lesen.
UNION ALL
funktioniert auch mit mehr Datentypen. Zum Beispiel beim Versuch, räumliche Datentypen zu vereinen. Zum Beispiel:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
wird werfen
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Allerdings union all
wird nicht.
Der einzige Unterschied ist:
"UNION" entfernt doppelte Zeilen.
"UNION ALL" entfernt keine doppelten Zeilen.