Zastosowanie operatora UNION
Operator UNION w SQL jest używany do obsługi logiki dotyczącej wyboru danych pochodzących ze ZBIORU A albo ze ZBIORU B. Najczęściej będą nas interesować właśnie takie informacje. Zacznijmy zatem od przykładu. Załóżmy, że w naszej bazie danych mamy dwie tabele. Pierwsza z nich to tabela o nazwie Zamówienia, zawierająca dane o zamówieniach złożonych przez klientów.
IDZamówienia | IDKlienta | DataZamówienia | KwotaZamówienia |
1 | 1 | 2016-09-01 | 10,00 |
2 | 2 | 2016-09-02 | 12,50 |
3 | 2 | 2016-09-03 | 18,00 |
4 | 3 | 2016-09-15 | 20,00 |
Druga tabela, o nazwie ZwrotyTowarów, zawiera dane dotyczące zwrotów towarów zakupionych przez klientów:
IDZwrotu | IDKlienta | DataZwrotu | KwotaZwrotu |
1 | 1 | 2016-09-10 | 2,00 |
2 | 2 | 2016-09-15 | 15,00 |
3 | 3 | 2016-09-28 | 3,00 |
Chcemy stworzyć raport prezentujący wszystkie zamówienia i zwroty odnoszące się do konkretnego klienta. Chcielibyśmy również posortować zamówienia według daty zamówienia, natomiast zwroty względem daty zwrotu. Możemy uzyskać taki wynik, stosując
zamieszczoną poniżej instrukcję. Puste linie służą jedynie unaocznieniu zastosowania w niej dwóch całkowicie odrębnych instrukcji SELECT powiązanych ze sobą za pomocą operatora UNION:
SELECT
DataZamówienia AS 'Data',
'Zamówienie' AS 'Rodzaj',
KwotaZamówienia AS 'Kwota'
FROM Zamówienia
WHERE IDKlienta = 2
UNION
SELECT
DataZwrotu AS 'Data',
'Zwrot' AS 'Rodzaj',
KwotaZwrotu AS 'Kwota'
FROM ZwrotyTowarów
WHERE IDKlienta = 2
ORDER BY Data
Wynik powyższej instrukcji jest następujący:
Data | Rodzaj | Kwota |
---|---|---|
2016-09-02 | Zamówienie | 12,50 |
2016-09-03 | Zamówienie | 18,00 |
2016-09-15 | Zwrot | 15,00 |
Jak widać, operator UNION oddziela dwie instrukcje SELECT. Każdą z nich można uruchomić niezależnie od drugiej. Na samym końcu mamy również klauzulę ORDER BY, która odnosi się do wyników zwracanych przez obie instrukcje SELECT. Ogólny format powyższej instrukcji jest następujący:
InstrukcjaSelect_1
UNION
InstrukcjaSelect_2
ORDER BY lista_kolumn
Aby operator UNION zadziałał poprawnie, muszą być spełnione trzy poniższe zasady:
? Wszystkie instrukcje SELECT połączone ze sobą za pomocą operatora UNION muszą mieć taką samą liczbę kolumn na liście_kolumn.
? Wszystkie kolumny na liście_kolumn w każdej instrukcji SELECT muszą być wymieniane w tej samej kolejności.
? Wszystkie odpowiadające sobie kolumny na liście_kolumn każdej instrukcji SELECT muszą mieć takie same lub zgodne ze sobą typy danych.
Nawiązując do powyższych zasad, zauważ, że w obu instrukcjach SELECT wybierane są trzy kolumny. Każda z nich zawiera dane uporządkowane w tej samej kolejności i o takim samym typie.
Ponadto, gdy korzystamy z operatora UNION, powinniśmy użyć aliasów kolumn, aby wszystkie odpowiadające sobie kolumny w poszczególnych zapytaniach miały takie same nazwy. W naszym przykładzie pierwsza kolumna z pierwszej instrukcji SELECT ma pierwotnie stosowaną nazwę pochodzącą z tabeli, a więc DataZamówienia. Analogicznie, pierwsza kolumna w drugiej instrukcji to DataZwrotu. Aby upewnić się, że pierwsza kolumna w wyniku końcowym będzie miała jedną, pożądaną przez nas nazwę, obie wyżej wymienione kolumny otrzymały alias Data. Dzięki temu możemy odwołać się do tej kolumny w ramach listy_kolumn w klauzuli ORDER BY.
Zauważ również, że druga kolumna każdej z instrukcji SELECT wykorzystuje wartości literału. Utworzona została kolumna obliczana o nazwie Rodzaj, w którą wstawiana jest wartość Zamówienie lub Zwrot. Dzięki temu wiemy, z której tabeli pochodzi każdy wiersz z wyniku.
Na koniec zwróć uwagę na to, że klauzula ORDER BY odnosi się do końcowych wyników zwracanych przez oba połączone ze sobą zapytania. Jest to prawidłowe działanie, ponieważ zastosowanie sortowania oddzielnie do każdej z instrukcji nie miałoby sensu.
W tym momencie warto się zatrzymać, aby zadać sobie pytanie, dlaczego w powyższym przypadku konieczne było zastosowanie operatora UNION zamiast zwykłego złączenia tabeli Zamówienia z tabelą ZwrotyTowarów za pomocą pojedynczej instrukcji SELECT. Skoro w obu tabelach istnieją kolumny o nazwie IDKlienta, dlaczego nie możemy po prostu połączyć tych dwóch tabel za pomocą tej właśnie kolumny? Problem polega na tym, że obie te tabele są tak naprawdę powiązane ze sobą jedynie pośrednio. Klienci mogą składać zamówienia oraz dokonywać zwrotów, ale nie istnieje bezpośredni związek pomiędzy zamówieniami a zwrotami.
Ponadto, nawet gdyby istniało bezpośrednie połączenie między tymi dwoma tabelami, złączenie, o którym mowa powyżej, nie dałoby oczekiwanych rezultatów. Dzięki zastosowaniu odpowiedniego złączenia powiązane ze sobą informacje mogą być wyświetlone w tym samym wierszu. Jednakże w tym przypadku naszą intencją jest wyświetlenie zamówień i zwrotów w oddzielnych wierszach. Nasz cel osiągniemy właśnie poprzez zastosowanie operatora UNION.
Podsumowując, operator UNION umożliwia nam wyświetlenie za pomocą jednego zapytania niepowiązanych ze sobą danych lub danych powiązanych częściowo.
Język SQL. Przyjazny podręcznik. Wydanie II Autor: Larry Rockoff Wydawnictwo: Helion