Ora è il momento di mettere tutto insieme e imparare a scrivere query semplici ma utili usando una combinazione di SELECT, WHERE e ORDER BY. Questa skill ti servirà per un sacco di cose, tipo ottenere liste di utenti o creare piccoli report.
Prima di partire, ricordiamoci com’è fatta la struttura di una query SQL semplice:
SELECT colonna1, colonna2, colonna3
FROM tabella
WHERE condizione
ORDER BY colonna ASC
LIMIT numero_righe
OFFSET numero_righe;
Se SQL fosse un romanzo, SELECT sarebbe il titolo del capitolo, FROM il suo contenuto, e WHERE la spiegazione della trama. E ORDER BY mette tutto in ordine, così leggere è più figo!
L’ordine degli operatori è fisso. Puoi saltarne qualcuno (non scriverlo), ma non puoi cambiare l’ordine.
Esempio 1: Selezionare i nomi degli studenti con voti eccellenti
Immagina di avere una tabella students con questa struttura e questi dati:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
Devi ottenere la lista di tutti gli studenti con voto eccellente (cioè grade = 'A'), ordinata per nome. Ecco come si fa:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
Risultato:
| name |
|---|
| Alex |
| Otto |
Spiegazione:
SELECT name— scegliamo solo il nome. Non ha senso tirare fuori dati che non ci servono.WHERE grade = 'A'— filtriamo solo quelli con voto eccellente.ORDER BY name ASC— ordiniamo i nomi degli studenti in ordine alfabetico.
Esempio 2: Cercare prodotti per prezzo
Ora immaginiamo di avere una tabella products con info sui prodotti:
| id | product_name | category | price |
|---|---|---|---|
| 1 | Smartfon | Electronics | 30000 |
| 2 | Televizor | Electronics | 45000 |
| 3 | Kholodilnik | Appliances | 50000 |
| 4 | Pylesos | Appliances | 15000 |
| 5 | Lampochka | Lighting | 500 |
Il nostro obiettivo è ottenere la lista dei prodotti della categoria "Electronics", ordinati per prezzo decrescente. La query sarà così:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
Risultato:
| product_name | price |
|---|---|
| Televizor | 45000 |
| Smartfon | 30000 |
Spiegazione:
SELECT product_name, price— scegliamo il nome del prodotto e il suo prezzo.WHERE category = 'Electronics'— filtriamo solo i prodotti della categoria "Electronics".ORDER BY price DESC— ordiniamo i risultati per prezzo decrescente (il più caro per primo).
Esempio 3: Filtri complessi con logica
Usiamo di nuovo la tabella students. Supponiamo di dover trovare tutti gli studenti con più di 21 anni che hanno voto B o C, ordinati per età. Qui combiniamo più condizioni:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
Risultato:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
Spiegazione:
WHERE age > 21— scegliamo solo gli studenti con più di 21 anni.AND (grade = 'B' OR grade = 'C')— filtriamo quelli con votoBoC. Le parentesi tonde servono per raggruppare le condizioni.ORDER BY age ASC— ordiniamo il risultato per età, dal più giovane.
Esempio 4: Combinare ordinamento e filtraggio
Torniamo alla tabella products. Vogliamo trovare i prodotti che costano meno di 50.000, ordinarli per categoria e, dentro ogni categoria, per prezzo (dal più basso al più alto).
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
Risultato:
| product_name | category | price |
|---|---|---|
| Pylesos | Appliances | 15000 |
| Smartfon | Electronics | 30000 |
| Televizor | Electronics | 45000 |
| Lampochka | Lighting | 500 |
Spiegazione:
WHERE price < 50000— prima filtriamo i prodotti, lasciando solo quelli che costano meno di 50.000.ORDER BY category ASC, price ASC— ordiniamo per categoria (in ordine alfabetico), e dentro ogni categoria per prezzo crescente.
Esempio 5: Errore comune — dimenticare le condizioni
Vediamo ora cosa può andare storto. E se ci dimentichiamo di raggruppare le condizioni, tipo con gli operatori logici?
Query sbagliata:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
Qui OR grade = 'C' verrà eseguito senza tener conto di AND age > 21, e la query darà un risultato sbagliato. Otterrai tutti quelli che hanno voto C, anche se hanno meno di 21 anni.
Quindi usa sempre le parentesi per chiarezza:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION