Neste post vou mostrar como pegar o resultado de uma consulta MySQL e gravá-lo em uma tabela preexistente, em vez de exibi-lo.
Se você deseja criar uma nova tabela a partir de uma query SELECT, sugiro ler o artigo Como criar uma tabela a partir de uma declaração SELECT no MySQL.
O servidor MySQL normalmente retorna o resultado de um SELECT ao cliente que o requisitou.
Se você faz uma requisição a partir do terminal cliente MySQL, é para onde os resultados serão enviados e exibidos.
Neste texto vou mostrar como enviar os resultados de um SELECT para dentro de uma outra tabela.
Copiar resultados de uma tabela para outra pode ser útil em vários casos:
- Se você estiver desenvolvendo um algoritmo que modifica uma tabela, certamente seria mais seguro trabalhar em uma cópia — o que evita ter que lidar com as consequências de um desastre em cima de informações importantes para você ou para a empresa em que você trabalha.
- Em algumas operações, pode ser interessante trabalhar em uma tabela temporária e, mais tarde, copiar os dados conferidos para a tabela definitiva.
- Você pode usar o recurso em um script, que toma dados de uma tabela maior e cria uma pequena tabela de serviços e vai atualizando a tabela principal aos poucos (ou em horários de menor fluxo na rede).
- Se você está aprendendo MySQL, pode ser interessante transferir dados para tabelas “de aprendizado” e deixar as tabelas de produção em paz.
Vou mostrar como usar o INSERT ... SELECT
para obter informações de uma tabela e inseri-las em outra.
Para isto, vou fazer uso das tabelas ClientesCidades e CliCred. Sugiro adequar os exemplos às suas próprias tabelas. Contudo, se quiser, você pode pegar as minhas mal acabadas tabelas aqui.
Como inserir os resultados da query em uma tabela
A tabela CliCred tem 3 campos coincidentes com a tabela ClientesCidades. Veja o que o comando EXPLAIN mostra (em destaque):
EXPLAIN CliCred;
+-----------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | cc_nome | varchar(255) | YES | | NULL | | | cc_cidade | varchar(255) | YES | | NULL | | | cc_cred | mediumint(9) | YES | | NULL | | | cc_limite | mediumint(9) | YES | | NULL | | +-----------+-----------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
Embaixo, após o comando EXPLAIN, destaquei os campos que correspondem aos que foram destacados em cima:
EXPLAIN ClientesCidades;
+---------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | NomeCliente | varchar(255) | YES | | NULL | | | IdadeCliente | mediumint(9) | YES | | NULL | | | CidadeCliente | varchar(255) | YES | | NULL | | | CredCliente | mediumint(9) | YES | | NULL | | +---------------+-----------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
Cada uma destas 2 tabelas tem 100 registros.
Ao final da operação, a tabela ClientesCidades terá recebido os 100 registros da tabela CliCred — e passará a ter 200 registros.
Veja:
INSERT INTO ClientesCidades (NomeCliente, CidadeCliente, CredCliente) SELECT cc_nome, cc_cidade, cc_cred FROM CliCred;
Vamos analisar o comando dado:
INSERT INTO ClientesCidades
— Determina em que tabela ocorrerá a alteração (inserção de novos dados).(NomeCliente, CidadeCliente, CredCliente)
— Estes são os campos (as colunas) que serão alterados na tabela ClientesCidades.SELECT cc_nome, cc_cidade, cc_cred FROM CliCred
— Seleciona os valores contidos nos camposcc_nome, cc_cidade, cc_cred
na tabela CliCred, para inserir na primeira tabela.
Veja uma listagem parcial (apenas os 10 últimos registros) da nova tabela ClientesCidades:
SELECT * FROM ClientesCidades where id > 190;
+-----+-------------------+--------------+----------------+-------------+ | id | NomeCliente | IdadeCliente | CidadeCliente | CredCliente | +-----+-------------------+--------------+----------------+-------------+ | 191 | Paula Wiley | NULL | St. Catharines | 187 | | 192 | Cathleen Thornton | NULL | Rouvroy | 289 | | 193 | Laurel Espinoza | NULL | Boneffe | 131 | | 194 | Amber Sparks | NULL | Kailua | 256 | | 195 | Elizabeth Bean | NULL | Beaconsfield | 147 | | 196 | Eleanor Cleveland | NULL | Rosciano | 295 | | 197 | Virginia Dillon | NULL | Metairie | 209 | | 198 | Jana Dyer | NULL | Birori | 135 | | 199 | Kendall Reid | NULL | Westkapelle | 274 | | 200 | Katell Robinson | NULL | Colonnella | 149 | +-----+-------------------+--------------+----------------+-------------+ 10 rows in set (0.03 sec)
Em uma análise do resultado, note que:
- o último valor do campo id, em ClientesCidades, reflete o acréscimo de mais 100 registros. Agora são 200 registros;
- 100 nomes de clientes, de cidades e valores de Crédito foram adicionados nos campos NomeCliente, CidadeCliente e CredCliente;
- A tabela CliCred não tem o campo IdadeCliente, por isto o valor NULL (nulo) foi gravado nos campos correspondentes.
Como copiar todos os valores de uma tabela para outra
Isto é bem mais fácil e pode realizado com um comando mais enxuto e menor preocupação com a sintaxe.
Vamos supor a existência das tabelas tabela_Origem e tabela_Destino, ambas com estruturas idênticas.
Para copíar os valores da primeira para dentro da segunda, use o seguinte comando:
INSERT INTO tabela_Destino SELECT * FROM tabela_Origem;
E se eu quisesse copiar apenas as informações sobre clientes com créditos superiores a 300?
Vamos retomar (e alterar) o exemplo acima:
INSERT INTO ClientesCidades (NomeCliente, CidadeCliente, CredCliente) SELECT cc_nome, cc_cidade, cc_cred FROM CliCred WHERE cc_cred > 300;
Como, no caso da minha tabela, nenhum cliente tem valor de crédito superior a 300, o resultado foi este:
Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
Uma última dica: Você pode usar a mesma tabela como origem e destino.
Divirta-se e tenha um bom aprendizado!
5 replies on “Como inserir o resultado de uma query SELECT em uma tabela MySQL”
Boa noite
se for possível me explique como eu faço para sacar os dados do seguinte modo.
1- Tenho 2 bancos de dados:
exemplo 1: db teste1
exemplo 2: db teste2
no db teste 1 tenho uma tabela com nome estados/siglas onde contem os estados e as siglas
na db teste2 preciso copiar da db teste1 a sigla dos estados….
e na hora de preecher o formulario seleciono o value estado sigla + cidade e salvo utilizando um INSERT INTO db teste1 tabela estado
top mais preciso de um que pego os resultados e jogue dentro de um span2 resutado por resutado dai fazer uma row com 5 spam dai quando completa os 5 spam2 cria outra row e assim em diante
Insert com select, numa única execução da query gera na tabela destino várias cópias de um mesmo registro. Coisa que deveria acontecer conforme a quantidade de execuções da query. O que pode ser feito?
Ao colega Sávio. Para selecionar apenas um registro, basta colocar a clausula distinct.
Ex: Select distinct campoA, campoB from tabela
Obrigada! Eu estava precisando desse assunto! ótimo post! me ajudou