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

 

 



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