Lezione 6 — SELECT base e WHERE: Estrarre i Dati correttamente in MySQL

Impara a interrogare il tuo database MySQL utilizzando l'istruzione SELECT e a filtrare i risultati con la clausola WHERE per ottenere esattamente i dati di cui hai bisogno.

Introduzione all'estrazione dei dati

Dopo aver imparato a creare database e tabelle, arriva il momento di fare ciò per cui i database sono nati: l'estrazione delle informazioni. In MySQL, l'operazione principale per leggere i dati è l'istruzione SELECT.

Molti principianti pensano che SELECT serva semplicemente a "vedere" i dati, ma in realtà è lo strumento più potente di SQL. Attraverso l'interrogazione dei dati, possiamo generare report, alimentare l'interfaccia di un sito web o analizzare il comportamento degli utenti. In questa lezione, esploreremo non solo come scrivere una query di base, ma come raffinare la ricerca utilizzando la clausola WHERE, fondamentale per evitare di sovraccaricare il server con dati inutili.

L'istruzione SELECT: La base di tutto

L'istruzione SELECT permette di specificare quali colonne di una tabella vogliamo visualizzare. La sintassi fondamentale è:

SELECT colonna1, colonna2 FROM nome_tabella;

Selezionare tutte le colonne

Quando vogliamo vedere l'intero contenuto di una riga, utilizziamo l'asterisco (*). Questo è un comando rapido, molto utile durante la fase di sviluppo per verificare che i dati siano stati inseriti correttamente.

-- Recuperiamo tutti i campi di tutti gli utenti registrati
SELECT * FROM utenti;

Perché evitare l'asterisco in produzione? Sebbene SELECT * sia comodo, in un ambiente professionale è considerata una cattiva pratica. Se la tua tabella ha 50 colonne e tu ne usi solo 2, stai costringendo il database a leggere e trasferire via rete una quantità enorme di dati inutili. Questo rallenta l'applicazione e aumenta il consumo di memoria del server.

Selezionare colonne specifiche

La pratica corretta consiste nel dichiarare esplicitamente i campi necessari. Questo rende il codice più leggibile e performante.

-- Recuperiamo solo il nome e l'email degli utenti
SELECT nome, email FROM utenti;

In questo esempio, MySQL ignorerà tutte le altre colonne (come password o data di creazione), ottimizzando la risposta.

Filtrare i dati con la clausola WHERE

Nella maggior parte dei casi, non vogliamo tutti i record di una tabella, ma solo quelli che soddisfano determinati criteri. Qui entra in gioco la clausola WHERE.

La clausola WHERE agisce come un filtro: ogni riga della tabella viene valutata e, se la condizione specificata è vera (TRUE), la riga viene inclusa nel risultato finale; se è falsa (FALSE), viene scartata.

Operatori di confronto

Per costruire le condizioni nel WHERE, utilizziamo gli operatori di confronto:

  • = : Uguale a
  • <> o != : Diverso da
  • < : Minore di
  • > : Maggiore di
  • <= : Minore o uguale a
  • >= : Maggiore o uguale a

Vediamo un esempio pratico basato su una tabella di prodotti:

-- Selezioniamo i prodotti che costano esattamente 10 euro
SELECT nome_prodotto, prezzo 
FROM prodotti 
WHERE prezzo = 10.00;

-- Selezioniamo i prodotti con un prezzo superiore a 50 euro
SELECT nome_prodotto, prezzo 
FROM prodotti 
WHERE prezzo > 50.00;

Gestione dei tipi di dato nel WHERE

Un errore comune per chi inizia è non distinguere tra numeri e stringhe nelle query.

Stringhe e Date

