Istruzione SELECT

Con questo capitolo iniziamo il percorso verso la teoria e la pratica sulla sintassi Sql iniziando dai criteri con cui è possibile effettuare ricerche, in gergo tecnico dette query.

Come già accennato nei capitoli precedenti, l'Sql somiglia in maniera impressionante al linguaggio umano, con una scarsa terminologia è possibile realizzare potenti query (il termine è utilizzato anche per indicare genericamente operazioni Sql) sui nostri database.

L'istruzione con cui possiamo inizializzare una ricerca è SELECT, Sql è case-insensitive nei confronti dei comandi proprietari del linguaggio, è la stessa cosa scrivere SELECT o select, ma diventa case-sensitive quando si specificano i nomi delle tabelle o dei campi del database, quindi prego di prestare la massima attenzione a questo aspetto, consiglio comunque di scrivere in maiuscolo i comandi ed in minuscolo i nomi, in modo leggere meglio il codice.

Si ipotizzi di lavorare sulla tabella anagrafe con i seguenti campi:

Ipotizzando che la tabella sia stracolma di dati eseguiamo la più banale delle ricerche, il cui risultato sarà la restituzione di tutti i record presenti:

SELECT * FROM anagrafe;

letteralmente: SELEZIONA tutti i campi DALLA TABELLA anagrafe;

Il simbolo asterisco (*) indica appunto tutti i campi, ogni operazione va conclusa con un punto e virgola (;), potremmo però decidere di selezionare ad esempio solo il campo nome:

SELECT nome FROM anagrafe;

oppure due o più campi:

SELECT nome,cognome,anni FROM anagrafe;

Utilizziamo quindi la virgola (,) per separare più valori. Creiamo ora una query che restituisca determinati record in base ad una condizione:

SELECT * FROM anagrafe WHERE nome = 'Luca';

letteralmente: SELEZIONA tutti i campi DALLA TABELLA anagrafe DOVE IL CAMPO nome E' UGUALE A Luca;

Possiamo potenziare i criteri di ricerca stabilendo più di una condizione:

SELECT* FROM anagrafe WHERE nome = 'Luca' AND cognome = 'Ruggiero';

letteralmente: SELEZIONA tutti i campi DALLA TABELLA anagrafe DOVE IL CAMPO nome E' UGUALE A Luca ED IL CAMPO cognome E' UGUALE A Ruggiero;

Possiamo però avere l'esigenza di escludere l'uno o l'altro criterio di ricerca, quindi:

SELECT * FROM anagrafe WHERE nome = 'Luca' OR nome = 'Pippo';

Non è finita qui, possiamo effettuare una ricerca che consenta di trovare tutti i record i cui campi utilizzati abbiano valori simili, se ad esempio scrivo:

SELECT * FROM anagrafe WHERE nome LIKE 'Luca';

Tra i risultati della ricerca troverò probabilmente anche eventuali ocorrenze di Lucia e simili.

Effettuare una ricerca in questo modo comunque inutile, possiamo utilizzare l'operatore LIKE integrando nell'espressione il simbolo percentuale (%) che serve a recuperare una parte non specificata del valore di un campo, ad esempio %luca troverà sia i campi con l'occorrenza di Luca che di Gianluca ecc... un esempio:

SELECT * FROM anagrafe WHERE nome LIKE '%luca';

Il simbolo % più essere utilizzato sia all'inizio che alla fine di un valore, o in tutti e due i posti.

Possiamo, grazie all'operatore di confronto BETWEEN, selezionare i record dove, ad esempio nel campo anni l'età sia compresa tra un certo numero di anni ed un numero maggiore:

SELECT * FROM anagrafe WHERE anni BETWEEN '20' AND '30';

I risultati saranno tutti i record il cui corrispondente valore del campo anni andrà da 21 a 29.

Grazie al comando DISTINCT possiamo ricercare record che potrebbero essere stati ripetuti, ad esempio se ci sono due Luca Ruggiero nel database possiamo tentare di arrivare alla persona che ci interessa con una certa facilità, se ad esempio scrivessimo:

SELECT DISTINCT nome,cognome,nato_a FROM anagrafe WHERE cognome = 
'Ruggiero' AND nato_a = 'Napoli';

ritroveremo un solo Luca Ruggiero nato a Napoli, ma ovviamente potrebbero essercene comunque più di uno, dobbiamo quindi "chiudere il cerchio" il più possibile specificando ulteriori condizioni, aggiungiamo quindi all'esempio precedente l'espressione:

... AND anni = '24';

e troveremo Luca Ruggiero nato a Napoli che ha 24 anni.

Possiamo ordinare i nostri risultati in ordine crescente o decrescente scegliendo come parametro un qualsiasi campo, il nome, il cognome, l'età, la città di nascita ecc, vediamo un esempio in cui ordiniamo il ordine alfabetico crescente i record in base al cognome:

SELECT * FROM anagrafe ORDER BY cognome;

ORDER BY ci permette di fare questo, ma possiamo anche, grazie al comando DESC, ordinare i risultati in ordine decrescente:

SELECT * FROM anagrafe ORDER BY cognome DESC;

Concludiamo la lezione contando i record che ci interessano col comando COUNT:

SELECT COUNT (*) FROM anagrafe WHERE nome = 'Luca';

sapremo quanti Luca ci sono nel database, ma possiamo fare ancora di più:

SELECT DISTINCT COUNT (*) FROM anagrafe;

in questo modo se ci sono dei record che si ripetono possiamo escluderli dal conteggio e sapere quanti record univoci sono presenti.

E' comunque possibile ovviare a questo inconveniente direttamente da codice, se ad esempio utilizziamo il database per un'applicazione Web in Asp, possiamo da codice Asp non permettere l'inserimento di un intero record uguale effettuando dei controlli prima di autorizzare inserimento.

Autore: Luca Ruggiero