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