Przykład 5
Wypisz personalia wszystkich czytelników, którzy mieszkają w miejscowościach, w których mieszkają czytelnicy o imieniu Jan1
Tutaj rozwiązanie „na raty” jest już mniej obiecujące - o ile w poprzednim przykładzie wiedzieliśmy, że potrzebujemy jednej nazwy miasta, o tyle tutaj może ich być bardzo wiele2:
SELECT MIASTO FROM CZYTELNIK WHERE IMIĘ = 'Jan'
Wynikiem tego zapytania w naszej przykładowej bazie jest następujący zbiór:
Miasto
Warszawa
Piastów
Wykorzystajmy więc powyższe jako podzapy tanie, jednak nieco inaczej:
SELECT IMIĘ, NAZWISKO FROM CZYTELNIK
WHERE MIASTO IN (SELECT MIASTO FROM CZYTELNIK WHERE IMIĘ = 'Jan')
Podzapy tania możemy użyć również jako tymczasowej tabeli, na której wykonujemy inne (pod?)zapytanie, jak w rozwiązaniu kolejnego przykładu:
Przykład 6
Wypisz personalia i liczbę wypożyczonych książek dla wszystkich czytelników, którzy mają ponadprzeciętne czytelnictwo, jednak liczone jedynie na podstawie tych, którzy cokolwiek wypożyczali (nie uwzględniamy tych, którzy tylko założyli konto) w kolejności malejącej liczby wypożyczonych książek
Ten problem wymaga nieco dłuższego zastanowienia.
Możemy w prosty sposób określić, ile książek dany czytelnik wypożyczył (ci, którzy się nie pojawią w wyniku poniższego zapytania nic nie pożyczyli i nas nie interesują):
SELECT IMIĘ,
NAZWISKO,
COUNT(*) AS CZYTELNICTWO FROM CZYTELNIK,
WYPOŻYCZENIE
WHERE CZYTELNIK.ID = WYPOŻYCZENIE.ID_C GROUP BY ID_C
Chcąc jednak wyświetlić jedynie tych, których czytelnictwo przekracza średnią, musimy tą średnią poznać. Wystarczy więc policzyć liczbę wypożyczeń, oraz liczbę czytelników.
Liczba wypożyczeń to po prostu:
W przeciwieństwie do poprzedniego przykładu tutaj może być wielu Janów mieszkających w różnych miejscowościach!
Uważny czytelnik zauważy, że w podanym zapytaniu można uniknąć powtarzania się miejscowości stosując klauzulę GROUP BY MIASTO, lub słowo DISTINCT. Słusznie. Pomijam to jednak ze względu na czytelność przykładu.