Antworten:
UNIONEntfernt doppelte Datensätze (wobei alle Spalten in den Ergebnissen gleich sind), UNION ALLnicht.
Es gibt einen Leistungseinbruch bei der Verwendung von UNIONanstelle 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




UNIONEntfernt Duplikate, UNION ALLnicht 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_TARGETmit WORKAREA_SIZE_POLICY=AUTOoder SORT_AREA_SIZEund) 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!=XTeil. Das ist viel schneller als UNION.
UNION- UNIONauch 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 UNIONOperator 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 ALLwird von T-SQL nicht "angeboten". UNION ALList Teil des ANSI SQL-Standards und nicht spezifisch für MS SQL Server.
UNION
Der UNIONBefehl wird verwendet, um verwandte Informationen aus zwei Tabellen auszuwählen, ähnlich wie der JOINBefehl. Bei Verwendung des UNIONBefehls müssen jedoch alle ausgewählten Spalten vom gleichen Datentyp sein. MitUNION werden nur unterschiedliche Werte ausgewählt.
UNION ALL
Der UNION ALLBefehl entspricht dem UNIONBefehl, außer dassUNION ALL alle Werte ausgewählt werden.
Der Unterschied zwischen Unionund Union allbesteht darin, dass Union allkeine 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 UNIONAnweisung wirkt sich effektiv SELECT DISTINCTauf die Ergebnismenge aus. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie UNION ALLstattdessen, 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 UNIONs vermeiden, da diese ein großes Leistungsleck darstellen. Als Faustregel verwenden, UNION ALLwenn 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).
unionVerwendung einer Kombination aus joins und einigen wirklich bösen cases 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 fizzgegenselect 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 allErgebnis 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.
UNIONDies dauert zu lange, da DISTINCTauf 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
DISTINCTauf Ergebnisse ist eine Sortieroperation für Ergebnisse.
UNION ALLDie Ergebnisse werden in beliebiger Reihenfolge für die Ergebnisse UNIONangezeigt. 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 UNIONund UNION ALLbesteht darin, dass UNION willdoppelte Datensätze weggelassen UNION ALLwerden, während doppelte Datensätze enthalten sind.
UnionDie Ergebnismenge ist in aufsteigender Reihenfolge sortiert, während die UNION ALLErgebnismenge nicht sortiert ist
UNIONführt eine DISTINCTErgebnismenge durch, um doppelte Zeilen zu entfernen. Während UNION ALLnicht Duplikate entfernen und daher ist es schneller als UNION. *
Hinweis : Die Leistung von ist UNION ALLin der Regel besser als UNION, da UNIONder 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 ALLaus 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 UNIONOperation 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 ALLOperation 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
UNIONAbsichten vermitteln möchten (dh keine Duplikate), da UNION ALLes 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.
UNIONwird NICHT sortiert das Ergebnis in aufsteigender Reihenfolge. Jede Bestellung, die Sie in einem Ergebnis ohne Verwendung sehen, order byist 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 BYKlausel 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 ALLkann a Zeilen nach und nach zurückbringen, während a UNIONSie 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 ALLhält die Verbindung sozusagen am Leben.
Wenn Sie also ein Timeout-Problem haben und es keine Sortierung gibt und Duplikate kein Problem sind, UNION ALLkann 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 ALLfunktioniert 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 allwird nicht.
Der einzige Unterschied ist:
"UNION" entfernt doppelte Zeilen.
"UNION ALL" entfernt keine doppelten Zeilen.