Fondamenti delle basi di dati
Corso MySQL a cura del prof. Pietro De Paolis
Soluzione seconda prova scritta
Esame di Stato 2003/04
Di questa pagina esiste una versione completa di software funzionante in rete.
Arrivati a questo punto dovremmo essere in grado di svolgere in modo autonomo il tema di informatica industriale e applicazioni tecnico-scientifiche assegnato agli esami di Stato per l'indirizzo informatica industriale, corso di ordinamento. La traccia assegnata è stata: Seconda prova informatica industriale Anno 2003-04
Tecnica di risoluzione
E' bene acquisire una tacnica di risoluzione che sia valida per qualunque traccia indicata dal ministero. Analizzate le tracce degli anni precedente possiamo notare che in ogni caso è richiesta la costituzione di una banca dati e più interrogazioni sulla banca dati creata.
Dividiamo quindi la procedura di risoluzione in tre punti:
1 - Costruzione delle tabelle
La costituzione della banca dati richiede la ideazione e costruzione di un numero adeguato di tabelle o relazioni; per ricavare il numero ed il tipo di tabelle occorre dapprima leggersi e rileggersi la traccia diverse volte fino ad acquisire la piena consapevolezza degli elementi che influenzano la banca dati.
2 - Scrittura del codice MySQL
Successivamente, una volta create tutte le tabelle, si procede alla implementazione in linguaggio MySQL delle interrogazioni richieste sulle tabelle appena create.
3 - Rilettura traccia
Potrebbe succedere, in tale fase, che il numero di tabelle create sia insufficiente; si rilegge di nuovo la traccia e si aggiungono le tabelle mancanti.
4 - Verifica finale
Verifica totale della soluzione, partendo da una nuova rilettura della traccia e verificando che la soluzione da noi adottata sia conforme a quanto richiesto.
1 - Costruzione delle tabelle
Leggendo più volte la traccia notiamo:
L'organizzazione scolastica dell'istituto prevede che:
Andiamo con ordine:
a. ciascuno studente possa frequentare più corsi di recupero e/o di sostegno e/o di arricchimento dell'offerta formativa;
questo ci suggerisce di creare una tabella che possiamo chiamare: corsifrequentati con la seguente struttura:
codicefrequenza | codicecorso | codicestudente | annoscolastico |
01 | 01 | 05 | 2001/02 |
02 | 01 | 125 | 2002/03 |
3000 | 300 | 124 | 2001/02 |
b. ogni corso abbia un titolo, una descrizione, una data di inizio e di fine, un monte ore definito;
questo ci suggerisce di creare una tabella che possiamo chiamare: corsiesistenti con la seguente struttura:
codicecorso | titolo | descrizione | datainizio | datafine | ore |
01 | italiano | Corso di recupero classi terze | 14/09/2006 | 30/09/2006 | 10 |
02 | matematica | corso di recupero classi quarte | 14/09/2006 | 29/09/2006 | 10 |
300 | matematica | Corso di recupero classi terze | 14/09/2006 | 29/09/2006 | 10 |
c. ogni studente possa frequentare più corsi esterni alla scuola;
d. i corsi esterni alla scuola hanno un titolo, una descrizione, una data di inizio e di fine, un monte ore definito, un riferimento che indichi l'Ente e/o l'Istituzione che li ha organizzati, un riferimento alla documentazione di accertamento;questo ci suggerirebbe di creare una nuova tabella con i corsi esterni; tuttavia, poichè essa assomiglia alla tabella dei corsi interni creata prima, possiamo, per semplicità, modificare la tabella creata sopra per i corsi interni e cioè:
codicecorso | titolo | descrizione | datainizio | datafine | ore |
01 | italiano | Corso di recupero classi terze | 14/09/2006 | 30/09/2006 | 10 |
02 | matematica | corso di recupero classi quarte | 14/09/2006 | 29/09/2006 | 10 |
300 | matematica | Corso di recupero classi terze | 14/09/2006 | 29/09/2006 | 10 |
aggiungendo altre colonne in modo che sia valida sia per i corsi interni che per i corsi esterni; per cui lasciamo lo stesso nome alla tabella, cioè corsiesistenti e gli diamo la seguente struttura:
codicecorso | titolo | descrizione | datainizio | datafine | ore | tipo | ente | documentazione |
01 | italiano | Corso di recupero classi terze | 14/09/2006 | 30/09/2006 | 10 | interno | ||
02 | matematica | corso di recupero classi quarte | 14/09/2006 | 29/09/2006 | 10 | esterno | scuola privata "L. da Vinci" | certificato di superamento corso di matematica |
300 | matematica | Corso di recupero classi terze | 14/09/2006 | 29/09/2006 | 10 | interno |
e. ogni classe sia individuata univocamente da un numero ordinale progressivo (I, II, III, IV, V) e da una lettera che ne indica la sezione di appartenenza (A, B, C, D, E, F, G,).
questo ci suggerisce di creare una tabella che possiamo chiamare: classiesistenti con la seguente struttura:
codiceclasse | numero | sezione |
1 | I | A |
2 | I | B |
35 | V | G |
La traccia continua dicendo:
In particolare, il Dirigente Scolastico chiede che si possa procedere all'archiviazione dei:
questo ci suggerisce di creare una tabella che possiamo chiamare: studenti con la seguente struttura:
codicestudente | cognome | nome | datanascita | comunenascita | comuneresidenza | indirizzo | telefono |
01 | Bianchi | Gerardo | 14/12/87 | Milano | Milano | Via Bossi 25 | 02832547 |
02 | Rossi | Antonio | 10/01/1988 | Roma | Milano | Via G. Mazzini 310 | 02573281 |
980 | Merlino | Giuseppe | 15/10/1991 | Venezia | Gallarate | Via Manzoni 120 | 02581475 |
la traccia prosegue:
2. dati relativi alla frequenza delle classi del corso di studi (quali classi ciascuno studente ha frequentato in ordine crescente ed in quale anno scolastico);3. dati relativi agli esiti conclusivi di ciascun anno scolastico (promozione sì/no, eventuali debiti formativi ed in quale disciplina) per ciascuno studente;
questo ci suggerisce di creare una tabella che possiamo chiamare: classifrequentate con la seguente struttura:
codicefrequenza | codicestudente | numero | sezione | annoscolastico | esito | debiti |
01 | 01 | I | A | 2001/02 | promosso | |
02 | 02 | II | A | 2001/02 | promosso | italiano, matematica |
10980 | 1500 | V | C | 2002/03 | non promosso |
la traccia prosegue:
4. dati relativi ai corsi interni;5. dati relativi ai corsi esterni alla scuola purché documentati.
questi dati li possiamo ricavare dalle due tabelle già create e cioè: corsiesistenti e corsifrequentati.
Definizione delle relazioni della base di dati in linguaggio MySQL
Supponendo di aver già un base di dati a disposizione su cui creare le nuove tabelle possiamo passare direttamente alla creazione delle relative tabelle già esposte sopra.
Per la tabella studenti il nostro comando in MySQL sarà:
CREATE TABLE studenti (codicestudente INT(7) not null AUTO_INCREMENT, cognome CHAR(50), nome CHAR(50), datanascita CHAR(50), comunenascita CHAR(50), comuneresidenza CHAR(50), indirizzo CHAR (50), telefono CHAR(50), PRIMARY KEY(codicestudente) )
Per la tabella corsifrequentati il nostro comando in MySQL sarà:
CREATE TABLE corsifrequentati (codicefrequenza INT(7) not null AUTO_INCREMENT, codicecorso INT(7), codicestudente INT(7), annoscolastico CHAR(50), PRIMARY KEY(codicefrequenza) )
Per la tabella corsiesistenti il nostro comando in MySQL sarà:
CREATE TABLE corsiesistenti (codicecorso INT(7) not null AUTO_INCREMENT, titolo CHAR(50), descrizione CHAR(50), datainizio CHAR(50), datafine CHAR(50), ore CHAR(50), tipo CHAR(50), ente CHAR(50), documentazione CHAR(50), PRIMARY KEY(codicecorso) )
Per la tabella classiesistenti il nostro comando in MySQL sarà:
CREATE TABLE classiesistenti (codiceclasse INT(7) not null AUTO_INCREMENT, numero CHAR(7), sezione CHAR(7), PRIMARY KEY(codiceclasse) )
Per la tabella classifrequentate il nostro comando in MySQL sarà:
CREATE TABLE classifrequentate (codicefrequenza INT(7) not null AUTO_INCREMENT, codicestudente INT(7), numero CHAR(5), sezione CHAR(5), annoscolastico CHAR(50), esito CHAR(50), debiti CHAR(50), PRIMARY KEY(codicefrequenza) )
Le tabelle possono essere create tutte con una unica pagina web in php che le crea.
La traccia ci chiede, inoltre,
Implementi in linguaggio MySQL le seguenti interrogazioni:
data una classe, quali studenti di quella classe hanno frequentato corsi e di che tipo;
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT studenti.cognome, studenti.nome, corsiesistenti.titolo, corsiesistenti.tipo FROM classifrequentate, studenti, corsiesistenti, corsifrequentati WHERE classifrequentate.numero='$classe' AND classifrequentate.sezione='$sezione' AND classifrequentate.sezione='$annoscolastico' AND corsifrequentati.annoscolastico='$annoscolastico' AND classifrequentate.codicestudente=studenti.codicestuente AND corsifrequentati.codicestudente=studenti.codicestuente AND corsifrequentati.codicecorso=corsiesistenti.codicecorso
dove con $classe abbiamo indicato la variabile di ingresso della classe da cercare, con $sezione la variabile di ingresso della sezione da cercare e con $annoscolastico la variabile di ingresso dell'anno soclastico, nell'ipotesi di usare un linguaggio di programmazione in php.
La traccia ci chiede, inoltre,
dato uno studente, quali corsi ha frequentato, di che tipo, per quale monte ore e in quale anno scolasticoa;
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT studenti.cognome, studenti.nome, corsiesistenti.titolo, corsiesistenti.tipo, corsiesistenti.ore, corsifrequentati.annoscolastico FROM studenti, corsiesistenti, corsifrequentati WHERE studenti.cognome='$cognome' AND studenti.nome='$nome' AND corsifrequentati.codicestudente=studenti.codicestuente AND corsifrequentati.codicecorso=corsiesistenti.codicecorso
dove con $cognome abbiamo indicato la variabile di ingresso del cognome dello studente da cercare e con $nome la variabile di ingresso del nome dello studente da cercare, nell'ipotesi di usare un linguaggio di programmazione in php.
La traccia ci chiede, inoltre,
dato un anno scolastico, quali corsi interni sono stati attivati e da quali studenti sono stati frequenti;
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT corsiesistenti.titolo, studenti.cognome, studenti.nome FROM studenti, corsiesistenti, corsifrequentati WHERE corsifrequentati.annoscolastico='$annoscolastico' AND corsifrequentati.codicestudente=studenti.codicestudente AND corsiesistenti.codicecorso=corsifrequentati.codicecorso AND corsiesistenti.tipo='interno'
dove con $annoscolastico abbiamo indicato la variabile di ingresso dell'anno scolastico, nell'ipotesi di usare un linguaggio di programmazione in php.
La traccia ci chiede, inoltre,
dato un corso, quali sono i dati relativi ad esso e per quali anni scolastici è stato attivato;
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT corsiesistenti.*, corsifrequentati.annoscolastico FROM corsiesistenti, corsifrequentati WHERE corsiesistenti.codicecorso='$codicecorso' AND corsifrequentati.codicecorso=corsiesistenti.codicecorso
dove con $codicecorso abbiamo indicato la variabile di ingresso del codice del corso, nell'ipotesi di usare un linguaggio di programmazione in php.
La traccia ci chiede, infine,
dato uno studente quali classi ha frequentato, in quali anni scolastici e con quali esiti finali.
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT studenti.cognome, studenti.nome, classifrequentate.annoscolastico, classifrequentate.esito, classifrequentate.debito FROM studenti, classifrequentate, classiesistenti WHERE studenti.cognome='$cognome' AND studenti.nome='$nome' AND classifrequentate.codicestudente=studenti.codicestuente AND classifrequentate.codiceclasse=classiestenti.codiceclasse
dove con $cognome abbiamo indicato la variabile di ingresso del cognome dello studente da cercare e con $nome la variabile di ingresso del nome dello studente da cercare, nell'ipotesi di usare un linguaggio di programmazione in php.
Applicazione completa in rete
A questo punto la soluzione della traccia ministeriale è terminata. Possiamo, ora, collaudare in rete la soluzione proposta. Vedi: versione completa di software funzionante in rete.
giugno 2006
Corso di programmazione in MYSQL
Dizionario mysql e relativo php
Corso di programmazione in PHP
prof. Pietro De Paolis
Indice di tutte le pagine del sito