Skill Factory
Tutte le categorie
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
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
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
App Mania Lezione 9 - Gestione Sprite - II Parte - (Come far girare l'ago di una bussola)
Gino Visciano |
Skill Factory - 23/04/2016 08:26:00 | in Tutorials
Benvenuti alla nona lezione, nella lezione precedente avete preparato le immagini che servono per far girare l'ago della bussola sia in senso orario, che in senso antiorario.
In questa lezione implementerete i blocchi che servono per attivare l'animazione per far girare l'ago.
Come avete già visto nella lezione precedente, per far girare l'ago ogni volta che premete sui pulsanti "Ruota+" e "Ruota-", dovete sostituire nello Sprite Ago_Bussola l'immagine dell'ago corrente con l'immagine successiva, se avete premuto il pulsante "Ruota+" oppure l'immagine precedente se avete premuto il pulsante "Ruota-", come mostra la sequenza seguente:
I nomi delle immagini, sono composti da una parte fissa, la parola ago e da un numero progressivo da 01 .. 12, sfrutterete proprio quest'ultima caratteristica per caricare l'immagine che serve, basta creare un contatore che s'incrementa oppure si decrementa ad ogni operazione.
Con App Inventor per creare un contatore serve una variabile, per inizializzarla eseguite le operazioni seguenti:
1) selezionate l'Area Blocks;
2) aprite la categoria Variables;
3) cliccate sul blocco initialize global;
4) rinominatelo fotogramma;
5) aprite la categoria Math;
6) cliccate sul blocco numero;
7) associate il blocco numero a quello initialize global;
8) assegante al blocco numero il valore 1 per inizializzare la variabile fotogramma, come mostra l'immagine.
Userete la variabile fotogramma, come contatore per richiamare le immagini. Il contatore si dovrà incrementare ogni volta che si clicca sul pulsante "Ruota+" e decrementare quando si clicca sul pulsante "Ruota-", l'immagine seguente mostra come trasformare la variabile fotogramma in un contatore:
ogni volta che viene eseguito questo blocco la variabile fotogramma s'incrementa di 1.
Il blocco somma lo trovate nella categoria Math.
Il blocco get oppure il blocco set, per ottenere oppure assegnare un valore alla variabie fotogramma, lo trovate spostando il cursore del mouse sul blocco initialize global, come mostra l'immagine seguente:
Per caricare l'immagine nello Sprite Ago_Bussola, serve il blocco set Picture, lo trovate nella categoria Ago_Bussola, come mostra l'immagine seguente:
Per comporre il nome dell'immagine, dovete procedere come segue:
1) per i valori da 1 a 9 del contatore, dovete concatenare la parola "ago0" con il valore della variabile "fotogramma" e l'estensione ".png";
2) per i valori da 10 a 12 del contatore, dovete concatenare la parola "ago", senza 0 (zero), con il valore della variabile "fotogramma" e l'estensione ".png".
Per concatenare i due valori tra loro dovete utilizzare il blocco Join, della categoria Text. Nella stessa categoria trovate anche il blocco text string, che permette di aggiungere valori alfanumerici.
Le immagini seguenti mostrano i blocchi da utilizzare per comporre il nome dell'immagine corrente da caricare nello Sprite.
1) Blocchi da usare per i Fotogrammi da 1 a 9:
2) Blocchi da usare per i Fotogrammi da 10 a 12:
Utilizzando un blocco if potete controllare il valore raggiunto dal contatore e decidere quali blocchi usare, come mostra l'immagine seguente:
Il blocco if si comporta nel modo seguente: se fotogramma (il contatore) è minore di 10, componi il nome con la formula "ago0"+fotogramma+".png", altrimenti usa la formula "ago"+fotogramma+".png", perché i per i valori di fotogramma da 10 in poi non serve più lo 0 (zero).
Come avete visto nelle lezioni precedenti il blocco if lo trovate nella categoria Control.
A questo punto per creare l'animazione dell'ago che gira dovete creare le strutture di blocchi seguenti.
1) Struttura che permette di creare l'animazione per far girare l'ago della bussola in senso orario:
Il blocco Click del pulsante But_ruota_piu lo trovate nella sezione Blocks, cliccando sul nome del pulsante.
2) Struttura che permette di creare l'animazione per far girare l'ago della bussola in senso antiorario:
Il blocco Click del pulsante But_ruota_meno lo trovate nella sezione Blocks, cliccando sul nome del pulsante.
Per inizializzare lo schermo la prima volta che lanciate l'applicazione, con il primo ago, dovete usare il blocco seguente:
Il blocco Initialize lo trovate nella sezione Blocks, cliccando sul nome dello schermo Screen1.
L'immagine seguente mostra la parte logica completa dell'APP Bussola:
Per eseguire l'APP Bussola, avviate l'emulatore aiStarter:
e avviate l'APP selezionando Connect e cliccando sul comando Emulator.
Se avete l'emulatore sul cellulare, per avviare l'APP dovete procedere come segue:
1) lanciare l'emulatore sul cellulare
2) selezionare Connect sul computer e cliccare sul comando AI Companion
3) Inserire oppure leggere con il QR code il codice visualizzato sul computer.
L'immagine seguente mostra l'APP in esecizione:
<< Lezione precedente Lezione successiva >>
T U T O R I A L S S U G G E R I T I
App Mania Lezione 8 - Gestione Sprite - I Parte - (Come far girare l'ago di una bussola)
Gino Visciano |
Skill Factory - 16/04/2016 15:43:01 | in Tutorials
Benvenuti all'ottava lezione, in questa lezione imparerete a lavorare con gli Sprite. Gli Sprite sono immagini particolari che permettono di creare animazioni.
In questa e nella prossima lezione svilupperete l'APP BUSSOLA che permette di far girare un Ago sia in senso orario, che in senso antiorario.
Creare un'animazione significa visualizzare una dopo l'altra una sequenza d'immagini, con l'obiettivo di dare all'osservatore la sensazione del movimento. Quindi ogni immagine sarà leggermete diversa dalla precedente, come avvine con i fotogrammi delle pellicole dei film, nell'esempio seguente potete osservare una sequenza di 12 immagini che danno la sensazione di un ago che gira:
utilizzerete questa sequenza d'immagini per far girare l'ago della vostra bussola.
Come si usano gli Sprite in APP INVENTOR
Gli Sprite, in APP INVENTOR, possono vivere solo se posizionati all'interno di un Canvas, un pannello sensibile agli eventi generati dagli Sprite, tipo clic, spostamenti e collisioni tra Sprite.
Sia gli Sprite che i Canvas li trovate nella sezione Drawing and Animation del pannello Palette, come mostra l'immagine seguente.
Per usare gli Sprite, basta trascinare un Canvas nello Schermo attivo e poi aggiungere gli Sprite, trascinandoli nel Canvas.
Differenza tra immagini jpg e png
Le immagini con estensione jpg (JPEG = Joint Photographic Experts Group) e png (PNG=Portable Network Graphics) sono immagini compresse utilizzate per il Web. La sostanziale differenza che esiste tra questi due tipi d'immagini è quella che le immagini di tipo png hanno lo sfondo trasparente, quindi se sovrapposte ad un'altra immag Gine, quella in secondo piano appare come sfondo.
Guardate l'esempio seguente:
Sovrapponendo l'ago della bussola alla bussola, l'immagine è ancora visibile perché lo sfondo dell'ago è trasparente, se aveste fatto la stessa cosa con un'immagine di tipo JPEG la bussola non sarebbe visibile, perché in questo caso lo sfondo dell'ago non sarebbe trasparente.
I programmi più conosciuti per gestire questi tipi di immagini sono: Phtoshop e GIMP, se non avete già un dei due programmi, vi suggerisco d'installare GIMP, è gratuito e semplice da usare.
GIMP lo potete scaricare dal sito : www.gimp.org/downloads.
Come creare una bussola con l'ago che gira usando APP INVENTOR
Per iniziare posizionatevi sull'immagine seguente, premete il tasto destro del mouse e copiate l'immagine.
Avviate GIMP, incollate l'immagine e salvatela con il nome bussola.jpg. Attenzione in GIMP per salvare un immagine in formato jpg dovete procedere nel modo seguente:
1) Aprite il menu File
2) Selezionate Esporta come ...
3) Scegliete la cartella in cui salvare
4) Scrivete il nome dell'immagine, in questo caso bussola.jpg
Adesso dovete creare la sequenza d'immagini che servono per far girare l'ago della bussola, quindi posizionatevi sull'immagine seguente, premete il tasto destro del mouse e copiate l'immagine, incollatela in GIMP e salvatela con il nome ago01.png. L'estensione png è importante perché le immagini degli aghi devono avere lo sfondo trasparente.
Per creare una sequenza d'immagini che permettono di impostare un'animazione per far girare un ago di 360°, occorrono 12 aghi, ciascuno con una inclinazione di 30° in più, rispetto al precedente.
Partendo dall'immagine ago01.png, con GIMP è semplice creare le altre 11 immagini, basta utilizzare lo strumento ruota, vediamo come:
1) Aprite l'immagine ago01.png
2) selezionate lo strumento ruota dal pannello degli strumenti
3) Cliccate sull'immagine
4) Ruotate l'immagine di 30° in senso orario e confermate cliccando sul pulsante RUOTA, come mostra l'immagine seguente:
5) Salvate l'immagine corrente, selezionando File, Esporta come ... e assegnategli il nome ago02.png
6) Ripetete i punti dal 2 al 5 per creare la sequenza delle 12 immagini.
L'immagine seguente mostra i 12 aghi ed i nomi associati.
Come impostare lo schermo dell'APP BUSSOLA e caricare le immagini per creare le animazioni
Collegatevi ad APP INVENTOR (https://ai2.appinventor.mit.edu) e create un nuovo progetto di nome bussola. Se non sapete ancora creare un progetto con APP INVENTOR leggete la lezione 1.
Quando siete nell'Area di Designer, eseguite le seguenti operazioni:
1) Trascinate nello schermo attivo un Canvas e chiamatelo Piano, per rinominare un componente basta selezionarlo nella sezione Components e cliccare sul pulsante Rename, come mostra l'immagine seguente;
2) Impostate le proprità Height e Width del Canvas con il valore Fill parent;
3) Trascinate nel Canvas attivo lo Sprite da utilizzare come sfondo della bussula e chiamatelo Bussola;
4) Impostate le proprità Height e Width dello Sprite con il valore 220;
5) Trascinate nel Canvas attivo lo Sprite da utilizzare per gli aghi e chiamatelo Ago_Bussola;
6) Impostate le proprità Height e Width dello Sprite con il valore 170;
7) Trascinate in fondo allo schermo attivo, un Layout orizzontale;
8) Trascinate all'interno del Layout un Button e chiamatelo But_ruota_piu ed impostate la proprietà Text con il valore Ruota+;
9) Trascinate all'interno del Layout un Button e chiamatelo But_ruota_meno ed impostate la proprietà Text con il valore Ruota-;
10) Trascinate all'interno del Layout una Label e chiamatela Lab_fotogramma ed impostate la proprietà Text con il valore Fotogramma;
11) Trascinate all'interno del Layout una Label e chiamatela Lab_display ed impostate la proprietà Text con il valore 0;
L'immagine seguente mostra l'aspetto finale dello schermo dell APP BUSSOLA:
Infine dovete caricare tutte le immagini, utilizzando l'UPLOAD della sezione Media, a destra dello schermo attivo, sotto la sezione Components, come mostra l'immagine seguente:
Nella prossima lezione, implementerete i blocchi per far girare gli aghi della bussola sia in senso orario, che in senso antiorario.
<< Lezione precedente Lezione successiva >>
T U T O R I A L S S U G G E R I T I