Skillbook Logo
foto profilo

Skill Factory

Tutte le categorie


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

COME SVILUPPARE UN SITO IN WORDPRESS LEZIONE 5

Giuliano Angrisani | Skill Factory - 28/04/2016 10:48:52 | in Tutorials

Nella lezione precedente abbiamo visto come scaricare ed installare un Tema, in questa lezione vedremo come creare un Articolo con Wordpress.

Dalla pagina amministratore, nel pannello sulla sinistra, cliccate sulla voce Articoli.

 

Nella nuova pagina appaiono tutti gli articoli nel vostro sito (di default c'è  già l'articolo Ciao Mondo!)

Per creare un nuovo Articolo cliccate sulla voce Aggiungi Nuovo, l'immagine seguente mostra la pagina per creare l'articolo.

La pagina per la creazione di un Articolo di Wordpress è organizzata nel modo seguete:

1) nella parte superiore è possibile inserire il Titolo dell'articolo;

2) sotto c'è il pulsante Aggiungi Media con il quale potete inserire immagini, video o documenti all'interno dell'articolo;

3) segue l'area in cui è presente il corpo dell'articolo, la barra degli strumenti di questo campo, è simile a quella di Word, permette di formattare il testo, inserire link, ecc.

4) nella barra laterale di destra ci sono i riquadri per pubblicare o programmare l’articolo, selezionare le categorie di appartenenza del post e digitare dei tag che siano attinenti all’argomento trattato oppure dare un formato specifico per l'articolo.

Per pubblicare l’articolo che avete scritto, basta cliccare sul pulsante Pubblica, mentre se volete programmarlo in modo che venga pubblicato automaticamente dal blog ad un giorno ed un orario prestabiliti, cliccate sulla voce Modifica collocata accanto alla dicitura Pubblica subito e specificate nei campi che compaiono la data e l’ora di pubblicazione del post, prima di cliccare su Pubblica.

Nella sezione Formato potete cambiare il formato dell'articolo. Il formato è un’informazione che può essere utilizzata dal Tema per modificare la visualizzazione di un articolo.

La lista dei formati è standard e tutti i temi possono farne uso. Non è necessario supportare tutti i formati della lista, ma è possibile abilitarne solo una parte, mentre non è possibile aggiungere nuovi formati, né tramite plugin (che vedremo in futuro), né attraverso i temi.

 

Per quanto riguarda le categorie ed i tag a cui collegare gli articoli, non ci sono delle vere e proprie regole.

Le categorie sono delle sezioni del blog molto generiche in cui si vanno a raggruppare i post che sono correlati da uno stesso argomento (ad esempio articoli sulle recensioni dei film potrebbero far parte della categoria Cinema e Spettacoli), mentre i tag sono delle etichette aggiuntive che ti permettono di entrare più nello specifico (riferendoci all'esempio precedente possiamo creare i tag Film,Recensione ).

Puoi creare nuove categorie cliccando sull’apposita opzione nella barra laterale di destra dell’editor di Wordpress, mentre per creare nuovi tag basta digitarli nel riquadro Tag articolo.

Infine è possibile caricare un'Immagine in Evidenza che fungerà da anteprima dell'articolo (thumbnails) all'interno del sito.

 


<< Lezione precedente           Lezione successiva >>


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


Share Button

Ricominciamo ... dal linguaggio SQL Lezione 12

Gino Visciano | Skill Factory - 26/04/2016 23:39:50 | in Tutorials

Benvenuti alla dodicesima lezione, in questa nuova lezione vedrete la clausola Group By del comando Select.

Il comando Select utilizza la clausola Group By combinata con le funzioni statistiche per ottenere viste con SUBTOTALI, in base alle chiavi di raggruppamento indicate.

Per capire come funziona la clausola Group By partiamo dalla query seguente, che ordina il contenuto della tabella utilizzando come chiave di ordinamento il nominativo del cliente.

 

select fat.num_fat, fat.data, cli.nominativo, fat.imponibile, ts.tipo_scadenza  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) order by cli.nominativo;

 

