Torna all'elenco degli articoli Articoli
Tempo di lettura: 6 minuti

Che cos'è l'istruzione DELETE in SQL?

Questo articolo spiega l'uso dell'istruzione DELETE, uno dei metodi principali per rimuovere i record esistenti dal database. Prima di tutto verrà illustrata la sintassi, seguita da alcuni esempi di facile comprensione.

L'istruzione DELETE in SQL è estremamente utile. Permette di rimuovere i dati obsoleti o "cattivi" dalle tabelle del database. È necessario usare cautela quando si utilizza l'istruzione DELETE, poiché l'operazione non è reversibile. Non viene visualizzata alcuna finestra di dialogo che chieda di confermare l'operazione. Una volta eseguita una query DELETE, i dati saranno spariti per sempre!

L'istruzione DELETE è nota come comando di manipolazione dei dati. Questo articolo tratta gli altri comandi di questo tipo, ovvero INSERT e UPDATE.

Esploriamo la sintassi di SQL DELETE.

Sintassi di SQL DELETE

La sintassi dell'istruzione DELETE è la seguente:

DELETE FROM  [WHERE ]

La tabella da cui si desidera eliminare i dati viene posta dopo l'istruzione DELETE.

Le parentesi quadre indicano che la clausola WHERE è del tutto facoltativa. In pratica, però, questa clausola verrà utilizzata quasi sempre: se non si include la clausola WHERE, tutti i dati della tabella verranno cancellati.

Per questo motivo è sempre una buona idea utilizzare SELECT per visualizzare i dati che si desidera eliminare. Quando il risultato della query SELECT è uguale ai dati che si intende eliminare, è sufficiente sostituire l'istruzione SELECT nella query con l'istruzione DELETE. Tutte le altre parti della query possono rimanere invariate. In questo modo si eviterà di cancellare per errore alcuni dati fondamentali.

Questo conclude il nostro sguardo alla sintassi SQL DELETE. È giunto il momento di esaminare alcuni esempi pratici, che dimostreranno alcuni usi diversi dell'istruzione DELETE e che tratteranno alcuni problemi di autorizzazioni che potreste incontrare.

Permessi SQL DELETE

Prima di passare in rassegna i nostri esempi, è importante notare che (a seconda del dialetto SQL utilizzato) potrebbe essere necessario modificare i permessi dell'utente per poter modificare i record con l'istruzione DELETE.

Per impostazione predefinita, MySQL Workbench si avvia in modalità sicura; non è possibile utilizzare UPDATE o DELETE senza una condizione WHERE.

Ad esempio, quando si utilizza MySQL, viene visualizzato il messaggio: "Si sta utilizzando la modalità di aggiornamento sicuro e si è tentato di aggiornare una tabella senza WHERE che utilizza una colonna KEY. Per disattivare la modalità sicura, disattivare l'opzione in Preferenze → Editor SQL e riconnettersi".

Per risolvere il problema, avete due opzioni.

  1. Modificate le impostazioni in questo modo:
    1. Andare in Modifica →
    2. Fare clic sulla scheda Editor SQL e deselezionare la casella di controllo Aggiornamenti sicuri.
    3. Fare clic su Query → Riconnetti al server.
    4. Eseguire la query SQL.
  2. In alternativa, è possibile eseguire la seguente query:
    SET SQL_SAFE_UPDATES = 0;

Dopo aver completato una di queste opzioni, si dovrebbe essere in grado di utilizzare DELETE per rimuovere i dati dalle tabelle.

Ora passiamo agli esempi!

Esempi di SQL DELETE

CANCELLAZIONE semplice

Immaginiamo di gestire un database di dipendenti e di aver appena saputo che alcuni di essi hanno lasciato l'azienda. Vogliamo rimuoverli dalla nostra tabella employees tabella. Diamo un'occhiata allo stato attuale della tabella:

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36
3GeorgeHarrison41
4RingoStarr49

Immaginiamo di dover rimuovere George Harrison e Ringo Starr dalla nostra tabella. Quali sono le nostre opzioni?

Prima di rimuovere questi record, dobbiamo accertarci dei valori della colonna employee_id. Dopo aver fatto questo, la query DELETE avrà l'aspetto seguente:

DELETE FROM employees
WHERE employee_id = 3 OR employee_id = 4

In questo modo, George e Ringo verrebbero rimossi dalla tabella.

È anche possibile specificare una singola condizione che catturi entrambi i record in una sola volta. In questo caso, poiché sia George che Ringo hanno più di 40 anni, si può utilizzare la colonna age:

