você está aqui: Home  → Colunistas  →  Bancos de Dados Livres

INSERT com SELECT

Por Luiz Paulo de Oliveira Santos

Data de Publicação: 17 de Setembro de 2006

Uma possibilidade interessante e desconhecida de muitos desenvolvedores que utilizam SQL é o uso de duas instruções SQL em uma única chamada. Por exemplo: A instrução INSERT que é responsável por inserir registros em tabelas, e, pode ser utilizada em conjunto com outras instruções, como o SELECT, por exemplo.

A instrução SELECT do SQL é além de polêmica bastante complexa. Com ela podemos extrair informações dos mais diversos tipos, ou seja, podemos utilizar o SELECT para obter desde resultados de cálculos básicos até buscas complexas e mais elaboradas, como nos exemplos a seguir:

SELECT 1+1

ou

(SELECT * FROM `xoops_users` where (uid >1) and (uid < 5))

UNION

(SELECT * FROM `xoops_users` where (uid >10) and (uid < 15))
ORDER BY uname;

Podemos utilizar o SELECT para extrair informações e canalizar o resultado obtido para outra instrução SQL. É o proposto no título do artigo, e o que será demonstrado a seguir.

Em uma situação onde existe a necessidade de gerar uma tabela de dados para ser trabalhada, e, ao final dos trabalhos ser exportada para outro sistema, por exemplo. Necessita-se importar dados de diferentes tabelas ou intervalos da tabela e colocar tudo em uma única tabela (tabela resposta). Logo teremos que inserir registros na tabela que armazenará a resposta.

A inserção dos dados é efetuada com a instrução INSERT, que é bastante simples. Basicamente informa-se a tabela que receberá os dados, os campos que serão preenchidos (e podem ser omitidos caso todos os campos sejam preenchidos) e a massa de dados que preencherá os campos, conforme o exemplo:

INSERT INTO <tabela> (lista de campos,...)
   VALUES (massa de dados);

Sendo que a massa de dados deve obedecer a lista de campos informada.

Supondo que exista a tabela respostas com a seguinte estrutura:

Campo Tipo
IDENVIO INT(11)
NOME VARCHAR(50)
IDDESTINO INT(11)

Para inserirmos um registro na tabela respostas a instrução INSERT terá a seguinte sintaxe:

INSERT INTO respostas (IDENVIO, NOME, IDDESTINO)
VALUES (11,"lpaulo",132);

Para efetuarmos a importação devida, deve-se obter os campos IDENVIO e NOME da tabela xoops_users (nos campos uid e uname respectivamente) e o campo IDDESTINO da tabela xoops_xoopscomments (campo com_id). Logo, necessitam-se buscar dados em duas tabelas e armazenar a resposta na tabela respostas. Para buscar os dados nas tabelas utilizaremos um SELECT. Porém deve-se filtrar os registros da tabela xoops_xoopscomments, de forma que para cada registro de xoops_users seja exibido com seu equivalente em xoops_xoopscomments.

A seguir temos a instrução que faz a extração dos dados:

SELECT xoops_users.uid, xoops_users.uname,
       xoops_xoopscomments.com_id
       FROM xoops_users, xoops_xoopscomments
       WHERE xoops_users.uid = xoops_xoopscomments.com_uid

No SELECT acima obtemos 3 campos, sendo dois deles INTEGER e um VARCHAR.

Agora será unido o SELECT ao INSERT:

INSERT INTO `respostas`  (IDENVIO, NOME, IDDESTINO)
SELECT xoops_users.uid, xoops_users.uname,
       xoops_xoopscomments.com_id
       FROM xoops_users, xoops_xoopscomments
       WHERE xoops_users.uid = xoops_xoopscomments.com_uid

Desta forma será inserido na tabela respostas os registros obtidos na consulta com SELECT. Observe que a clausula VALUES foi omitida. Em alguns casos a clausula VALUES pode ser omitida e em outros casos não. Em uma próxima oportunidade o assunto será estudado.

E as variações e aplicações para esse tipo de sintaxe são simplesmente ilimitadas! O limite é a necessidade e criatividade de cada um.

Nota: O uso do INSERT em conjunto com SELECT é muito útil, porém deve-se lembrar sempre das formas normais que foram empregadas para normalização do banco de dados. Se as formas normais não forem respeitadas, redundâncias podem aparecer em seu banco! Mas formas normais é assunto para outro bate papo.

Espero que essa pequena dica seja útil quando precisar "importar" dados provenientes de tabelas que já existam.

Um forte abraço e até mais!

Sobre o autor

Luiz Paulo de Oliveira Santos teve seu primeiro contato com computadores em 1984, estudou BASIC para equipamentos de 8 bits (ZX-81 e Apple 2), em 1985 com o ambiente de 16 bits, e em 1988 com o ambiente de 32 bits. Em 1993 foi um dos primeiros Brasileiros a ter contato com o VBK que em 1995 se tornou o Delphi. Graduou em Tecnologia Em Processamento de Dados, cursou especialização em Análise de Sistemas e atualmente é graduando em Ciências Jurídicas. Atua como analista de suporte de redes da Universidade Metodista de Piracicaba, é editor da revista DB Freemagazine (uma revista gratuíta focada exclusivamente para bancos de dados Cliente/Servidor) e professor nas Faculdades Integradas Einstein de Limeira no curso de Tecnologia em Sistemas de Informação. Tem experiência nas áreas: Sistemas de Computação, Redes e Teleprocessamento de Dados, Bancos de Dados cliente-servidor e SQL. É autor do livro Firebird - Dicas de Segurança, publicado pela Editora Ciência Moderna.

Recomende este artigo nas redes sociais

 

 

Veja a relação completa dos artigos desta coluna