back to top

SELECT: effettuare interrogazioni con MySQL

In questa lezione della nostra guida a MySQL analizzeremo quello che sicuramente è il comando più utilizzato: SELECT. Prima di procedere nella descrizione di questo comando, tuttavia, è necessario fare qualche premessa.

Premessa

Ora che le nostre tabelle sono state popolate di dati possiamo vedere come effettuare delle interrogazioni al database. Mediante una interrogazione (o query) l’utente, attraverso la console o per il tramite di un’applicazione, invia delle richieste al database che risponde in modo coerente alle istruzioni ricevute.

Interrogazioni e Comandi

Di seguito analizzeremo la procedura per l’accesso ai dati, procedura che, indipendentemente dalla piattaforma utilizzata, presenta caratteristiche di logica comuni a tutti i DBMS. Tale procedura è riassumibile nei seguenti step:

  1. connessione (e autenticazione) alla base dati;
  2. invio della query (interrogazione o comando);
  3. ricevimento del recordset (in caso di interrogazione) o del risultato dell’operazione richiesta (in caso di comando);
  4. chiusura della connessione;

Di seguito lo schema tradizionale di interazione tra client e database server:

Da sottolineare il ruolo di primo piano ricoperto nella fase n.2 dal linguaggio SQL (Structure Query Language). Grazie alle semplici istruzioni di SQL, infatti, è possibile compiere ogni tipo di operazione sul nostro database: estrarre, modificare, inserire dati e molto altro ancora.

La differenza tra interrogazione e comando sta nella trasmissione o meno, da parte del server, di un set di dati in risposta alla query. Esempi di comando possono essere INSERT INTO, UPDATE e DELETE; Le interrogazioni, invece, avvengono mediante SELECT, il quale restituisce sempre, appunto, un set di risultati (recordset).

I comandi supportati da MySQL sono i medesimi del linguaggio SQL, seppur con alcune piccole differenze. In un certo senso possiamo dire che SQL è il linguaggio, mentre MySQL è un suo "dialetto". Nel proseguo di questa guida faremo un ripasso dei principali comandi di SQL avendo cura di soffermarci sulle più importanti differenze introdotte da MySQL alla sintassi classica del linguaggio. Il comando che prenderemo in considerazione, direttamente in questa lezione, è SELECT.

Il comando SELECT

Per effettuare l’operazione di interrogazione ed estrazione di dati si ricorre al comando SQL più famoso ed utilizzato, cioè SELECT.

Attraverso una SELECT vengono, appunto, selezionati dei dati da una o più tabelle e restituiti all’utente sotto forma di una "nuova tabella" (il cosidetto recordset): tale "nuova tabella" sarà composta dalle colonne definite all’interno della SELECT e da tante righe quante è stato possibile rinvenirne in base ad eventuali filtri imposti dall’utente. Vediamo un esempio lavorando, ancora, sulla nostra tabella "amici":

SELECT cognome FROM amici;

Attraversio questa SELECT abbiamo chiesto al nostro DBMS MySQL di fornirci un elenco dei cognomi degli amici presenti nell’omonima tabella. Tutti gli altri dati (nome, numero di telefono, ecc.) non verranno inseriti nella risposta in quanto abbiamo chiesto esplicitamente di avere solo i cognomi.

Se avessimo voluto avere anche il numero di telefono avremmo utilizzato:

SELECT cognome, telefono FROM amici;

Se invece avessimo voluto avere in risposta tutti i campi della nostra tabella avremmo potuto utilizzare il carattere asterico in questo modo:

SELECT * FROM amici;

Introdurre dei filtri di selezione con WHERE

Attraverso la clausola WHERE è possibile filtrare il resultset sulla base di alcune regole, ad esempio avremmo potuto chedere a MySQL di restituirci solo i dati relativi agli amici che di cognome fanno "Rossi":

SELECT * FROM amici WHERE cognome = 'Rossi';

Oppure solo i dati dell’utente con uno specifico "id":

SELECT * FROM amici WHERE id = 7;

Si noti che nel primo esempio di SELECT con WHERE, dopo l’uguale abbiamo utilizzato gli apici per racchiudere il valore da cercare, mentre nel secondo esempio no. Ciò accade, molto semplicemente, perchè nel primo caso abbiamo a che fare con un campo testuale mentre nel secondo con uno numerico.