num_fat data nominativo imponibile tipo_scadenza
0015/16 2016-03-31 Aldebran 800.00 30 DFFM
0009/16 2016-02-29 Aldebran 1800.00 30 DFFM
0003/16 2016-01-15 Aldebran 1500.00 30 DFFM
0016/16 2016-03-31 Cassandra 1600.00 30 DFFM
0010/16 2016-02-29 Cassandra 600.00 30 DFFM
0004/16 2016-01-15 Cassandra 500.00 30 DFFM
0008/16 2016-02-29 Fiorini & Figli 2100.00 30 gg DF
0002/16 2016-01-15 Fiorini & Figli 2000.00 30 gg DF
0014/16 2016-03-31 Fiorini & Figli 900.00 30 gg DF
0013/16 2016-03-31 Morgan & C. 1900.00 30 gg DF
0007/16 2016-02-29 Morgan & C. 1500.00 30 gg DF
0001/16 2016-01-15 Morgan & C. 1000.00 30 gg DF
0017/16 2016-03-31 Pedretti 2000.00 60 gg DF
0011/16 2016-02-29 Pedretti 1900.00 60 gg DF
0005/16 2016-01-15 Pedretti 1800.00 60 gg DF
0018/16 2016-03-31 Staiano 1000.00 60 DFFM
0012/16 2016-02-29 Staiano 900.00 60 DFFM
0006/16 2016-01-29 Staiano 800.00 60 DFFM

 

La tabella che si ottine eseguendo la query, appare ordinata in base alla colonna nominativo cliente, il punto in cui cambia il nominativo del cliente si chiama rottura di codice ed indica la fine del gruppo precedente e l'inizio del gruppo seguente.  Ogni gruppo caratterizzato dalla rottura di codice è una SOTTOTABELLA a cui si possono applicare le funzioni statistiche se si utilizza la clausola Group By.  

Vediamo alcuni esempi:

1) Qual è il fatturato di ogni cliente?

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo;

nominativo fatturato
Aldebran 4100.00
Cassandra 2700.00
Fiorini & Figli 5000.00
Morgan & C. 4400.00
Pedretti 5700.00
Staiano 2700.00

 

Attenzione, quando usate la clausola Group By, non dimenticate che le colonne della select  devono corrispondere alle chiavi di raggruppamento e alle funzioni statistiche da utilizzare.

2) Qual è il fatturato di ogni cliente e quante fatture ha emesso?

select cli.nominativo, count(*) as "fatture emesse", sum(fat.imponibile) as "fatturato"  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo;

nominativo fatture emesse fatturato
Aldebran 3 4100.00
Cassandra 3 2700.00
Fiorini & Figli 3 5000.00
Morgan & C. 3 4400.00
Pedretti 3 5700.00
Staiano 3 2700.00

 

3) Quali clienti in totale hanno fatto un fatturato inferiore a €5000.00?

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo having sum(fat.imponibile)<5000.00;

oppure

select cli.nominativo, sum(fat.imponibile)  as "fatturato" from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) group by cli.nominativo having fatturato<5000.00;

nominativo fatturato
Aldebran 4100.00
Cassandra 2700.00
Morgan & C. 4400.00
Staiano 2700.00

 

La clausola Having permette di inserire una condizione di selezione sul risultato del Group By.

 


<< Lezione precedente           Lezione successiva >>


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


Share Button

Ricominciamo ... dal linguaggio SQL Lezione 11

Gino Visciano | Skill Factory - 25/04/2016 22:59:46 | in Tutorials

Benvenuti all'undicesima lezione, in questa nuova lezione vedrete le funzioni statistiche del comando Select.

Le funzioni statistiche sono molto utili perché forniscono informazioni di aggregazione rispetto a tutti i dati presenti nelle colonne numeriche indicate.

Le principali  funzioni statistiche sono le seguenti:

 

  • SUM(NomeColonna)    Somma i valori della colonna indicata, si può applicare solo a colonne numeriche;
  • AVG(NomeColonna)     Calcola la Media dei valori della colonna indicata, si può applicare solo a colonne numeriche;
  • MIN(NomeColonna)     Restituisce il valore Minimo della colonna indicata, si può applicare solo a colonne numeriche;
  • MAX(NomeColonna)     Restituisce il valore Massimo della colonna indicata, si può applicare solo a colonne numeriche;
  • COUNT(NomeColonna)    Si usa per contareil numero di righe della tabella, si può applicare a qualunque tipo di colonna, spesso si usa nella forma COUNT(*).

 

Ad esempio per conoscere il numero di dipendenti inserito nella tabella Dipendenti, su può usare il comando seguente:

Select count(*) from Dipendenti;

10

Per vedere praticamente come si usano le funzioni statistiche eseguite prima gli step seguenti, nel Database azienda:

STEP 1: Creare la tabella Clienti.

use azienda;

