Filtrare i dati con la clausola WHERE

Gli argomenti di questa pagina

  • Filtrare i dati con la clausola WHERE
  • Operatori di confronto e operatori logici
  • Questo gruppo di istruzioni può usare questo script
  • Query che restituisce un solo record
  • Script per eseguire questo secondo gruppo di Query
  • Query che possono restituire più record
  • Confrontare su differenze
  • Abbinamento di operatori di confronto ed operatori logici
  • Usando l'operatore AND
  • Usando l'operatore OR
  • Usando AND e OR assieme

Filtrare i dati con la clausola WHERE

Una istruzione SELECT con la sola clausola SELECT ed ovviamente con la cluausola FROM restituisce sempre tutti i record ed i campi indicati nella clausola SELECT. Per limitare il numero di record restituiti da una istruzione SELECT è possibile usare la clausola WHERE. Istruendo bene questa clausola si possono ottenere risultati sorprendenti. Per eseguire in PHP la dichiarazione di cui sopra si deve usare la funzione mysql_query(). Questa funzione viene utilizzata per inviare una query o un comando a una connessione MySQL.

Operatori di confronto e operatori logici

Nella clausola WHERE vengono utilizzati gli operatori di confronto e operatori logici.

operatori di confronto operatori logici
operatore descrizione operatore descrizione
= é uguale ad un valore AND Restituisce TRUE se entrambe le espressioni restituiscono a loro volta TRUE
< è minore ad un valore OR Restituisce TRUE se almeno una delle due espressioni coinvolte restituisce TRUE
> é maggiore ad un valore NOT Restituisce l'opposto del valore dell'espressione: TRUE se l'espressione è FALSE e viceversa
<= è minore oppure uguale al valore    
>= è maggiore oppure uguale al valore    
<> è differente dal valore    
SELECT elenco_campi
FROM nome_tabella
WHERE campo predicato valore

Nella clausola WHERE il campo va inserito semplicemente indicandone il nome, ma il valore, se è un valore numerico va anch'esso scritto semplicemente (120), ma se è una stringa, va inserita tra apici semplici ('stringa1')

Negli esempi che seguono viene usata la tabella sql_citta che ha questi campi:
id, cap, citta, prov
e la tabella sql_rubrica con questi campi:
id, codice, cognome, nome, indirizzo, cap, citta, prov, data_nascita, telefono

Questo gruppo di istruzioni può usare questo script

Le Query presentate qui di seguito come esempi possono essere eseguite da questo script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        
$result mysql_query($Query);
        
$num_row mysql_num_rows($result);
        
$numfields mysql_num_fields($result);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            
$row mysql_fetch_array($result);
            echo 
$num_row " record restituiti<br />\n";
            echo 
"<table class=\"tabella_it\">";
            echo 
"<tr>\n";
            for (
$i=0$i $numfields$i++) {
                echo 
"<th>" $fields[$i] . "</th>\n";
            }
            echo 
"</tr>\n";
            echo 
"<tr>\n";
            for (
$i=0$i $numfields$i++) {
                echo 
"<td>" $row[$fields[$i]] . "</td>\n";
            }
            echo 
"</tr>\n";
            echo 
"</table>\n";
        }
    }
}
mysql_close ($link);
?>

Query che restituisce un solo record

Per ottenere questo risultato bisogna che la clausola WHERE verifichi la condizione su un campo o una serie di campi che possano dare restituire un solo record. Un campo sicuramente univoco è il campo ID. Così possiamo pensare a questo tipo di Query.

Mostra la città registrata con un particolare ID

esempio 1
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE id =13"
;
?>
1 record visualizzati
id cap citta prov
13 20050 Correzzana MB

Ma, come nella tabella sql_citta, potrebbero esserci anche altri campi che possono essere univoci, come per esempio il CAP della città come è visibile nel prossimo esempio.

Mostra la città con un particolare CAP

esempio 2
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE cap ='21020'"
;
?>
1 record visualizzati
id cap citta prov
29 21020 Daverio VA

Ma questo non è un requisito necessario. Istruendo correttamente la clausola WHERE possiamo ottenere un unico record inserendo nella clausola una combinazione di campi che singolarmente non sono univoci ma che assiene danno una coppia univoca. Nella nostra tabella abbiamo due città che si chiamano Varena e due che si chiamano Bevagna. Ma di ciascuna coppia una sola è di una provincia ed una sola di un'altra provincia. Quindi se nella clausola WHERE cerchiamo l'abbinamento dei campi 'citta' e 'prov' otterremo un abbinamento univoco.
Qui sotto, prima di eseguire l'esempio proposto, propongo due test:

  • nel primo test conto le città
  • nel secondo esempio conto le province
  • infine, nell'esempio finale, creo il filtro in modo da ottenere un unico record.

Mostra la città che si chiama Giusvalla e che sia della provincia di DE