Ovviamente è anche possibile definire filtri su più campi, ad esempio:

SELECT * FROM amici WHERE cognome = 'Rossi' AND nome = 'Mario';

Per creare questo filtro composto abbiamo utilizzato la clausola AND: così facendo il DBMS ci restituirà solo i dati relativi agli utenti che si chiamano "Mario Rossi". Se al posto di AND avessimo usato OR il risultato sarebbe stato molto diverso: avremmo ricevuto in risposta da MySQL i dati sia degli amici con cognome "Rossi" che di quelli aventi nome "Mario".

Ordinare i risultati di una SELECT con ORDER BY

Fino ad ora abbiamo visto come selezionare risultati ed eventualmente filtrarli mediante la clausola WHERE. Vediamo ora come sia possibile ottenere da una SELECT dei risultati ordinati in un modo esplicito. Supponiamo, ad esempio, di voler ottenere i risultati ordinati alfabeticamente in base al campo "cognome":

SELECT * FROM amici ORDER BY cognome ASC;

Se avessimo voluto ordinare in modo inverso (dalla Z alla A) avremmo utilizzato DESC (che sta per descendant, discendente) al posto di ASC (che sta per ascendant, ascendente), in questo modo:

SELECT * FROM amici ORDER BY cognome DESC;

Volendo è possibile definire un ordinamento su più campi, in questo modo:

SELECT * FROM amici ORDER BY cognome ASC, nome ASC;

Così facendo gli utenti con lo stesso cognome verranno ordinati alfabeticamente in base al nome, in quanto il secondo criterio interviene quando quello precedente non è in grado di esprimere un ordine (in quanto diversi record sono omogenei rispetto a tale fattore di ordinamento):

Rossi Albero
Rossi Bruno
Rossi Carlo
...

Ordinare i record in modo casuale

E’ anche possibile utilizzare ORDER BY per effettuare un ordinamento casuale (o randomico). Per farlo sarà sufficiente utilizzare come criterio di ordinamento la funzione RAND() in questo modo:

SELECT * FROM amici ORDER BY RAND()

Attraverso questa query l’ordinamento del recordset sarà puramente casuale, ogni volta che "lanceremo" questa query, quindi, otterremo un ordine differente dei risultati.

Limitare i risultati di una SELECT

In talune circostanze può rivelarsi utile limitare i risultati di una SELECT. Si pensi, ad esempio, ad una richiesta di selzione alla quale il DBMS potrebbe rispondere con diverse migliaia di record… in tal caso potrebbe essere utile chiedere a MySQL di restituire solo i primi X risultati. Per farlo si ricorre alla clausola LIMIT in questo modo:

SELECT * FROM amici ORDER BY cognome DESC LIMIT 10;

Così facendo otterremo in risposta solo i primi 10 record.

Qualora volessimo ottenere i successivi 20 record (quindi i risultati da 11 a 20) utilizzeremo LIMIT in questo modo:

SELECT * FROM amici ORDER BY cognome DESC LIMIT 10, 20;

I due parametri che seguono a LIMIT corrispondono a:

  • il record di partenza;
  • il numero di record che si vuole estrarre.

Estarre un record a caso

Abbiamo visto poco sopra che attraverso la funzione RAND() è possibile ordinare randomicamente i risultati di una query. Qualora volessimo ottenere un solo risultato in modo casuale non dovremo fare altro che aggiungere "LIMIT 1" alla fine della nostra query, in questo modo:

SELECT * FROM amici ORDER BY RAND() LIMIT 1;

Ogni volta che eseguiremo questa query otterremo un record differente.

SELECT DISTINCT …

DISTINCT è un modificatore del comando SELECT mediante il quale la query restituirà solo risultati "unici" eliminando cioè eventuali doppioni. Facciamo un esempio:

SELECT DISTINCT cognome FROM amici ORDER BY cognome ASC;

In questo modo, ad esempio, verrà restituita la stringa "Rossi" una solo volta anche se in realtà ci sono diverse persone con questo cognome.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

In questa guida...