Aqui aprenderemos a usar a instrução insert into select do MariaDB para inserir resultados de uma consulta em uma tabela. Isto dá certo porque a lista de valores(values) de um insert pode ter valores literais ou os resultados de um select.
A instrução insert into select é muito útil para copiar dados de uma tabela para outra ou para inserir um resumo de dados entre tabelas.
Sintaxe para INSERT INTO SELECT
insert into nome_tabela(lista_colunas) select lista_select from nome_tabela ...;
Aqui, primeiramente, especificamos o nome da tabela e uma lista de colunas que desejamos inserir dados. Depois especificamos o select que retornará resultados(result set).
As colunas da tabela do insert têm que corresponder em quantidade e tipo com a da tabela do select.
Tabelas que Serão Usadas nos Exemplos
Usaremos as tabelas countries e regions do banco de dados nation que baixamos no artigo: MariaDB e MySQL: Baixando Exemplo de Banco de Dados
Também criaremos uma pequena tabela chamada pequenos_paises.
Estrutura da tabela countries:
MariaDB [nation]> desc countries; +---------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------+------+-----+---------+----------------+ | country_id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(50) | YES | | NULL | | | area | decimal(10,2) | NO | | NULL | | | national_day | date | YES | | NULL | | | country_code2 | char(2) | NO | UNI | NULL | | | country_code3 | char(3) | NO | UNI | NULL | | | region_id | int(11) | NO | MUL | NULL | | +---------------+---------------+------+-----+---------+----------------+
Estrutura da tabela regions:
MariaDB [nation]> desc regions; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | region_id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | NULL | | | continent_id | int(11) | NO | MUL | NULL | | +--------------+--------------+------+-----+---------+----------------+
Crie a tabela pequenos_paises:
create table pequenos_paises( pais_id int primary key, nome varchar(50) not null, area decimal(10,2) not null );Exemplos de Uso de INSERT INTO SELECT
Inseriremos na tabela pequenos_paises, os países com áreas menores que 50.000 km2 que estão dentro da tabela countries:
insert into pequenos_paises (pais_id,nome,area) select country_id, name, area from countries where area < 50000;Vejamos o resultado:
Acabei não colocando todo o resultado por ser grande.
MariaDB [nation]> select * from pequenos_paises; +---------+----------------------------------------------+----------+ | pais_id | nome | area | +---------+----------------------------------------------+----------+ | 1 | Aruba | 193.00 | | 4 | Anguilla | 96.00 | | 5 | Albania | 28748.00 | | 6 | Andorra | 468.00 | | 7 | Netherlands Antilles | 800.00 | | 10 | Armenia | 29800.00 | | 11 | American Samoa | 199.00 | | 13 | French Southern territories | 7780.00 | | 14 | Antigua and Barbuda | 442.00 | | 18 | Burundi | 27834.00 | | 19 | Belgium | 30518.00 | | 24 | Bahrain | 694.00 | | 25 | Bahamas | 13878.00 | | 28 | Belize | 22696.00 | | 29 | Bermuda | 53.00 | | 32 | Barbados | 430.00 | | 33 | Brunei | 5765.00 | ........
Veja outro exemplo retirado de mariadbtutoriais:
#1 crie uma tabela chamada region_areas que armazena nomes e áreas de regiões.
create table region_areas( region_name varchar(100) not null, region_area decimal(15,2) not null, primary key(region_name) );
#2 consulte os dados das tabelas countries e regions e insira-os na tabela region_areas:
insert into region_areas (region_name, region_area) select regions.name, sum(area) from countries inner join regions using (region_id) group by regions.name;
#3 dados de consulta da tabela region_areas:
select * from region_areas order by region_area;
Veja o resultado: