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

 

 



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