Il linguaggio SQL (Structured Query Language) è lo strumento principale per chiunque lavori con i dati. Grazie alla sua sintassi semplice e dichiarativa, SQL permette di comunicare con i database e ottenere informazioni preziose in pochi passaggi. Tra le tante funzionalità offerte, una delle più importanti è la possibilità di leggere e interrogare i dati.
In questo articolo ti guiderò attraverso le principali clausole del Data Query Language (DQL) di SQL: SELECT, FROM, WHERE, JOIN, GROUP BY, HAVING e ORDER BY. Inoltre, vedremo anche strumenti avanzati come le CTE (Common Table Expressions) e le subquery, ideali per gestire query più complesse. Faremo riferimento in particolare alla sintassi di Microsoft SQL Server, uno dei sistemi di gestione di database relazionali più utilizzati al mondo.
SELECT: scegliere i dati da leggere
La clausola SELECT è il punto di partenza per qualsiasi query SQL. È qui che specifichi le colonne che vuoi visualizzare. Pensa a SELECT come a una lente che ti permette di focalizzarti solo sui dati di cui hai bisogno.
Ad esempio, se vuoi ottenere i nomi e i cognomi degli utenti presenti in una tabella, puoi scrivere:
SELECT nome, cognome FROM utenti;
La cosa bella di SELECT è che puoi usarla anche per fare calcoli o manipolazioni sui dati. Per esempio, puoi rinominare le colonne nei risultati utilizzando un alias:
SELECT nome AS NomeUtente, cognome AS CognomeUtente
FROM utenti;
Questa funzionalità è utile quando vuoi rendere i risultati più chiari o se stai lavorando con funzioni come SUM, AVG o COUNT.
Se lavori con tabelle molto grandi, è buona pratica aggiungere una clausola come TOP 1000 (o il corrispettivo LIMIT in altri database) alla tua SELECT per limitare il numero di righe restituite. Questo non solo evita di visualizzare troppi dati inutili, ma aiuta anche a ridurre il carico sul server, migliorando le performance della query.
FROM: specificare la sorgente dei dati
La clausola FROM è altrettanto importante: indica da dove provengono i dati che vuoi interrogare. In pratica, con FROM specifichi la tabella (o le tabelle) da cui estrarre le informazioni.
Ad esempio, se hai una tabella chiamata “utenti” e vuoi esplorarne i dati, usi:
SELECT * FROM utenti;
Quando lavori con più tabelle, è qui che entra in gioco l’uso di JOIN, che vedremo più avanti. Questo ti consente di collegare e combinare i dati da fonti diverse in modo logico.
WHERE: filtrare i dati
Molte volte non hai bisogno di tutti i dati di una tabella, ma solo di un sottoinsieme che soddisfi determinate condizioni. La clausola WHERE è ciò che ti permette di applicare filtri.
Per esempio, immaginiamo di avere una tabella “prodotti” e di voler selezionare solo quelli con un prezzo superiore a 50:
SELECT * FROM prodotti WHERE prezzo > 50;
Puoi anche combinare più filtri utilizzando operatori logici come AND e OR. Ad esempio:
SELECT * FROM prodotti WHERE prezzo > 50 AND categoria = 'Elettronica';
Questa query seleziona solo i prodotti della categoria “Elettronica” con un prezzo maggiore di 50.
GROUP BY: raggruppare per analizzare meglio
Quando vuoi ottenere informazioni aggregate, come il totale delle vendite per categoria o il numero di utenti per regione, la clausola GROUP BY è indispensabile. Con GROUP BY puoi organizzare i dati in gruppi basati su una o più colonne.
Ad esempio, supponiamo di avere una tabella “prodotti” e di voler contare quanti prodotti appartengono a ciascuna categoria:
SELECT categoria, COUNT(*) AS numero_prodotti
FROM prodotti
GROUP BY categoria;
Questa query raggruppa i prodotti per categoria e calcola il numero di elementi per ciascun gruppo.
HAVING: filtrare dopo l’aggregazione
Dopo aver raggruppato i dati, potrebbe essere necessario applicare ulteriori filtri ai risultati. È qui che entra in gioco la clausola HAVING.
Ad esempio, se vuoi visualizzare solo le categorie che contengono più di 10 prodotti, puoi scrivere:
SELECT categoria, COUNT(*) AS numero_prodotti
FROM prodotti
GROUP BY categoria
HAVING COUNT(*) > 10;
HAVING funziona in modo simile a WHERE, ma viene utilizzato sui dati già aggregati.
Perfezionare le query e migliorare le performance
Scrivere query ben strutturate è una competenza essenziale, ma quando si lavora con database di grandi dimensioni, le performance diventano un aspetto cruciale. Query mal ottimizzate possono rallentare il sistema e complicare il lavoro.
Il passo successivo per chi ha imparato le basi di SQL è approfondire tecniche avanzate di ottimizzazione. Ad esempio, imparare a usare correttamente gli indici, ottimizzare l’uso dei JOIN e migliorare la gestione delle risorse del database. Se vuoi fare questo salto di qualità, puoi consultare il corso SQL Server di Nicola Iantomasi. È una risorsa preziosa per imparare a scrivere query performanti e usare il linguaggio SQL in modo professionale.
JOIN: combinare i dati tra più tabelle
Nel mondo reale, i dati non si trovano quasi mai tutti in un’unica tabella. Per esempio, potresti avere una tabella “clienti” che contiene informazioni sui tuoi utenti e una tabella “ordini” che registra gli acquisti effettuati. Per mettere insieme questi dati e ottenere informazioni più complete, SQL ti offre i JOIN.
Con i JOIN puoi combinare i dati di due o più tabelle basandoti su una colonna in comune, come un identificativo. Esistono diversi tipi di JOIN, ognuno pensato per situazioni diverse:
- INNER JOIN: ti mostra solo i record che hanno una corrispondenza in entrambe le tabelle.
- LEFT JOIN: restituisce tutti i record della prima tabella (quella a sinistra) e i dati corrispondenti della seconda, anche se non ci sono corrispondenze.
- RIGHT JOIN: funziona come il LEFT JOIN, ma considera come “principale” la seconda tabella.
- FULL JOIN: unisce tutto, restituendo i dati da entrambe le tabelle, con o senza corrispondenze.
Facciamo un esempio pratico: supponiamo di voler sapere quali clienti hanno effettuato ordini. La query potrebbe essere:
SELECT ordini.id, clienti.nome
FROM ordini
INNER JOIN clienti ON ordini.cliente_id = clienti.id;
Questa query confronta le due tabelle, “ordini” e “clienti”, utilizzando la colonna cliente_id come punto di collegamento. È un po’ come unire due puzzle: i pezzi devono combaciare. Una volta imparato a usare i JOIN, avrai uno strumento potente per navigare tra le relazioni dei tuoi dati.
ORDER BY: ordinare i risultati
Quando estrai dati da un database, è probabile che tu voglia presentarli in un ordine specifico. La clausola ORDER BY serve proprio a questo: ti permette di organizzare i risultati in ordine crescente o decrescente, in base a una o più colonne.
Ad esempio, se hai una tabella “prodotti” e vuoi visualizzare gli articoli ordinati per prezzo, puoi scrivere:
SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo ASC;
In questo caso, i prodotti verranno ordinati dal prezzo più basso al più alto. Se invece desideri invertire l’ordine, puoi usare DESC.
Tuttavia, l’uso di ORDER BY può comportare alcune problematiche, specialmente in termini di performance. Ordinare i dati richiede al database di analizzare e riorganizzare i risultati, un’operazione che diventa costosa quando si lavora con tabelle molto grandi. Se la colonna su cui applichi l’ordinamento non è indicizzata, il database dovrà eseguire un’operazione completa di sorting in memoria o su disco, rallentando significativamente il tempo di risposta.
CTE e subquery: gestire la complessità
Quando le tue query iniziano a diventare più complesse, è facile perdersi in un mare di codice difficile da leggere e mantenere. Per fortuna, SQL mette a disposizione due strumenti fondamentali per semplificare le cose: le CTE (Common Table Expressions) e le subquery.
Le CTE, o espressioni di tabella comuni, ti permettono di definire espressioni tabellare che puoi usare all’interno della tua query principale. È come creare un blocco appunti per organizzare meglio i dati. Ad esempio, se vuoi calcolare il totale speso da ogni cliente e poi filtrare quelli che hanno superato una certa soglia, puoi farlo così:
WITH Vendite AS (
SELECT cliente_id, SUM(prezzo) AS totale_speso
FROM ordini
GROUP BY cliente_id
)
SELECT * FROM Vendite
WHERE totale_speso > 1000;
Con questa struttura, hai definito una CTE chiamata “Vendite”, che puoi interrogare come se fosse una tabella reale.
Le subquery, invece, funzionano come query annidate all’interno di altre query. Sono perfette quando hai bisogno di calcolare qualcosa “al volo”. Ad esempio, se vuoi sapere i nomi dei clienti che hanno effettuato ordini sopra un certo valore, puoi usare una subquery così:
SELECT nome FROM clienti
WHERE id IN (SELECT cliente_id FROM ordini WHERE prezzo > 100);
In questo caso, la subquery trova tutti gli ID dei clienti che hanno speso più di 100, e la query principale utilizza quei risultati per selezionare i nomi.
Entrambi questi strumenti sono indispensabili per chi lavora con dati complessi. Usarli non solo rende le query più facili da leggere, ma ti permette anche di affrontare problemi complessi in modo chiaro ed elegante. In questo articolo trovi un approfondimento sul tema.
Conclusione sull’interrogazione dei dati con SQL
SQL è uno strumento indispensabile per chiunque lavori con i dati. Conoscere e padroneggiare le clausole principali come SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN e ORDER BY ti permetterà di estrarre e analizzare le informazioni in modo efficace. Strumenti avanzati come le CTE e le subquery ti apriranno poi nuove possibilità per affrontare problemi complessi.
Ma non dimenticare che sapere scrivere query è solo l’inizio. Imparare a ottimizzarle è ciò che distingue un utente esperto da uno principiante.












