0Pricing
Coding Interview Prep · Lekcja

Podzapytania skalarne w SELECT i WHERE

Podzapytania zwracające jedną wartość oraz błąd, który występuje, gdy zwrócą więcej niż jeden wiersz

Podzapytania skalarne w SELECT i WHERE 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.

Co osoba prowadząca rozmowę ma na myśli, mówiąc „podzapytanie skalarne”

Podzapytanie skalarne to zapytanie, które zwraca dokładnie jeden wiersz i jedną kolumnę — pojedynczą wartość. Ponieważ daje jedną wartość, SQL pozwala umieścić je niemal wszędzie tam, gdzie można użyć literału: w SELECT, WHERE, HAVING, a nawet w ORDER BY.

  • Osoby prowadzące rozmowy sprawdzają, czy znają Państwo zasadę jeden wiersz, jedna kolumna.
  • Klasyczna pułapka to podzapytanie, które przypadkowo zwraca więcej niż jeden wiersz.

Jeśli potrafią Państwo jasno sformułować tę definicję, pierwszy etap mają Państwo już za sobą.

Podzapytanie skalarne na liście SELECT

Umieszczenie podzapytania skalarnego na liście SELECT pozwala dołączyć jedną obliczoną wartość do każdego wiersza wyniku. W tym przykładzie pokazujemy każdego pracownika obok średniego wynagrodzenia w całej firmie.

Podzapytanie (SELECT AVG(salary) FROM employees) jest wykonywane i redukuje całą tabelę do jednej liczby, a następnie ta liczba jest powtarzana w każdym wierszu.

SELECT
  name,
  salary,
  (SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;

Podzapytanie skalarne w WHERE

Ta sama pojedyncza wartość może sterować filtrowaniem. Bardzo częste pytanie na rozmowie kwalifikacyjnej brzmi: znaleźć wszystkie osoby, które zarabiają więcej niż średnia w firmie.

Podzapytanie oblicza średnią, a następnie każdy wiersz zapytania zewnętrznego jest z nią porównywany. To nie jest podzapytanie skorelowane — zapytanie wewnętrzne nie zależy od wiersza zewnętrznego, więc jest wykonywane tylko raz.

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Błąd „więcej niż jeden wiersz”

To błąd, którego osoby prowadzące rozmowy oczekują od Państwa do przewidzenia. Jeśli podzapytanie jest używane z = lub >, ale zwraca wiele wierszy, silnik zgłasza:

  • Postgres: more than one row returned by a subquery used as an expression
  • MySQL: Subquery returns more than 1 row

Poniższe zapytanie kończy się błędem, ponieważ w dziale 5 może pracować kilku pracowników — podzapytanie nie jest skalarne.

SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);

Jak wymusić skalarność podzapytania

Dwa niezawodne sposoby zagwarantowania pojedynczej wartości:

  • Użyć funkcji agregującej, takiej jak MAX, MIN lub AVG — funkcje agregujące bez GROUP BY zawsze zwracają jeden wiersz.
  • Użyć LIMIT 1 (Postgres/MySQL) lub FETCH FIRST 1 ROW ONLY po ORDER BY.

Poprawiona wersja poniżej wyszukuje najwyższe wynagrodzenie w dziale 5.

SELECT name
FROM employees
WHERE salary = (
  SELECT MAX(salary) FROM employees WHERE dept_id = 5
);

Podzapytania skalarne zwracają NULL, gdy nie ma wierszy

Subtelny punkt często poruszany na rozmowach kwalifikacyjnych: jeśli podzapytanie skalarne dopasuje zero wierszy, nie zgłasza błędu — zwraca NULL. Ta wartość NULL propaguje następnie przez porównanie.

Ponieważ salary > NULL daje wynik UNKNOWN (a nie true), zapytanie zewnętrzne nie zwraca żadnych wierszy. Kandydaci często spodziewają się tutaj błędu; poprawna odpowiedź to pusty wynik, bez żadnego komunikatu.

SELECT name, salary
FROM employees
WHERE salary > (
  SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);

Przykład: osoby zarabiające powyżej średniej wraz z różnicą

Połączmy oba zastosowania. Pokażemy każdą osobę zarabiającą powyżej średniej oraz to, o ile jej wynagrodzenie ją przekracza. To samo podzapytanie skalarne pojawia się w SELECT i WHERE.

