INTERSECT i EXCEPT do porównywania
Znajdowanie wspólnych i różniących się wierszy w dwóch zbiorach danych
INTERSECT i EXCEPT do porównywania to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 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.
Operatory porównywania
INTERSECT i EXCEPT to operatory zbiorowe służące do porównywania dwóch zestawów wyników, a nie do ich łączenia. Rekruterzy wykorzystują je w pytaniach takich jak „którzy klienci znajdują się na obu listach” albo „które wiersze znajdują się w A, ale nie w B”.
INTERSECT= wiersze obecne w obu zapytaniach.EXCEPT= wiersze z pierwszego zapytania, których nie ma w drugim.
Co zwraca INTERSECT
INTERSECT zwraca tylko unikatowe wiersze występujące w obu zestawach wyników. Wiersz musi być zgodny we wszystkich kolumnach, aby zostać uznany za wspólny.
Podobnie jak UNION, zwykły INTERSECT usuwa duplikaty i zwraca każdy wspólny wiersz tylko raz.
SELECT customer_id FROM orders_2023
INTERSECT
SELECT customer_id FROM orders_2024;
-- customers who ordered in BOTH yearsCo zwraca EXCEPT
EXCEPT (nazywany w Oracle MINUS) zwraca unikatowe wiersze z pierwszego zapytania, które nie występują w drugim. Jest kierunkowy: A EXCEPT B różni się od B EXCEPT A.
To naturalny sposób na znalezienie rekordów brakujących w drugim zbiorze danych.
SELECT customer_id FROM orders_2023
EXCEPT
SELECT customer_id FROM orders_2024;
-- ordered in 2023 but NOT in 2024 (churned)EXCEPT nie jest symetryczny
To częsty temat podczas rozmów kwalifikacyjnych: EXCEPT jest kierunkowy. Zamiana zapytań miejscami daje odpowiedź na inne pytanie.
A EXCEPT B= występuje w A, ale nie w B.B EXCEPT A= występuje w B, ale nie w A.
W przeciwieństwie do tego INTERSECT jest symetryczny: A INTERSECT B jest równe B INTERSECT A.
-- new customers in 2024 (not seen in 2023):
SELECT customer_id FROM orders_2024
EXCEPT
SELECT customer_id FROM orders_2023;Duplikaty i domyślne działanie DISTINCT
Standardowe INTERSECT i EXCEPT działają na unikatowych wierszach, podobnie jak UNION. Zduplikowane wiersze wejściowe są redukowane przed porównaniem.
Niektóre bazy danych obsługują INTERSECT ALL i EXCEPT ALL, które uwzględniają krotność, ale operatory te są mniej powszechne. Jeśli rekruter nie powie ALL, należy przyjąć semantykę unikatowych wyników.
SELECT city FROM a
INTERSECT ALL
SELECT city FROM b;
-- multiplicity-aware (Postgres supports this; MySQL 8+ too)Porównywanie całych wierszy pod kątem równości
Oba operatory porównują całe wiersze we wszystkich wybranych kolumnach. Dwa wiersze są równe tylko wtedy, gdy każda kolumna się zgadza. Dzięki temu operatory te świetnie nadają się do sprawdzania, czy dwie tabele zawierają identyczne dane.
Należy wybrać pełny zestaw interesujących Państwa kolumn, aby porównanie miało sens.
SELECT id, name, email FROM prod_users
EXCEPT
SELECT id, name, email FROM staging_users;
-- rows in prod that differ from / are missing in stagingWzorzec dwukierunkowego porównania tabel
Aby sprawdzić, czy dwie tabele są identyczne, należy wykonać EXCEPT w obu kierunkach i połączyć różnice. Jeśli połączony wynik jest pusty, tabele są dokładnie takie same.
To klasyczna odpowiedź na rozmowie kwalifikacyjnej dotycząca sprawdzania danych podczas migracji i uzgadniania.
(SELECT * FROM table_a EXCEPT SELECT * FROM table_b)
UNION ALL
(SELECT * FROM table_b EXCEPT SELECT * FROM table_a);
-- empty result => tables are identicalSposób traktowania wartości NULL
W operacjach zbiorowych dwie wartości NULL są traktowane jako równe sobie podczas dopasowywania, inaczej niż w przypadku zwykłego wyrażenia NULL = NULL, którego wynikiem jest UNKNOWN.
Wiersz zawierający NULL w jednej kolumnie będzie więc pasować do innego wiersza z wartością NULL na tej samej pozycji. Rekruterzy sprawdzają to, ponieważ jest to sprzeczne ze zwykłymi regułami porównywania.
-- (1, NULL) INTERSECT (1, NULL) -> returns (1, NULL)
SELECT id, region FROM a
INTERSECT
SELECT id, region FROM b;Priorytet operatorów zbiorowych
Przy mieszaniu operatorów INTERSECT zazwyczaj wiąże silniej niż UNION i EXCEPT zgodnie ze standardem SQL. Aby uniknąć niejednoznaczności, należy ujmować gałęzie w nawiasy.
Stwierdzenie, że używają Państwo nawiasów, aby jawnie określić kolejność obliczeń, pokazuje dojrzałość podczas rozmowy kwalifikacyjnej.
(SELECT id FROM a EXCEPT SELECT id FROM b)
UNION
(SELECT id FROM c);Wybór między INTERSECT/EXCEPT a złączeniami
INTERSECT i EXCEPT są zwięzłe oraz porównują całe wiersze z wbudowanym usuwaniem duplikatów. Złączenia są bardziej elastyczne (można zwracać dodatkowe kolumny i wybrać sposób obsługi duplikatów).
Operatorów zbiorowych należy używać, gdy pytanie dotyczy wyłącznie tego, „które wiersze są wspólne lub których brakuje”. Po złączenia należy sięgnąć, gdy potrzebne są kolumny z obu stron albo gdy dany dialekt nie obsługuje tych operatorów.
Połączenie wszystkiego
Podsumowanie, które można powtórzyć: "INTERSECT zwraca wiersze obecne w obu zapytaniach i jest symetryczny; EXCEPT zwraca wiersze obecne w pierwszym zapytaniu, ale nie w drugim, i jest kierunkowy. Oba operatory porównują całe wiersze, traktują wartości NULL jako równe i domyślnie zwracają unikatowe wyniki."
Dodanie sztuczki z dwukierunkowym porównaniem EXCEPT na potrzeby dalszego pytania o uzgadnianie danych pozwala w pełni omówić ten temat.
Szybkie sprawdzenie
Chcą Państwo znaleźć klientów, którzy złożyli zamówienie w 2023 roku, ale NIE złożyli zamówienia w 2024 roku (klientów utraconych).
Podsumowanie
Najważniejsze wnioski:
INTERSECT= wiersze występujące w obu zapytaniach; operator symetryczny.EXCEPT(w Oracle: MINUS) = wiersze występujące w pierwszym zapytaniu, ale nie w drugim; operator kierunkowy.- Oba operatory porównują całe wiersze i domyślnie zwracają unikatowe wyniki.
- Wartości NULL są traktowane jako równe podczas dopasowywania.
- Dwukierunkowe użycie
EXCEPTdaje pełne porównanie tabel.
Często zadawane pytania
Czy lekcja „INTERSECT i EXCEPT do porównywania” jest bezpłatna?
Tak — pełny tekst „INTERSECT i EXCEPT do porównywania” 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 „INTERSECT i EXCEPT do porównywania”?
Znajdowanie wspólnych i różniących się wierszy w dwóch zbiorach danych Ć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 3 z 4.
Ile czasu zajmuje lekcja „INTERSECT i EXCEPT do porównywania”?
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ń