Zadaj sobie pytanie co to zapytanie zwraca. A zwraca listę nazwisk i zarobków z tabeli ludzie, filtrując tylko tych dla których istnieją przynajmniej 4 rekordy o większych zarobkach.
Wiec do from rozumiesz, tu ważny jest nadany alias l
dla tabeli ludzie. Warunek where sprawdza ilość rekordów dla zarobków większych od tych w filtrowanym wierszu tu kluczowy jest warunek podzapytania l.zarobki < zarobki
l.zarobki wskazuje na wartość z wiersza filtrowanego, zarobki odwołuje się do tabeli z podzapytania.
Aby to zrozumieć to zrób tak:
SELECT
nazwisko
, zarobki
,(SELECT COUNT(*) FROM ludzie WHERE l.zarobki < zarobki) IleOsobZarabieWiecej
FROM
ludzie l
I zapis twojego zapytania:
select nazwisko,zarobki
from (
SELECT
nazwisko
, zarobki
,(SELECT COUNT(*) FROM ludzie WHERE l.zarobki < zarobki) IleOsobZarabieWiecej
FROM
ludzie l
) dt
where IleOsobZarabieWiecej>3
Napomknę tylko że taki sposób, jest zabójczy, bo dla każdego rekordu w warunku where wykonasz podzapytanie, w uproszczeniu tyle razy zapytasz bazę o ilość ile rekordów ma tabela ludzie.
Bardziej by pasował taki zapis (celowo dodaje id, zakładając, że takie pole istnieje w tabeli ludzie, ponieważ może się zdarzyć, że nazwisko będzie powielone)
SELECT
l.id
,l.nazwisko
,l.zarobki
FROM
ludzie l
inner join ludzie iw on l.zarobki < iw.zarobki
group by
l.id
,l.nazwisko
,l.zarobki
having
count(*) > 3