Capitolo 7


Manipolare i dati

Fino a questo punto del corso abbiamo trattato quella parte di SQL che assolve alle funzioni di QL (Query Language) ovvero interrogazioni dei dati senza nessuna possibilità di manipolarli come ad esempio cambiarne il valore. In questo capitolo vedremo invece quella parte di SQL che assolve alle funzioni di DML (Data Manipulation Language). Questa parte di SQL ci consente di inserire dati nelle tabelle, di modificarli e di cancellarli; le corrispondenti istruzioni che assolvono a tale scopo sono: INSERT, UPDATE, DELETE.
Possiamo operare con queste tre istruzioni sui dati in modo selettivo o in modo globale. Nel modo selettivo useremo delle select e/o delle condizioni per far riferimento a particolari valori o a particolari posizioni nella tabella; nel modo globale non faremo uso di select o di condizioni. Vediamo in dettaglio quanto esposto.

INSERT

Supponiamo di disporre delle seguenti tabelle:

PERSONE
Nome
Cognome
Indirizzo
Citta
Giovanni Verdi Via Bella Roma
Antonio Rossi Via Casalacio Roma

 

GIOCATORI
Cognome
Nome
Squadra
Mancini Arturo S. Lorenzo

e di voler inserire i nominativi presenti in PERSONE nella tabella GIOCATORI:

INSERT INTO GIOCATORI
                   (COGNOME, NOME)
SELECT COGNOME, NOME
FROM PERSONE;

il risultato che si ottiene è il seguente:

GIOCATORI
Cognome
Nome
Squadra
Mancini Arturo S. Lorenzo
Verdi Giovanni  
Rossi Antonio  

Vediamo un altro esempio:
Supponiamo di disporre una tabella DIPENDENTI e di aver appena creato la tabella DIRIGENTI. Abbiamo la necessità di inserire nella tabella DIRIGENTI tutti i dipendenti che siano dirigenti:

INSERT INTO DIRIGENTI

SELECT NOME, COGNOME
FROM DIPENDENTI
WHERE QUALIFICA = 'DIRIGENTE';

Questa insert inserisce dentro la tabella DIRIGENTI quello che ha selezionato la restante istruzione formata da una select. Vediamo graficamente cosa è accaduto:

Nel database prima della insert:

DIPENDENTI
  
DIRIGENTI
COGNOME
NOME
MANSIONE
 
NOME
COGNOME
ROSSI MARIO RAGIONIERE      
NERI
GIULIO DIRIGENTE      
BIANCHI MARIA IMPIEGATO      
VERDI LUIGI DIRETTORE      

Nel database dopo la insert:

DIPENDENTI
  
DIRIGENTI
COGNOME
NOME
MANSIONE
 
NOME
COGNOME
ROSSI MARIO RAGIONIERE   GIULIO NERI
NERI
GIULIO DIRIGENTE      
BIANCHI MARIA IMPIEGATO      
VERDI LUIGI DIRETTORE      

La insert dell’esempio precedente era di tipo selettivo, vediamo ora una insert di tipo globale: Supponiamo di avere la necessità di inserire nella tabella DIRIGENTI un nuovo dirigente il cui nominativo non è presente nella tabella DIPENDENTI in quanto il dirigente in questione non è un dipendente ma un libero professionista ‘assoldato’ dall’azienda.

INSERT INTO DIRIGENTI
VALUES ('GIOVANNI', 'GIOVANNETTI');

dopo questa insert la tabella DIRIGENTI verrà così trasformata:

DIRIGENTI
NOME
COGNOME
NERI GIULIO
GIOVANNI GIOVANNETTI

Supponiamo ora che dobbiamo inserire nella tabella DIPENDENTI un nuovo lavoratore ma non sappiamo quale è la sua qualifica:

INSERT INTO DIPENDENTI
(NOME, COGNOME)
VALUES ('AMERIGO', 'VESPUCCI');

dopo questa insert la tabella DIPENDENTI verrà così trasformata:

DIPENDENTI
COGNOME
NOME
MANSIONE
ROSSI MARIO RAGIONIERE
NERI
GIULIO DIRIGENTE
BIANCHI MARIA IMPIEGATO
VERDI LUIGI DIRETTORE
VESPUCCI AMERIGO  

Una importante differenza tra i due tipi di insert è che tramite l’insert con value si inserisce un record per volta, mentre tramite insert con la select è possibile inserire molti record alla volta.

