Istruzioni DML Istruzioni DML pag. 2 Inserimento dati in una tabella : INSERT pag. 2 Aggiornamento dati in una tabella : UPDATE pag. 6 Cancellazione record in una tabella : DELETE pag. 10 Esercizi di riepilogo pag. 13 Bibliografia pag. 14 appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 1 -
Istruzioni DML Una delle principali funzioni di un database è quella di consentire la manipolazione dei dati contenuti nelle tabelle. Gli utenti devono essere in grado di inserire, aggiornare e cancellare i dati necessari per mantenere aggiornato il database e garantire che vengano introdotti solo dati corretti. Le istruzioni DML (Data Manipulation Language), fornite da SQL, vengono utilizzate per aggiungere, modificare o cancellare i dati memorizzati nelle tabelle del database. L istruzione INSERT consente di aggiungere dati ad una tabella, l istruzione UPDATE consente di modificare i dati contenuti in una tabella e l istruzione DELETE consente di cancellare i dati memorizzati in una tabella. Inserimento dati in una tabella : INSERT L istruzione INSERT consente di aggiungere dati alle tabelle del database secondo la seguente sintassi : INSERT INTO <nome tabella> [ ( <nome colonna> [ {, <nome colonna> }...] ) ] VALUES ( <valore> [ {, <valore>}... ] ) Sono obbligatorie solo la prima e l ultima riga della sintassi mentre la seconda riga è opzionale. Sia la prima che la seconda riga fanno parte della clausola INSERT INTO in cui occorre identificare il nome della tabella in cui si stanno inserendo i dati. Il nome della tabella è specificato dopo le parole riservate INSERT INTO. Quindi si ha la possibilità, nella seconda riga della sintassi, di identificare il nome delle colonne che riceveranno i dati. E possibile specificare una o più colonne, il tutto incluso fra parentesi tonde. Se si specificano più colonne, queste devono essere separate da una virgola. Se si specifica il nome delle colonne, tutte le colonne della tabella di destinazione che non sono state specificate devono supportare l impiego di valori null o devono essere definite con un valore di default; in caso contrario il database non saprà quale valore inserire in queste colonne. Nella terza riga della sintassi, riguardante la clausola VALUES, occorre specificare uno o più valori che verranno inseriti nella tabella. I valori devono essere racchiusi fra parentesi e, se ne viene specificato più d uno, devono essere separati da una virgola. I valori, inoltre, devono rispondere ai seguenti requisiti : appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 2 -
Ciascun valore di tipo stringa (carattere) deve essere racchiuso fra singoli o doppi apici Se nella clausola INSERT INTO non vengono specificate le colonne, allora vi deve essere un valore per ciascuna colonna della tabella ed i valori devono essere esattamente nello stesso ordine in cui sono stati definiti nella tabella. Si supponga di avere una tabella definita dalla seguente struttura : Tabella Nome campo Chiave Tipo dati Dim. Dec. Null Descrizione tbdipendenti Matricola Primaria Intero 4 Cognome Carattere 20 Nome Carattere 20 Indirizzo Carattere 40 SI CodiceFiscale Carattere 16 SI Vincolo : valori unici L istruzione che consente di inserire un nuovo record è la seguente : INSERT INTO tbdipendenti VALUES (1, "ROSSI", "MARIO", "VIA MAZZINI, 7", Null); oppure : INSERT INTO tbdipendenti VALUES (1, 'ROSSI', 'MARIO', 'VIA MAZZINI, 7', Null); Matricola Cognome Nome Indirizzo CodiceFiscale 1 ROSSI MARIO VIA MAZZINI, 7 INSERT INTO tbdipendenti VALUES (1, 'ROSSI', 'MARIO', 'VIA MAZZINI, 7'); è errata in quanto manca il valore corrispondente alla colonna CodiceFiscale. Se la colonna può accettare il valore Null è sufficiente indicare tale valore per la colonna, se non si attribuisce uno specifico valore. L istruzione, pertanto, corretta è : INSERT INTO tbdipendenti VALUES (1, 'ROSSI', 'MARIO', 'VIA MAZZINI, 7',Null); INSERT INTO tbdipendenti VALUES (1, 'ROSSI', Null, 'VIA MAZZINI, 7', Null); è errata in quanto si è attribuito il valore Null alla colonna Nome che, dalla definizione della tabella, risulta non accettare tale valore. Per correggere l istruzione è sufficiente attribuire alla colonna un valore qualsiasi, purché diverso da Null. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 3 -
Se nella clausola INSERT INTO vengono specificate delle colonne, vi deve essere esattamente un valore per la colonna specificata e tutti i valori devono trovarsi esattamente nello stesso ordine in cui sono stati definiti nella clausola INSERT INTO. Tuttavia le colonne ed i valori non devono necessariamente essere nello stesso ordine in cui si trovano nella tabella. Con la seguente istruzione si inserisce un nuovo record specificando solo i valori corrispondenti alle colonne indicate nella clausola INSERT INTO : INSERT INTO tbdipendenti ( Matricola, Cognome, Nome ) VALUES (2, 'VERDI', 'LUCA'); Matricola Cognome Nome Indirizzo CodiceFiscale 1 ROSSI MARIO VIA MAZZINI, 7 2 VERDI LUCA Lo stesso risultato si ottiene con la seguente istruzione in cui nella clausola INSERT INTO l elenco delle colonne non è lo stesso di quello utilizzato nella definizione della tabella : INSERT INTO tbdipendenti (Nome, Cognome, Matricola ) VALUES ('FRANCA', 'BIANCHI', 3); è importante, come si può notare, la corrispondenza fra il nome della colonna ed il valore ad essa associato. Matricola Cognome Nome Indirizzo CodiceFiscale 1 ROSSI MARIO VIA MAZZINI, 7 2 VERDI LUCA 3 BIANCHI FRANCA INSERT INTO tbdipendenti (Cognome, Matricola ) VALUES ('BIANCHI', 3); è errata in quanto nell elenco delle colonne non è indicata la colonna Nome che, dalla definizione della tabella, non può assumere il valore Null. Nota : nel caso in cui la chiave primaria viene definita come contatore, la colonna corrispondente può essere omessa dall elenco in quanto il nuovo record inserito avrebbe, in tale colonna un valore, pari all incremento impostato in fase di definizione. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 4 -
Una colonna può, nella creazione di una tabella, essere definita come contatore nei seguenti modi : In Microsoft Jet (ACCESS, DAO) : NomeColonna Counter per, es. : Matricola Counter In SQL Server o ADO : NomeColonna TipoDato IDENTITY(ValoreIniziale, Incremento) per, es. : Matricola int IDENTITY (in questo modo il valore iniziale e l incremento, per default, sono uguali a 1.) Se il campo Matricola, per es., viene definito come contatore, l istruzione successiva è corretta : INSERT INTO tbdipendenti (Cognome, Nome ) VALUES ('VERDONE', 'VITO'); In questo caso il record inserito avrebbe nel campo Matricola un valore uguale a 4: Matricola Cognome Nome Indirizzo CodiceFiscale 1 ROSSI MARIO VIA MAZZINI, 7 2 VERDI LUCA 3 BIANCHI FRANCA 4 VERDONE VITO Ovviamente è anche corretta, ma non consigliabile l uso altrimenti viene a decadere il concetto di contatore, la seguente istruzione : INSERT INTO tbdipendenti (Matricola,Cognome, Nome ) VALUES (8,'VERDONE', 'VITO'); Matricola Cognome Nome Indirizzo CodiceFiscale 1 ROSSI MARIO VIA MAZZINI, 7 2 VERDI LUCA 3 BIANCHI FRANCA 8 VERDONE VITO Nota : i valori specificati nella clausola VALUES devono rispondere a tutte le restrizioni imposte sulla tabella. Questo significa che i valori devono essere conformi ai tipi di dati e ai domini associati alla colonna. Inoltre i valori sono limitati dai vincoli imposti sulla tabella. Per esempio, un vincolo a chiave esterna può limitare l intervallo di valori che possono essere inseriti nella tabella. Occorre, quindi, assicurarsi di conoscere le restrizioni imposte su una tabella prima di tentare di inserirvi dei dati. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 5 -
Aggiornamento dati in una tabella : UPDATE L istruzione UPDATE consente di aggiornare i dati contenuti in un database. Col questa istruzione è possibile modificare i dati contenuti in una o più righe e una o più colonne. La sintassi dell istruzione UPDATE è la seguente : UPDATE <nome tabella> SET <nome colonna> = <espressione> [{,<nome colonna> = < espressione>}...] [WHERE <condizione di ricerca>] Come si può notare, la clausola UPDATE e SET sono obbligatorie mentre la clausola WHERE è opzionale. Nella clausola UPDATE occorre specificare il nome della tabella che si sta aggiornando. Nella clausola SET occorre specificare una o più espressioni. Nella clausola WHERE occorre specificare una condizione o in insieme di condizioni che fungono da filtro per le righe che vengono aggiornate. Verranno, pertanto, aggiornate solo le righe che restituiscono il valore vero (true) per la condizione specificata. E importante sottolineare che se la condizione proposta nella clausola WHERE prende in considerazione la chiave primaria si aggiorna un solo record altrimenti si aggiornano tutti quei record che soddisfano la condizione. La clausola SET include il termine <nome colonna> = <espressione>. E possibile specificare una o più espressioni, in tal caso occorre separarle con una virgola. Fondamentalmente occorre specificare una colonna (della tabella che si sta aggiornando) e fornire un valore da assegnare alla colonna. Si supponga di avere una tabella definita dalla seguente struttura : Tabella Nome campo Chiave Tipo dati Dim. Dec. Null Descrizione tbarticoli idarticolo Primaria Intero 4 Articolo Carattere 30 CostoAcquisto Numerico 6 2 SI PrezzoVendita Numerico 6 2 SI Sconto Numerico 4 2 SI Giacenza Intero 4 Categoria Carattere 10 e contenente i seguenti dati : appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 6 -
idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 5 4 Cartuccia 2 CARTUCCIA COLORE 3 5 5 3 Cartuccia 3 CARTUCCIA NERO 6 9 15 5 Cartuccia 4 COPRISTAMPANTE 4 5 10 4 Accessori 5 MODEM USB 56K 4 6 20 2 Modem 6 MODEM 128K USB 3 5 0 3 Modem 7 MONITOR 15 3 5 0 1 Video 8 MONITOR 17 2 4 5 2 Video 9 MOUSE 2 4 5 5 Mouse 10 MOUSE SERIALE 4 5 0 1 Mouse 11 SCHEDA DI RETE 15 18 0 2 Scheda UPDATE tbarticoli SET Sconto = 10; modifica ogni riga della tabella tbarticoli in modo che la colonna Sconto di ogni riga contenga il valore 10 : idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 10 4 Cartuccia 2 CARTUCCIA COLORE 3 5 10 3 Cartuccia 3 CARTUCCIA NERO 6 9 10 5 Cartuccia 4 COPRISTAMPANTE 4 5 10 4 Accessori 5 MODEM USB 56K 4 6 10 2 Modem 6 MODEM 128K USB 3 5 10 3 Modem 7 MONITOR 15 3 5 10 1 Video 8 MONITOR 17 2 4 10 2 Video 9 MOUSE 2 4 10 5 Mouse 10 MOUSE SERIALE 4 5 10 1 Mouse 11 SCHEDA DI RETE 15 18 10 2 Scheda Naturalmente questa è un operazione legittima ma in realtà è molto improbabile che si debba cambiare il valore di una colonna di tutte le righe di una tabella in modo da renderle tutti uguali. E molto più probabile che si voglia qualificare l aggiornamento tramite la clausola WHERE. UPDATE tbarticoli SET Sconto = 10 WHERE Sconto = 0 cambia il contenuto della colonna Sconto in 10 ma esegue l operazione solo per le righe che rispondono alla condizione di ricerca contenuta nella clausola WHERE, ovvero per le righe in cui lo Sconto è uguale a 0. Rispetto alla tabella originale, il risultato è il seguente : appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 7 -
idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 5 4 Cartuccia 2 CARTUCCIA COLORE 3 5 5 3 Cartuccia 3 CARTUCCIA NERO 6 9 15 5 Cartuccia 4 COPRISTAMPANTE 4 5 10 4 Accessori 5 MODEM USB 56K 4 6 20 2 Modem 6 MODEM 128K USB 3 5 10 3 Modem 7 MONITOR 15 3 5 10 1 Video 8 MONITOR 17 2 4 5 2 Video 9 MOUSE 2 4 5 5 Mouse 10 MOUSE SERIALE 4 5 10 1 Mouse 11 SCHEDA DI RETE 15 18 10 2 Scheda Se, come già detto, nella condizione di ricerca della clausola WHERE è specificata la chiave primaria, allora viene aggiornata solo la riga il cui valore coincide con quello indicato nell espressione. UPDATE tbarticoli SET Sconto = 10 WHERE idarticolo = 1 modifica il valore della colonna Sconto solo in corrispondenza dell unica riga, in quanto si tratta della chiave primaria, la cui colonna idarticolo è uguale a 1. Si potrebbe,inoltre, avere l esigenza di cambiare un valore sulla base del valore preesistente, per esempio facendo riferimento alla giacenza attualmente disponibile. Per esempio si può sommare 5 al valore attualmente contenuto nella colonna Giacenza. UPDATE tbarticoli SET Giacenza = (Giacenza + 5); aggiunge, nella colonna Giacenza, 5 a tutte le righe della tabella, in quanto non viene specificata la clausola WHERE. Rispetto alla tabella originale, il risultato è il seguente : idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 5 9 Cartuccia 2 CARTUCCIA COLORE 3 5 5 8 Cartuccia 3 CARTUCCIA NERO 6 9 15 10 Cartuccia 4 COPRISTAMPANTE 4 5 10 9 Accessori 5 MODEM USB 56K 4 6 20 7 Modem 6 MODEM 128K USB 3 5 0 8 Modem 7 MONITOR 15 3 5 0 6 Video 8 MONITOR 17 2 4 5 7 Video 9 MOUSE 2 4 5 10 Mouse 10 MOUSE SERIALE 4 5 0 6 Mouse 11 SCHEDA DI RETE 15 18 0 7 Scheda L espressione utilizzata per effettuare la modifica può, ovviamente, essere anche più complessa. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 8 -
La seguente istruzione consente di aumentare lo Sconto del 10% in tutte le righe della tabella in cui il valore dello Sconto è maggiore o uguale a 10. UPDATE tbarticoli SET Sconto = Sconto+(Sconto*10)/100 WHERE Sconto >=10; Rispetto alla tabella originale, il risultato è il seguente : idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 5 4 Cartuccia 2 CARTUCCIA COLORE 3 5 5 3 Cartuccia 3 CARTUCCIA NERO 6 9 16,5 5 Cartuccia 4 COPRISTAMPANTE 4 5 11 4 Accessori 5 MODEM USB 56K 4 6 22 2 Modem 6 MODEM 128K USB 3 5 0 3 Modem 7 MONITOR 15 3 5 0 1 Video 8 MONITOR 17 2 4 5 2 Video 9 MOUSE 2 4 5 5 Mouse 10 MOUSE SERIALE 4 5 0 1 Mouse 11 SCHEDA DI RETE 15 18 0 2 Scheda La clausola WHERE consente anche di specificare più predicati. Nel seguente esempio si raddoppia il valore della colonna relativa al PrezzoVendita per ogni riga che in cui lo Sconto è minore di 10 e la Categoria è uguale a Video : UPDATE tbarticoli SET PrezzoVendita = 2*[PrezzoVendita] WHERE Sconto<10 And Categoria='Video'; Rispetto alla tabella originale, il risultato è il seguente : idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 15 5 4 Cartuccia 2 CARTUCCIA COLORE 3 5 5 3 Cartuccia 3 CARTUCCIA NERO 6 9 15 5 Cartuccia 4 COPRISTAMPANTE 4 5 10 4 Accessori 5 MODEM USB 56K 4 6 20 2 Modem 6 MODEM 128K USB 3 5 0 3 Modem 7 MONITOR 15 3 10 0 1 Video 8 MONITOR 17 2 8 5 2 Video 9 MOUSE 2 4 5 5 Mouse 10 MOUSE SERIALE 4 5 0 1 Mouse 11 SCHEDA DI RETE 15 18 0 2 Scheda in cui è effettivamente raddoppiato il valore della colonna PrezzoVendita nelle righe il cui idarticolo è uguale a 7 ed 8, ovvero le uniche righe che soddisfano la condizione espressa nella clausola WHERE. In una clausola SET è anche possibile specificare più espressioni. In altre parole si possono cambiare i valori di più colonne per volta. Per esempio, si supponga di voler raddoppiare il valore PrezzoVendita ed azzerare il valore Sconto nelle righe in cui la Categoria è uguale a Cartuccia. L istruzione UPDATE avrà il seguente aspetto : appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 9 -
UPDATE tbarticoli SET PrezzoVendita = 2*PrezzoVendita, Sconto = 0 WHERE Categoria='Cartuccia'; Rispetto alla tabella originale, il risultato è il seguente : idarticolo Articolo CostoAcquisto PrezzoVendita Sconto Giacenza Categoria 1 CARTUCCIA FAX 10 30 0 4 Cartuccia 2 CARTUCCIA COLORE 3 10 0 3 Cartuccia 3 CARTUCCIA NERO 6 18 0 5 Cartuccia 4 COPRISTAMPANTE 4 5 10 4 Accessori 5 MODEM USB 56K 4 6 20 2 Modem 6 MODEM 128K USB 3 5 0 3 Modem 7 MONITOR 15 3 5 0 1 Video 8 MONITOR 17 2 4 5 2 Video 9 MOUSE 2 4 5 5 Mouse 10 MOUSE SERIALE 4 5 0 1 Mouse 11 SCHEDA DI RETE 15 18 0 2 Scheda in cui sono state modificate le prime tre righe in base alle espressioni e alla condizione presente nell istruzione. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 10 -
Cancellazione record in una tabella : DELETE Una volta che i record di una tabella sono stati inseriti e/o modificati, è possibile che si debba provvedere alla loro cancellazione. La eliminazione di dati da una tabella avviene tramite l istruzione DELETE secondo la seguente sintassi : DELETE FROM <nome tabella> [WHERE <condizione di ricerca>] Come si può notare, la clausola DELETE FROM richiese che venga specificato il nome della tabella dalla quale si stanno cancellando le righe. La clausola WHERE richiede che venga specificata la condizione di ricerca. Se non si include la clausola WHERE, l istruzione DELETE cancellerà tutte le righe della tabella specificata. Nota : l istruzione DELETE può cancellare solo le righe di una tabella; non può cancellare la definizione dei dati contenuti nella tabella. Per cancellare i dati e la loro definizione si deve usare l istruzione DROP TABLE. Si noti che nell istruzione DELETE on vengono indicati i nome delle colonne; questo è dovuto al fatto che non è possibile cancellare da una tabella solo i valori di determinate colonne. E possibile solo cancellare intere righe. Per cancellare il nome di una determinata colonna si usa l istruzione UPDATE che assegna alla colonna il valore nullo. Naturalmente ciò è possibile solo se la colonna supporta i valori null. DELETE FROM tbarticoli ; cancella tutte le righe della tabella tbarticoli. DELETE FROM tbarticoli WHERE Sconto = 0 cancella tutte le righe della tabella in cui il valore della colonna Sconto è uguale a 0. Naturalmente, come già visto nell istruzione UPDATE, la clausola WHERE consente anche di specificare più predicati. In effetti la clausola WHERE consente di specificare esattamente quali righe devono essere cancellate dalla tabella. DELETE FROM tbarticoli WHERE Sconto = 0 AND Giacenza = 0; cancella tutte le righe, se ovviamente esistono, in cui i valori della colonna Sconto e della colonna Giacenza sono uguali a 0. appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 11 -
Se la chiave primaria è di tipo contatore, se si cancella e poi si inserisce il contatore cosa fa? Osservazione : si supponga si avere la tabella tbprofessioni definita con i campi idprofessione (contatore) e Professione (carattere). La chiave primaria è il campo idprofessione. La tabella contiene, per es., i seguenti dati : idprofessione Professione 1 Operaio 2 Insegnante 3 Medico 4 Ingegnere 5 Avvocato 6 Impiegato es. : Se sulla tabella viene effettuata un istruzione per la cancellazione di una riga, per DELETE FROM tbprofessioni WHERE idprofessione=4; e successivamente un istruzione per l inserimento di una nuova riga, per es. : INSERT INTO tbprofessione (Professione) VALUES ('Infermiere'); il risultato ottenuto è il seguente : idprofessione Professione 1 Operaio 2 Insegnante 3 Medico 5 Avvocato 6 Scrittore 7 Infermiere Come si può notare la riga corrispondente al valore 4 della colonna idprofessione non è stata sostituita dal nuovo inserimento ma, il valore attribuito alla nuova riga inserita è esattamente uguale al valore dell ultima riga della tabella incrementato di 1. Quindi i valori assunti da una chiave primaria, definita come contatore, non possono essere più recuperati in caso di cancellazione. Questo, ovviamente, non accade se la chiave primaria è definita con un altro tipo di dati (intero, carattere, ecc.). appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 12 -
ESERCIZI Si supponga di avere una tabella definita dalla seguente struttura : Tabella Nome campo Chiave Tipo dati Dim. Dec. Null Descrizione tbdipendenti Matricola Primaria Intero 4 Cognome Carattere 20 Nome Carattere 20 Indirizzo Carattere 40 SI Telefono Carattere 15 SI Comune Carattere 20 SI Inserire una nuova riga nella tabella specificando tutte le colonne ed i valori corrispondenti : INSERT INTO tbdipendenti ( Codice, Cognome, Nome, Indirizzo, Telefono) VALUES ( 15, 'PICCOLO', 'MARCO', 'Via Lombardia, 14', '099222222' ) Inserire nella colonna Comune il nome del comune NAPOLI in base al prefisso telefonico indicato nella colonna Telefono (081). UPDATE tbdipendenti SET Comune='NAPOLI' WHERE Telefono >= '081' AND Telefono < '082' Tabella prima dell aggiornamento : Matricola Nome Cognome Indirizzo Telefono Comune 1 Mario Rossi 0995334789 2 Antonio Verdi 0812542112 3 Monica Marzo 068974521 4 Luca Bianchi 0812465679 5 Francesca Roma 0801527821 6 Giovanna Verdone 0263452156 appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 13 -
Tabella dopo l aggiornamento : Matricola Nome Cognome Indirizzo Telefono Comune 1 Mario Rossi 0995334789 2 Antonio Verdi 0812542112 NAPOLI 3 Monica Marzo 068974521 4 Luca Bianchi 0812465679 NAPOLI 5 Francesca Roma 0801527821 6 Giovanna Verdone 0263452156 BIBLIOGRAFIA Titolo Autore Casa Editrice Visual Basic 6.0 Accesso ai database Jeffrey P. McManus Mondadori Le basi di dati Il linguaggio SQL Lorenzi - Rossi Atlas Fondamenti di SQL Robert Sheldon Mc GRAW HILL SQL I Portatili Mondadori Programmare Visual Basic 6.0 Francesco Balena Mondadori Visual Basic 6.0 Guida per lo sviluppatore di database MSDN Library (Visual Studio 6.0) Roger Jennings Microsoft Mondadori appunti rielaborati dai testi indicati nella bibliografia (a cura del Prof. Salvatore DE GIORGI) pag. - 14 -