Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ricerche con MySQL

Panoramiche delle funzioni di ricerca che possono essere utilizzate sui dati conservati in un database MySQL: ricerche esatte, fulltext o condizionate
Panoramiche delle funzioni di ricerca che possono essere utilizzate sui dati conservati in un database MySQL: ricerche esatte, fulltext o condizionate
Link copiato negli appunti

Dopo aver popolato un database ci troveremo a dover estrarre i dati tramite interrogazioni: queste potranno essere precise (es. estrarre il record della città di Milano) o contenere caratteri jolly (es. estrarre i record di tutte le città inizianti per "Mil"); potranno anche essere eseguite su una sola tabella oppure, tramite l'uso delle join, estrarre i dati da una tabella secondo un criterio riguardante un'altra tabella collegata (es. estrarre i record delle città legate alla regione con nome "Lombardia").

Ipotizziamo per questo articolo di avere a disposizione un database delle città d'Italia con le rispettive regioni strutturato in questo modo:

Tabella citta (ID, Nome, Regione)
Tabella regione (ID, Nome)

dove citta.Regione e regione.ID siano legati da una relazione uno a molti (come illustrato in un articolo di qualche settimana fa).

Ricerca esatta

Il tipo di ricerca basilare che possiamo sfruttare consiste nel cercare i record che presentino un campo corrispondente esattamente alla parola che stiamo cercando, come ad esempio:

SELECT ID FROM citta WHERE Nome = 'Pisa'

In alternativa possiamo cercare i record non corrispondenti alla stringa tramite la notazione "!=":

SELECT Nome FROM citta WHERE Nome != 'Pisa'

Ovviamente l'uso della ricerca per negazione in questo caso si rivela infelice data la quantità di elementi negati rispetto a quelli positivi, ma può rivelarsi invece molto utile nel caso in cui un particolare campo possa assumere solo due valori.

Ricerca all'interno di un Set

Un altro caso concreto che potrebbe capitarci scrivendo un piccolo motore di ricerca è rappresentato dalla ricerca di record contenenti una sola oppure tutte le parole cercate: in questo caso ci troviamo di fronte a ricerche di tipo OR. Per le ricerche di tipo OR di un certo numero di parole all'interno di un solo campo sarebbe necessario scrivere delle clausole della query di questo tipo:

WHERE campo = 'parola1' OR campo = 'parola2' OR campo = 'parola3'

fino all'esaurimento delle parole cercate. Se poi i campi all'interno dei quali cercare fossero più di uno sarebbe necessario raddoppiare il numero di clausole OR allungando ulteriormente la query e rendendola sempre meno funzionale. L'alternativa è l'uso della parola chiave IN e di un Set di alternative.

Facendo riferimento al caso precedente ci troveremo ad avere una query di questo tipo:

SELECT * FROM tabella WHERE campo IN ('parola1', 'parola2', 'parola3')

Il Set è formato dalle parole cercate ma è anche possibile invertire la situazione e cercare i record che presentano una parola in uno o più record. In questo caso però può accadere di estrarre due volte lo stesso record per la stessa parola: una volta perché presente in un campo, un'altra perché presente anche nel secondo.

Per evitare è necessario usare DISTINCT con una clausola di tipo GROUP BY.

È possibile anche cercare i record che non presentino la parola in un particolare campo tramite le parole chiave NOT IN al posto di IN.

Ricerca LIKE

Finora abbiamo visto esempi di ricerca limitati a precise parole o, come nel caso delle ricerche in Set, a due o più alternative ben definite in partenza. È chiaro che questo tipo di ricerca è possibile solo cercando un dato preciso, ad esempio uno studente dal suo voto medio, un modello di automobile dal nome, un libro dal suo codice ISBN, ma non nel caso comune in cui l'utente cerchi un record tramite un carattere jolly.

Generalmente il carattere jolly è rappresentato dal segno di asterisco ("*") - come ad esempio la ricerca di file in ambiente Windows - oppure dal carattere di punto (".") - come nel caso delle espressioni regolari. Nel caso del linguaggio SQL il carattere jolly è invece rappresentato dal segno di percentuale ("%") in abbinamento all'istruzione LIKE.

Facciamo un esempio pratico sempre sulla nostra tabella delle città:

SELECT Nome FROM citta WHERE Nome LIKE 'A%'

Questa query estrarrà tutte le città il cui nome inizia per A, dato che il carattere di jolly è stato inserito dopo la A (quindi ad esempio ASTI ma non TRAPANI). Spostando il carattere % prima della A o mantenendolo in entrambe le posizioni si ottengono rispettivamente una ricerca per tutte le città terminanti per A (ad esempio ROMA e non MILANO) e di tutte le città contenenti la lettera A (quindi PARMA ma non ROVIGO).

Anche in questo caso è possibile ottenere l'effetto di negazione anteponendo la parola chiave NOT a LIKE.

Da notare bene che utilizzare LIKE senza il carattere jolly equivale a realizzare una ricerca esatta per valore: queste due query si equivalgono:

SELECT Nome FROM citta WHERE Nome LIKE 'MILANO'
SELECT Nome FROM citta WHERE Nome = 'MILANO'

Ricerca all'interno di una subquery

Un altro tipo interessante di ricerca è quello rappresentato dall'utilizzo di una subquery. Per mezzo di questa tecnica si realizzano due query una all'interno dell'altra. La query esterna avrà ricercherà all'interno di un Set tramite la parola chiave IN, e la query secondaria fornirà esattamente il Set nel quale cercare. La query interna infatti estrae i dati assemblandoli a formare un Set proprio come se si trattasse di un array; a questo punto la query esterna potrà andare a fare una ricerca direttamente su questo array.

Molto spesso l'utilizzo di una subquery va a sovrapporsi alle query di tipo join, ma questo è poco auspicabile per due ragioni:

  • le JOIN sono più ottimizzate delle subquery
  • le subquery sono state introdotte solo successivamente alle JOIN, quindi si ha una minor retrocompatibilità.

Ad esempio per estrarre tutte le città in regioni il cui nome contenga la lettera S è preferibile la seconda di queste due query, comunque entrambe valide:

SELECT citta.Nome FROM citta WHERE citta.Regione IN (SELECT ID FROM regione WHERE Nome LIKE '%S%')
SELECT citta.Nome FROM citta, regione WHERE citta.Regione = regione.id AND regione.Nome LIKE '%S%'

Ricerca FULLTEXT

Il tipo di ricerca più sofisticato disponibile su MySQL è rappresentato dalle ricerche FULLTEXT, che permettono non solo di estrarre i record contenenti determinati termini ma anche di ordinarli in base alla rilevanza del risultato. Gli svantaggi sono il dover definire in fase di progettazione del database una chiave FULLTEXT di tipo testuale su cui effettuare le ricerche e il fatto che lo spazio occupato nel database sarà aumentato vista la necessità di creare gli indici testuali.

Per una trattazione approfondita di questo tipo di ricerche rimando all'articolo di Gabriele Farina Un motore di ricerca in PHP e MySQL.

Ti consigliamo anche