Alcuni esempi con Query UNION
Gli argomenti di questa pagina
- Introduzione
- Uso della clausola UNION sulla stessa tabella invece di molteplici operatori OR
- Ordinamento di una Query UNION
- Aggiungere un limite al numero di record da visualizzare
- Aggiunta di un campo letterale
|
Introduzione
Le tabelle con cui andremo a lavorare saranno sempre queste indicate qui di seguito.
Per la tabella sql_rubrica
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int |
NO |
PRI |
|
auto_increment |
codice |
varchar(50) |
NO |
|
|
|
cognome |
varchar(250) |
NO |
|
|
|
nome |
varchar(250) |
NO |
|
|
|
indirizzo |
varchar(250) |
NO |
|
|
|
cap |
varchar(250) |
NO |
|
|
|
citta |
varchar(250) |
NO |
|
|
|
prov |
varchar(10) |
NO |
|
|
|
data_nascita |
date |
NO |
|
|
|
telefono |
varchar(250) |
NO |
|
|
|
I campi della tabella sql_rubrica: id, codice, cognome, nome, indirizzo, cap, citta, prov, data_nascita, telefono |
Per la tabella sql_agenda
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int |
NO |
PRI |
|
auto_increment |
cognome |
varchar(250) |
NO |
|
|
|
nome |
varchar(250) |
NO |
|
|
|
indirizzo |
varchar(250) |
NO |
|
|
|
id_citta |
int |
NO |
|
|
|
data_nascita |
date |
NO |
|
|
|
telefono |
varchar(250) |
NO |
|
|
|
I campi della tabella sql_agenda: id, cognome, nome, indirizzo, id_citta, data_nascita, telefono |
Per la tabella sql_mag_fornitori
Field |
Type |
Null |
Key |
Default |
Extra |
id_fornitore |
int |
NO |
PRI |
|
auto_increment |
rag_sociale |
varchar(150) |
NO |
|
|
|
indirizzo |
varchar(200) |
NO |
|
|
|
telefono |
varchar(50) |
NO |
|
|
|
I campi della tabella sql_mag_fornitori: id_fornitore, rag_sociale, indirizzo, telefono |
Per la tabella sql_citta
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int |
NO |
PRI |
|
auto_increment |
cap |
varchar(10) |
YES |
|
|
|
citta |
varchar(250) |
YES |
|
|
|
prov |
varchar(10) |
YES |
|
|
|
I campi della tabella sql_citta: id, cap, citta, prov |
Come primo esempio vediamo come usare la clausola UNION o la clausola UNION ALL sulla stessa tabella.
Uso della clausola UNION sulla stessa tabella invece di molteplici operatori OR
La richiesta al DB
Mostra un elenco dei miei contatti scegliendo le iniziali sui campi: cognome, citta e prov
La query UNION è equivalente alla sottostante Query basata su molteplici OR, ma risulta più efficiente su recordset molto voluminosi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php $Query = " SELECT cognome, nome, cap, citta, prov FROM sql_rubrica WHERE cognome LIKE 'P%' UNION SELECT cognome, nome, cap, citta, prov FROM sql_rubrica WHERE citta LIKE 'M%' UNION SELECT cognome, nome, cap, citta, prov FROM sql_rubrica WHERE prov LIKE 'B%' "; ?>
|
1
2
3
4
5
6
7
8
9
|
<?php $Query = " SELECT cognome, nome, cap, citta, prov FROM sql_rubrica WHERE cognome LIKE 'P%' OR citta LIKE 'M%' OR prov LIKE 'B%' "; ?>
|
|
13 record letti
cognome |
nome |
cap |
citta |
prov |
Pasotti |
Alessio |
22050 |
Correzzana |
FS |
Poggi |
Giuseppe |
67030 |
Abbadia Lariana |
AB |
Pischedda |
Giovanni |
22059 |
Falconara Alta |
FS |
Poggi |
Claudio |
51021 |
Ville di Fano |
RF |
Pasquone |
Maria |
89844 |
Castel Vittorio |
CH |
Pedron |
Margherita |
95022 |
Condofuri |
DO |
Pioggia |
Ernesto |
26020 |
Giusvalla |
CA |
Calvi |
Giovanni |
53021 |
Marsiliana |
AB |
D'Alessandro |
Micdas |
12345 |
MASSARO |
BC |
Oristano |
Gaby Bo |
12345 |
MASSARO |
BC |
Maini |
Marilena |
57020 |
Borgo S. Dalmazzo |
BO |
Odelli |
Giuseppe |
73020 |
Cereseto |
BO |
Ravizzola |
Stefano |
71021 |
Coccanile |
BO |
|
Ordinamento di una Query UNION
Per ottenere l'ordinamento di una Query UNION è possibile aggiungere la clausola ORDER BY alla fine della Query UNION, dopo l'ultima Query SELECT.
Contrariamente a quel che si può pensare la clausola ORDER BY si riferisce al resultset della Query UNION e non all'ultima Query SELECT.
Il campo o i campi da indicare nella clausola ORDER BY debbono essere quelli usati nella prima Query SELECT o, in alternativa e se si hanno dei dubbi, è possibile indicare nella clausola ORDER BY il numero che il campo o i campi occupano nella Query SELECT.
La richiesta al DB
Mostra una lista ordinata dei contatti della rubrica e dei contatti dell'agenda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php $Query = " SELECT id, cognome, nome, citta, prov FROM sql_rubrica WHERE citta = 'Agropoli'
UNION ALL
SELECT sql_agenda.id, sql_agenda.cognome, sql_agenda.nome, sql_citta.citta, sql_citta.prov FROM sql_agenda INNER JOIN sql_citta ON sql_agenda.id_citta = sql_citta.id WHERE sql_citta.citta = 'Ville di Fano' ORDER BY 2 "; ?>
|
|
22 record letti
id |
cognome |
nome |
citta |
prov |
95 |
Baldoni |
Serena |
Agropoli |
GH |
91 |
Biancarosa |
Francesca |
Agropoli |
DE |
12 |
Borsotti |
Mirella |
Ville di Fano |
AQ |
16 |
Boscati |
Andrea |
Ville di Fano |
AQ |
92 |
Burranca |
Cristian |
Agropoli |
DE |
97 |
Caldiero |
Giuseppina |
Agropoli |
DE |
90 |
Clotilde |
Marinella |
Agropoli |
DE |
11 |
Curti |
Oreste |
Ville di Fano |
AQ |
89 |
D'Agate |
Federica |
Agropoli |
DE |
4 |
Di Maggio |
Mario |
Ville di Fano |
AQ |
6 |
Edelvisi |
Maurizio |
Ville di Fano |
AQ |
7 |
Gerardini |
Silvano |
Ville di Fano |
AQ |
98 |
Lomo |
Dalia |
Agropoli |
DE |
21 |
Orlandi |
Enrico |
Ville di Fano |
AQ |
23 |
Poggi |
Claudio |
Ville di Fano |
AQ |
94 |
Querio |
Angela |
Agropoli |
GH |
93 |
Said |
Antomio |
Agropoli |
GH |
5 |
Scicchitano |
Andrea |
Ville di Fano |
AQ |
96 |
Serrone |
Diamora |
Agropoli |
DE |
20 |
Traina |
Giovanni |
Ville di Fano |
AQ |
88 |
Zarbo |
Veriano |
Agropoli |
DE |
99 |
Zuna |
Clotilde |
Agropoli |
DE |
|
Aggiungere un limite al numero di record da visualizzare
Come per l'ordinamento è possibile usare la clausola LIMIT che, come il suo nome lascia ad intendere, è quello di decidere il numero di record che la query deve mostrare.
La clausola LIMIT ha due argomenti:
- il primo indica da quale riga deve iniziare l'estrazione dei record
- il secondo indica il numero di righe da estrarre; se omesso, vengono estratti tutti i record a partire dalla posizione indicata dal primo argomento
La sintassi è questa:
SELECT col_a, col_b, col_c FROM table_1
UNION
SELECT col_1, col_2, col_3 FROM table_2
ORDER BY col_xxx
LIMIT start[, num_row];
La richiesta al DB
Mostra 20 record di una lista ordinata dei contatti della rubrica e dei contatti dell'agenda a partire da un determinato record.
Anche in questo caso, come per l'ordinamento, la clausola LIMIT va posta dopo l'ultima Query SELECT.
Ecco il risultato. Questa stessa Query, senza la clausola LIMIT, avrebbe restituito poco più di 200 record.
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php $Query = " SELECT id, 'rub' AS origine, cognome, nome, indirizzo FROM sql_rubrica UNION ALL SELECT id, 'ag' AS origine, cognome, nome, indirizzo FROM sql_agenda ORDER BY 2 LIMIT 95,20 "; ?>
|
|
20 record letti
id |
origine |
cognome |
nome |
indirizzo |
96 |
ag |
Serrone |
Diamora |
VIA CAVOUR |
97 |
ag |
Caldiero |
Giuseppina |
VIA MATTEO RICCI, 12 |
98 |
ag |
Lomo |
Dalia |
VIA SABIN, 34/2 |
99 |
ag |
Zuna |
Clotilde |
VIA SABIN, 34/2 |
100 |
ag |
D'Alessandro |
Micdas |
Via dei Sibillini |
101 |
ag |
Oristano |
Gaby Bo |
Via Manzoni |
102 |
ag |
giulio |
cesare |
|
103 |
ag |
pinco |
pallino |
|
1 |
rub |
Migliavacca |
Luigi |
VIA P. FIMIANI TRIVIO |
2 |
rub |
Rizzi |
Carlo |
VIA SABIN, 34/2 |
3 |
rub |
Liberali |
Franca |
VIA DEL TUSCOLANO, 1 |
4 |
rub |
Di Maggio |
Mario |
TERMINAL CONTENITORI MOLO VII |
5 |
rub |
Scicchitano |
Andrea |
VIA SABIN, 34/2 |
6 |
rub |
Edelvisi |
Maurizio |
VIA MATTEO RICCI, 12 |
7 |
rub |
Gerardini |
Silvano |
Z.I SAMBUCETO |
8 |
rub |
Pasotti |
Alessio |
VIA SABIN, 34/2 |
9 |
rub |
Calvi |
Giovanni |
VIA SABIN, 34/2 |
10 |
rub |
Poggi |
Giuseppe |
VIA SABIN, 34/2 |
11 |
rub |
Curti |
Oreste |
STRADA MARCHESANE, 43_4 |
12 |
rub |
Borsotti |
Mirella |
VIA DEL TUSCOLANO, 1 |
|
Aggiunta di un campo letterale
Lavorando con Query UNION non è sempre possibile capire la tabella da cui i record vengono mostrati. Se si desidera tener traccia dell'origine di ciascun record è possibile aggiungere nella lista dei campi di ciascuna delle Query SELECT un campo letterale come indicato nell'esempio che segue.
Un campo letterale si aggiunge nella forma:
'stringa da visualizzare' AS nome_campo
nome_campo sarà quel che si vede nella intestazione di colonne, 'stringa da visualizzare' è quel che si vede in ogni record.
Mostra una lista ordinata di tutti i contatti ma indica da quale tabella proviene
Nella tabella sottostante è ora possibile sapere da quale tabella proviene ogni contatto cercato.
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
|
<?php $Query = " SELECT id, 'rub' AS origine, cognome, nome, citta, prov FROM sql_rubrica WHERE citta = 'Agropoli'
UNION
SELECT sql_agenda.id, 'ag' AS origine, sql_agenda.cognome, sql_agenda.nome, sql_citta.citta, sql_citta.prov FROM sql_agenda INNER JOIN sql_citta ON sql_agenda.id_citta = sql_citta.id WHERE sql_citta.citta = 'Ville di Fano' ORDER BY cognome "; ?>
|
|
22 record letti
id |
origine |
cognome |
nome |
citta |
prov |
95 |
rub |
Baldoni |
Serena |
Agropoli |
GH |
91 |
rub |
Biancarosa |
Francesca |
Agropoli |
DE |
12 |
ag |
Borsotti |
Mirella |
Ville di Fano |
AQ |
16 |
ag |
Boscati |
Andrea |
Ville di Fano |
AQ |
92 |
rub |
Burranca |
Cristian |
Agropoli |
DE |
97 |
rub |
Caldiero |
Giuseppina |
Agropoli |
DE |
90 |
rub |
Clotilde |
Marinella |
Agropoli |
DE |
11 |
ag |
Curti |
Oreste |
Ville di Fano |
AQ |
89 |
rub |
D'Agate |
Federica |
Agropoli |
DE |
4 |
ag |
Di Maggio |
Mario |
Ville di Fano |
AQ |
6 |
ag |
Edelvisi |
Maurizio |
Ville di Fano |
AQ |
7 |
ag |
Gerardini |
Silvano |
Ville di Fano |
AQ |
98 |
rub |
Lomo |
Dalia |
Agropoli |
DE |
21 |
ag |
Orlandi |
Enrico |
Ville di Fano |
AQ |
23 |
ag |
Poggi |
Claudio |
Ville di Fano |
AQ |
94 |
rub |
Querio |
Angela |
Agropoli |
GH |
93 |
rub |
Said |
Antomio |
Agropoli |
GH |
5 |
ag |
Scicchitano |
Andrea |
Ville di Fano |
AQ |
96 |
rub |
Serrone |
Diamora |
Agropoli |
DE |
20 |
ag |
Traina |
Giovanni |
Ville di Fano |
AQ |
88 |
rub |
Zarbo |
Veriano |
Agropoli |
DE |
99 |
rub |
Zuna |
Clotilde |
Agropoli |
DE |
|