DELETE FROM employees
WHERE age > 40

L'esecuzione di questa query ci lascerà con i seguenti record nella tabella employees tabella.

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36

I nostri record sono stati cancellati con successo! Se volete vedere altri esempi di DELETE, date un'occhiata a questo articolo del ricettario, che mostra come cancellare una singola o più righe di dati.

Consideriamo poi un esempio più avanzato che utilizza una subquery per cancellare i dati.

Subquery DELETE

È possibile eliminare i dati dalle tabelle anche utilizzando le subquery. Una subquery è quando una query viene utilizzata come parte di un'altra. Per saperne di più sulle subquery, leggete questo articolo per principianti. Vediamo uno scenario in cui è possibile utilizzare una DELETE con una subquery.

Utilizzeremo di nuovo la nostra tabella employees ancora una volta:

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36
3GeorgeHarrison41
4RingoStarr49

Abbiamo anche una tabella sales_team che contiene i record di tutti i dipendenti del reparto vendite dell'azienda:

idfirst_namelast_name
1JohnLennon
3GeorgeHarrison

Abbiamo appena ricevuto la terribile notizia del licenziamento del team di vendita. È nostro compito aggiornare le tabelle employees e sales_team e le tabelle.

Dimostrerò come una subquery può aiutarci in questo particolare scenario. Ecco la query:

DELETE FROM employees
WHERE employee_id 
IN (SELECT id
FROM sales_team)

Ok, vediamo di scomporla.

La query tra parentesi tonde (cioè la sottoquery) restituisce tutti i valori id dalla tabella sales_team della tabella:

SELECT id FROM sales_team

Questa query ci fornisce i valori 1 e 3.

Osserviamo la parte DELETE della query principale:

DELETE FROM employees
WHERE employee_id 
IN...

Notate la clausola WHERE. In questa parte della query, stiamo cercando di eliminare i record in cui employee_id è presente nei risultati della nostra sottoquery. Ricordare che la subquery ha dato come risultato 1 e 3. Quindi, questa query ha come risultato:

DELETE FROM employees
WHERE employee_id 
IN (1,3)

Supponiamo di eseguire l'intera query e di utilizzare la query SELECT per visualizzare i risultati:

SELECT employee_id, first_name, last_name, age
FROM employees

Ecco cosa otteniamo:

employee_idfirst_namelast_nameage
2PaulMcCartney36
4RingoStarr49

Ecco fatto! Il team di vendita è stato rimosso con successo dalla tabella employees tabella. Si può notare l'utilità di una sottoquery per questo caso d'uso.

Questo è un caso d'uso leggermente più avanzato. Quando si parla dell'istruzione DELETE, vale la pena di menzionare le istruzioni TRUNCATE e DROP:

  • TRUNCATE è più veloce di DELETE, poiché non esegue la scansione della tabella prima di rimuovere i record. Per questo motivo, non può essere utilizzata con la condizione WHERE o indicare quante righe sono state eliminate al termine dell'operazione.
  • Il comando DROP TABLE rimuove tutto ciò che ha a che fare con quella tabella: la definizione della tabella e tutti gli indici, i trigger e i vincoli correlati.

Per saperne di più su questi due metodi di rimozione dei dati, leggete questo articolo su come usare le subquery con INSERT, UPDATE e DELETE. È inoltre possibile consultare questo articolo che illustra la differenza tra DELETE, TRUNCATE e DROP.

Eliminazione dei vincoli di chiave primaria e chiave esterna

Un altro aspetto da discutere è quello dei vincoli di chiave primaria (PK) e di chiave esterna (FK). Quando si lavora su esempi più piccoli, come quelli illustrati in questo articolo, non ci si deve preoccupare dei vincoli PK e FK. Ma se lavorate con un database esistente di grandi dimensioni, li incontrerete sicuramente.

Quando si eliminano i dati da una tabella, è possibile che si vogliano rimuovere anche i vincoli associati ai dati di quella tabella. Se questo è il vostro caso, date un'occhiata ai seguenti esempi:

  • Questo esempio mostra come eliminare una chiave primaria.
  • Questo esempio mostra come eliminare un vincolo di chiave esterna.

Mantenere i dati rilevanti con SQL DELETE

Questo conclude il nostro sguardo completo sull'istruzione SQL DELETE. Ne abbiamo mostrato la sintassi ed esplorato i potenziali usi di questo comando attraverso diversi esempi.

Se desiderate una formazione più completa su SQL, date un'occhiata al nostro percorso di apprendimento SQL dalla A alla Z che vi insegna le basi e poi passa ad argomenti più avanzati.