Operator Union
Operator UNION – operator w języku SQL łączący rezultaty dwóch zapytań w jedną tabelę (bądź inną postać wyniku) zawierającą wszystkie pasujące do nich wiersze. Oba zapytania biorące udział w złączeniu muszą generować jednakową liczbę kolumn o odpowiednio kompatybilnych typach danych. Zdublowane rekordy są automatycznie usuwane, z wyjątkiem sytuacji, w której zostało użyte UNION ALL
.
Operator UNION
może być użyteczny w bazodanowych aplikacjach magazynowych, w których tabele nie są perfekcyjnie unormowane. Prostym przykładem niech będzie baza danych zawierająca tabele sales2005
oraz sales2006
, które posiadają identyczną strukturę ale są rozseparowane ze względu na reprezentowane wyniki. Zapytanie UNION
powinno połączyć wyniki z obydwu tabel.
UNION
nie gwarantuje uporządkowania wierszy. Wiersze z drugiego operandu mogą pojawiać się przed, po, lub pomieszane z wierszami z pierwszego operandu. W razie potrzeby specjalnego uporządkowania, należy użyć ORDER BY
.
UNION ALL
może być zdecydowanie szybsze niż zwykłe UNION
. UNION ALL
jest techniką stosowaną do zarządzania serwisowania i tworzenia w środowiskach magazynowych o dużej ilości danych. Chroni ona programistów przed koniecznością tworzenia czasochłonnych projektów bazodanowych. Bazy danych mogą mieć bardzo niejednorodny tzw. bieżący przedział czasowy (np. porcja miesięczna lub dzienna), a starsze dane bywają rzadko uaktualniane. Używające różnych nośników pamięci, obszarów tablicowych, tabel, i definicji indeksów, ustawienia mogą być zestrojone w celu uzyskania specyficznych wyników dla różnych poziomów zmienności i częstotliwości uaktualnień.
W bazach danych MS SQL oraz IBM DB2 operator UNION ALL jest elementem tworzącym zapytania rekurencyjne[1]
Przykłady zastosowań
[edytuj | edytuj kod]Dane są następujące dwie tabele:
person | amount |
---|---|
Joe | 1000 |
Alex | 2000 |
Bob | 5000 |
person | amount |
---|---|
Joe | 2000 |
Alex | 2000 |
Zach | 35000 |
Użycie następującej sekwencji:
SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;
przyniesie następujący zestaw rezultatów, jednak kolejność wierszy może być różna ponieważ nie dołączono klauzuli ORDER BY
:
person | amount |
---|---|
Joe | 1000 |
Alex | 2000 |
Bob | 5000 |
Joe | 2000 |
Zach | 35000 |
Warto zauważyć, że są dwa wiersze z Joe ponieważ różnią się one w kolumnie amount. Jest tylko jeden wiersz z Alexem bo w obu tabelach wiersze te nie różnią się.
UNION ALL
daje inne rezultaty, ponieważ nie eliminuje duplikatów. Uruchamiając sekwencję:
SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;
można otrzymać następujące rezultaty, ponownie zawierające pomieszane dane z powodu braku rozszerzenia ORDER BY
:
person | amount |
---|---|
Joe | 1000 |
Joe | 2000 |
Alex | 2000 |
Alex | 2000 |
Bob | 5000 |
Zach | 35000 |