0Pricing
SQL Interview Prep · Lekcja

Liczba kolumn i zgodność typów

Zasady, które muszą spełniać zbiory wyników, aby można było je połączyć, oraz typowe błędy niezgodności

Liczba kolumn i zgodność typów to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 2 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 SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Reguły zgodności, o które pytają rekruterzy

Każda operacja zbiorowa (UNION, INTERSECT, EXCEPT) wymaga, aby oba zestawy wyników były zgodne dla operacji zbiorowych. Rekruterzy pytają o to, aby sprawdzić, czy znają Państwo nieoczywiste sposoby, na jakie te zapytania mogą przestać działać.

Zgodność określają dwie reguły: zgodna liczba kolumn oraz zgodne typy danych na odpowiadających sobie pozycjach. Naruszenie którejkolwiek z nich powoduje błąd albo zaskakujący wynik.

Reguła 1: taka sama liczba kolumn

Oba zapytania muszą zwracać taką samą liczbę kolumn. Jeśli pierwsze zapytanie zwraca trzy kolumny, a drugie dwie, baza danych odrzuci instrukcję.

To najczęstszy błąd związany z operacjami zbiorowymi podczas rozmów kwalifikacyjnych, szczególnie gdy ktoś edytuje jedną gałąź i zapomina o drugiej.

SELECT id, name, city FROM a
UNION
SELECT id, name FROM b;
-- ERROR: each UNION query must have the same number of columns

Reguła 2: zgodne typy według pozycji

Kolumny są dopasowywane według pozycji, a nie nazwy. Pierwsza kolumna pierwszego zapytania odpowiada pierwszej kolumnie drugiego zapytania, następnie druga odpowiada drugiej i tak dalej. Każda taka para musi mieć zgodne typy.

Zgodność zazwyczaj oznacza możliwość niejawnej konwersji: INT i BIGINT są odpowiednią parą, natomiast INT i DATE na ogół nie.

SELECT id, signup_date FROM a
UNION
SELECT id, signup_date FROM b;
-- positions: (int,date) vs (int,date) -> OK

Liczy się pozycja, nie nazwa

Subtelna pułapka polega na tym, że kolumny mogą mieć różne nazwy i nadal mogą zostać połączone, o ile ich pozycje odpowiadają sobie pod względem typów. Z kolei zgodne nazwy w niewłaściwej kolejności spowodują nieprawidłowe dopasowanie danych.

Operacje zbiorowe należy zawsze analizować kolumna po kolumnie, według pozycji. Rekruterzy celowo zamieniają kolumny miejscami, aby to sprawdzić.

SELECT name, id FROM a
UNION ALL
SELECT id, name FROM b;
-- name<->id swapped: types may clash or data lands in wrong column

Nazwy kolumn wynikowych

Zestaw wyników otrzymuje nazwy kolumn z pierwszego zapytania. Etykiety z drugiego zapytania są odrzucane. Aby kontrolować nagłówki, należy nadać aliasy kolumnom w pierwszej gałęzi.

Dlatego późniejsze ORDER BY musi odwoływać się do nazw z pierwszego zapytania albo używać numerów pozycji.

SELECT id AS user_id, city AS location FROM a
UNION ALL
SELECT id, town FROM b;
-- output headers: user_id, location

Niejawna konwersja typów

Gdy dwie kolumny odpowiadające sobie pozycjami mają różne, ale zgodne typy, silnik wybiera typ wyniku wystarczająco szeroki, aby pomieścić oba typy. Połączenie INT z DECIMAL zazwyczaj daje w wyniku DECIMAL.

Wspomnienie o tej konwersji podczas rozmowy kwalifikacyjnej pokazuje znajomość szczegółów: wiedzą Państwo, że kolumna nie powoduje błędu, tylko zostaje podniesiona do szerszego typu.

SELECT amount FROM int_table   -- INT
UNION ALL
SELECT amount FROM dec_table;  -- DECIMAL
-- result column is DECIMAL

Uzupełnianie brakujących kolumn za pomocą NULL

Gdy dwa zapytania mają naturalnie różną strukturę, można je wyrównać, dodając kolumny zastępcze. Częstą techniką jest wybieranie NULL (często rzutowanego na określony typ) w celu uzupełnienia pozycji obecnej w drugiej gałęzi.