Osoba prowadząca rozmowę może zapytać, czy podzapytanie jest wykonywane dwa razy. Logicznie występuje ono dwukrotnie, ale dobry optymalizator może obliczyć nieskorelowane podzapytanie tylko raz i użyć wyniku ponownie.

SELECT
  name,
  salary,
  salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;

Podzapytanie skalarne w ORDER BY

Ponieważ podzapytanie skalarne jest po prostu wartością, można go również użyć w ORDER BY. Rzadko jest to najczytelniejsze rozwiązanie, ale osoby prowadzące rozmowy lubią sprawdzać, czy wiedzą Państwo, że jest ono dozwolone.

Tutaj sortujemy działy według wartości pobranej z innej tabeli — liczby pracowników w każdym dziale — bez używania złączenia.

SELECT d.dept_name
FROM departments d
ORDER BY (
  SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;

Skalarne a skorelowane: znajomość różnicy

Powyższy przykład z ORDER BY odwołuje się w rzeczywistości do d.id z zapytania zewnętrznego — dlatego jest skorelowanym podzapytaniem skalarnym, wykonywanym raz dla każdego wiersza zewnętrznego.

Osoby prowadzące rozmowy szczególnie lubią to rozróżnienie:

  • Nieskorelowane podzapytanie skalarne: samodzielne, wykonywane raz.
  • Skorelowane podzapytanie skalarne: odwołuje się do wiersza zewnętrznego, wykonywane dla każdego wiersza.

Oba typy są nadal skalarne (zwracają jedną wartość), ale ich wydajność może znacznie się różnić.

Kiedy nie używać podzapytania skalarnego

Skorelowane podzapytanie skalarne na liście SELECT jest wygodne, ale w przypadku dużych tabel może działać wolno — jest wykonywane dla każdego wiersza. Osoby prowadzące rozmowy oczekują znajomości alternatyw:

  • LEFT JOIN z wcześniej zagregowaną tabelą pochodną.
  • Funkcja okna, taka jak AVG(salary) OVER ().

Poniższa wersja z funkcją okna tworzy tę samą kolumnę ze średnią firmową bez osobnego skanowania podzapytania.

SELECT
  name,
  salary,
  AVG(salary) OVER () AS company_avg
FROM employees;

Zdanie na rozmowę kwalifikacyjną

Jeśli poproszą Państwo o zdefiniowanie podzapytania skalarnego, proszę powiedzieć: „Podzapytanie skalarne zwraca jeden wiersz i jedną kolumnę, więc działa jak pojedyncza wartość i może być użyte wszędzie tam, gdzie dozwolony jest literał. Jeśli zwróci więcej niż jeden wiersz, silnik zgłosi błąd; jeśli nie zwróci żadnego wiersza, da NULL”.

To jedno zdanie obejmuje definicję, przypadek błędu i przypadek brzegowy związany z NULL — trzy kwestie, na które zwraca uwagę każda osoba prowadząca rozmowę.

Szybkie sprawdzenie

Sprawdź swoją wiedzę o działaniu podzapytań skalarnych.

Podsumowanie

Podzapytania skalarne nie mają już przed Państwem tajemnic:

  • Definicja: jeden wiersz, jedna kolumna — można ich używać jak literału w SELECT, WHERE, HAVING i ORDER BY.
  • Wiele wierszy przy użyciu =/> powoduje błąd; skalarność można wymusić funkcją agregującą lub LIMIT 1.
  • Zero wierszy daje NULL, który po cichu eliminuje wiersze podczas filtrowania.
  • Skorelowane podzapytania skalarne są wykonywane dla każdego wiersza; gdy wydajność ma znaczenie, należy preferować złączenia lub funkcje okna.

Następnie: podzapytania w klauzuli FROM, gdzie wynikiem jest cała wirtualna tabela.

Często zadawane pytania

Czy lekcja „Podzapytania skalarne w SELECT i WHERE” jest bezpłatna?

Tak — pełny tekst „Podzapytania skalarne w SELECT i WHERE” 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 „Podzapytania skalarne w SELECT i WHERE”?

Podzapytania zwracające jedną wartość oraz błąd, który występuje, gdy zwrócą więcej niż jeden wiersz Ć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 „Podzapytania skalarne w SELECT i WHERE”?

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

  1. Podzapytania skalarne w SELECT i WHERE
  2. Podzapytania w klauzuli FROM (tabele pochodne)
  3. Podzapytania IN, ANY i ALL
  4. Wydajność EXISTS a IN
← Powrót do Coding Interview Prep