esempio 3: primo test
1
2
3
4
5
6
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE citta = 'Agnano'
"
;
?>
2 record visualizzati
id cap citta prov
23 56017 Agnano PI
24 80125 Agnano NA
esempio 3: secondo test
1
2
3
4
5
6
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'NA'
"
;
?>
3 record visualizzati
id cap citta prov
24 80125 Agnano NA
30 80070 Fusaro NA
31 80075 Monterone NA
esempio 3 finale
1
2
3
4
5
6
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'NA'
AND citta = 'Agnano'"
;
?>
1 record visualizzati
id cap citta prov
24 80125 Agnano NA

Script per eseguire questo secondo gruppo di Query

Le seguenti Query presentate come esempi sono eseguite da questo script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        if (
$result mysql_query($Query)) {
            
$num_row mysql_num_rows($result);
            
$numfields mysql_num_fields($result);
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            if (
$num_row 0) {
                echo 
$num_row " record letti<br />\n";
                echo 
"<table class=\"tabella_it\">\n";        
                echo 
"<tr>\n";
                for (
$i=0$i $numfields$i++) {
                    echo 
"<th>" $fields[$i] . "</th>\n";
                }
                echo 
"</tr>\n";
                while (
$row mysql_fetch_array($result)) {
                    echo 
"<tr>\n";
                    for (
$i=0$i $numfields$i++) {
                        echo 
"<td>";
                        echo 
is_null($row[$fields[$i]]) ? 'NULL' $row[$fields[$i]];
                        echo 
"</td>\n";
                    }
                    echo 
"</tr>\n";
                }
                echo 
"</table>\n";
            } else {
                echo 
"Nessun record restituito<br />\n";
            }
        } else {
            echo 
mysql_error() . "<br />\n"
        }
    }
}
mysql_close ($link);

Query che possono restituire più record

Finiti i test per ottenere un solo record possiamo passare a Query che possono dare molteplici record. Ma anche qui possiamo ottenere zero, uno o più record dipendente dal modo con cui viene usata la clausola WHERE e dai campi che vengono usati.

Mostra le città della provincia che indico

esempio 4
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'AN'"
;
?>
2 record trovati
2 record visualizzati
id cap citta prov
12 60013 Corinaldo AN
14 60015 Falconara Alta AN
esempio 5
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'VA'"
;
?>
2 record trovati
2 record visualizzati
id cap citta prov
28 21030 Cuvio VA
29 21020 Daverio VA

Confrontare su differenze

Finora i confronti sono stati eseguiti sulle uguaglianze nei confronti tra due o più valori. Ma questa sezione non può essere conclusa senza verificare un confronto sulle diseguaglianze.

Mostra le città che non sono delle province che indico

esempio 6
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov <> 'NA'
AND prov <> 'RC'
"
;
?>
33 record trovati
15 record visualizzati
id cap citta prov
1 35031 AbanoTerme PD
2 23821 Abbadia Lariana LC
3 56011 Agropoli GH
5 06031 Bevagna PG
6 12011 Borgo S. Dalmazzo CN
7 18037 Castel Vittorio IM
8 43050 Cereseto PR
9 44030 Coccanile FE
12 60013 Corinaldo AN
13 20050 Correzzana MB
14 60015 Falconara Alta AN
15 17010 Giusvalla SV
18 58010 Marsiliana GR
19 55060 Massarosa LU
20 39013 Moso in passiria BZ
... ... ... ...

Abbinamento di operatori di confronto ed operatori logici

In un confronto è possibile un solo tipo di operatore di confronto, ma è anche possibile utilizzare diversi tipi di confronto usando gli operatori logici AND e OR. Facciamo solo un paio di esempi.
Prima di passare a questa ultima fase vediamo alcuni aspetti della nostra tabella. Abbiamo
tre diverse città e due diverse città che sono nella stessa provincia
due coppie di città con lo stesso nome che si trovano in province diverse.
Vediamo cosa possiamo ottenere abbinando gi operatori di confronto con gli operatori logici.

esempio 7
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'TN'"
;
?>
1 record trovati
1 record visualizzati
id cap citta prov
21 38030 Varena TN
esempio 8
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'PG'"
;
?>
1 record trovati
1 record visualizzati
id cap citta prov
5 06031 Bevagna PG
esempio 9
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE citta = 'Varena'"
;
?>
1 record trovati
1 record visualizzati
id cap citta prov
21 38030 Varena TN
esempio 10
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE citta = 'Bevagna'"
;
?>
1 record trovati
1 record visualizzati
id cap citta prov
5 06031 Bevagna PG

Usando l'operatore AND

Viene usato l'operatore AND quando occorre effettuare più di un confronto e tutti i confronti debbono essere TRUE.
In questo esempio:

Scegliere tutte le città della provincia di NA e che sia diversa da Fusaro

