Lezione del 07 Aprile 2003 - Docente : Elisabetta Splendori Il Linguaggio SQL - Aggiornamento di dati Esistono tre dichiarazioni SQL utilizzate per modificare i contenuti di un database: INSERT. Aggiunge nuove righe di dati a una tabella DELETE. Elimina righe di dati da una tabella UPDATE. Modifica i dati esistenti nel database INSERT In genere, un DBMS basato su SQL fornisce tre modi per aggiungere nuove righe dati a un database: - INSERT a riga singola ( aggiunge una nuova riga di dati a una tabella ) - INSERT multiriga (estrae righe di dati da un’altra parte del database (ad es. da una tabella) e le aggiunge a una tabella) - GROSSI carichi. Una utilità per grossi carichi aggiunge dati a una tabella da un file che si trova al di fuori del database. In genere viene utilizzata per caricare il database o per incorporare dati scaricati da altri sistemi o raccolti da molti siti. INSERT a riga singola elenco di colonne INSERT INTO < nome tabella > (<nome colonna > [, …]) VALUES ( costante [,costante,…] | espressione | NULL ) Lista di valori La proposizione INTO specifica la tabella, detta tabella di destinazione, che riceve la nuova riga e la proposizione VALUES specifica i valori che conterrà la nuova riga. L’elenco di colonne indica le colonne in cui andranno i valori della nuova riga. Si noti che tale elenco si può ridurre ad una sola colonna. Si supponga di aver assunto un nuovo venditore, con i seguenti dato personali: Nome: Henry Jacobsen Età: 36 Numero dipendente: 111 Titolo: Sales Manager Ufficio : Atlanta (ufficio numero 13) Data assunzione: 25 luglio 1990 Obiettivo: non ancora assegnato Vendite annue: $0.00 Di seguito è rappresentata la dichiarazione INSERT che aggiunge il Sig. Jacobsen al database di esempio: INSERT INTO SALESREPS( NAME, AGE, EMPL_NUM, SALES, TITLE, HIRE_DATE, REP_OFFICE) VALUES (‘Henry Jacobsen’, 36, 111, 0.00, ‘Sales Mgr’, ’07-25-90’, 13) (inserisce 1 riga) Quando SQL inserisce una nuova riga di dati in una tabella, assegna automaticamente il valore NULL alle colonne il cui nome è mancante dall’elenco di colonne nella dichiarazione INSERT. 1 Lezione del 07 Aprile 2003 - Docente : Elisabetta Splendori Nell’esempio appena citato mancano le colonne QUOTA e MANAGER; ne risulta che la riga appena aggiunta ha un valore NULL nelle colonne QUOTA e MANAGER. Si può rendere più esplicita l’assegnazione di un valore NULL i inserendo tali colonne nell’elenco di colonne e specificando la parola chiave NULL. La dichiarazione INSERT che segue ha lo stesso effetto della dichiarazione precedente: INSERT INTO SALESREPS( NAME, AGE, EMPL_NUM, SALES, QUOTA, TITLE, MANAGER, HIRE_DATE, REP_OFFICE) VALUES (‘Henry Jacobsen’, 36, 111, 0.00, NULL, ‘Sales Mgr’, NULL, ’07-25-90’, 13) Inserimento di tutte le colonne SQL consente di omettere l’elenco di colonne nella dichiarazione INSERT. Quando l’elenco di colonne viene omesso, SQL genera automaticamente un elenco di colonne contenente tutte le colonne della tabella, in ordine da sinistra verso destra. La dichiarazione INSERT precedente può essere riscritta come segue: INSERT INTO SALESREPS VALUES (111 , ‘Henry Jacobsen’, 36, 13 , ‘Sales Mgr’, ’07-25-90’, NULL, NULL , 0.00) Quando si omette l’elenco di colonne, la parola chiave NULL deve essere utilizzata nell’elenco di valori per assegnare esplicitamente valori NULL alle colonne. Inoltre la sequenza di valori deve corrispondere esattamente alla sequenza di colonne nella tabella. INSERT multiriga elenco colonne INSERT INTO < nome tabella > (nome colonna [,…]) query Aggiunge più righe di dati nella tabella. I valori per le nuove righe non sono specificati esplicitamente nel testo della dichiarazione; al contrario, la sorgente di nuove righe è una query di database, specificata nella dichiarazione. Si supponga di voler copiare il numero di ordine, la data e l’ammontare di tutti gli ordini ricevuti prima del 1 gennaio 1990 dalla tabella ORDERS a un’altra tabella, chiamata OLDORDERS. Scriveremo: INSERT INTO OLDORDERS (ORDER_NUM, ORDER_DATE, AMOUNT) SELECT ORDER_NUM, ORDER_DATE, AMOUNT FROM ORDERS Copia i vecchi ordini WHERE ORDER_DATE <’01-01-90’ nella tabella OLDORDERS (inserisce 9 righe) Questa dichiarazione INSERT sembra complessa, ma in realtà è molto semplice. Concettualmente, SQL esegue prima la query sulla tabella ORDERS, quindi inserisce i risultati di query , riga per riga , nella tabella OLDORDERS. 2 Lezione del 07 Aprile 2003 - Docente : Elisabetta Splendori Cancellazione di dati dal database (DELETE) La dichiarazione DELETE elimina righe di dati selezionate da una singola tabella. DELETE FROM < nome tabella > [ WHERE condizione di ricerca ] La proposizione FROM specifica la tabella di destinazione contenente le righe da cancellare; la proposizione WHERE specifica quali righe della tabella devono essere cancellate. Supponiamo di voler eliminare Henry Jacobsen dalla tabella dei venditori. La dichiarazione DELETE che elimina la sua riga dalla tabella SALESREPS è mostrata di seguito. Elimina Henry Jacobsen dal database. DELETE FROM SALESREPS WHERE NAME = ‘Henry Jacobsen’ (butta 1 riga) Si ricordi che le condizioni di ricerca nella proposizione WHERE possono specificare una singola riga o un intero set di righe, secondo la condizione di ricerca specifica. Ad esempio, supponiamo di voler cancellare tutti gli ordini ricevuti prima del 15 Novembre 1989. Si avrebbe: DELETE FROM ORDERS WHERE ORDER_DATE < ’15-NOV-89’ In tal caso verrebbero buttate 5 righe. Cancellare tutte le righe La proposizione WHERE in una dichiarazione DELETE è opzionale, ma è quasi sempre presente. Se la proposizione WHERE viene omessa, vengono cancellare tutte le righe della tabella di destinazione, come nell’esempio che segue: Cancella tutti gli ordini DELETE FROM ORDERS (butta 30 righe) Sebbene questa dichiarazione DELETE generi una tabella vuota (vengono cancellate tutte le righe della tabella ORDERS), non cancella la tabella ORDERS dal database: la definizione della tabella ORDERS e le sue colonne sono ancora memorizzate nel database. La tabella esiste ancora e in essa possono essere inserite nuove righe con la dichiarazione INSERT. Per eliminare la definizione della tabella dal database si deve utilizzare la dichiarazione DROP TABLE. 3 Lezione del 07 Aprile 2003 - Docente : Elisabetta Splendori DELETE con subquery A volte la selezione di righe deve essere realizzata in base a dati di altre tabelle. Ad esempio, si vogliono cancellare tutti gli ordini presi da Sue Smith. Senza sapere il suo numero di dipendente non è possibile trovare tutti gli ordini consultando solo la tabella ORDERS. Per trovare gli ordini si può utilizzare una query su 2 tabelle. DELETE FROM ORDERS, SALESREPS WHERE REP=EMPL_NUM AND NAME = ‘Sue Smith’ In questo caso SQL darebbe un errore (“Error: More than one table specified in FROM clause” ) poiché non é si possibile utilizzare un’unione in una dichiarazione DELETE. Il modo per gestire la richiesta è con una delle condizioni di ricerca di subquery. Di seguito è rappresentata una forma valida della dichiarazione DELETE che gestisce la richiesta: Cancella gli ordini presi da Sue Smith DELETE FROM ORDERS, WHERE REP= (SELECT EMPL_NUM FROM SALESREPS WHERE NAME = ‘Sue Smith’) (butta 4 righe) La subquery trova il numero di dipendente di Sue Smith e la proposizione WHERE seleziona quindi gli ordini con un valore corrispondente. Le subquery nelle proposizione WHERE possono essere annidate come nella proposizione WHERE della dichiarazione SELECT. Possono anche contenere riferimenti esterni alla tabella di destinazione della dichiarazione DELETE. 4