Esercizio 1
Conta i libri per genere e ordina alfabeticamente i generi.
Numero di righe atteso: 5
SQL e database · Lezione
Ottieni statistiche per genere e autore, filtra prima i libri con WHERE e poi i gruppi con HAVING.
Le lezioni usano biblioteca.db: una tabella libri con otto record. Nel laboratorio a destra puoi provare subito le query e scaricare lo stesso database per continuare con DB Browser for SQLite.
Puoi sperimentare liberamente: se vuoi tornare agli otto libri iniziali, usa il pulsante «Ripristina».
GROUP BY genere riunisce i libri dello stesso genere. COUNT(*) calcola quanti libri ci sono in ogni gruppo: il risultato contiene una riga per genere, non una riga per libro. Usa ORDER BY genere per rendere stabile l'ordine mostrato.
SELECT genere, COUNT(*) AS quanti FROM libri GROUP BY genere ORDER BY genere;
Risultato atteso: Cinque gruppi: Distopia 1, Fantascienza 2, Fantasy 2, Giallo 1, Narrativa 2.
WHERE anno >= 1950 elimina i libri più vecchi prima di creare i gruppi. Confronta la query con quella precedente: rimangono soltanto tre generi. WHERE non può filtrare il risultato di COUNT(*): per quello useremo HAVING.
SELECT genere, COUNT(*) AS quanti FROM libri WHERE anno >= 1950 GROUP BY genere ORDER BY genere;
Risultato atteso: Tre gruppi: Fantascienza 2, Fantasy 2, Giallo 1.
HAVING COUNT(*) >= 2 mantiene soltanto i generi con almeno due libri. WHERE genere = 'Fantasy' filtra invece le singole righe prima del raggruppamento. Ricorda la sequenza: FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.
SELECT genere, COUNT(*) AS quanti FROM libri GROUP BY genere HAVING COUNT(*) >= 2 ORDER BY genere;
Risultato atteso: Tre gruppi: Fantascienza, Fantasy e Narrativa (due libri ciascuno).
GROUP BY autore permette di cercare gli autori presenti più volte. Nel database soltanto George Orwell ha due libri. Non aggiungere titolo alla SELECT di una query raggruppata per autore: quel titolo non rappresenterebbe necessariamente tutti i libri del gruppo.
SELECT autore, COUNT(*) AS numero_libri FROM libri GROUP BY autore HAVING COUNT(*) > 1;
Risultato atteso: Una riga: George Orwell, 2.
Puoi ordinare i gruppi per COUNT(*) DESC; se più generi hanno lo stesso numero di libri, usa genere ASC come secondo criterio. LIMIT 2 mostra i primi due gruppi di questo ordinamento.
SELECT genere, COUNT(*) AS quanti FROM libri GROUP BY genere ORDER BY quanti DESC, genere ASC LIMIT 2;
Risultato atteso: Due gruppi: Fantascienza e Fantasy, con 2 libri ciascuno.
Scrivi una query per ogni consegna. Eseguila qui oppure in DB Browser; controlla colonne, righe e condizioni.
Conta i libri per genere e ordina alfabeticamente i generi.
Numero di righe atteso: 5
Conta i libri dal 1950 in poi per genere, ordinando per genere.
Numero di righe atteso: 3
Mostra autore e numero di libri per gli autori che hanno scritto più di un libro nel database.
Numero di righe atteso: 1
Mostra genere e numero di libri soltanto per i generi con almeno due libri.
Numero di righe atteso: 3
Mostra genere e numero di libri; ordina per numero di libri decrescente, poi per genere crescente, e visualizza soltanto i primi due.
Numero di righe atteso: 2
Mostra, per ogni genere, il primo e l'ultimo anno di pubblicazione.
Numero di righe atteso: 5
Tra i libri pubblicati dopo il 1950, mostra genere e numero di libri per i generi con almeno due libri.
Numero di righe atteso: 1
Conta i libri per autore; mostra soltanto i tre autori con più libri, sciogliendo i pari merito per nome.
Numero di righe atteso: 3
Mostra genere e media degli anni di pubblicazione per i generi con media maggiore di 1960.
Numero di righe atteso: 2
Mostra genere e numero di libri soltanto per i generi presenti con un unico libro.
Numero di righe atteso: 2
Premi «Controlla esercizio» per verificare il risultato. Se non riesci, usa «Aiutami»: riceverai suggerimenti graduali senza vedere subito la soluzione.
ConceptStep distingue ciò che è indispensabile da ciò che è consigliato o utile come rinforzo. Solo i prerequisiti obbligatori bloccano l'avanzamento.
Relazioni: linea continua = obbligatorio · linea tratteggiata = consigliato · linea puntinata = rinforzo.