Odpowiedzi:
UNION
usuwa zduplikowane rekordy (gdzie wszystkie kolumny w wynikach są takie same), UNION ALL
nie robi.
Użycie UNION
zamiast powoduje pogorszenie wydajności UNION ALL
, ponieważ serwer bazy danych musi wykonać dodatkową pracę, aby usunąć zduplikowane wiersze, ale zwykle nie chce się duplikatów (szczególnie podczas opracowywania raportów).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Wynik:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Wynik:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Zarówno UNION, jak i UNION ALL łączą wynik dwóch różnych zapytań SQL. Różnią się sposobem obsługi duplikatów.
UNION wykonuje DISTINCT na zestawie wyników, eliminując wszelkie zduplikowane wiersze.
UNION ALL nie usuwa duplikatów, a zatem jest szybszy niż UNION.
Uwaga: podczas korzystania z tych poleceń wszystkie wybrane kolumny muszą być tego samego typu danych.
Przykład: jeśli mamy dwie tabele, 1) pracownik i 2) klient
UNION
usuwa duplikaty, podczas UNION ALL
gdy nie.
Aby usunąć duplikaty, zestaw wyników musi zostać posortowany, co może mieć wpływ na wydajność UNION, w zależności od ilości sortowanych danych oraz ustawień różnych parametrów RDBMS (dla Oracle PGA_AGGREGATE_TARGET
z WORKAREA_SIZE_POLICY=AUTO
lub SORT_AREA_SIZE
i SOR_AREA_RETAINED_SIZE
jeśli WORKAREA_SIZE_POLICY=MANUAL
).
Zasadniczo sortowanie jest szybsze, jeśli można je przeprowadzić w pamięci, ale obowiązuje to samo zastrzeżenie dotyczące ilości danych.
Oczywiście, jeśli potrzebujesz danych zwróconych bez duplikatów, musisz użyć UNION, w zależności od źródła danych.
Skomentowałbym pierwszy post, aby zakwalifikować komentarz „jest znacznie mniej wydajny”, ale nie mam wystarczającej reputacji (punktów), aby to zrobić.
W ORACLE: UNION nie obsługuje typów kolumn BLOB (lub CLOB), UNION ALL tak.
Podstawowa różnica między UNION i UNION ALL polega na tym, że operacja łączenia eliminuje zduplikowane wiersze z zestawu wyników, ale połączenie wszystkich zwraca wszystkie wiersze po dołączeniu.
from http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
Możesz uniknąć duplikatów i nadal działać znacznie szybciej niż UNION DISTINCT (który w rzeczywistości jest taki sam jak UNION), uruchamiając takie zapytanie:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Zwróć uwagę na AND a!=X
część. Jest to o wiele szybsze niż UNION.
UNION
- UNION
usuwa również duplikaty zwracane przez podzapytania, podczas gdy twoje podejście nie.
Wystarczy dodać tutaj moje dwa centy: można zrozumieć UNION
operatora jako czystą, zorientowaną na SET UNIĘ - np. Zestaw A = {2,4,6,8}, zestaw B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}
Gdy mamy do czynienia z zestawami, nie chcesz numery 2 i 4 pojawia się dwukrotnie, jako element albo jest albo nie jest w zestawie.
Jednak w świecie SQL możesz chcieć zobaczyć wszystkie elementy z dwóch zestawów razem w jednym „worku” {2,4,6,8,1,2,3,4}. I w tym celu T-SQL oferuje operatorowi UNION ALL
.
UNION ALL
nie jest „oferowany” przez T-SQL. UNION ALL
jest częścią standardu ANSI SQL i nie jest specyficzny dla MS SQL Server.
UNIA komenda służy do wyboru informacji związanych z dwóch tabel, podobnie jak komendy. Jednak podczas korzystania z polecenia wszystkie wybrane kolumny muszą być tego samego typu danych. Za pomocą wybierane są tylko odrębne wartości.UNION
JOIN
UNION
UNION
UNION ALL komenda jest równa poleceniu, poza tym, że wybiera wszystkie wartości.UNION ALL
UNION
UNION ALL
Różnica między Union
i Union all
polega na tym, Union all
że nie wyeliminuje zduplikowanych wierszy, zamiast tego wyciąga wszystkie wiersze ze wszystkich tabel pasujących do specyfikacji zapytania i łączy je w tabelę.
UNION
Oświadczenie skutecznie robi SELECT DISTINCT
na zbiorze wyników. Jeśli wiesz, że wszystkie zwrócone rekordy są unikalne z twojego związku, użyj UNION ALL
zamiast tego, daje to szybsze wyniki.
Nie jestem pewien, czy ma to znaczenie, która baza danych
UNION
i UNION ALL
powinien działać na wszystkich serwerach SQL.
Należy unikać niepotrzebnych, UNION
ponieważ są one ogromnym przeciekiem wydajności. Zasadą jest używanie kciuka, UNION ALL
jeśli nie jesteś pewien, którego użyć.
UNION - wyniki w odrębnych rekordach,
a
UNION ALL - wyniki we wszystkich rekordach, w tym duplikatach.
Oba są operatorami blokującymi, dlatego osobiście wolę używać JOINS niż Blocking Operators (UNION, INTERSECT, UNION ALL itp.) W dowolnym momencie.
Aby zilustrować, dlaczego operacja Unii działa słabo w porównaniu do operacji Union All, sprawdź następujący przykład.
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'
Poniżej przedstawiono wyniki operacji UNION ALL i UNION.
Instrukcja UNION skutecznie WYRÓŻNIA WYBÓR na zestawie wyników. Jeśli wiesz, że wszystkie zwrócone rekordy są unikalne z twojego związku, użyj zamiast tego UNION ALL, daje to szybsze wyniki.
Użycie UNION powoduje operacje Sortowania odrębnego w planie wykonania. Dowód na potwierdzenie tego stwierdzenia pokazano poniżej:
UNION
/ UNION ALL
).
union
użycia kombinacji join
s i niektórych naprawdę paskudnych case
s, ale to sprawia, że zapytanie jest prawie niemożliwe do odczytania i utrzymania, a z mojego doświadczenia wynika, że jest to również straszne z punktu widzenia wydajności. Porównaj: select foo.bar from foo union select fizz.buzz from fizz
przeciwselect 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 służy do wybierania różnych wartości z dwóch tabel, a jako union all służy do wybierania wszystkich wartości, w tym duplikatów z tabel
()
pokazaną po raz drugi. Właściwie, po namyśle, ponieważ union all
wynik nie jest zbiorem, nie powinieneś próbować rysować go za pomocą diagramu Venna!
(Z Microsoft SQL Server Book Online)
UNIA [WSZYSTKO]
Określa, że wiele zestawów wyników ma być łączonych i zwracanych jako pojedynczy zestaw wyników.
WSZYSTKO
Uwzględnia wszystkie wiersze w wynikach. Obejmuje to duplikaty. Jeśli nie zostanie określony, zduplikowane wiersze zostaną usunięte.
UNION
potrwa zbyt długo, gdy DISTINCT
w wynikach zostaną zastosowane duplikaty znalezienia podobnych wierszy .
SELECT * FROM Table1
UNION
SELECT * FROM Table2
odpowiada:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
Efektem ubocznym nakładania
DISTINCT
wyników jest operacja sortowania wyników.
UNION ALL
wyniki będą wyświetlane w dowolnej kolejności według wyników, ale UNION
wyniki zostaną pokazane tak, jak ORDER BY 1, 2, 3, ..., n (n = column number of Tables)
zastosowano do wyników. Możesz zobaczyć ten efekt uboczny, gdy nie masz duplikatu wiersza.
Dodaję przykład
UNION , łączy się z wyraźnym -> wolniejszym, ponieważ wymaga porównania (w deweloperze Oracle SQL wybierz zapytanie, naciśnij F10, aby zobaczyć analizę kosztów).
UNION ALL , łączy się bez wyraźnego -> szybciej.
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
i
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION
scala zawartość dwóch strukturalnie zgodnych tabel w jeden połączony stół.
Różnica między UNION
i UNION ALL
polega na tym, że UNION will
pomijamy zduplikowane rekordy, podczas gdy UNION ALL
będą one zawierać zduplikowane rekordy.
Union
Zestaw wyników jest sortowany w porządku rosnącym, natomiast UNION ALL
zestaw wyników nie jest sortowany
UNION
wykonuje a DISTINCT
na swoim zestawie wyników, aby wyeliminować wszelkie zduplikowane wiersze. Natomiast UNION ALL
nie usunie duplikatów i dlatego jest szybszy niż UNION
. *
Uwaga : Wydajność UNION ALL
zwykle będzie lepsza niż UNION
, ponieważ UNION
wymaga od serwera dodatkowej pracy w celu usunięcia wszelkich duplikatów. Tak więc w przypadkach, w których jest pewne, że nie będzie żadnych duplikatów, lub gdy posiadanie duplikatów nie stanowi problemu, użycie UNION ALL
byłoby zalecane ze względu na wydajność.
ORDER BY
, posortowane wyniki nie są gwarantowane. Być może masz na myśli konkretnego dostawcę SQL (nawet wtedy, w porządku rosnącym, co dokładnie ...?), Ale to pytanie nie ma dostawcy = określone tagi.
Załóżmy, że masz dwa stołowego Teacher & Student
Oba mają 4 kolumny z inną nazwą jak ta
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
Możesz zastosować UNION lub UNION ALL do tych dwóch tabel, które mają tę samą liczbę kolumn. Ale mają inną nazwę lub typ danych.
Zastosowanie UNION
operacji na 2 tabelach powoduje pominięcie wszystkich zduplikowanych wpisów (wartość wszystkich kolumn wiersza w tabeli jest taka sama jak innej tabeli). Lubię to
SELECT * FROM Student
UNION
SELECT * FROM Teacher
wynik będzie
Zastosowanie UNION ALL
operacji na 2 tabelach powoduje zwrócenie wszystkich pozycji z duplikatem (jeśli istnieje jakakolwiek różnica między wartością kolumny w wierszu w 2 tabelach). Lubię to
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
Wydajność:
Oczywiście wydajność UNION ALL jest lepsza niż UNION, ponieważ wykonują dodatkowe zadanie, aby usunąć zduplikowane wartości. Możesz to sprawdzić w Szacowanym czasie wykonania, naciskając ctrl + L w MSSQL
UNION
przekazanie zamiaru (tj. Brak duplikatów), ponieważ UNION ALL
jest mało prawdopodobne, aby uzyskać rzeczywisty wzrost wydajności w wartościach bezwzględnych.
W bardzo prostych słowach różnica między UNION a UNION ALL polega na tym, że UNION pominie zduplikowane rekordy, podczas gdy UNION ALL będzie zawierać zduplikowane rekordy.
Jeszcze jedną rzecz, którą chciałbym dodać
Unia : - Zestaw wyników jest sortowany w porządku rosnącym.
Połącz wszystkie : - Zestaw wyników nie jest sortowany. dwa dane wyjściowe zapytania są właśnie dołączane.
UNION
Będzie NIE sortowania wynik w porządku rosnącym. Każde zamówienie, które zobaczysz w wyniku bez użycia, order by
jest czystym przypadkiem. DBMS może swobodnie korzystać ze strategii, które jej zdaniem są skuteczne w usuwaniu duplikatów. Może to być sortowanie, ale może to być również algorytm mieszający lub coś zupełnie innego - a strategia zmieni się wraz z liczbą wierszy. A, union
który wydaje się posortowany ze 100 wierszami, może nie być ze 100 000 wierszy
ORDER BY
klauzulę.
Różnica między Union Vs Union ALL W Sql
Co to jest Union In SQL?
Operator UNION służy do łączenia zestawu wyników dwóch lub więcej zbiorów danych.
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
Ważny! Różnica między Oracle a MySQL: powiedzmy, że t1 t2 nie mają między sobą zduplikowanych wierszy, ale mają pojedyncze zduplikowane wiersze. Przykład: t1 ma sprzedaż od 2017 r., A t2 od 2018 r
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
W ORACLE UNION ALL pobiera wszystkie wiersze z obu tabel. To samo będzie miało miejsce w MySQL.
Jednak:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
W ORACLE UNION pobiera wszystkie wiersze z obu tabel, ponieważ między t1 i t2 nie ma zduplikowanych wartości. Z drugiej strony w MySQL zestaw wyników będzie miał mniej wierszy, ponieważ w tabeli t1, a także w tabeli t2 będą zduplikowane wiersze!
Z drugiej strony UNION usuwa zduplikowane rekordy. UNION ALL tego nie robi. Ale trzeba sprawdzić większość danych, które będą przetwarzane, a kolumna i typ danych muszą być takie same.
ponieważ związek używa wewnętrznie „wyraźnego” zachowania do wybierania wierszy, dlatego jest to bardziej kosztowne pod względem czasu i wydajności. lubić
select project_id from t_project
union
select project_id from t_project_contact
daje mi to 2020 rekordów
z drugiej strony
select project_id from t_project
union all
select project_id from t_project_contact
daje mi ponad 17402 wierszy
w perspektywie pierwszeństwa oba mają takie same pierwszeństwo.
Jeśli nie ORDER BY
, a UNION ALL
może przywołać wiersze z powrotem, gdy jedzie, a a UNION
sprawi, że poczekasz do samego końca zapytania, zanim podasz cały zestaw wyników naraz. Może to mieć znaczenie w sytuacji UNION ALL
przekroczenia limitu czasu - utrzymuje połączenie przy życiu.
Więc jeśli masz problem z czasem oczekiwania i nie ma sortowania, a duplikaty nie są problemem, UNION ALL
może być raczej pomocne.
Jako nawyk zawsze używaj UNION ALL . Używaj tylko UNION w szczególnych przypadkach, gdy musisz wyeliminować duplikaty, które mogą być bardzo nieuporządkowane i możesz przeczytać o tym w innych komentarzach tutaj.
UNION ALL
działa również na większej liczbie typów danych. Na przykład podczas próby połączenia typów danych przestrzennych. Na przykład:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
rzuci
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Jednak union all
nie będzie.
Jedyną różnicą jest:
„UNION” usuwa zduplikowane wiersze.
„UNION ALL” nie usuwa duplikatów wierszy.