CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Vogliamo creare una struttura per permettere di memorizzari i voti della classe in tutte le materie
Per fare questo untilizziamo tre tabelle
Alunni,materie,voti
Alunni
Materie
Voti
Creo un record per ogni alunno
Creo un record per ogni materia
Creao un record per ogni voto della classe
Utilizzando Microsoft Access
Si crea la tabella Anagrafica degli alunni ,le Materie e i voti si mettono alcuni campi
Si creano via via le query e si memorizzano dando loro un nome
1
CASE STUDY INFORMATICA DATABASE VOTI
Alunni
3ASA MARZO APRILE 2015
materie
2
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Voti
Come data default metto quella di oggi
Nella tabella voti metto predefinito la data odierna
Nella tabella Alunni mettiamo IDALUNNO COME CHIAVE PRIMARIA al fine di individuare univocamente un alunno
Nella tabella Materie mettiamo IDMATERIA COME CHIAVE PRIMARIA al fine di individuare univocamente una Materia
Nella tabella voti mettiamo ID COME CHIAVE PRIMARIA al fine di individuare univocamente il voto
Mentre IDALUNNO è chiave esterna ossia il suo valore è chiave primaria in un’altra tabella (Alunni)
Infine IDMATERIA è chiave esterna ossia il suo valore è chiave primaria in un’altra tabella (Materie)
La tabella Materie è tipo è del tipo codice,descrizione e serve a codificare le materie , ossia ogni volta che faccio riferimento ad una materia utilizzo un numero
Che rende tutto più veloce questo tipo di tabella si chiama TABELLA DI DOMINIO nel senso che i valori numerici che può assumere una materia sono tutti e soli
quelli che sono scritti nella tabella.
3
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Affinché il database sia a corrente di queste regole occorre fare un passo importante definire le relazioni
SI TRASCINANO I CAMPI CHE DEVONO ESSERE UGUALI IDALUNNO TRA ALUNNO E VOTI (POSSONO AVERE ANCHE NOMI DIVERSI)
IDMATERIA TRA MATERIE E VOTI (POSSONO AVERE ANCHE NOMI DIVERSI)
Cliccando col destro sulla relazione
4
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
RELAZIONI
In base alle chiavi access capisce cosa vogliamo relazionare e se metto integrità referenziale
Aggiorna campi correlati a catena : modifico IDalunno lo modifico automaticamente nei voti
elimina record correlati a catena : elimino IDalunno elimino automaticamente tutti i suoi voti
Aggiorna campi correlati a catena : modifico IDmateria in materia automaticamente nei voti
elimina record correlati a catena : elimino IDmateria in materie tutti i voti della materia
5
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
mettiamo un po’ di contenuto e cominciamo ad interrogare
TABELLA METERIE
TABELLA ALUNNI
6
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
TABELLA VOTI
Naturalmente nell’inserire i voti occorre una interfaccia che non faccia vedere i numeri interni (valori codificati) ma nome materia cognome alunno
Ma questo esula dal nostro percorso. Se voglio vedere i voti in maniera chiara basta una query che TRADUCA i numeri in DESCRIZIONI
7
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Andando in struttura siccome ho messo le relazioni ACCESS si predispone
Non mi resta che selezionare i dati che mi interessano e la tabella dei voti diventa chiara
SQL naturalmente è più complicato poiché coinvolge più tabelle
Per legare i valori si utilizza la parola chiave INNER JOIN
8
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
QUERY sui VOTI
NOME QUERY
Vista voti
DESCRIZIONE
FA VEDERE I VOTI METTENDO DESCRIZIONE
DELLA MATERIA E NOME E COGNOME
9
SQL
SELECT alunni.Cognome, alunni.Nome,
materie.Materia, Voti.Voto, Voti.Data, alunni.IDalunno,
materie.IDmateria
FROM materie INNER JOIN (alunni INNER JOIN Voti ON
alunni.IDalunno = Voti.IDalunno) ON materie.IDmateria
= Voti.IDmateria;
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
miei voti (utilizzo query precedente)
SELEZIONA TUTTI I VOTI DI UN ALUNNO
SPECIFICO
SELECT [Vista voti].Cognome, [Vista voti].Nome, [Vista
voti].Materia, [Vista voti].Voto, [Vista voti].Data
FROM [Vista voti]
WHERE ((([Vista voti].IDalunno)=3));
Vediamo adesso come possiamo fare una sintesi dei voti
Si Utilizza l’istruzione GROUP BY (raggruppa per)
Ogni volta che voglio fare qualcosa di sintetico su uno o più valori
Esempio : Sintesi per Materia : Per ogni materia voglio numero voti ,minimo,massimo,media
Esempio : Sintesi per Alunno : Per ogni alunno voglio numero voti ,minimo,massimo,media
Esempio : Sintesi per Alunno e materia : Per ogni alunno,per ogni materia voglio numero voti ,minimo,massimo,media
10
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
sintesi_alunno
PER OGNI ALUNNO NUMERO VOTI,MAX MIN
MEDIA
SELECT Voti.IDalunno, count(voto) AS numero_voti,
min(voto) AS minimo, max(voto) AS massimo,
avg(voto) AS media
FROM voti
GROUP BY IDalunno;
sintesi_materia
PER OGNI MATERIA NUMERO VOTI,MAX MIN
MEDIA
SELECT voti.IDmateria, Count(voti.voto) AS
numero_voti, Min(voti.voto) AS minimo,
Max(voti.voto) AS massimo, Avg(voti.voto) AS media
FROM voti
GROUP BY voti.IDmateria;
11
CASE STUDY INFORMATICA DATABASE VOTI
sintesi_alunno_materia
3ASA MARZO APRILE 2015
PER OGNI ALUNNO ,PER OGNI MATERIA
NUMERO VOTI,MAX MIN MEDIA
12
SELECT voti.IDalunno, voti.IDmateria, Count(voti.voto)
AS numero_voti, Min(voti.voto) AS minimo,
Max(voti.voto) AS massimo, Avg(voti.voto) AS media
FROM voti
GROUP BY voti.IDalunno, voti.IDmateria;
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Si può fare un filtro prima di aggregare sul colonna non aggegata (WHERE) e anche dopo avere aggregato (HAVING) E ANCHE ORDINARE (ORDER BY)
sintesi_alunno_materia_filtro
PER OGNI ALUNNO ,PER OGNI MATERIA
NUMERO VOTI,MAX MIN MEDIA
AVENDO PIU DI UN VOTO
SELECT voti.IDalunno, voti.IDmateria, Count(voti.voto)
AS numero_voti, Min(voti.voto) AS minimo,
Max(voti.voto) AS massimo, Avg(voti.voto) AS media
FROM voti
GROUP BY voti.IDalunno, voti.IDmateria
HAVING (((Count(voti.voto))>1));
sintesi_alunno_materia_filtro_3
PER OGNI ALUNNO ,PER OGNI MATERIA
NUMERO VOTI,MAX MIN MEDIA
Interrogati nel 2015 con media minore di 8
Dalla media più grande alla più piccola
SELECT voti.IDalunno, voti.IDmateria, Count(voti.voto)
AS numero_voti, Min(voti.voto) AS minimo,
Max(voti.voto) AS massimo, Avg(voti.voto) AS media
FROM voti
WHERE (((Year([DATA]))=2015))
GROUP BY voti.IDalunno, voti.IDmateria
HAVING (((Avg(voti.voto))<8))
ORDER BY Avg(voti.voto) DESC;
13
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Una volta praparate le basi per fare vedere esternamente le informazioni precedenti posso operare con una query di livello superiore
sintesi_alunno_materia
PER OGNI ALUNNO ,PER OGNI MATERIA
NUMERO VOTI,MAX MIN MEDIA
SELECT alunni.Cognome, alunni.Nome,
materie.Materia, sintesi_alunno_materia.numero_voti,
sintesi_alunno_materia.minimo,
sintesi_alunno_materia.massimo,
sintesi_alunno_materia.media,
sintesi_alunno_materia.IDalunno,
sintesi_alunno_materia.IDmateria
FROM (sintesi_alunno_materia INNER JOIN materie
ON sintesi_alunno_materia.IDmateria =
materie.IDmateria) INNER JOIN alunni ON
sintesi_alunno_materia.IDalunno = alunni.IDalunno;
FROM sintesi_alunno_materia
INNER JOIN materie ON sintesi_alunno_materia.IDmateria = materie.IDmateria -> prendi stessi valori materie
INNER JOIN alunni ON sintesi_alunno_materia.IDalunno = alunni.IDalunno -> prendi stessi valori alunno
14
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
15
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
N.B. le funzioni count(),min() max(),avg() si chiamano funzioni di aggregazione
Una funzione di aggregazione importante (che non abbiamo avuto necessità di usare nel nostro esempio) è sum() che esegue la somma su una colonna
Esempio se il database contiene un valore imponibile per ogni fattura RELATIVA AD UN CLIENTE
Select
idcliente,sum(IMPONIBILE) AS TOTALE From fatture group by idcliente mi d ail fatturato per ciascun cliente
16
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Come ultima parte vogliamo avere il tabellone completo man mano che metto i voti
La query fatta in precedenza e memorizzata sintesi_alunno_materia contiene solo i voti messi ma nulla mi dice su ciò che non ho messo
Vogliamo avere il tabellone dove compaiono
•
•
tutti gli alunni
per ciascuno dei quali compaiono tutte le materia e gli eventuali voti
se gli alunni sono 6 e le materie sono 10 il tabellone dovrà contenere 6*10 righe ossia 60 righe
per avere il tabellone lo chiameremo base_tabellone
chiameremo base_tabellone
Visualizza OGNI ALUNNO e OGNI MATERIA
17
SELECT alunni.Cognome, alunni.Nome,
alunni.Datadinascita, alunni.Maschio, alunni.Altezza,
materie.Materia, materie.IDmateria, alunni.IDalunno
FROM alunni, materie;
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
18
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
19
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Mancano i voti mettiamo insieme base_tabellone e riepilogo voti e materie lo chiamiamo tabellone
tabellone
Visualizza OGNI ALUNNO e OGNI
MATERIA ed eventuali voti
ORDINE ALFABETICO ALUNNI,MATERIA
Left join prende comunque tutti gli
alunni
20
SELECT base_tabellone.Cognome, base_tabellone.Nome,
base_tabellone.Materia, sintesi_alunno_materia.numero_voti,
sintesi_alunno_materia.minimo, sintesi_alunno_materia.massimo,
sintesi_alunno_materia.media, base_tabellone.IDmateria,
base_tabellone.IDalunno
FROM base_tabellone LEFT JOIN sintesi_alunno_materia ON
(base_tabellone.IDalunno = sintesi_alunno_materia.IDalunno) AND
(base_tabellone.IDmateria = sintesi_alunno_materia.IDmateria)
ORDER BY base_tabellone.Cognome, base_tabellone.Nome,
base_tabellone.Materia;
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Left join prende comunque tutte le
materie
Quelli che non hanno tutti I voti compaiono vuoti (NULL)
21
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
22
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Finalmente posso interrogare tabellone per avere la situazione di Bianchi globale,le materie in cui è stato interrogato,le materia in cui deve essere ancora
interrogato
SELECT tabellone.*
FROM tabellone
WHERE (((tabellone.Cognome)="bianchi"));
Visualizza situazione globale bianchi
bianchi
Cognome Nome
Bianchi
Bianchi
Bianchi
Bianchi
Materia
Leonardo
Ed. fisica
Leonardo
Filosofia
Leonardo
Fisica
Leonardo Informatica
Bianchi Leonardo
Inglese
Bianchi Leonardo
Italiano
Bianchi Leonardo Matematica
Bianchi Leonardo
Bianchi Leonardo
numero_voti minimo massimo media IDmateria IDalunno
1
8
1
2
7
7
Scienze
Storia
Bianchi Leonardo Storia dell'arte
23
8
7
8,5
8
10
8
3
5
3
3
3
3
7
7,75
4
1
2
3
3
3
6
7
3
3
9
3
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Visualizza situazione interrogazioni bianchi
SELECT tabellone.*, tabellone.numero_voti
FROM tabellone
WHERE (((tabellone.Cognome)="bianchi") AND
((tabellone.numero_voti) Is Not Null));
bianchi_interrogato
Cognome Nome
Materia numero_voti minimo massimo media IDmateria IDalunno
Bianchi Leonardo Informatica
1
8
8
8
5
3
Bianchi
Bianchi
Leonardo Italiano
Leonardo Matematica
1
2
24
7
7
7
8,5
7
7,75
1
2
3
3
CASE STUDY INFORMATICA DATABASE VOTI
3ASA MARZO APRILE 2015
Visualizza situazione interrogazione che deve
ancora fare bianchi
SELECT tabellone.*, tabellone.numero_voti
FROM tabellone
WHERE (((tabellone.Cognome)="bianchi") AND
((tabellone.numero_voti) Is Null));
bianchi_da_interrogare
Cognome Nome
Bianchi Leonardo
Materia
Ed. fisica
numero_voti minimo massimo media IDmateria IDalunno
10
3
Bianchi
Bianchi
Leonardo
Leonardo
Filosofia
Fisica
8
3
3
3
Bianchi
Bianchi
Leonardo
Leonardo
Inglese
Scienze
4
6
3
3
7
9
3
3
Bianchi Leonardo
Storia
Bianchi Leonardo Storia dell'arte
Notare come queste query finali sono molto semplici (NESSUN JOIN)
RAPPRESENTANO IL LIVELLO ESTERNO (ossia quella parte vicino all’utente) DEL DBMS A PARTIRE DA TABELLE E RELAZIONI CHE ABBIAMO PROGETTATO
(LIVELLO LOGICO)
esterno: descrizione di una porzione della base di
dati di interesse, per mezzo del modello logico. Nei
sistemi più moderni non è esplicitamente presente ma
è possibile definire relazioni derivate (query memorizzate chiamate
views)
25