create table clienti (
id int auto_increment Primary Key,
nominativo varchar(100),
piva char(11) unique,
indirizzo varchar(100),
localita varchar(50),
provincia char(2));
 

STEP 2: Creare la tabella Fatture.

use azienda;

create table fatture (
id int auto_increment Primary Key,
num_fat varchar(20) unique,
data date,
id_cliente int,
imponibile decimal(9,2),
id_tipo_scadenza int);

use azienda;

create table tipo_scadenza (
id int auto_increment Primary Key,
tipo_scadenza varchar(100));

STEP 3: Inserimento Clienti.

use azienda;

insert into clienti (nominativo, localita, provincia) values ('Morgan & C.', 'Roma','RM');

insert into clienti (nominativo, localita, provincia) values ('Fiorini & Figli', 'Napoli','NA');

insert into clienti (nominativo, localita, provincia) values ('Aldebran', 'Milano','MI');

insert into clienti (nominativo, localita, provincia) values ('Cassandra', 'Roma','RM');

insert into clienti (nominativo, localita, provincia) values ('Pedretti', 'Napoli','NA');

insert into clienti (nominativo, localita, provincia) values ('Staiano', 'Milano','MI');


STEP 4: Inserimento Tipo_scadenza.

use azienda;

insert into tipo_scadenza (tipo_scadenza) values ('Rimessa diretta');

insert into tipo_scadenza (tipo_scadenza) values ('30 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('30 DFFM');

insert into tipo_scadenza (tipo_scadenza) values ('60 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('60 DFFM');

insert into tipo_scadenza (tipo_scadenza) values ('90 gg DF');

insert into tipo_scadenza (tipo_scadenza) values ('90 DFFM');


STEP 5: Inserimento Fatture.

use azienda;

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0001/16', '2016/01/15', 1,1000.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0002/16', '2016/01/15', 2,2000.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0003/16', '2016/01/15', 3,1500.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0004/16', '2016/01/15', 4,500.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0005/16', '2016/01/15', 5,1800.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0006/16', '2016/01/29', 6,800.00,5);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0007/16', '2016/02/29', 1,1500.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0008/16', '2016/02/29', 2,2100.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0009/16', '2016/02/29', 3,1800.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0010/16', '2016/02/29', 4,600.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0011/16', '2016/02/29', 5,1900.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0012/16', '2016/02/29', 6,900.00,5);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0013/16', '2016/03/31', 1,1900.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0014/16', '2016/03/31', 2,900.00,2);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0015/16', '2016/03/31', 3,800.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0016/16', '2016/03/31', 4,1600.00,3);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0017/16', '2016/03/31', 5,2000.00,4);

insert into fatture (num_fat, data, id_cliente, imponibile, id_tipo_scadenza) values ('0018/16', '2016/03/31', 6,1000.00,5);


Dopo che avete completato i 5 step,  potete  usare le tabelle create e popolate per vedere come si usano le funzioni statistiche del comando Select, di seguito vediamo alcuni esempi:

La query seguente mette in relazione tutte le tabelle create e ne visualizza il contenuto:

select fat.num_fat, fat.data, cli.nominativo, fat.imponibile, ts.tipo_scadenza  from fatture as fat join clienti as cli on(fat.id_cliente=cli.id) join tipo_scadenza as ts on(fat.id_tipo_scadenza=ts.id) order by cli.nominativo;

 

num_fat data nominativo imponibile tipo_scadenza
0015/16 2016-03-31 Aldebran 800.00 30 DFFM
0009/16 2016-02-29 Aldebran 1800.00 30 DFFM
0003/16 2016-01-15 Aldebran 1500.00 30 DFFM
0016/16 2016-03-31 Cassandra 1600.00 30 DFFM
0010/16 2016-02-29 Cassandra 600.00 30 DFFM
0004/16 2016-01-15 Cassandra 500.00 30 DFFM
0008/16 2016-02-29 Fiorini & Figli 2100.00 30 gg DF
0002/16 2016-01-15 Fiorini & Figli 2000.00 30 gg DF
0014/16 2016-03-31 Fiorini & Figli 900.00 30 gg DF
0013/16 2016-03-31 Morgan & C. 1900.00 30 gg DF
0007/16 2016-02-29 Morgan & C. 1500.00 30 gg DF
0001/16 2016-01-15 Morgan & C. 1000.00 30 gg DF
0017/16 2016-03-31 Pedretti 2000.00 60 gg DF
0011/16 2016-02-29 Pedretti 1900.00 60 gg DF
0005/16 2016-01-15 Pedretti 1800.00 60 gg DF
0018/16 2016-03-31 Staiano 1000.00 60 DFFM
0012/16 2016-02-29 Staiano 900.00 60 DFFM
0006/16 2016-01-29 Staiano 800.00 60 DFFM

 