Quando filtri per un valore testuale (VARCHAR, TEXT) o per una data (DATE, DATETIME), il valore deve essere racchiuso tra apici singoli ('). Se dimentichi gli apici, MySQL interpreterà la parola come il nome di una colonna, generando un errore.

-- CORRETTO: Filtro per stringa
SELECT * FROM utenti WHERE citta = 'Roma';

-- ERRATO: Questo genererà un errore perché Roma non è una colonna
-- SELECT * FROM utenti WHERE citta = Roma;

Numeri

I valori numerici (INT, DECIMAL, FLOAT) non richiedono apici. Sebbene MySQL sia flessibile e possa accettare numeri tra apici, è corretto scriverli senza per mantenere la coerenza semantica del linguaggio.

Combinare più condizioni: AND, OR e NOT

Spesso un singolo filtro non è sufficiente. Possiamo combinare più criteri utilizzando gli operatori logici.

L'operatore AND

L'operatore AND richiede che tutte le condizioni siano vere affinché la riga venga selezionata. È utile per restringere drasticamente il campo di ricerca.

-- Troviamo gli utenti che vivono a Milano E che hanno più di 18 anni
SELECT nome, email 
FROM utenti 
WHERE citta = 'Milano' AND eta > 18;

L'operatore OR

L'operatore OR richiede che almeno una delle condizioni sia vera. Viene usato per ampliare la ricerca.

-- Troviamo gli utenti che vivono a Milano OPPURE a Roma
SELECT nome, email 
FROM utenti 
WHERE citta = 'Milano' OR citta = 'Roma';

L'operatore NOT

L'operatore NOT inverte il risultato di una condizione. È utile quando è più semplice definire ciò che non vogliamo.

-- Troviamo tutti gli utenti che NON vivono a Napoli
SELECT nome, email 
FROM utenti 
WHERE NOT citta = 'Napoli';

Esempi pratici e casi d'uso reali

Per consolidare i concetti, analizziamo tre scenari tipici di uno sviluppatore web.

Caso 1: Sistema di Login

Quando un utente tenta di accedere, il server non scarica tutti gli utenti, ma cerca solo quello con l'email specifica e la password corrispondente.

SELECT id, nome 
FROM utenti 
WHERE email = 'utente@esempio.com' AND password = 'hash_password_sicura';

Caso 2: E-commerce (Filtro Categorie e Prezzo)

Immaginiamo un utente che cerca "Smartphone" che costino meno di 300 euro.

SELECT nome_prodotto, prezzo, marca 
FROM prodotti 
WHERE categoria = 'Smartphone' AND prezzo < 300.00;

Caso 3: Gestione Ordini (Ricerca per Stato)

Un amministratore vuole vedere tutti gli ordini che non sono ancora stati spediti (stato 'pendente' o 'in lavorazione').

SELECT id_ordine, data_ordine 
FROM ordini 
WHERE stato = 'pendente' OR stato = 'in lavorazione';

Errori comuni e FAQ

Perché la mia query non restituisce risultati nonostante i dati esistano?

Il motivo più comune è la case-sensitivity o gli spazi bianchi. Sebbene MySQL per impostazione predefinita non sia case-sensitive per le stringhe (dipende dal collation), è possibile che ci siano spazi invisibili. Ad esempio, 'Roma ' è diverso da 'Roma'.

Posso usare WHERE con SELECT *?

Sì, è possibile: SELECT * FROM utenti WHERE id = 1;. Tuttavia, ricorda il consiglio di evitare * in produzione.

Qual è la differenza tra = e LIKE?

In questa lezione abbiamo visto =, che cerca l'uguaglianza esatta. LIKE (che vedremo in lezioni successive) permette ricerche parziali usando i caratteri jolly (es. WHERE nome LIKE 'Mar%' per trovare Mario, Marco, etc.).

Prossimi passi

Ora che sai come selezionare e filtrare i dati, hai le basi per creare query funzionali. Tuttavia, l'estrazione dei dati può diventare molto più sofisticata.

Nelle prossime lezioni approfondiremo:

  1. L'ordinamento dei dati: Impareremo a usare ORDER BY per visualizzare i risultati in ordine alfabetico o numerico.
  2. Il limite dei risultati: Vedremo come usare LIMIT per implementare la paginazione (fondamentale per non caricare 10.000 righe in una sola pagina web).
  3. Operatori avanzati: Studieremo BETWEEN, IN e l'operatore LIKE per filtri ancora più precisi.

Per fare pratica, prova a creare una tabella libri con colonne titolo, autore, anno_pubblicazione e prezzo, e prova a scrivere query per trovare tutti i libri di un autore specifico pubblicati dopo il 2010.