UNION a UNION ALL
Różnice w usuwaniu duplikatów i wydajności oraz wyjaśnienie, dlaczego zwykle zamierzone jest UNION ALL
UNION a UNION ALL to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Dlaczego osoby rekrutujące pytają o UNION
Operacje zbiorowe łączą jeden zbiór wyników z drugim w pionie. UNION i UNION ALL to pierwsze operatory zbiorowe, po które sięgają osoby przeprowadzające rozmowę, ponieważ różnica między nimi jest krótką odpowiedzią ujawniającą, czy rozumie się koszty operacji.
Pytanie jest niemal zawsze formułowane następująco: "Jaka jest różnica między UNION a UNION ALL i którego operatora należy użyć?" Dobra odpowiedź powinna jednocześnie wspomnieć o usuwaniu duplikatów, sortowaniu i wydajności.
Działanie UNION
UNION łączy wiersze dwóch zapytań w jeden zbiór wyników, a następnie usuwa zduplikowane wiersze. Dwa wiersze są duplikatami tylko wtedy, gdy zgadzają się wszystkie kolumny.
Aby usunąć duplikaty, silnik musi posortować lub zahaszować wszystkie połączone wiersze, co wymaga rzeczywistych zasobów. UNION zwraca zbiór w sensie matematycznym: bez powtórzeń.
SELECT city FROM customers
UNION
SELECT city FROM suppliers;Działanie UNION ALL
UNION ALL łączy oba zbiory wyników i zachowuje każdy wiersz, w tym duplikaty. Nie usuwa duplikatów, więc nie wykonuje w tym celu sortowania ani haszowania.
Ponieważ pomija etap usuwania duplikatów, UNION ALL jest niemal zawsze szybszy i stanowi właściwy wybór, gdy wiadomo, że wiersze nie mogą się powtarzać albo gdy duplikaty są pożądane.
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;Różnica w wydajności
Najważniejsza odpowiedź na rozmowie: UNION ALL jest tańszy, ponieważ nigdy nie usuwa duplikatów. UNION musi porównać wszystkie połączone wiersze, aby usunąć powtórzenia.
UNION= UNION ALL + niejawny etap DISTINCT.- W przypadku dużych zbiorów wyników operacja DISTINCT może dominować w kosztach zapytania.
Jeśli usuwanie duplikatów nie jest potrzebne, wybór UNION niepotrzebnie zużywa procesor i pamięć.
Przykład z duplikatami
Załóżmy, że oba zapytania mogą zwrócić wiersz 'Paris'. W przypadku UNION otrzymamy pojedynczy wiersz Paris. W przypadku UNION ALL otrzymamy Paris dwa razy.
Osoby przeprowadzające rozmowę często proszą o przewidzenie liczby wierszy. Najpierw należy wyobrazić sobie surowe połączenie wyników, a następnie zadać pytanie: czy operator usuwa powtórzenia?
-- customers.city: Paris, Lyon
-- suppliers.city: Paris, Nice
-- UNION -> Paris, Lyon, Nice (3 rows)
-- UNION ALL -> Paris, Lyon, Paris, Nice (4 rows)Duplikaty są określane na podstawie wszystkich kolumn
Częsta pułapka polega na tym, że dwa wiersze są duplikatami tylko wtedy, gdy każda wybrana kolumna ma taką samą wartość. Wystarczy dodać jedną różniącą się kolumnę, aby wiersze przestały być duplikatami, więc UNION zachowa oba.
Dlatego SELECT id, city często zwraca więcej wierszy niż SELECT city z operatorem UNION, nawet w przypadku tych samych tabel.
SELECT id, city FROM customers
UNION
SELECT id, city FROM suppliers;
-- ids differ -> few or no duplicates removedSortowanie połączonego wyniku
Nie można umieścić ORDER BY w poszczególnych gałęziach zapytania; klauzula ta dotyczy całego połączonego wyniku i musi pojawić się tylko raz, na samym końcu.
Osoba przeprowadzająca rozmowę może zapytać, gdzie umieścić ORDER BY. Odpowiedź brzmi: pojedyncze ORDER BY należy umieścić po ostatnim zapytaniu, odwołując się do kolumn wynikowych po nazwie lub pozycji.
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers
ORDER BY city;Nazwy kolumn pochodzą z pierwszego zapytania
Odwołując się do kolumn w końcowym ORDER BY, należy używać nazw (lub aliasów) z pierwszego zapytania SELECT. Nazwy kolumn z drugiego zapytania są ignorowane przy oznaczaniu wyników.
Ma to znaczenie, gdy gałęzie nadają kolumnom różne nazwy. Należy nadać aliasy pierwszej gałęzi, aby określić nagłówki wyników.
SELECT city AS location FROM customers
UNION ALL
SELECT town FROM suppliers
ORDER BY location;Kiedy UNION jest właściwym wyborem
Należy używać UNION tylko wtedy, gdy duplikaty wierszy rzeczywiście mogą wystąpić i każdy unikatowy wiersz ma pojawić się tylko raz. Przykłady to łączenie dwóch list kontaktów, na których ta sama osoba może występować na obu listach, albo tworzenie pozbawionej duplikatów listy unikatowych wartości z kilku źródeł.
Jeśli można zagwarantować, że źródła są rozłączne, UNION ALL zwróci ten sam wynik szybciej.
SELECT email FROM web_signups
UNION
SELECT email FROM store_signups;
-- one row per distinct email across bothKiedy UNION ALL jest właściwym wyborem
Należy używać UNION ALL, gdy duplikaty nie mogą wystąpić, gdy mają znaczenie albo gdy później będą Państwo wykonywać agregację. Klasycznym przykładem jest łączenie tabel partycjonowanych według miesięcy, które nie zawierają wspólnych wierszy.
Wskazówka dotycząca rozmów kwalifikacyjnych: warto zaznaczyć, że UNION ALL jest ustawieniem domyślnym, a po UNION sięgamy dopiero wtedy, gdy usuwanie duplikatów jest rzeczywiście wymagane.
SELECT * FROM sales_2023
UNION ALL
SELECT * FROM sales_2024;Połączenie wszystkiego
Dopracowana odpowiedź na rozmowie kwalifikacyjnej może brzmieć: "UNION usuwa zduplikowane wiersze, co wymusza sortowanie lub użycie funkcji mieszającej; UNION ALL zachowuje wszystkie wiersze i działa szybciej. Oba operatory wymagają zgodnej liczby kolumn oraz zgodnych typów, a każde ORDER BY umieszcza się raz, na końcu. Domyślnie wybieram UNION ALL, chyba że wymagana jest deduplikacja."
To jedno zdanie pokazuje jednocześnie poprawność i świadomość wydajnościową.
Szybkie sprawdzenie
Proszę sprawdzić, czy rozumieją Państwo różnicę między UNION a UNION ALL.
Podsumowanie
Najważniejsze wnioski:
UNION= łączenie i usuwanie zduplikowanych wierszy (niejawne DISTINCT, dodatkowy koszt).UNION ALL= łączenie z zachowaniem wszystkich wierszy; działa szybciej i jest rozsądnym ustawieniem domyślnym.- Duplikaty wymagają zgodności wszystkich kolumn.
- Pojedyncze
ORDER BYumieszcza się na samym końcu i używa ono nazw kolumn z pierwszego zapytania.
Domyślnie należy wybierać UNION ALL, a po UNION sięgać tylko wtedy, gdy deduplikacja jest naprawdę potrzebna.
Często zadawane pytania
Czy lekcja „UNION a UNION ALL” jest bezpłatna?
Tak — pełny tekst „UNION a UNION ALL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „UNION a UNION ALL”?
Różnice w usuwaniu duplikatów i wydajności oraz wyjaśnienie, dlaczego zwykle zamierzone jest UNION ALL Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „UNION a UNION ALL”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- UNION a UNION ALL
- Liczba kolumn i zgodność typów
- INTERSECT i EXCEPT do porównywania
- Odwzorowywanie operacji na zbiorach za pomocą złączeń