Partendo da questa tabella, usando le funzioni statistiche, potete rispondere alle domande seguenti:

1) Quante fatture sono state inserite nella tabella fatture?

use azienda;
select count(*) from fatture;
18

2) Qual è il valore totale del fatturato inserito nella tabella fatture?

use azienda;
select sum(imponibile) from fatture;
24600.00

3) Qual è il valore medio del fatturato inserito nella tabella fatture?

use azienda;
select avg(imponibile) from fatture;
1366.66

4) Qual è il fatturato minimo inserito nella tabella fatture?

use azienda;
select min(imponibile) from fatture;
500.00

5) Qual è il fatturato massimo inserito nella tabella fatture?

use azienda;
select max(imponibile) from fatture;
2100.00

6) Quante fatture sono state inserite nella tabella fatture nel il mese di gennaio?

use azienda;
select count(*) from fatture where data>='2016-01-01' and data<='2016-01-31'; 
6

7) Qual è il fatturato totale inserito nella tabella fatture nel mese di gennaio?

use azienda;
select sum(imponibile) from fatture where data>='2016-01-01' and data<='2016-01-31'; 
7600.00

8) Qual è il fatturato totale del cliente Cassandra inserito nella tabella fatture?

use azienda;
select clienti.nominativo, sum(fatture.imponibile) from fatture  join clienti on (fatture.id_cliente=clienti.id) where clienti.nominativo='Cassandra';
Cassandra   2700.00

9) Qual è il fatturato totale dei clienti di Roma inserito nella tabella fatture?

use azienda;
select clienti.localita, sum(fatture.imponibile) from fatture join clienti on (fatture.id_cliente=clienti.id) where clienti.localita='Roma';
Roma  7100,00

10)  Qual è il fatturato totale dei clienti di Roma inserito nella tabella fatture nel mese di gennaio?

use azienda;
select clienti.localita, sum(fatture.imponibile) from fatture join clienti on (fatture.id_cliente=clienti.id) where clienti.localita='Roma' and data>='2016-01-01' and data<='2016-01-31';
Roma  1500.00

 


<< Lezione precedente           Lezione successiva >>


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


Share Button

Ricominciamo ... dal linguaggio SQL Lezione 10

Gino Visciano | Skill Factory - 25/04/2016 00:21:34 | in Tutorials

Benvenuti alla decima lezione, in questa lezione imparerete ad applicare il Self Join.  Un Self Join non è altro che un Join applicato alla stessa tabella.

Per capire come funziona questo tipo di Join, immaginate di avere una tabella Dipendenti, in cui è presente anche l'id del responsabile di ogni dipendente. La particolarità di questa tabelle è che il responsabile di un dipendente è anche lui un dipendente, quindi è presente nella stessa tabella.

La caratteristica importante della tabella Dipendenti è che contine contemporaneamente, sia la chiave primaria, che la chiave esterna, come mostra l'immagine seguente:

Per distinguere le due tabelle con lo stesso nome dovete usare due alias di tabella differenti, come mostra l'esempio seguente:

SELECT col1,col2, ..., coln FROM tabella_a AS a JOIN tabella_a AS b ON ( ... );

Per vedere come si applica praticamente un Self Join, facciamo le seguenti considerazioni:

1) Rossi Alberto è l'Amministratore dell'azienda quindi non ha responsabili;

2) Verdi Carlo è il Direttore Generale dell'Azienda, il suo responsabile è Rossi Alberto;

3) Bianchi Silvia è il Direttore Commerciale dell'Azienda, il suo Responsabile è Verdi Carlo;

4) Neri Mara è il Responsabile delle Risorse Umane, il suo Responsabile è Verdi Carlo;

5) Rossi Luca è un Commerciale, il suo Responsabile è Bianchi Silvia;

6) Verdi Laura è un Commerciale, il suo Responsabile è Bianchi Silvia;

7) Bianchi Loredana è una Segretaria, il suo Responsabile è Neri Mara;

8) Rossi Valentina è un'Addetta all'Amministrazione, il suo Responsabile è Neri Mara;

9) Bianchi Paola  è un'Addetta all'Amministrazione, il suo Responsabile è Neri Mara;

10) Neri Marcella è un'Addetta alla Reception, il suo Responsabile è Neri Mara;

 