È evidente che i valori che inseriamo in una tabella tramite l’istruzione INSERT devono essere dello stesso tipo del campo che li riceve; simile discorso vale per la dimensione o la lunghezza del dato da inserire che non deve superare la dimensione o la lunghezza del campo che lo riceve. Una stringa lunga 23 caratteri non può essere contenuta in un campo di tipo stringa lungo 20 caratteri.
Abbiamo usato le parole ‘dimensione’ e ‘lunghezza’: ‘lunghezza’ viene usato per campi di tipo stringa, ‘dimensione’ viene usato per campo di tipo numerico.

Campi contatori

I campi contatori sono dei particolari campi i quali contengono valori numerici incrementali. Generalmente questi campi con i suoi valori vengono utilizzati come chiave primaria; infatti è possibile far si che ad ogni nuovo inserimento di record, viene immesso un valore incrementale che è univoco.

In Access per ottenere tutto ciò basta dichiarare un campo di tipo contatore e questo automaticamente, ad ogni inserimento di record, si caricherà di un valore incrementato di una unità. Quindi per il primo record avremo il valore 1, per il secondo il valore 2 e così via.

In Oracle il discorso è più complesso, infatti bisogna creare una sequenza e poi permettere che questa generi un valore incrementale da immettere nel campo. Vediamo un esempio di come si crea una sequenza e di come si utilizza:

CREATE SEQUENCE sq_atleti /* Viene creata una sequenza di nome sq_atleti */
      INCREMENT BY 1 /* L’incremento della sequenza è unitario */
      START WITH 1 /*Il primo valore della sequenza sarà 1 */
      NOMAXVALUE /* Non deve esistere un valore massimo oltre il quale non si possono generare valori */
      NOCYCLE /*Non permette che i valori vengano generati da capo in un nuovo ciclo */
      NOCACHE /* Non permette di preallocare i valori della sequenza in memoria */
      ORDER; /* Garantisce che i numeri della sequenza vengano assegnati alle istanze che li richiedono                                 nell’ordine con cui vengono ricevute le richieste */
INSERT INTO atleti
VALUES(‘Giovanni’,
               ‘Rossi’,
                sq_atleti.NEXTVAL); /* Viene generato e inserito nel corrispondente campo il valore                                                                       incrementele */

La sintassi di questo esempio è stata testata solo su Oracle.

UPDATE

Questa istruzione serve per modificare i dati contenuti in una tabella. Consideriamo di avere una tabella PRODOTTI con i campi prodotto e prezzo; ora vogliamo modificare i corrispettivi prezzi dei prodotti aumentandoli del 10%:

Tabella prima dell’update:

PRODOTTI
PRODOTTO
PREZZO
MARMELLATA
L. 3.000
CIOCCOLATA L. 4.500
BISCOTTI L. 2.500

UPDATE PRODOTTI
SET PREZZO = PREZZO * 1.10;

Tabella dopo l’update:

PRODOTTI
PRODOTTO
PREZZO
MARMELLATA
L. 3.300
CIOCCOLATA L. 4.950
BISCOTTI L. 2.750

Questo particolare tipo di update viene applicato a tutte le righe per la colonna specificata; esiste anche un altro tipo di update le cui righe la dove deve avvenire la modifica vengono selezionate usando una select.
Alla tabella PRODOTTI modificata da l’ultimo update vogliamo modificare il prezzo della cioccolata aumentandolo ulteriormente di un altro 3%:

UPDATE PRODOTTI
SET PREZZO = PREZZO * 1.03
WHERE PRODOTTO = 'CIOCCOLATA';

Tabella dopo l’update:

PRODOTTI
PRODOTTO
PREZZO
MARMELLATA
L. 3.300
CIOCCOLATA L. 5.099
BISCOTTI L. 2.750

È anche possibile modificare più campi alla volta. Vediamo un esempio: Nella tabella PRODOTTI dobbiamo modificare il prezzo della cioccolata aumentandolo ulteriormente di un 15% e dobbiamo cambiare la denominazione da ‘cioccolata’ in ‘nutella’:

UPDATE PRODOTTI
SET PREZZO = PREZZO * 1.15,
         PRODOTTO = 'NUTELLA'
WHERE PRODOTTO = 'CIOCCOLATA';

Tabella dopo l’update:

PRODOTTI
PRODOTTO
PREZZO
MARMELLATA
L. 3.300
NUTELLA L. 5.864
BISCOTTI L. 2.750

