Operatore UNION ALL
Gli argomenti di questa pagina
- Introduzione
- I files SQL necessari per creare le tabelle
- Alcuni esempi
- Prima soluzione: uso di LEFT e RIGHT JOIN nelle Query SELECT
- Seconda soluzione: uso di due semplici Query SELECT
- Uso di due Query SELECT differenti e più complesse
- Uso della clausola WHERE in una o più Query SELECT
|
Introduzione
La principale differenza tra L'operatore UNION e l'operatore UNION ALL è che l'operatore UNION non mostra i record duplicati delle tabelle, mentre l'operatore UNION ALL mostra anche anche i record duplicati.
Anche per questa variante dell'operatore UNION valgono la stessa sintassi e le stesse regole viste nella pagina precedente.
I nostri studi li eseguiremo ancora su queste tabelle:
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 |
In questa pagina usiamo la clausola UNION ALL su tutte le Query e nello stesso ordine presentate nella pagina precedente, quindi, per brevità i commenti e le regole usate saranno molto limitate. Quel che cambia è solo la richiesta che si fa al DB.
I files SQL necessari per creare le tabelle
I files SQL necessari a creare queste tabelle sono state mostrate nella pagina iniziale di questo settore.
Alcuni esempi
Confrontanto i resultset si noterà che quelli di questa pagina sono pressocchè raddoppiati rispetto a quelli presentati nella pagina precedente. Questo è dovuto all'uso della clausola UNION ALL invece della semplice UNION.
Mostra il nominativo completo, città e indirizzo dei contatti della tabella rubrica e quelli della tabella agenda, ma mostra anche i record duplicati
Prima soluzione: uso di LEFT e RIGHT JOIN nelle Query SELECT
Questo è il risultato. Naturalmente sono ancora mostrati valori NULL per la tabella che ha meno record dell'altra. Il resultset mostra i contatti di una tabella affiancati a quelli dell'altra tabella.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php $Query = " SELECT sql_rubrica.cognome AS rub_cognome, sql_rubrica.nome AS rub_nome, sql_rubrica.indirizzo AS rub_indirizzo, sql_agenda.cognome AS ag_cognome, sql_agenda.nome AS ag_nome, sql_agenda.indirizzo AS ag_indirizzo FROM sql_rubrica LEFT JOIN sql_agenda ON sql_rubrica.id = sql_agenda.id UNION ALL SELECT sql_rubrica.cognome AS rub_cognome, sql_rubrica.nome AS rub_nome, sql_rubrica.indirizzo AS rub_indirizzo, sql_agenda.cognome AS ag_cognome, sql_agenda.nome AS ag_nome, sql_agenda.indirizzo AS ag_indirizzo FROM sql_rubrica RIGHT JOIN sql_agenda ON sql_rubrica.id = sql_agenda.id "; ?>
|
|
204 record trovati
20 record visualizzati
rub_cognome |
rub_nome |
rub_indirizzo |
ag_cognome |
ag_nome |
ag_indirizzo |
Forlini |
Andrea |
VIA DEI GERANI |
Forlini |
Andrea |
VIA DEI GERANI |
Pioggia |
Ernesto |
VIA GRAMSCI 14 A |
Pioggia |
Ernesto |
VIA GRAMSCI 14 A |
Armonia |
Laura |
VIA CAVOUR |
Armonia |
Laura |
VIA CAVOUR |
Caldarone |
Innocenzo |
VIA SABIN 34/2 |
Caldarone |
Innocenzo |
VIA SABIN 34/2 |
Zarbo |
Veriano |
VIA DEL TUSCOLANO 1 |
Zarbo |
Veriano |
VIA DEL TUSCOLANO 1 |
D'Agate |
Federica |
VIA BREDINA 6 |
D'Agate |
Federica |
VIA BREDINA 6 |
Clotilde |
Marinella |
VIA.GIUSEPPE DI VITTORIO, 41 |
Clotilde |
Marinella |
VIA.GIUSEPPE DI VITTORIO, 41 |
Biancarosa |
Francesca |
VIA PO, 31 |
Biancarosa |
Francesca |
VIA PO, 31 |
Burranca |
Cristian |
VIA BRIGONI, 6 |
Burranca |
Cristian |
VIA BRIGONI, 6 |
Said |
Antomio |
VIA DEI GERANI |
Said |
Antomio |
VIA DEI GERANI |
Querio |
Angela |
VIA DEL TUSCOLANO 1 |
Querio |
Angela |
VIA DEL TUSCOLANO 1 |
Baldoni |
Serena |
VIA DELLA CHIMICA N.9 |
Baldoni |
Serena |
VIA DELLA CHIMICA N.9 |
Serrone |
Diamora |
VIA CAVOUR |
Serrone |
Diamora |
VIA CAVOUR |
Caldiero |
Giuseppina |
VIA MATTEO RICCI, 12 |
Caldiero |
Giuseppina |
VIA MATTEO RICCI, 12 |
Lomo |
Dalia |
VIA SABIN, 34/2 |
Lomo |
Dalia |
VIA SABIN, 34/2 |
Zuna |
Clotilde |
VIA SABIN, 34/2 |
Zuna |
Clotilde |
VIA SABIN, 34/2 |
D'Alessandro |
Micdas |
Via dei Sibillini |
D'Alessandro |
Micdas |
Via dei Sibillini |
Oristano |
Gaby Bo |
Via Manzoni |
Oristano |
Gaby Bo |
Via Manzoni |
NULL |
NULL |
NULL |
giulio |
cesare |
|
NULL |
NULL |
NULL |
pinco |
pallino |
|
... |
... |
... |
... |
... |
... |
|
Seconda soluzione: uso di due semplici Query SELECT
E' possibile visualizzare i contatti di una tabella e quelli dell'altra tabella in maniera sequenziale
1
2
3
4
5
6
7
8
9
|
<?php $Query = " (SELECT id, cognome, nome, indirizzo FROM sql_rubrica) UNION ALL (SELECT id, cognome, nome, indirizzo FROM sql_agenda) "; ?>
|
|
204 record trovati
20 record visualizzati
id |
cognome |
nome |
indirizzo |
1 |
Migliavacca |
Luigi |
VIA P. FIMIANI TRIVIO |
2 |
Rizzi |
Carlo |
VIA SABIN, 34/2 |
3 |
Liberali |
Franca |
VIA DEL TUSCOLANO, 1 |
4 |
Di Maggio |
Mario |
TERMINAL CONTENITORI MOLO VII |
5 |
Scicchitano |
Andrea |
VIA SABIN, 34/2 |
6 |
Edelvisi |
Maurizio |
VIA MATTEO RICCI, 12 |
7 |
Gerardini |
Silvano |
Z.I SAMBUCETO |
8 |
Pasotti |
Alessio |
VIA SABIN, 34/2 |
9 |
Calvi |
Giovanni |
VIA SABIN, 34/2 |
10 |
Poggi |
Giuseppe |
VIA SABIN, 34/2 |
11 |
Curti |
Oreste |
STRADA MARCHESANE, 43_4 |
12 |
Borsotti |
Mirella |
VIA DEL TUSCOLANO, 1 |
13 |
Franchinotti |
Anna |
VIA BREDINA, 6 |
14 |
Pischedda |
Giovanni |
VIA MATTEO RICCI, 12 |
15 |
Maini |
Marilena |
MACRON TICHON STREET, 27 |
16 |
Boscati |
Andrea |
VIA MATTEO RICCI, 12 |
17 |
Bazzotti |
Pietro |
VIA SABIN, 34/2 |
18 |
Scicchitano |
Pierluigi |
STRADA MARCHESANE, 434 |
19 |
Dionisio |
Andrea |
VIA DEL TUSCOLANO, 1 |
20 |
Traina |
Giovanni |
VIA SABIN, 34/2 |
... |
... |
... |
... |
|
Uso di due Query SELECT differenti e più complesse
Mostra il nominativo completo, la cittù e l'indirizzo dei contatti della tabella rubrica e della tabella agenda
In questo esempio la soluzione è leggermente più complessa.
Memtre possiamo prelevare tutti i dati indicati dalla prima Query SELECT, non altrettanto è possibile con la seconda Query SELECT. Infatti nella tabella usata nella seconda
Query SELECT non è indicato in modo esplicito il nome della città ma è indicato l'id che in altra tabella la cittù è referenziata. Per questo motivo occorre usare una JOIN che collega la tabella agenda con la tabella citta.
Il concatenamento del nome col cognome viene eseguito usando la funzione MYSQL CONCAT_WS.
E' da notare che se la funzione MYSQL CONCAT_WS viene usata in una delle due Query SELECT deve essedre usata anche nell'altra per rispettare la regola dei numeri dei campi chiamati nell'una e nell'altra Query SELECT.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php $Query = " SELECT CONCAT_WS( ' ', cognome, nome ) AS nominativo, citta, indirizzo FROM sql_rubrica UNION ALL SELECT CONCAT_WS( ' ', sql_agenda.cognome, sql_agenda.nome ) AS nome_completo, sql_citta.citta, sql_agenda.indirizzo FROM sql_agenda INNER JOIN sql_citta ON sql_agenda.id_citta = sql_citta.id "; ?>
|
|
204 record trovati
20 record visualizzati
nominativo |
citta |
indirizzo |
Migliavacca Luigi |
Varena |
VIA P. FIMIANI TRIVIO |
Rizzi Carlo |
Varena |
VIA SABIN, 34/2 |
Liberali Franca |
Abbadia Lariana |
VIA DEL TUSCOLANO, 1 |
Di Maggio Mario |
Ville di Fano |
TERMINAL CONTENITORI MOLO VII |
Scicchitano Andrea |
Ville di Fano |
VIA SABIN, 34/2 |
Edelvisi Maurizio |
Ville di Fano |
VIA MATTEO RICCI, 12 |
Gerardini Silvano |
Ville di Fano |
Z.I SAMBUCETO |
Pasotti Alessio |
Correzzana |
VIA SABIN, 34/2 |
Calvi Giovanni |
Marsiliana |
VIA SABIN, 34/2 |
Poggi Giuseppe |
Abbadia Lariana |
VIA SABIN, 34/2 |
Curti Oreste |
Ville di Fano |
STRADA MARCHESANE, 43_4 |
Borsotti Mirella |
Ville di Fano |
VIA DEL TUSCOLANO, 1 |
Franchinotti Anna |
Abbadia Lariana |
VIA BREDINA, 6 |
Pischedda Giovanni |
Falconara Alta |
VIA MATTEO RICCI, 12 |
Maini Marilena |
Borgo S. Dalmazzo |
MACRON TICHON STREET, 27 |
Boscati Andrea |
Ville di Fano |
VIA MATTEO RICCI, 12 |
Bazzotti Pietro |
Abbadia Lariana |
VIA SABIN, 34/2 |
Scicchitano Pierluigi |
Abbadia Lariana |
STRADA MARCHESANE, 434 |
Dionisio Andrea |
San Leonardo in Passiria |
VIA DEL TUSCOLANO, 1 |
Traina Giovanni |
Ville di Fano |
VIA SABIN, 34/2 |
... |
... |
... |
|
Uso della clausola WHERE in una o più Query SELECT
Nelle Query SELECT usate in unq Query UNION è possibile usare tutte le clausole e tutte le funzioni utilizzabili in tutte le Query SELECT.
Mostra i contatti della rubrica che abitano in una determinata città ed i contatti dell'agenda che abitano in una determinata città, anche se ripetuti
In questo esempio la clausola WHERE viene usata in entrambe le Query SELECT, ma, se la richiesta da fare al DB fosse stata diversa, si poteva usare anche in maniera differente. L'intera Query sarebbe stata ancora valida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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 = 'Agropoli') "; ?>
|
|
21 record letti
id |
cognome |
nome |
citta |
prov |
88 |
Zarbo |
Veriano |
Agropoli |
DE |
89 |
D'Agate |
Federica |
Agropoli |
DE |
90 |
Clotilde |
Marinella |
Agropoli |
DE |
91 |
Biancarosa |
Francesca |
Agropoli |
DE |
92 |
Burranca |
Cristian |
Agropoli |
DE |
93 |
Said |
Antomio |
Agropoli |
GH |
94 |
Querio |
Angela |
Agropoli |
GH |
95 |
Baldoni |
Serena |
Agropoli |
GH |
96 |
Serrone |
Diamora |
Agropoli |
DE |
97 |
Caldiero |
Giuseppina |
Agropoli |
DE |
98 |
Lomo |
Dalia |
Agropoli |
DE |
99 |
Zuna |
Clotilde |
Agropoli |
DE |
88 |
Zarbo |
Veriano |
Agropoli |
GH |
89 |
D'Agate |
Federica |
Agropoli |
GH |
90 |
Clotilde |
Marinella |
Agropoli |
GH |
91 |
Biancarosa |
Francesca |
Agropoli |
GH |
92 |
Burranca |
Cristian |
Agropoli |
GH |
96 |
Serrone |
Diamora |
Agropoli |
GH |
97 |
Caldiero |
Giuseppina |
Agropoli |
GH |
98 |
Lomo |
Dalia |
Agropoli |
GH |
99 |
Zuna |
Clotilde |
Agropoli |
GH |
|