Per creare il Database Azienda, implementate lo Schema Fisico seguente:

 

Attraverso i comandi seguenti potete implementare il Database Azienda, in MySQL, se state usando un DBMS diverso potrebbero esserci delle differenze.

I comandi devono essere eseguiti nella sezione SQL del pannello di controllo phpMyAdmin.

 

STEP 1: Creazione del Database Azienda

1) Create il Database:

create database azienda;

2) Create la tabella Dipendenti:

use azienda; -- connettiti al db azienda
create table dipendenti (
    id int AUTO_INCREMENT PRIMARY KEY,
    matricola char(5) UNIQUE,
    cognome varchar(50) NOT NULL,
    nome varchar(50) NOT NULL,
    cod_fisc char(16) UNIQUE,
    luogo_di_nascita varchar(50),
    data_di_nascita date,
    id_ruolo int NOT NULL,
    id_responsabile int);


3) Create la tabella Ruoli:

use azienda; -- connettiti al db azienda
create table ruoli (
    id int AUTO_INCREMENT PRIMARY KEY,
    ruolo varchar(50) NOT NULL);

 

STEP 2: Inserire i ruoli nella Tabella Ruoli

use azienda; -- connettiti al db azienda

insert into ruoli (ruolo) values ('Amministratore');

insert into ruoli (ruolo) values ('Direttore Generale');

insert into ruoli (ruolo) values ('Direttore Commerciale');

insert into ruoli (ruolo) values ('Reaponsabile Risorse Umane');

insert into ruoli (ruolo) values ('Commerciale');

insert into ruoli (ruolo) values ('Segretaria');

insert into ruoli (ruolo) values ('Addetto Amministrazione');

insert into ruoli (ruolo) values ('Addetto Reception');

insert into ruoli (ruolo) values ('Addetto Delivery');

insert into ruoli (ruolo) values ('Responsabile Sicurezza');

Il risultato del lavoro fatto è il seguente:

select * from ruoli:

1 Amministratore
2 Direttore Generale
3 Direttore Commerciale
4 Reaponsabile Risorse Umane
5 Commerciale
6 Segretaria
7 Addetto Amministrazione
8 Addetto Reception
9 Addetto Delivery
10 Responsabile Sicurezza

 