esempio 11: AND
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'NA' AND citta <> 'Fusaro'"
;
?>
2 record trovati
2 record visualizzati
id cap citta prov
24 80125 Agnano NA
31 80075 Monterone NA

Usando l'operatore OR

Viene usato l'operatore OR quando occorre effettuare un confronto ed almeno uno deve essere vero.
In questo esempio:

Mostra tutte le città della provincia di NA o della provincia RC

esempio 12: OR
1
2
3
4
5
<?php
$Query 
"SELECT *
FROM `sql_citta`
WHERE prov = 'NA' OR prov = 'RC'"
;
?>
5 record trovati
5 record visualizzati
id cap citta prov
10 89030 Condofuri RC
24 80125 Agnano NA
30 80070 Fusaro NA
31 80075 Monterone NA
37 89020 Melicucco RC

Usando AND e OR assieme

Quando occorre rispondere a domande più complesse è possibile usare gli operatori AND ed OR assieme. Tuttavia occorre prestare molta attenzione ad evitare di costruire delle condizioni ambigue, come è mostrato nei prossimi esempi, perchè potrebbero generare risultati inattesi.
Osserviamo la seguente Query:

esempio 13: AND e OR
1
2
3
4
5
6
<?php
$Query 
"SELECT cognome, nome, cap, citta, prov 
FROM `sql_rubrica`
WHERE nome = 'Andrea' 
    AND prov = 'RF' OR citta = 'Abbadia Lariana'"
;
?>

Nell'esempio mostrato la Query è ambigua perche può essere interpretata in due differenti maniere:

  1. Cercare le persone che si chiamano Andrea e che sono della provincia di RF oppure tutti quelli che abitano nella città di Abbadia Lariana
  2. Cercare le persone che si chiamano Andrea che sono della provincia di RF o della città di Abbadia Lariana

In questi casi, per evitare ambiguità e rendere più chiara la condizione di ricerca, è consigliabile, anzi, direi, obbligatorio usare le parentesi per combinare correttamente le condizioni di ricerca.

Soluzione per la prima interpretazione:

Nell'esempio qui sotto viene esposta la prima interpretazione, anche se poco logica:
Cercare le persone che si chiamano Andrea e che sono della provincia di RF: (nome = 'Andrea' AND prov = 'RF')
oppure tutti quelli che abitano nella città di Abbadia Lariana: OR citta = 'Abbadia Lariana'
Vengono soddisfatte prima le condizioni incapsulate tra le parentesi e poi l'ultima condizione

Cercare le persone che si chiamano Andrea e che sono della provincia di RF oppure tutti quelli che abitano nella città di Abbadia Lariana

esempio 14: AND e OR con parentesi
1
2
3
4
5
6
<?php
$Query 
"SELECT cognome, nome, cap, citta, prov 
FROM `sql_rubrica`
WHERE (nome = 'Andrea' AND prov = 'RF') 
OR citta = 'Abbadia Lariana'"
;
?>
11 record trovati
11 record visualizzati
cognome nome cap citta prov
Liberali Franca 67030 Abbadia Lariana AB
Scicchitano Andrea 51021 Ville di Fano RF
Poggi Giuseppe 67030 Abbadia Lariana AB
Franchinotti Anna 67030 Abbadia Lariana AB
Boscati Andrea 51021 Ville di Fano RF
Bazzotti Pietro 67030 Abbadia Lariana AB
Scicchitano Pierluigi 67030 Abbadia Lariana AB
Dionisio Andrea 51023 San Leonardo in Passiria RF
Broccardo Andrea 67030 Abbadia Lariana AB
Zero Agnese 67030 Abbadia Lariana AB
Zerlenga Francesco 67030 Abbadia Lariana AB

Soluzione per la seconda interpretazione:

In questo ultimo esempio viene presa in considerazione la seconda interpretazione, che a parer mio è la più logica:
Cercare le persone che si chiamano Andrea: nome = 'Andrea'
che sono della provincia di RF o della città di Abbadia Lariana: AND (prov = 'RF' OR citta = 'Abbadia Lariana')

Cercare le persone che si chiamano Andrea che sono della provincia di RF o della città di Abbadia Lariana

esempio 15: AND e OR con parentesi
1
2
3
4
5
6
<?php
$Query 
"SELECT cognome, nome, cap, citta, prov 
FROM `sql_rubrica`
WHERE nome = 'Andrea' 
AND (prov = 'RF' OR citta = 'Abbadia Lariana')"
;
?>
4 record trovati
4 record visualizzati
cognome nome cap citta prov
Scicchitano Andrea 51021 Ville di Fano RF
Boscati Andrea 51021 Ville di Fano RF
Dionisio Andrea 51023 San Leonardo in Passiria RF
Broccardo Andrea 67030 Abbadia Lariana AB

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum