SQLShack (Português)
Este artigo cobre a instrução SQL INSERT INTO SELECT junto com sua sintaxe, exemplos e casos de uso.
Em meu artigo anterior Instrução SQL SELECT INTO, exploramos as seguintes tarefas.
- Criar uma tabela SQL dinamicamente enquanto insere registros com tipos de dados apropriados
- Use SQL SELECT INTO para inserir registros em um determinado grupo de arquivos
- Não podemos usá-lo para inserir dados em uma tabela existente
A instrução INSERT INTO SELECT
Queremos inserir registros como uma atividade regular do banco de dados. Podemos inserir dados diretamente usando ferramentas de cliente, como SSMS, Azure Data Studio ou diretamente de um aplicativo. Em SQL, usamos a instrução SQL INSERT INTO para inserir registros.
A sintaxe do INSERT INTO
Depois de inserir os dados na tabela, podemos usar a seguinte sintaxe para nosso Instrução SQL INSERT INTO.
1
2
|
INSERT INTO table_name (Coluna1, Coluna 2 ….)
VALORES (valor1, valor2, …);
|
Se tivermos especificado todos os valores da coluna como por coluna da tabela pedidos, não precisamos especificar os nomes das colunas. Podemos inserir registros diretamente na tabela.
1
2
|
INSERT INTO table_name
VALORES (valor1, valor2, …);
|
Vamos criar uma tabela de exemplo e inserir dados nela .
1
2
3
4
|
CRIAR TABELA Funcionários
(ID INT,
Nome VARCHAR (20)
);
|
Podemos inserir dados usando as seguintes consultas. Ambas as consultas são válidas para inserção de dados.
1
2
|
Inserir nos valores dos funcionários (ID, nome) (1, “raj”)
Inserir nos valores dos funcionários (2, “raj”)
|
Não podemos inserir dados sem especificar os nomes das colunas, se houver um a incompatibilidade entre a inserção de dados e a ordem dos valores da coluna é diferente. Podemos obter a seguinte mensagem de erro.
- Msg 213, Nível 16, Estado 1, Linha 6
Nome da coluna ou número de valores fornecidos não definição da tabela de correspondências.
- Msg 245, nível 16, estado 1, linha 6
A conversão falhou ao converter o valor varchar raj para o tipo de dados int.
Neste exemplo, usaremos a instrução SQL INSERT INTO com o fornecimento de valores diretamente em uma instrução. Suponha que desejamos inserir dados de outra tabela. Ainda podemos usar a instrução SQL INSERT INTO com uma instrução select. Vamos explorar isso na próxima seção.
Sintaxe da instrução INSERT INTO SELECT
Podemos inserir dados de outras tabelas SQL em uma tabela com a seguinte instrução INSERT INTO SELECT.
1
2
3
|
INSERT INTO table1 (col1, col2, col3,…)
SELECT col1, col2, col3,…
FROM table2
|
Esta consulta executa as seguintes tarefas:
- Ele primeiro seleciona registros de uma tabela (instrução Select)
- Em seguida, ele insere em uma tabela especificada com INSERT INTO
- Observação: a estrutura da coluna deve corresponder entre a coluna retornada pela instrução SELECT e a tabela de destino.
INSERT INTO SELECT exemplos
Exemplo 1: inserir dados de todas as colunas da tabela de origem para a tabela de destino
Temos os seguintes registros em um Tabela de funcionários existente.
Vamos criar outra tabela Clientes com a seguinte consulta.
1
2
3
4
|
CRIAR TABELA Clientes
(ID INT,
Nome VARCHAR (20)
);
|
Queremos inserir todos os registros da tabela Funcionários para a tabela Clientes. Podemos usar a instrução SQL INSERT INTO SELECT para fazer isso.
1
2
3
|
INSERT INTO Customers
SELECT *
FROM Employees;
|
Insere todos os registros na tabela Clientes. Podemos verificar se os registros na tabela Clientes são semelhantes aos da tabela Funcionários.
Neste exemplo, inserimos registros para todos colunas para a tabela Clientes.
Exemplo 2: Inserir linhas da tabela de origem para a tabela de destino especificando nomes de coluna
Vamos eliminar a tabela Clientes existente antes de prosseguirmos. Agora, queremos criar uma tabela com uma coluna adicional IDENTITY. A coluna IDENTITY insere automaticamente valores de identidade em uma tabela. Também adicionamos uma coluna City que permite valores NULL
1
2
3
4
5
6
|
CRIAR TABELA Clientes
(ID INT IDENTITY (1, 1),
Emp_ID INT,
Nome VARCHAR (20),
Cidade VARCHAR (20) NULL,
);
|
Não podemos usar a instrução INSERT INTO SELECT semelhante à exemplo acima. Se tentarmos executar este código, obteremos uma mensagem de erro.
1
2
3
|
INSERT INTO Customers
SELECT *
FROM Employees ;
|
Nesse caso, precisamos especificar o nome da coluna com a instrução INSERT INTO.
1
2
3
|
INSERT INTO clientes (Emp_ID, nome)
SELECT *
FROM Funcionários;
|
Na tabela Clientes, temos uma coluna adicional com permite valores NULL. Vamos fazer uma seleção na tabela de clientes. Na captura de tela a seguir, podemos ver os valores NULL na coluna Cidade.
Suponha que você tenha uma coluna diferente na tabela de origem. Você ainda pode inserir registros na tabela de destino especificando nomes de coluna na instrução INSERT INTO SELECT. Devemos ter um tipo de dados apropriado para inserir dados. Você não pode inserir dados de uma coluna varchar em uma coluna INT.
Adicione uma nova coluna na tabela Funcionários usando a instrução ALTER TABLE.
1
2
|
ALTER TABLE Funcionários
ADICIONE país varchar (50);
|
Atualize os registros da tabela com o valor do país Índia.
1
|
Atualizar conjunto de funcionários Country = “Índia”
|
Agora, execute novamente o INSERT INTO Instrução SELECT. Você pode notar que estamos usando SELECT * em vez de especificar nomes de coluna.
1
2
3
|
INSERT INTO Customers (Emp_ID, Name)
SELECT *
DE funcionários;
|
Recebemos a seguinte mensagem de erro. Esse erro ocorre devido à incompatibilidade de coluna entre a tabela de origem e a tabela de destino.
Podemos mapear a coluna entre a tabela de origem e de destino usando a seguinte consulta.
1
2
3
4
5
6
|
INSERIR EM clientes
(Emp_ID,
Nome
)
SELECIONE ID, Nome
FROM Funcionários;
|
Exemplo 3: Insira as linhas superiores usando INSERT INTO SELECT instrução
Suponha que desejamos inserir as N primeiras linhas da tabela de origem na tabela de destino. Podemos usar a cláusula Top na instrução INSERT INTO SELECT. Na consulta a seguir, ele insere a primeira linha da tabela Funcionários na tabela Clientes.
1
2
3
4
5
6
|
INSERT TOP (1) INTO Customers
(Emp_ID,
Nome
)
SELECT ID, nome
DE funcionários;
|
Exemplo 4: inserir usando ambas as colunas e valores definidos em a instrução SQL INSERT INTO SELECT
Nos exemplos anteriores, especificamos valores específicos na instrução INSERT INTO ou usamos INSERT INTO SELECT para obter registros da tabela de origem e inseri-los na tabela de destino.
Podemos combinar as colunas e os valores definidos na instrução SQL INSERT INTO SELECT.
Temos as seguintes colunas na tabela Clientes e Funcionários. Anteriormente, não inseríamos nenhum valor para a coluna Cidade. Também não temos os valores exigidos na tabela Employee. Precisamos especificar um valor explícito para a coluna Cidade.
Na consulta a seguir, especificamos um valor para a cidade coluna enquanto o restante dos valores inserimos da tabela Funcionários.
1
2
|
INSERT TOP (1) INTO Customers (Emp_ID, Name, City)
SELECT ID, Name, “Delhi” DE funcionários;
|
Na consulta a seguir, podemos ver que ele insere um linha (devido à cláusula Top (1)) junto com o valor da coluna Cidade.
Exemplo 5: INSERT INTO SELECT instrução com a cláusula Join para obter dados de várias tabelas
Podemos usar uma cláusula JOIN para obter dados de várias tabelas. Essas tabelas são unidas com condições especificadas com a cláusula ON. Suponha que desejamos obter dados de várias tabelas e inseri-los em uma tabela.
Neste exemplo, estou usando o banco de dados AdventureWorks2017. Primeiro, crie uma nova tabela com os tipos de dados apropriados.
Esta tabela deve conter registros da saída de uma consulta de junção de várias tabelas. Execute a seguinte consulta para inserir dados na tabela HumanResources.EmployeeData.
Exemplo 6: instrução INSERT INTO SELECT com expressão de tabela comum
Usamos Expressões de tabela comuns (CTE) para simplificar a junção complexa de várias colunas. No exemplo anterior, usamos JOINS em uma instrução Select para inserir dados em uma tabela SQL. Nesta parte, iremos reescrever a consulta com CTE.
Em uma CTE, podemos dividir o código em duas partes.
- Definimos CTE por uma cláusula WITH antes da instrução SELECT, INSERT, UPDATE, DELETE
- Uma vez que definimos CTE, podemos fazer referência a CTE semelhante a uma tabela SQL relacional
Execute o seguinte código para inserir dados usando um CTE.
Exemplo 7 : Instrução INSERT INTO SELECT com uma variável de tabela
Usamos variáveis de tabela de forma semelhante a uma tabela temporária. Podemos declará-los usando o tipo de dados da tabela. Esta tabela pode ser usada para realizar atividades no SQL Server onde não precisamos de uma tabela permanente. Você pode dividir a consulta a seguir em três partes.
- Crie uma variável de tabela SQL com os tipos de dados de coluna apropriados. Precisamos usar o tipo de dados TABLE para a variável de tabela
- Executar uma instrução INSERT INTO SELECT para inserir dados em uma variável de tabela
- Exibir o conjunto de resultados da variável de tabela
Conclusão
Neste artigo, exploramos os casos de uso da instrução INSERT INTO SELECT. Espero que você tenha achado este artigo útil. Sinta-se à vontade para fornecer feedback nos comentários abaixo.
- Autor
- Postagens recentes
Ele é o criador de uma das maiores coleções online gratuitas de artigos sobre um único tópico, com sua série de 50 partes sobre Grupos de Disponibilidade AlwaysOn do SQL Server. Com base em sua contribuição para a comunidade do SQL Server, ele foi reconhecido com vários prêmios, incluindo o prestigioso “Melhor autor do ano” continuamente em 2020 e 2021 na SQLShack.
Raj está sempre interessado em novos desafios, então se você precisar de consultoria ajuda em qualquer assunto abordado em seus escritos, ele pode ser contatado em [email protected]
Veja todas as postagens de Rajendra Gupta
- Executando atualizações de versões secundárias e principais para AWS RDS SQL Server – 29 de janeiro de 2021
- Implantando instâncias AWS RDS PostgreSQL – 27 de janeiro de 2021
- Migração de bancos de dados SQL locais para AWS RDS SQL Server usando AWS DMS – 25 de janeiro , 2021