KWALIFIKACJA INF3 - TEST WIEDZY NR 2

PYTANIE NR 32.
Rozważ następujący fragment kodu SQL:
SELECT Imię, Nazwisko 
FROM Pracownicy 
WHERE Pensja > (SELECT AVG(Pensja) FROM Pracownicy);
Co zwróci to zapytanie?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Zapytanie wewnętrzne oblicza jedną wartość: średnią pensję wszystkich rekordów (AVG(Pensja) z tabeli Pracownicy).
Następnie warunek Pensja > średnia filtruje wiersze i zapytanie główne zwraca tylko kolumny Imię i Nazwisko tych pracowników, którzy zarabiają powyżej tej średniej.

Pełne wyjaśnienie:

Zapytanie składa się z dwóch części: zapytania głównego oraz podzapytania w klauzuli WHERE.

1) Co robi podzapytanie?
Fragment (SELECT AVG(Pensja) FROM Pracownicy) jest podzapytaniem skalarnym, czyli takim, które w tym kontekście powinno zwrócić jedną wartość. Funkcja AVG(Pensja) oblicza średnią arytmetyczną wartości w kolumnie Pensja dla wszystkich wierszy tabeli Pracownicy (pomijając wartości NULL, jeśli występują w danym silniku SQL).

2) Jak działa WHERE z podzapytaniem?
Warunek Pensja > (…) porównuje pensję konkretnego pracownika (z bieżącego wiersza przetwarzanego przez zapytanie główne) z obliczoną wcześniej średnią. Do wyniku przechodzą tylko te rekordy, dla których pensja jest większa od średniej.

3) Co zostanie zwrócone w SELECT?
W części SELECT wskazano tylko dwie kolumny: Imię i Nazwisko. Oznacza to, że wynikiem będzie lista imion i nazwisk pracowników spełniających warunek, a nie same wartości pensji ani statystyka.

Dlaczego pozostałe odpowiedzi są błędne?

  • Odpowiedź mówiąca o pracownikach zarabiających mniej niż średnia jest niezgodna z operatorem porównania, bo w zapytaniu użyto >, a nie <.
  • Stwierdzenie, że zapytanie zwróci "średnią pensję" myli wynik podzapytania z wynikiem zapytania głównego. Średnia jest tylko wartością pomocniczą do filtrowania, a nie kolumną wypisywaną w rezultacie.
  • Opcja o "liczbie pracowników" byłaby poprawna dopiero przy użyciu agregacji w zapytaniu głównym, np. z COUNT(*). Tutaj nie ma COUNT, więc wynik to wiersze z danymi osobowymi, nie jedna liczba.

Wskazówka egzaminacyjna: gdy widzisz w odpowiedziach "liczbę …", sprawdź, czy w zapytaniu jest funkcja zliczająca (COUNT) lub grupowanie. Gdy jej nie ma, najczęściej wynikiem będzie lista rekordów/kolumn wskazanych w SELECT.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Podzapytanie skalarne to podzapytanie zwracające jedną wartość (jedną kolumnę i jeden wiersz) używaną potem w wyrażeniu, np. w WHERE. Przykład: porównanie pensji z AVG(Pensja) wyliczonym dla całej tabeli.
AVG() oblicza średnią arytmetyczną wartości liczbowych w kolumnie. Zwykle pomija wartości NULL. Wynikiem jest jedna liczba, którą można użyć do raportowania albo jako próg w filtrze, np. Pensja > AVG(Pensja).
Średnia jest liczona w podzapytaniu, ale w zapytaniu głównym w sekcji SELECT wskazano kolumny Imię i Nazwisko. To oznacza, że wynik ma postać wierszy z danymi pracowników, a średnia służy jedynie do filtrowania w WHERE.
Nie, ponieważ w części SELECT nie ma kolumny Pensja. SQL zwraca tylko te kolumny, które wymienisz w SELECT. Jeśli chcesz zobaczyć również wynagrodzenie, musisz dodać je do listy, np. SELECT Imię, Nazwisko, Pensja.
Wystarczy zmienić operator porównania w warunku: zamiast > użyć <. Wtedy filtr wybierze wiersze, dla których pensja jest mniejsza od wartości obliczonej przez AVG(Pensja) dla tabeli Pracownicy.
Trzeba użyć agregacji w zapytaniu głównym, np. COUNT(*), a nie wypisywać imion i nazwisk. Koncepcyjnie: wybierasz pracowników spełniających warunek i zamiast listy danych zwracasz jedną wartość zliczającą rekordy.
Nie w tej wersji. Ponieważ w podzapytaniu jest tylko FROM Pracownicy, średnia dotyczy całej tabeli. Średnią dla działu uzyskasz dopiero po dodaniu warunku lub powiązania z działem (np. korelacji) albo po użyciu GROUP BY.
W wielu silnikach SQL funkcje agregujące, takie jak AVG(), pomijają NULL. To wpływa na próg średniej i tym samym na to, kto przejdzie filtr Pensja > średnia. Dokładne zachowanie warto sprawdzić w dokumentacji używanego silnika.
Najczęściej myli się wynik podzapytania z wynikiem całego zapytania (np. oczekiwanie, że zwróci średnią), nie zauważa się operatora >/< albo zakłada się zliczanie bez użycia COUNT. Pomaga sprawdzenie: co jest w SELECT i czy jest agregacja.
Podzapytanie to zapytanie w nawiasach użyte jako część innego zapytania (np. w WHERE). GROUP BY grupuje wiersze w ramach jednego zapytania i zwykle wymaga agregatów w SELECT. W tym zadaniu nie ma GROUP BY, jest za to podzapytanie z AVG().
info

Około 69% zdających odpowiada poprawnie na to pytanie. średnie

Źródła:

  • PostgreSQL Documentation: "Subquery Expressions" oraz "Aggregate Functions" (AVG) — https://www.postgresql.org/docs/current/functions-subquery.html (dostęp: 2026-03-04)
  • MySQL 8.0 Reference Manual: "Subqueries" — https://dev.mysql.com/doc/refman/8.0/en/subqueries.html (dostęp: 2026-03-04)
  • Microsoft Learn (SQL Server): "AVG (Transact-SQL)" — https://learn.microsoft.com/en-us/sql/t-sql/functions/avg-transact-sql (dostęp: 2026-03-04)

Materiały:

  • Dokumentacja SQL dla wybranego silnika (sekcja o subqueries i aggregate functions)
  • Ćwiczenia z zapytań zagnieżdżonych i funkcji agregujących na przykładowej bazie
  • Materiały kursowe dotyczące SELECT, WHERE, GROUP BY i funkcji agregujących

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego