Odczytywanie danych z bazy – union, union all

Zamiast tworzyć bardzo rozbudowane warunki where w zapytaniu select, można podzielić kwerendę na kilka mniejszych, łatwiejszych w utrzymaniu zapytań SQL i połączyć je za pomocą operatora union lub union all. Wartości odczytane po operatorze union są doklejane do poprzedniego wyniku zapytania select.

select nazwy_kolumn from tabela1

union lub union all

select nazwy_kolumn from tabela2

Uwaga: W przypadku, jeśli wartości drugiego zapytania nie będą mogły być doklejone do pierwszego, to zostanie zwrócony błąd. Taka sytuacja może wystąpić w skutek niegodności ilości kolumn oraz ich typów.

Różnica między union oraz union all polega na tym, że duplikaty rekordów zostaną usunięte przed zwróceniem wartości. Union all spowoduje pozostawianie zdublowanych rekordów. Nazwy zwracanych rekordów zostaną przepisane z pierwszego wyrażenia select.

Można napisać kwerendę z kilkoma użyciami union. W praktyce taka sytuacja świadczy o słabym zrozumieniu danych przechowywanych w bazie i lepszym pomysłem będzie poprawienie tego. Pozbycie się operatorów union powinno w odczuwalny sposób wpłynąć na czas odczytu danych z bazy danych.

Uwaga: Nie zalecam mieszania union oraz union all w jednej kwerendzie. Można uzyskać ciekawe rezultaty oraz błędy logiczne. Użycie union jako ostatniego spowoduje usunięcie duplikatów z poprzednich rezultatów. Dokładnie tak, jak użycie operatora distinct.

Uwaga: Zalecam stosować union all wszędzie tam, gdzie nie występują duplikaty. Kod SQL będzie wykonywany szybciej, ponieważ nie jest wykonywany krok usuwania duplikatów,

Przykłady:

Dla danych w tabeli items:

Zawartość tabeli items

Łączenie różnych wartości:

Możemy dodać rekordy zwracane poprzez zapytanie select, nie modyfikując tabeli items. używając kodu:

select * from items
union all
select 5, 'kubek'

Wynikiem działania kodu będzie zwrócona zawartość tabeli items wraz z nową wartością:

Wynik działania kodu

Kod z użyciem union zwróci dokładnie takie same rezultaty.

Porównanie działania union oraz union all:

Połączmy dokładnie dwa takie same rezultaty, czyli kwerendy select do tej samej tabeli.

Union all:
select * from items
union all
select * from items

Zwróci rezultaty:

Rezultat działania union all
Union:
select * from items
union
select * from items

Zwróci rezultatu:

Rezultat działania union

Kod drugiego zapytania wyeliminował duplikaty rekordów.

Łączenie różnych danych:

Operator union można wykorzystać także do łączenia różnych wyników. Jedynym warunkiem jest to, że ostatecznie zwracane typy muszą być zgodne z wynikiem pierwszego zapytania:

Dodatkowo użyjmy tabelki users:

Zawartość tabeli users

Możemy wykonać następujący kod:

select id, name from items
union 
select id, cast(dt_create as varchar) from users

Da to następujące rezultaty:

Wynik działania powyższego kodu

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *