UdA 6 Il linguaggio SQL lezione 4 MYSQL E HEIDISQL X AUTORE: MANCANO i testi In questa lezione impareremo... • TESTO TESTO TESTO TESTO • TESTO TESTO TESTO TESTO • TESTO TESTO TESTO TESTO • TESTO TESTO TESTO TESTO ■■ Architettura di MySQL MySQL è un database relazionale con architettura di rete; infatti possiede una versione sever e una client. ◀ Un DBMS server è un programma riceve le Architettura dei database clientche e server richieste da parte di un DBMS client e accede conseguentemente ai contenuti del database per fornire ai client che ne abbiano l’autorizzazione le informazioni che essi richiedono. Con il termine DBMS client si indicano i programmi che si connettono a uno o più DBMS server per inviare richieste da restituire all’utente. ▶ Il ◀ DBMS ▶ server MySQL si comporta come un tradizionale server di servizi TCP, accettando connessioni da applicazioni client. Una volta stabilita la connessione, il client può interrogare i database tramite query. Il server è in grado di accettare più connessioni contemporaneamente. Per motivi di sicurezza l’accettazione delle connessioni può essere limitata secondo vari criteri: ◗◗ solo da localhost: i client sono localizzati sulla stessa macchina del server; ◗◗ solo dall’interno del dominio: i client sono localizzati anche su macchine connesse al dominio di rete del server stesso; ◗◗ dall’esterno del dominio: i client sono localizzati anche su macchine esterne rispetto alla rete di dominio (situazione molto pericolosa perché espone il sistema a intrusioni). Una volta ottenuta la connessione al server, l’accesso ai database gestiti dal server DBMS è limitato dal fatto che ogni database è accessibile solo dagli utenti autorizzati. Esistono in commercio numerosissimi strumenti di manutenzione sia integrati nel pacchetto MySQL sia diffusi nel Web. Questi strumenti possono essere suddivisi nelle tre categorie seguenti: ◗◗ client a riga di comando (CUI, Character User Interface): sono comandi utili all’amministratore di DBMS per effettuare una manutenzione in locale; 2 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 ◗◗ client visuali (GUI, Graphics User Interface): sono applicazioni visuali che consentono una ricca manutenzione interattiva; inoltre, rendono possibile una connessione remota al DBMS che consente l’accesso previa autenticazione; ◗◗ client web online: sono pagine attive scritte con linguaggi di scripting lato server in grado di connettersi al DBMS per effettuare interrogazioni. Client a riga di comando I client a riga di comando vengono eseguiti dal sistema operativo che ospita il DBMS; MySQL possiede un client a riga di comando sia per Windows sia per Linux. In Windows possiamo utilizzare il client a riga di comando attivando il programma dal menu di Avvio. Applicazioni client visuali In commercio esistono molte applicazioni client visuali, alcune open source, altre shareware e altre ancora proprietarie. In generale si tratta di software che integrano all’interno di un’unica finestra tutte le funzioni disponibili anche a riga di comando. I principali soft­ware sono i seguenti: ◗◗ heidiSQL: semplice client per win32 e win64; ◗◗ SQLWave e Navicat: client visuale multipiattaforma; ◗◗ dbdesigner: ambiente multipiattaforma di sviluppo visuale dello schema. Può collegarsi anche ad altri DBMS oltre a MySQL (via ODBC) e consente non solo la progettazione ma anche l’analisi visuale dello schema. P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 3 UdA 6 Inserire TITOLO Client web online Esistono molte applicazioni web online che integrano in un sito web attivo tutte le funzioni a riga di comando. Nella suite easyphp è presente un’applicazione (phpMyAdmin) sia nella versione per Windows sia in quella per Linux che permette la connessione per l’amministrazione remota del DBMS e la manipolazione dei database attraverso un’interfaccia grafica intuitiva disponibile sul Web, come illustrato nella figura che segue. Sicurezza e utenti di MySQL Poiché gli utenti del database non coincidono con gli utenti del sistema operativo, quando si crea un nuovo database devono essere definiti gli utenti che hanno i diritti di accesso e di manutenzione al database stesso. Tutti i database del DBMS MySQL sono di proprietà di un particolare ◀ utente ▶ di tipo ◀ amministratore ▶ chiamato root in grado di concedere diritti di lettura, inserimento, cancellazione, modifica, concessione ad altri utenti eventualmente identificati da password. ◀ L’utente amministratore della base di dati o Administrator (DBA) è responsabile della struttura, dello schema e della gestione della base di dati; decide e assegna i privilegi ad altri utenti chiamati “convenzionali” che solitamente modificano i dati e formulano le interrogazioni. Infatti, solo gli utenti che possiedono un database possono interrogarlo nei limiti dei diritti che sono stati loro concessi. ▶ Tipi di campo Prima di tutto vediamo da quali dati è composto un database di MySQL. I tipi di dati o domini della tabella possono essere dichiarati mediante query di creazione tabella, oppure mediante ambiente GUI (Graphics User Interface) offerto dai DBMS visuali quale, per esempio, HeidiSQL che verrà trattato più avanti. Innanzitutto occorre ricordare che MySQL è un database di tipo relazionale e permette quindi di creare relazioni tra tabelle diverse. Come la maggior parte dei DBMS è formato da database e ciascun database da tabelle. Le tabelle sono formate da campi (colonne) e record (righe), seguendo lo schema di qualsiasi altro database. I campi possiedono un nome (attributo) e un tipo (dominio), che devono essere decisi durante la fase di creazione delle tabelle. Durante la fase di progettazione della tabella è necessario tenere conto della dimensione e del tipo di campi riassunti nella tabella che segue. 4 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL tipo Descrizione BIGINT INTEGER SMALLINT TINYINT DOUBLE FLOAT DECIMAL DATE TIME DATETIME YEAR CHARACTER VARCHAR TEXT MEDIUMTEXT BLOB MEDIUM BLOB LONG BLOB DATETIME intero lunghissimo intero lungo intero intero ridotto reale a doppia precisione reale a singola precisione decimale memorizzato come stringa una data in formato US (aaaa-mm-gg) un orario una data con ora un anno stringa a lunghezza fissa stringa a lunghezza variabile campo testo a lunghezza fissa campo testo (memo) immagini jpeg, bmp, gif (Binary Large Object), oppure file binary in esadecimale o di testo Data e ora IMAGE oggetti (OLE - Object Linked and Embedded - Microsoft) Lezione 5 Dimensione massima/ formato INTERI REALI DATA STRINGA OGGETTI DATA OGGETTI da –263 a 263–1 da –231 a 231–1 da –32768 a 32767 da –128 a +127 da ±2.225*10308 a ± 1.798*10308 da ±1.176*10-38 a ± 3.403*1038 da ±2.225*10-308 a ± 1.798*10308 dal clic ’1000-01-01’ a ’9999-12-31 formato HH:MM:SS aaaa-mm-gg hh:mm:ss formato AAAA da 0 a 255 caratteri da 0 a 255 caratteri da 0 a 65535 caratteri 16 MB di caratteri –1 fino a 64 KB fino a 16 MB circa 4 GB un valore di data o di ora compreso tra 100 e 9999 da 0 a clic 2,14 GigaByte Zoom su... tIpI DI CAMpo MySQL ◗ Le stringhe sono delimitate da apice singolo oppure doppio indifferentemente, quindi “ciao” e ’ciao’ sono equivalenti. ◗ Il valore null è differente da 0 per i dati numerici e anche da "" (stringa vuota) per le stringhe; attesta che il campo è effettivamente vuoto. ◗ Le costanti numeriche possono essere precedute o meno dal segno (+ o –). ◗ Nei confronti tra dati di tipo numerico, i valori vengono confrontati in accordo con il loro valore algebrico, e non con quanto viene visualizzato quando si utilizzano dei formati particolari di visualizzazione (per esempio 10% vale 0,1). ◗ I confronti con dati di tipo DATE sono ammessi solo se dello stesso tipo, per esempio il tipo TIMESTAMP non è compatibile con il tipo DATE, così come il tipo DATETIME. ◗ Le costanti di tipo data e ora vengono considerate come stringhe, quindi sempre racchiuse tra apici singoli o doppi. ◗ Per avere il formato data compatibile con quello europeo (giorno-mese-anno) anziché quello americano (anno-mese-giorno) è sufficiente intervenire nel file My.ini modificando la variabile date_format come segue: date_format=%d-%m-%y P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 5 UdA 6 Inserire TITOLO ■■ L’ambiente HeidiSQL HeidiSQL Navicat SQL Wave DB Designer … Recentemente sono apparsi moltissimi client per MySQL. In Client GUI Client non GUI generale, il compito del DBMS MySQL admin Administrator client è quello di consentire la connessione remota al database, oltre a fornire un ambiente DBMS MySQL - DBMS con interfaccia spesso di tipo grafico (GUI) e alcune volte addirittura con supporto di creazioDatabase 1 Database 2 Database n … ni automatiche di query (QBE). HeidiSQL si colloca tra i DBMS client di tipo GUI ma senza una QBE specifica. L’unica QBE disponibile riguarda la definizione dei dati, mentre per l’interrogazione delle tabelle si deve ricorrere al linguaggio SQL. L’immagine sopra specifica la collocazione di questi strumenti: L’installazione di MySQL e HeidiSQL In questo paragrafo affrontiamo l’installazione dei DBMS MySQL client e server in ambiente Windows. Prima di tutto occorre installare MySQL server. Installare MySQL server Per fare questo è necessario andare al sito: http://dev.mysql.com/downloads/ e quindi seguire le indicazioni per il download di MySQL server. Una volta terminato il download del file, si deve passare all’esecuzione dell’installazione sul PC facendo doppio clic sull’icona Dopo aver seguito le istruzioni, a ogni avvio di Windows il programma verrà automaticamente eseguito e in tal modo il server resterà sempre attivo. L’installazione e l’avvio di HeidiSQL Può essere scaricato gratuitamente dal sito www.heidisql.com nella sezione download. La procedura seguente spiega come effettuare l’installazione. Dopo aver scaricato il programma fai doppio clic sull’icona che lo raffigura. 2 Appare la finestra a lato nella quale devi fare clic su Next. ▼ 6 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 3 Seleziona I accept the agreement (figura a lato) dopo aver letto il contratto di licenza, quindi fai clic su Next. ▶ 4 A questo punto viene mostrata la cartella (sotto) nella quale verrà installato il programma. Fai clic su Next per proseguire. ▼ 5 Fai clic su Next per completare l’installazione. ▼ 6 Ora, facendo clic su Install, si passa alla fase di installazione vera e propria nella quale verranno copiati i file. ▼ 7 Fai clic su Finish per terminare l’installazione. Essendo un software di tipo “free”, il produttore non richiede alcun compenso in denaro ma solo una donazione attivabile facendo clic sul pulsante Donate. 8 Una volta completata l’installazione, quando si avvia il programma appare la finestra denominata Session manager che consente la connessione remota al database. Trattandosi della prima connessione al database fai clic su New (figura a lato) per creare una nuova ◀ sessione di connessione ▶. ◀ È necessario ricordare che MySQL è un DBMS server che consente a utenti diversi di connettersi allo stesso database anche nel medesimo istante. Questo comporta che per ogni connessione si attivi una sessione che al termine del lavoro deve necessariamente essere chiusa per non tenere occupato inutilmente il server. ▶ P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 7 UdA 6 Inserire TITOLO 9 In questo caso abbiamo creato una nuova sessione denominata Prova. Per accedere al database è necessario autenticarsi indicando l’◀ indirizzo IP ▶ oppure il nome dell’host che ospita il DBMS server al quale connettersi (Hostname/IP), il nome dell’utente (User) e la password. ◀ In questo caso la password deve essere quella impostata dall’amministratore, mentre l’indirizzo IP dell’host è 127.0.0.1 che rappresenta un indirizzo di loopback usato per identificare la macchina in uso. In sostanza è l’indirizzo da usare per le prove in locale. ▶ La finestra a lato mostra l’ambiente GUI di Heidisql. ▶ ■■ La creazione del database e delle tabelle con HeidiSQL Prendiamo ora in esame la procedura per la creazione di un database con HeidiSql. In questo esempio faremo uso dell’ambiente GUI, anche se è possibile effettuare le medesime operazioni mediante il linguaggio SQL in modalità “linea di comando”. La procedura seguente illustra come creare un database di nome prova e una tabella di nome Rubrica. 1Per prima cosa devi fare clic con il tasto destro sull’icona che raffigura la connessione, che in questo esempio è stata creata precedentemente con il nome Prova, quindi scegliere la voce Create new e poi Database. ▶ 2 A questo punto scrivi il nome del database da creare nell’apposita casella di testo accanto all’etichetta Name, quindi fai clic su OK per confermare. ▶ Come puoi notare nella casella di testo posta in basso nella figura a lato (SQL preview for CREATE DATABASE) appaiono le righe di codice scritte in linguaggio SQL generate dal comando che è stato impartito utilizzando la finestra GUI. 3 Il database prova è stato creato. Passa quindi alla creazione della tabella: fai clic con il tasto destro del mouse sul nome del database scegliendo la voce Create new e quindi Table. ▶ 8 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 4 Ora scrivi il nome della tabella da creare (in questo caso Rubrica) accanto all’etichetta Name. ▼ nome della tabella pulsante che consente di aggiungere nuovi campi per ogni campo si aggiunge una nuova riga pulsante per il salvataggio della struttura della tabella 5 In questa finestra puoi aggiungere i campi che formano la struttura della tabella semplicemente utilizzando il pulsante Add. Facendo clic su Add appare una riga nuova che deve essere completata per aggiungere nuovi campi alla tabella. Per ogni campo viene richiesto il nome (Name) e il tipo (Datatype), oltre ad altre caratteristiche come la lunghezza (Length/Set) e le proprietà illustrate di seguito: ◗◗ Default Value: determina quale valore o stringa ◀ Auto increment è un campo deve contenere il campo, che può anche essere di numerico il cui valore viene intipo ◀ auto increment ▶, prima che avvenga l’imcrementato di uno a ogni nuovo missione di un nuovo dato da parte dell’utente. record; a differenza di Access, il ◗◗ Unsigned: per valori numerici senza segno. valore può essere reinserito se il ◗◗ Zerofill: il campo viene riempito di zeri per tutrecord viene eliminato. ▶ ta la lunghezza ed è utilizzato soprattutto per i codici. ◗◗ Allow NULL: determina se il campo può essere lasciato anche vuoto (Null). nome del campo finestra di aiuto tipo del campo, in questo caso INT 6 Passa ora alla creazione della ◀ chiave primaria ▶. Fai clic con il tasto destro del mouse sul campo e seleziona la voce Create new index, quindi PRIMARY. ◀ La chiave primaria di una tabella è un campo che consente di identificare ciascun record in modo univoco. Un campo chiave primaria possiede dati tutti diversi (non può cioè contenere ripetizioni). Per esempio il codice fiscale oppure la partita IVA sono tipici campi adatti a essere usati come chiavi primarie. ▶ P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 9 UdA 6 Inserire TITOLO In tal modo il campo ID_persona rappresenterà la chiave primaria della tabella. ▼ 7 Per creare un campo auto increment, cioè che si incrementa da solo durante l’inserimento dei dati, fai clic all’interno della colonna Default. Come puoi notare, appare la tendina a lato nella quale spuntare il campo AUTO_INCREMENT. In tal modo a ogni nuovo record inserito il valore verrà incrementato automaticamente di una unità. 8 Completiamo quindi la tabella aggiungendo altri campi come illustrato nella finestra che segue. Puoi notare che accanto al campo di tipo chiave primaria appare un’icona con un simbolo che lo identifica, analogamente a quanto accade in Access. ▼ 9 Dopo aver fatto clic su Save, la tabella viene memorizzata e appare nel riquadro di sinistra. ▶ Passa adesso all’inserimento dei record. Per fare questo, attiva la scheda Data e fai clic con il tasto destro, quindi seleziona Insert row. ▼ Inserisci i dati nelle colonne utilizzando il mouse oppure il tasto tab per spostarsi da una colonna all’altra. Al termine, per salvare fai clic al di fuori della tabella: Il triangolino rosso posto nell‘angolo in alto a sinistra indica che è in corso l’immissione di nuovi valori all'interno dei campi. 10 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 • Creare un database con HeidiSQL • Creare la struttura delle tabelle • Immettere i dati nei record Prova adesso! CREA IL FILE esempio1 Crea un database di nome Scuole. Crea la tabella Esami (riportata sotto), scegliendo opportunamente il tipo, la dimensione e il formato dei campi: Esame (testo) Complementare (Sì/No) Numero (int) id_docente (int) Sessione (char) Anno (year) Anno_accademico (year) Aule (char) Giorno (char) Crea la tabella Docenti, scegliendo opportunamente il tipo, la dimensione e il formato dei campi: ID_docente (int) Cognome nome (char) N_telefono (char) Facoltà (char) Apri la tabella Esami e inserisci i record riportati di seguito. Esame Grandi opere Teoria della termodinamica Progettazione di database Applicazione macchine utensili Sistemi operativi Storia medievale Analisi 1 Analisi 2 Geometria Storia della matematica Glottologia Sistemi e modelli Fisica Sistemi 1 Compl. no id_ docente no no 1 2 102 106 no 3 no Sessione Anno Anno_ clic Aule autunnale autunnale 3 3 11 11 300-120 100 Lunedì Martedì 101 autunnale 3 12 101 Lunedì 2 106 primaverile 4 12 106-110 Mercoledì no 1 101 autunnale 4 12 109-198 Giovedì no 1 102 autunnale 1 11 401 Giovedì no no no sì 5 5 6 2 107 101 101 107 primaverile autunnale invernale invernale 2 3 1 4 10 11 11 10 510-511 524 434 100 Giovedì Martedì Martedì Mercoledì sì sì no sì 4 5 2 6 108 107 106 101 estiva estiva autunnale invernale 3 2 1 2 10 09 09 10 402-404 601 235 236 Mercoledì Giovedì Venerdì Giovedì P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 Giorno 11 UdA 6 Inserire TITOLO Apri la tabella Docenti e inserisci i record riportati di seguito. ID_docente Cognome nome n_telefono Facoltà 101 102 103 104 105 106 107 108 Michael Datton Otto Reisen Cleo McNamara Sally Colombo Dan Jackson John Grandom Astolf McMillan Robert Kelly 3105551234 3105556543 3105554321 3105550088 3105554567 3104332234 3124356564 3210854212 Informatica Lingue Storia Storia Informatica Ingegneria Informatica Lingue ■■ La creazione di un vincolo relazionale Per comprendere come creare una struttura relazionale mediante HeidiSQL vediamo come realizzare una rubrica multimediale. Il problema riguarda, quindi, la gestione di una struttura in grado di memorizzare i dati delle associazioni tra individui e i relativi recapiti, che possono essere telefonici, di posta elettronica, oppure sotto forma di sito web o, ancora, di numero di fax. Si vuole creare un database che permetta di registrare per ogni “individuo” più recapiti multimediali. Per fare questo, è necessario quindi creare un’associazione tra l’entità Individuo e l’entità Recapito; un individuo può avere più recapiti, mentre lo stesso recapito non può appartenere a individui diversi. Tra le due entità si deve quindi instaurare una relazione 1 a N come illustrato dalla figura seguente. Entità 1 Relazione 1 a N Entità 2 Le entità che possono essere individuate nel problema sono le seguenti: ◗■ Individuo, per rappresentare i dati anagrafici di tutte le persone da contattare; ◗■ Recapito, per memorizzare i recapiti multimediali. Gli attributi per Individuo sono: il codice fiscale per rappresentarlo in modo univoco, il cognome, il nome, la data di nascita. Gli attributi per Recapito sono: il codice fiscale riferito all’individuo, il numero di telefono, il numero di fax, l’indirizzo e-mail, l’indirizzo del sito web. Si può verificare anche il caso in cui un individuo non possieda alcun recapito telefonico, e per questa ragione è stato inserito nel modello E-R il tratteggio sul lato sinistro dello schema. Individuo COD_FISC cognome nome data di nascita 12 rintracciabile con appartiene a Recapito cod_fisc telefono email fax sito P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 La procedura seguente illustra come realizzare la struttura di queste tabelle. Per prima cosa si crea il database rubrica_multimediale, quindi si fa clic sulle tabelle individui e recapiti. 1 Innanzitutto devi creare la tabella individui, con particolare riferimento al campo COD_FISC, di tipo PRIMARY KEY. 2 Dopo avere fatto clic su Save passa alla creazione della seconda tabella, chiamata recapiti, con particolare attenzione al campo cod_fisc che in questo caso non è di tipo chiave primaria. 3 Fai clic su Save e passa alla definizione della chiave esterna riguardante il campo cod_fisc della tabella recapiti. Dopo aver selezionato la scheda denominata Foreign keys, fai clic all’interno della colonna Columns e seleziona il campo chiave esterna, in questo caso il campo cod_fisc, come illustrato nella figura che segue. P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 13 UdA 6 Inserire TITOLO 4 Dopo aver confermato facendo clic su OK, puoi individuare nella scheda relativa il nome della chiave esterna. 5 A questo puoi notare che nella struttura della tabella recapiti è stata associata al campo cod_fisc un’icona raffigurante la chiave esterna. 6 Adesso passa all’inserimento dei dati, partendo dagli individui. In questo caso vengono inseriti due nuovi record. 7 Per verificare l’associazione tra le due tabelle inserisci alcuni recapiti. Appare una casella a tendina per la scelta del codice fiscale: si tratta dei codici fiscali inseriti nella tabella individui. 14 P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 MySQL e HeidiSQL Lezione 5 • Creare un database con HeidiSQL • Creare la struttura delle tabelle • Creare relazioni usando chiavi primarie ed esterne Prova adesso! CREA IL FILE esempio2 Crea un database docenti per gestire i dati dei docenti e alunni di una scuola impegnati nel recupero scolastico. Crea le seguenti tabelle: ◗ Studenti, che rappresenta i dati anagrafici degli alunni della scuola; ◗ Materie, che contiene il nome esteso di tutte le materie di studio; ◗ Professori, che contiene i dati anagrafici di ogni singolo docente; ◗ Frequenze, che contiene le materie di studio che ogni singolo allievo deve recuperare. I campi della tabella Studente sono: matricola (chiave primaria) e dati angrafici (cognome, nome, telefono ecc.). I campi della tabella Materia sono: codice materia (chiave primaria), cod_corso (foreign key) e descrizione materia. I campi della tabella Professore sono: codice del docente (chiave primaria) e dati anagrafici (cognome, nome ecc.). I campi della tabella Frequenza sono: cod_materia (foreign key), cord_corso (foreign key) e matricola dell’alunno (foreign key). Crea le relazioni tra le tabelle secondo lo schema che segue. Professore codice cognome nome telefono … Materia insegna insegnata da cod_materia cod_corso cod_prof materia relativa a Studente matricola cognome nome telefono … segue corso seguito da Frequenza cod_materia cod_corso matricola P. Camagni, R. Nikolassy, Progettare i database, Nuova Edizione OPENSCHOOL, © Ulrico Hoepli Editore S.p.A. 2014 15