back to top

MySQL: il costrutto INSERT INTO … SELECT

Le istruzioni chiamate INSERT INTO … SELECT permettono di copiare dei dati presenti in una tabella e di inserirli in un’altra utilizzando un unico statement: in pratica, nella stessa query, si utilizza INSERT INTO per popolare una tabella ed una SELECT per estrarre i dati da inserire da un’altra tabella che giร  li contiene. Questo approccio offre un notevole risparmio in termini di tempo e codice rispetto alla tradizionale successione di istruzioni.

La sintassi necessaria prevede sostanzialmente due casistiche: quella in cui tutte le colonne copiate da una tabella vengono riprodotte in una seconda e, non meno importante, quella in cui vengono copiate soltanto le colonne desiderate, procedura che richiederร  di specificare i nomi di queste ultime (rendendo impossibile l’utilizzo della wildcard “*” dopo il comando SELECT).

Pubblicitร 

Copiare dati tra tabelle strutturalmente identiche

Si supponga che le due tabelle abbiano la stessa identica struttura (stesso numero di campi aventi lo stesso nome). In tal caso il riversamento dei dati da una tabella all’altra รจ estremamente semplice:

INSERT INTO tabellaA
SELECT * FROM tabellaB;

In questo caso tutti i dati di “TabellaB” verranno riversati in “TabellaA”. รˆ importante notare che se la TabellaA ha delle restrizioni (come campi univoci o non null), queste dovrebbero essere gestite per evitare errori.

Volendo, ovviamente, รจ anche possibile aggiungere condizioni, ad esempio:

INSERT INTO tabellaA
SELECT * FROM tabellaB
WHERE id > 123;

In questo caso verranno riversati in “TabellaA” tutti i record di “TabellaB” aventi id superiore a 123. Questo metodo consente di adattare la migrazione dei dati in base a criteri specifici, garantendo una flessibilitร  notevole nel processo di trasferimento.

Copiare dati tra tabelle differenti

Per meglio comprendere l’utilitร  di questa sintassi faremo ricorso a qualche esempio un po’ piรน articolato. Si immagini quindi di disporre delle due seguenti tabelle:

  1. nominativi: oltre ad un identificatore autoincrementale (id), essa dovrร  prevedere almeno i campi “nome”, per il nome completo, “residenza”, per la localitร  associata al nominativo registrato, e “nazione”, il nome dello stato della localitร  di riferimento.
  2. clienti: i campi disponibili dovranno essere sostanzialmente gli stessi, ciรฒ non toglie che possano essere presenti in tabella anche ulteriori campi, considerazione che vale anche per “nominativi”. L’unica differenza riguarderร  il campo per il nome completo che, questa volta, si chiamerร  “nome_cliente”.

Detto questo, si potranno utilizzare le INSERT INTO … SELECT per ottenere diversi risultati; la prima istruzione proposta consentirร  per esempio di copiare soltanto le colonne “nome_cliente” e “nazione” della tabella “clienti” all’interno dei campi “nome” e “nazione” della tabella “nominativi”:

INSERT INTO nominativi (nome, nazione)
SELECT nome_cliente, nazione FROM clienti;

Come potete notare, non avendo le due tabelle strutture identiche, abbiamo dovuto specificare i nomi dei campi sia per la tabella di destinazione che per la tabella sorgente. Questo รจ fondamentale per garantire l’integritร  dei dati e per la corretta corrispondenza tra le colonne.

Il secondo esempio pratico prevede un’istruzione ancora piรน articolata: verrร  utilizzata la clausola WHERE con lo scopo di prelevare dalla tabella “clienti” soltanto i dati relativi alle colonne “nome_cliente” e “nazione” in cui i record presentano “UK” come valore del campo “nazione”:

INSERT INTO nominativi (nome, nazione)
SELECT nome_cliente, nazione FROM clienti
WHERE nazione='UK';

Esempio di utilizzo avanzato: riversamento di dati elaborati

Come descritto per il caso di WHERE, all’interno di una INSERT INTO … SELECT sarร  possibile utilizzare agevolmente anche altre due clausole come HAVING e GROUP BY. Inoltre, questi statements potranno essere impiegati non soltanto per copiare dati nella loro forma originale, ma anche i risultati della loro elaborazione. A tal proposito si analizzi un’istruzione come la seguente:

INSERT INTO informazioni_ordini (nome_negozio, ordini, data_ordine)
SELECT nome_negozio, SUM(ordini), data_ordine
FROM dati_ordini
GROUP BY nome_negozio, data_ordine;

In pratica, il valore del dato inserito nel campo “ordini” della tabella “informazioni_ordini” sarร  uguale alla somma (funzione SUM()) dei valori presenti nel campo “ordini” della tabella “data_ordini” raggruppati per i valori dei campi “nome_negozio” e “data_ordine”. Questo consente una visione aggregata dei dati, molto utile per analisi statistiche o reportistica.

Considerazioni Finali

Come avete potuto vedere, le potenzialitร  di questo costrutto sono notevoli e, attraverso una sapiente combinazione di comandi, รจ possibile effettuare migrazioni di dati anche complesse e articolate. Grazie a questa funzionalitร  di MySQL, รจ possibile ottimizzare il flusso di lavoro e garantire una gestione piรน efficiente dei database. Utilizzando con saggezza l’istruzione INSERT INTO … SELECT, potrete quindi migliorare significativamente le operazioni di integrazione dei dati nelle vostre applicazioni.

Altri contenuti interessanti

Pubblicitร 

Potrebbero interessarti queste guide

Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.

Leggi anche...

Come ottenere l’ID dell’ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

Ottenere l'ID dell'ultimo record inserito in una tabella, dopo...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'รจ il formato...

Confrontare due tabelle e trovare i record senza corrispondenza

all'interno di un database relazionale può essere utile poter...

Eseguire comandi SQL online con SQL Fiddle

Sì. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di più campi

Attraverso una semplice query SQL รจ possibile calcolare dinamicamente...
Pubblicitร