SQL (Structured Query Language)

Un corso completo sul linguaggio SQL (Structured Query Language): definizioni, esempi ed esercizi

Manipolare dati con SQL

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 qual è 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.

E’ 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

E’ 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:

  • cancellare una sola riga
  • cancellare più righe
  • cancellare tutte le righe

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. E’ questo un caso di ROLLBACK automatico.

ROLLBACK esplicito

E’ 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.

Autore: Art Net

Condividi questo articolo su

12 Commenti

  1. Ho imparato alcune cose buone qui. Certamente merita il bookmarking per la rivisitazione.

    Mi chiedo quanti sforzi hai impostato per creare questo tipo di fantastico sito informativo.

    Rispondi al Commento
  2. guida molto interessante grazie se ci fossero anche le istruzioni per creare la tabella sarebbe completa secondo me

    Rispondi al Commento
  3. Grazie per la guida. Semplice, interessante ed utile.
    Vorremmo segnalare due cose. Un errore ed un dubbio.
    Errore:
    SELECT DIVISIONE, AVG(STIPENDIO)
    FROM DIPENDENTI
    HAVING AVG(STIPENDIO) > 2200000;

    manca la “group by DIVISIONE” prima della HAVING.

    Di conseguenza il dubbio sul punto 6.
    HAVING non è necessario che venga posta dopo la clausola GROUP BY.
    Sicuri?

    Rispondi al Commento
  4. Guida Molto utile, segnalo un errore nella query 9, capitolo 2, delle soluzioni:
    PrezzoIngrosso è moltiplicato * 1,5 ma si chiedeva un aumento del 15%, ciò significa moltiplicare * 1,15

    Rispondi al Commento
  5. Veramente complimenti, una guida dettagliata, semplice e adatta a tutti 🙂

    FortyZone

    Rispondi al Commento
  6. Davvero complimenti ragazzi. La prima guida che per chi parte da zero è manna dal cielo…PERFETTA!!

    Rispondi al Commento
  7. nel punto 8 la soluzione non dovrebbe essere con HAVING MIN(IMPORTO) > 400 000; cioè: SELECT BENEFICIARI FROM ASSEGNI GROUP BY BENEFICIARIO HAVING MIN(IMPORTO) > 400 000;

    Rispondi al Commento
  8. un ottimo Manuale unico errore (se vogliamo chiamarlo cosi) i tipi di dati Char(5) number(5,2) cosa sono e come si usano

    Rispondi al Commento
  9. Complimenti ottimo sito! fatto davvero bene. Grazie!

    Rispondi al Commento

Invia commento

Il tuo indirizzo email non sarà pubblicato.