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.
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).
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:
INSER INTO tabellaA
SELECT FROM tabellaB
In questo caso tutti i dati di "TabellaB" verranno riversati in "TabellaA".
Volendo, ovviamente, è anche possibile aggiungere condizioni, ad esempio:
INSER 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.
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:
- 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.
- clienti: i campi disponibili dovranno essere sostanzialmente gli stessi, ciò però 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 "cliente" 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.
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" della tabella "clienti" 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".
Conclusioni
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.