Rzutowanie NULL zapobiega zgadywaniu typu przez silnik i zapewnia zgodność kolumn.

SELECT id, phone, CAST(NULL AS VARCHAR) AS email FROM a
UNION ALL
SELECT id, CAST(NULL AS VARCHAR), email FROM b;

Przykład błędu spowodowanego niezgodnością typów

W tym przypadku druga kolumna jest datą w jednej gałęzi, a ciągiem znaków w drugiej. Restrykcyjne silniki odrzucą takie zapytanie, natomiast mniej restrykcyjne mogą wykonać nieprzewidywalną konwersję. Bezpiecznym rozwiązaniem jest jawne użycie CAST, aby obie strony miały zgodny typ.

Podczas rozmowy kwalifikacyjnej warto zaproponować rzutowanie zamiast polegać na niejawnej konwersji.

SELECT id, CAST(event_date AS VARCHAR) FROM a
UNION ALL
SELECT id, label FROM b;
-- both second columns now VARCHAR -> compatible

Te reguły dotyczą wszystkich operatorów zbiorowych

Reguły dotyczące liczby kolumn i zgodności typów są identyczne dla operatorów UNION, UNION ALL, INTERSECT i EXCEPT. Wszystkie układają zestawy wyników pionowo i wszystkie wymagają zgodnych danych wejściowych.

Wystarczy więc jedna lista kontrolna dla każdej operacji zbiorowej: policzyć kolumny, sprawdzić typy według pozycji i ustawić nazwy na podstawie pierwszego zapytania.

SELECT id, city FROM a
INTERSECT
SELECT id, city FROM b;
-- same compatibility rules as UNION

Lista kontrolna przed wykonaniem

Przed połączeniem zestawów wyników należy sprawdzić:

  • Taką samą liczbę kolumn w każdej gałęzi.
  • Zgodność typów każdej pary kolumn odpowiadających sobie pozycjami (w razie wątpliwości należy użyć rzutowania).
  • Taką samą logiczną kolejność kolumn.
  • Aliasy ustawione w pierwszym zapytaniu, aby uzyskać czytelne nazwy wynikowe.

Głośne przejście przez tę listę podczas rozmowy kwalifikacyjnej zapobiega trudnym do zauważenia błędom niezgodnego dopasowania.

Połączenie wszystkiego

Większości problemów ze zgodnością można uniknąć. Gdy liczba kolumn się różni, błędy są wyraźne, ale zamiana kolumn lub nieoczekiwana konwersja typów może spowodować błąd niezauważalny. Analizowanie zapytań kolumna po kolumnie i celowe stosowanie rzutowania pozwala zachować poprawność operacji zbiorowych.

Pewna odpowiedź wymienia obie reguły, wspomina o dopasowywaniu według pozycji i zaznacza, że nazwy wynikowe pochodzą z pierwszego zapytania.

Szybkie sprawdzenie

Jak SQL ustala, które kolumny dwóch gałęzi UNION odpowiadają sobie?

Podsumowanie

Najważniejsze wnioski:

  • Wszystkie operatory zbiorowe wymagają takiej samej liczby kolumn w każdej gałęzi.
  • Kolumny są dopasowywane według pozycji, a każda para musi mieć zgodne typy.
  • Zgodne typy mogą zostać przekonwertowane do szerszego wspólnego typu.
  • Należy używać CAST(NULL AS type), aby uzupełnić różniące się struktury.
  • Nazwy wynikowe pochodzą z pierwszego zapytania.

Często zadawane pytania

Czy lekcja „Liczba kolumn i zgodność typów” jest bezpłatna?

Tak — pełny tekst „Liczba kolumn i zgodność typów” 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 SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Liczba kolumn i zgodność typów”?

Zasady, które muszą spełniać zbiory wyników, aby można było je połączyć, oraz typowe błędy niezgodności Ćwiczysz SQL 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ąć SQL Interview Prep?

Nie wymagamy żadnego doświadczenia. SQL 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 2 z 4.

Ile czasu zajmuje lekcja „Liczba kolumn i zgodność typów”?

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 SQL Interview Prep?

Tak. Każda lekcja SQL 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

  1. UNION a UNION ALL
  2. Liczba kolumn i zgodność typów
  3. INTERSECT i EXCEPT do porównywania
  4. Odwzorowywanie operacji na zbiorach za pomocą złączeń
← Powrót do SQL Interview Prep