Skill Factory
Lista post > Ricominciamo ... dal linguaggio SQL Lezione 13
Ricominciamo ... dal linguaggio SQL Lezione 13
Gino Visciano |
Skill Factory - 28/04/2016 22:28:39 | in Tutorials
Benvenuti alla tredicesima lezione, in questa nuova lezione utilizzerete gli operatori insiemistici per eseguire interrogazioni complesse con il comando Select.
Gli operatori insiemistici sono tre:
- UNION (Unoine)
- INTERSECT (Intersezione)
- EXCEPT (Differenza)
MySQL ha solo l'operatore UNION, per ottenere il risultato di INTERSECT ed EXCEPT dovete combinare gli operatori JOIN ed IN del comando Select con l'operatore UNION.
Per applicare praticamente gli operatori insiemistici, partiamo dalle tabelle seguenti:
CLIENTI
id | nominativo | piva | telefono | e_mail | localita | provincia |
1 | Morgan & C. | 01111111111 | 082770901 | info@morgan.com | Roma | RM |
2 | Fiorini & Figli | 02222222222 | 082770902 | info@fiorini.com | Napoli | NA |
3 | Aldebran | 03333333333 | 082770903 | info@aldebran.com | Milano | MI |
4 | Cassandra | 04444444444 | 082770904 | info@cassandra.com | Roma | RM |
5 | Pedretti | 05555555555 | 082770905 | info@pedretti.com | Napoli | NA |
6 | Staiano | 06666666666 | 082770906 | info@staiano.com | Milano | MI |
FORNITORI
id | nominativo | piva | telefono | e_mail | localita | provincia |
1 | Dedalo | 06666666666 | 081889801 | info@dedalo.com | Roma | RM |
2 | Alessandrini | 07777777777 | 081889802 | info@alessandrini.com | Roma | RM |
3 | Cozzolino | 08888888888 | 081889803 | info@cozzolino.com | Napoli | NA |
4 | Sastri | 09999999999 | 081889804 | info@sastri.com | Milano | MI |
5 | Aliblu | 01111111112 | 081889805 | info@aliblu.com | Palermo | PA |
6 | Aldebran | 03333333333 | 082770903 | info@aldebran.com | Milano | MI |
7 | Cassandra | 04444444444 | 082770904 | info@cassandra.com | Roma | RM |
8 | Pedretti | 05555555555 | 082770905 | info@pedretti.com | Napoli | NA |
La caratteristica delle due tabelle è quella che hanno dei record in comune (Aldebran, Cassandra e Pedretti), perché sono sia Clienti, sia Fornitori.
Operatore UNION
Questo operatore permette di unire il risultato di due Select eliminado i valori duplicati.
Ad esempio, immaginate di voler ottenere un Report con tutti i contatti telefonici ed e-mail dei vostri Clienti e Fornitori registrati nelle tabelle Clienti e Fornitori, con il comando seguente potete ottenere il risultato richiesto:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
UNION
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cassandra | 082770904 | info@cassandra.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Pedretti | 082770905 | info@pedretti.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
Se un contatto è sia cliente, sia fornitore, verrà visualizzato una volta sola, perché l'operatore UNION non visualizza i record duplicati.
Per visualizzare anche i record duplicati dovete usare l'operatore UNION ALL, come mostra l'esempio seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
UNION ALL
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Aldebran | 082770903 | info@aldebran.com |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cassandra | 082770904 | info@cassandra.com |
Cassandra | 082770904 | info@cassandra.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Pedretti | 082770905 | info@pedretti.com |
Pedretti | 082770905 | info@pedretti.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
Operatore INTERSECT
Questo operatore permette di confrontare il contenuto di due tabelle e visualizza solo i valori uguali.
Ad esempio, per visualizzare il numero di telefono e l'indirizzo e-mail dei contatti che sono sia clienti, sia fornitori, dovete usare il comando seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
INTERSECT
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Cassandra | 082770904 | info@cassandra.com |
Pedretti | 082770905 | info@pedretti.com |
In MySQL l'operatore INTERSECT non esiste, lo dovete sostituire con il JOIN seguente:
select c.nominativo as "CONTATTO", c.telefono as "TELEFONO", c.e_mail as "E-MAIL" from clienti as c join fornitori as f on(c.nominativo=f.nominativo and c.telefono=f.telefono and c.e_mail=f.e_mail) order by c.nominativo;
Operatore EXCEPT
Questo operatore permette di confrontare il contenuto di due tabelle e visualizza solo i valori diversi.
Ad esempio, per visualizzare il numero di telefono e l'indirizzo e-mail dei contatti che sono clienti oppure fornitori, escludendo tutti quelli che sono sia clienti, sia fornitori, dovete usare il comando seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
EXCEPT
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
In MySQL l'operatore EXCEPT non esiste, lo dovete sostituire con il comando seguente:
select c.nominativo as "CONTATTO", c.telefono as "TELEFONO", c.e_mail as "E-MAIL" from clienti c where not (c.nominativo in (select nominativo from fornitori) and c.telefono in (select telefono from fornitori) and c.e_mail in (select e_mail from fornitori))
UNION
select f.nominativo as "CONTATTO", f.telefono as "TELEFONO", f.e_mail as "E-MAIL" from fornitori f where not (f.nominativo in (select nominativo from clienti) and f.telefono in (select telefono from clienti) and f.e_mail in (select e_mail from clienti)) order by CONTATTO;
La prima Select visualizza solo i clienti con il nominativo, il telefono e l'e-mail diversi da tutti i fornitori. L'operatore IN esegue le Query nidificate e con il risultato ottenuto, crea un elenco di valori che vengono confrontati con il valore delle colonne indicate. Ad esempio c.nominativo in (select nominativo from fornitori) confronta il nominativo del cliente corrente, con tutti i nominativi dei fornitori.
La seconda Select visualizza solo i fornitori con il nominativo, il telefono e l'e-mail diversi da tutti i clienti.
L'Unione delle due Select fornisce il risultato richiesto.
T U T O R I A L S S U G G E R I T I