DELETE

Oltre a inserire dati in una tabella o modificarli, occorre anche poterli cancellare. Questa istruzione assolve allo scopo. Va fatto notare che DELETE non cancella un singolo campo per volta ma una riga o più righe per volta; inoltre questa istruzione cancella i record e non l’intera tabella. Vediamo ora alcuni esempi per meglio comprendere come funziona DELETE.

Si da il caso che dalla tabella PRODOTTI si voglia cancellare la riga della marmellata:

DELETE FROM PRODOTTI
WHERE PRODOTTO = 'MARMELLATA';

Tabella dopo la delete:

PRODOTTI
PRODOTTO
PREZZO
NUTELLA L. 5.864
BISCOTTI L. 2.750

Si da il caso che, ancora non contenti di aver cancellato la sola riga della marmellata, ora vogliamo cancellare tutte le dighe della tabella:

DELETE FROM PRODOTTI;

PRODOTTI
PRODOTTO
PREZZO

Come si può vedere dalla sintassi dei due esempi sull’istruzione DELETE, non è possibile cancellare l’intera tabella o singoli campi all’interno delle righe selezionate. Qualcuno a questo punto si potrebbe domandare come far scomparire l’intera tabella o come cancellare un singolo campo? Per cancellare un campo all’interno di una riga possiamo usare l’istruzione UPDATE, mentre invece come far scomparire un’intera tabella lo vedremo al capitolo seguente.

Ricapitolando possiamo affermare che DELETE ci permette di:

ROLLBACK, COMMIT

Per le sintassi di questi comandi si è fatto riferimento al tool SQL Plus 8.0 di Oracle. Tali comandi non sono implementati da Access.

Quando si inseriscono o si cancellano o si modificano i dati in un database è possibile intervenire al fine di annullare l’operazione o confermarla definitivamente. Ciò è particolarmente utile quando ci accorgiamo di aver eseguito uno dei tre comandi, visti in questo capitolo, sui dati errati, o quando vogliamo confermare definitivamente il comando mandato in esecuzione.

Per far maggiore chiarezza a quanto affermato va detto che i DBMS i quali implementano i comandi ROLLBACK e COMMIT, non rendono effettivi istantaneamente i comandi DELETE, UPDATE e INSERT, ma tengono memoria temporaneamente delle modifiche effettuate in un’altra area. Questo fa si che un utente, che non sia quello che ha eseguito uno dei comandi DELETE, UPDATE e INSERT, non veda le modifiche appartate; mentre l’altro, quello che ha eseguito uno dei tre comandi, veda le tabelle in oggetto come se fossero state modificate definitivamente. Dunque il comando di COMMIT rende definitive le modifiche apportate e il comando ROLLBACK elimina ogni modifica da queste ultime. Cerchiamo di meglio comprendere di quanto detto:

COMMIT esplicito

Rappresenta il comando vero e proprio che l’utente digita per confermare e rendere definitive le modifiche apportate. La sintassi è la seguente e va digitata dopo aver mandato in esecuzione uno o più dei tre comandi visti in questo capitolo.

COMMIT;

COMMIT implicito

Ci sono delle azioni che mandano in esecuzione il COMMIT in maniera automatica. Una di queste azioni è ad esempio l’uscita dal tool che ci consente di mandare in esecuzione le sintassi SQL o eseguire dei seguenti comandi: CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW. Ci sono altri comandi o azioni che provocano il COMMIT; per ulteriori informazioni si consiglia di consultare il manuale del DBMS che si sta utilizzando.

ROLLBACK automatico

Abbiamo finito di effettuare una serie di aggiornamenti al database, quando ad un certo punto per un fatto accidentale il computer si spegne o si blocca. Ebbene se non è stato effettuato un COMMIT esplicito i nostri aggiornamenti non sortiranno alcun effetto sul database. È questo un caso di ROLLBACK automatico.

ROLLBACK esplicito

È il caso in cui volendo non rendere effettive le modifiche apportate eseguiamo il comando ROLLBACK. La sintassi è la seguente:

ROLLBACK;

Riepilogo

In questo capitolo abbiamo visto le tre istruzioni più importanti per poter manipolare i dati. Gli esempi esposti erano particolarmente semplici; c’è però da far notare che con le istruzioni INSERT, UPDATE e DELETE possiamo utilizzare select o condizioni complesse e articolate quanto vogliamo.


 
Precedente
INDICE
Segue
pag. 12 di 20