Skillbook Logo
foto profilo

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 E-MAIL
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 E-MAIL
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 E-MAIL
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 E-MAIL
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.

 


<< Lezione precedente


T U T O R I A L S    S U G G E R I T I


Share Button
TOP