STEP 3: Inserire i Dipendenti nella Tabella Dipendenti

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RA001', 'Rossi', 'Alberto','Roma','1970/12/10',1,null);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ( 'VC002','Verdi', 'Carlo','Latina','1975/04/20', 2,1);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BS003','Bianchi', 'Silvia','Rieti', '1980/02/05', 3,2);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('NM004', 'Neri', 'Mara', 'Napoli', '1978/05/10', 4,2);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RL005','Rossi', 'Luca', 'Salerno','1972/09/15', 5, 3);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('VL006','Verdi', 'Laura', 'Roma', '1973/11/08', 5,3);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BL007', 'Bianchi', 'Loredana', 'Latina', '1982/03/04', 6,4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('RV008','Rossi', 'Valentina', 'Napoli', '1986/07/13', 7, 4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('BP009', 'Bianchi', 'Paola',  'Benevento', '1975/06/25', 7,4);

insert into dipendenti (matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile)
                    values ('NM010', 'Neri', 'Marcella', 'Salerno', '1979/05/28', 8,4);

Il risultato del lavoro fatto è il seguente:

select id, matricola, cognome, nome, luogo_di_nascita, data_di_nascita, id_ruolo, id_responsabile from dipendenti;

id matricola cognome nome luogo_di_nascita data_di_nascita id_ruolo id_responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 1 NULL
2 VC002 Verdi Carlo Latina 1975-04-20 2 1
3 BS003 Bianchi Silvia Rieti 1980-02-05 3 2
4 NM004 Neri Mara Napoli 1978-05-10 4 2
5 RL005 Rossi Luca Salerno 1972-09-15 5 3
6 VL006 Verdi Laura Roma 1973-11-08 5 3
7 BL007 Bianchi Loredana Latina 1982-03-04 6 4
8 RV008 Rossi Valentina Napoli 1986-07-13 7 4
9 BP009 Bianchi Paola Benevento 1975-06-25 7 4
10 NM010 Neri Marcella Salerno 1979-05-28 8 4

 

Creazione di una Query per visualizzare i Dipendenti, i Ruoli ed i Responsabili

Per creare la Query richiesta, serve un INNER JOIN tra la tabella Dipendenti e la tabella Ruoli, per visualizzare i ruoli e un SELF JOIN sulla tabella Dipendenti per visualizzare i Responsabili, il comando seguente vi permette di ottenere questo risultato:

select d1.id, d1.matricola, d1.cognome, d1.nome, d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome, d2.nome
            from dipendenti as d1 join dipendenti as d2 on (d1.id_responsabile=d2.id) join ruoli as r on (d1.id_ruolo=r.id);

 

id matricola cognome nome luogo_di_nascita data_di_nascita ruolo cognome nome
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara

L'Amministratore Rossi Alberto,corrispondente all'id 1, non viene visualizzato perché l'id_responsabile è uguale a null, quindi la condizione d1.id_responsabile=d2.id non è verificata, in un INNER JOIN oppure in un SELF JOIN vengono visualizzati solo i record che soddisfano la condizione chiave esterna uguale a chiave primaria.

Per visualizzare anche l'Amministratore dell'Azienda, dovete usare un LEFT JOIN, come mostra il comando seguente:

select d1.id, d1.matricola, d1.cognome, d1.nome, d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome, d2.nome
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left join ruoli as r on (d1.id_ruolo=r.id);

id matricola cognome nome luogo_di_nascita data_di_nascita ruolo cognome nome
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara


Utilizzando gli alias di colonna ed il concatenamento tra le colonne potete rendere il report ancora più professionale, come mostra il comando seguente:

select d1.id, d1.matricola, concat(d1.cognome, ' ', d1.nome) as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, concat(d2.cognome, ' ',  d2.nome) as "responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left  join ruoli as r on (d1.id_ruolo=r.id);

id matricola dipendente luogo_di_nascita data_di_nascita ruolo responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara

Attenzione la funzione MySQL concat permette di concatenare in un'unica colonna il congnome, uno spazio ed il nome. Con altri DBMS gli operatori di concatnamento sono || (doppio pipe) oppure il segno +, come mostra l'esempio seguente:

select d1.id, d1.matricola, d1.cognome || ' ' ||  d1.nome as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r.ruolo, d2.cognome ||  ' ' ||  d2.nome  as "responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id)  left join ruoli as r on (d1.id_ruolo=r.id);

Infine, per rendere il report ancora più professionale, con un ulteriore JOIN sulla tabella ruoli, potete anche aggiungere anche il ruolo del Responsabile, come mostra il comando seguente:

select d1.id, d1.matricola, concat(d1.cognome, ' ', d1.nome) as "dipendente", d1.luogo_di_nascita, d1.data_di_nascita, r1.ruolo,
            concat(d2.cognome, ' ',  d2.nome) as "responsabile", r2.ruolo as "ruolo responsabile"
            from dipendenti as d1 left join dipendenti as d2 on (d1.id_responsabile=d2.id) left join ruoli as r1 on (d1.id_ruolo=r1.id) 
           left  join ruoli as r2 on (d2.id_ruolo=r2.id) ;

 

id matricola dipendente luogo_di_nascita data_di_nascita ruolo responsabile ruolo responsabile
1 RA001 Rossi Alberto Roma 1970-12-10 Amministratore null null
2 VC002 Verdi Carlo Latina 1975-04-20 Direttore Generale Rossi Alberto Amministratore
3 BS003 Bianchi Silvia Rieti 1980-02-05 Direttore Commerciale Verdi Carlo Direttore Generale
4 NM004 Neri Mara Napoli 1978-05-10 Responsabile Risorse Umane Verdi Carlo Direttore Generale
5 RL005 Rossi Luca Salerno 1972-09-15 Commerciale Bianchi Silvia Direttore Commerciale
6 VL006 Verdi Laura Roma 1973-11-08 Commerciale Bianchi Silvia Direttore Commerciale
7 BL007 Bianchi Loredana Latina 1982-03-04 Segretaria Neri Mara Responsabile Risorse Umane
8 RV008 Rossi Valentina Napoli 1986-07-13 Addetto Amministrazione Neri Mara Responsabile Risorse Umane
9 BP009 Bianchi Paola Benevento 1975-06-25 Addetto Amministrazione Neri Mara Responsabile Risorse Umane
10 NM010 Neri Marcella Salerno 1979-05-28 Addetto Reception Neri Mara Responsabile Risorse Umane

Attenzione per visualizzare anche l'Amministratore è importante che anche l'ultimo JOIN sia di tipo LEFT .

 


<< Lezione precedente           Lezione successiva >>


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


Share Button
TOP