Como combinar os resultados de várias consultas SQL usando a declaração da União

Como combinar os resultados de várias consultas SQL usando a declaração da União

Em um artigo anterior, falamos sobre os vários tipos de JUNTAR Podemos usar em um banco de dados mariadb/mysql. Desta vez, em vez disso, damos uma olhada no UNIÃO Declaração: como funciona, como podemos usá -lo para combinar o resultado de consultas executadas em tabelas diferentes e quais são suas peculiaridades.

Neste tutorial, você aprenderá:

  • Como usar a declaração da união em um servidor mariadb/mysql
  • Quais são as propriedades da declaração da União


O resultado de uma declaração sindical

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente do OS
Programas Um banco de dados MARIADB/MYSQL em funcionamento
Outro Conhecimento básico do banco de dados MARIADB/MYSQL
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

A declaração da União

O UNIÃO Declaração Vamos combinar os resultados de duas ou mais consultas. Enquanto, ao realizar uma junção, podemos executar algum tipo de ação ou recuperar informações adicionais sobre a base das relações existentes entre tabelas, ao usar o UNIÃO Declaração, se algumas condições forem atendidas, as linhas resultantes de consultas lançadas em tabelas diferentes, mesmo não relacionadas, podem ser combinadas. Neste tutorial, veremos um exemplo básico e do mundo real de como podemos usar o UNIÃO Declaração em um ambiente Mariadb/MySQL.

Um exemplo básico

Vamos começar com um exemplo muito básico para apresentar as peculiaridades do UNIÃO declaração. Suponha que tenhamos duas tabelas completamente não relacionadas: o primeiro chamado "filme" e o segundo "cor". No primeiro, cada linha contém informações sobre um filme: o título, o gênero e a data de lançamento. Este último hospeda o nome de algumas cores. Aqui está como as tabelas se parecem:

+----+---------------+---------+--------------+ | id | título | gênero | release_date | +----+---------------+---------+--------------+| 1 | Uma nova esperança | fantasia | 1977-05-25 | | 2 | O padrinho | Drama | 1972-05-24 | +----+---------------+---------+--------------++- -+ --------+ | id | nome | +----+--------+| 1 | azul | | 2 | Amarelo | +----+--------+ 
cópia de

E esta é a descrição deles:

+--------------+-------------+------+-----+---------+----------------+ | Campo | Tipo | Nulo | Chave | Padrão | Extra | +--------------+-------------+------+-----+------- -+ ----------------+ | id | int (2) | Não | PRI | Nulo | Auto_increment | | título | Varchar (20) | Não | | Nulo | | | gênero | Varchar (20) | Não | | Nulo | | | release_date | data | Não | | Nulo | | +--------------+-------------+------+-----+------- -+------------------++-------+-------------+------+ -----+---------+----------------+| Campo | Tipo | Nulo | Chave | Padrão | Extra | +-------+-------------+------+-----+---------+---- ------------+ | id | int (2) | Não | PRI | Nulo | Auto_increment | | nome | Varchar (10) | Não | | Nulo | | +-------+-------------+------+-----+---------+----------------+ 
cópia de

Como dito antes, essas duas tabelas não têm absolutamente nenhuma conexão entre si. Usando o UNIÃO Declaração, no entanto, podemos combinar os resultados de duas consultas separadas lançadas nelas. Vamos correr:

Selecione o título, gênero do filme Union Select ID, nome da cor;

O comando acima retorna o seguinte resultado:

+---------------+---------+ | título | gênero | +-----------------+---------+| Uma nova esperança | fantasia | | O padrinho | Drama | | 1 | azul | | 2 | Amarelo | +---------------+---------+ 
cópia de

Vamos explicar. Nós realizamos dois diferentes Selecione Consultas: No primeiro, selecionamos o valor das colunas "título" e "gênero" para cada linha da tabela de filmes. No segundo, em vez disso, selecionamos as colunas "id" e "nome" da tabela "cor", novamente sem usar nenhum filtro.

Mesmo que as duas tabelas não estejam completamente relacionadas, já que usamos o UNIÃO Declaração entre as duas consultas, as linhas retornadas por cada uma delas são combinadas: o resultado é a tabela que você pode ver acima.

Mesmo que na grande maioria dos casos do mundo real as colunas selecionadas das tabelas envolvidas provavelmente tenham os mesmos tipos de dados, no exemplo bobo acima, podemos ver claramente como o UNIÃO acontece mesmo que as colunas das duas tabelas originais contenham diferentes tipos de dados: ambos a coluna selecionada da tabela "filme" são do Varchar Tipo de dados, enquanto a coluna "ID" da tabela "cor" é do tipo Int. Isso é possível porque o banco de dados executa automaticamente as conversões de dados necessárias.



Outra coisa muito importante a perceber é que as colunas no UNIÃO resultado, herdou seus nomes daqueles selecionados no primeiro consulta, a à esquerda do UNIÃO Palavra -chave: “Título” e “Gênero”. Olhar para o exemplo acima provavelmente faria você perguntar o que o UNIÃO A declaração pode ser útil no cenário da vida real: vamos ver outro exemplo.

O caso de futebol de fantasia

Algum tempo atrás, eu estive envolvido na criação de um pequeno aplicativo de futebol de fantasia. No banco de dados do aplicativo, havia uma tabela chamada "Club", que organizou informações sobre os clubes de fantasia envolvidos na competição. Este é um extrato dele:

+----+-----------------+--------+ | id | nome | orçamento | +----+-----------------+--------+| 1 | Havana Blu | 4 | | 2 | Longobarda | 4 | | 3 | Real Siderno | 0 | | 4 | Equipe de terremoto | 66 | | 5 | KALAPAGOS | 33 | | 6 | Cantasant | 5 | | 7 | F.C. Mojito | 0 | | 8 | Apoel nicotina | 1 | | 9 | Dharma | 0 | | 10 | Real 1908 | 12 | +----+-----------------+--------+ 
cópia de

No mesmo projeto, também havia uma chamada de tabela “Calendário”, na qual cada linha representava uma partida entre dois dos clubes listados acima. Como tínhamos 10 clubes, cada dia do campeonato sediou um total de 5 partidas. Como exemplo, aqui está um extrato de todas as correspondências dos quatro primeiros dias:

+----+-----+------+-------------+-------+--------------+ | id | dia | host | host_scores | convidado | Guest_Scores | +----+-----+------+-----------+-------+--------- -----+ | 1 | 1 | 2 | 75.5 | 8 | 67 | | 2 | 1 | 4 | 80 | 6 | 77 | | 3 | 1 | 7 | 63 | 9 | 71.5 | | 4 | 1 | 3 | 79.5 | 5 | 68 | | 5 | 1 | 10 | 64 | 1 | 72.5 | | 6 | 2 | 5 | 66.5 | 10 | 65.5 | | 7 | 2 | 9 | 82 | 3 | 62.5 | | 8 | 2 | 6 | 83 | 7 | 69.5 | | 9 | 2 | 8 | 77 | 4 | 79.5 | | 10 | 2 | 1 | 67 | 2 | 81.5 | | 11 | 3 | 4 | 73 | 2 | 58 | | 12 | 3 | 7 | 70.5 | 8 | 75.5 | | 13 | 3 | 3 | 66.5 | 6 | 88 | | 14 | 3 | 10 | 74.5 | 9 | 60.5 | | 15 | 3 | 5 | 68.5 | 1 | 72.5 | | 16 | 4 | 9 | 68 | 5 | 69 | | 17 | 4 | 6 | 60 | 10 | 66 | | 18 | 4 | 8 | 70.5 | 3 | 73.5 | | 19 | 4 | 2 | 71.5 | 7 | 79 | | 20 | 4 | 1 | 68.5 | 4 | 68 | +----+-----+------+-------------+-------+--------------+ 
cópia de

A primeira coluna de cada linha contém um Chave substituta usado como o chave primária para a tabela. O segundo contém o número inteiro representando o dia em que a partida faz parte de. O hospedar, host_scores, e convidado, convidado_scores As colunas contêm, respectivamente, o ID e as pontuações do clube, que tocaram como apresentador e as do clube que tocavam como convidado.



Agora, digamos que queremos gerar uma classificação na qual todos os clubes estão listados em ordem decrescente na base do total de pontuações que se apresentaram nos quatro primeiros dias do campeonato. Se cada ID do clube fosse listado apenas em uma coluna, digamos "host", a operação seria muito fácil: apenas calcularíamos a soma das pontuações usando o SOMA() Função agregada e agrupe os resultados pelo ID dos clubes, exibindo -os em ordem decrescente:

Selecione Host, SUM (Host_Scores) como Total_Scores do grupo de calendário por ordem do host por Total_Scores Desc
cópia de

No entanto, como cada dia do campeonato, um clube joga como hospedeiro e como convidado, a consulta acima não retornaria os resultados que queremos, mas produziria o total de uma equipe, incluindo apenas as pontuações feitas quando tocadas como host (ou alternativamente, como convidado).

Esse é um caso em que o UNIÃO A declaração pode ser útil: podemos executar duas consultas separadas, uma envolvendo as colunas "host" e "host_scores" e a outra envolvendo as "convidadas" e as "Guest_scores"; Podemos então usar o UNIÃO Declaração para anexar a linha resultante da segunda consulta aos retornados pelo primeiro e finalmente calcule os valores agregados. Além disso, podemos realizar uma junção com a tabela "Clube", para fazer com que o nome de cada clube apareça no resultado. Aqui está a consulta completa:

Selecione dados.team_id, clube.Nome, Sum (Scores) como Total_Scores de (Selecione Host como Team_id, Host_Scores como pontuações da União do Calendário Todos Selecionar Guest, Guest_Scores do Calendar) como Dados Junte -se ao Clube no Clube.id = dados.Grupo Team_id por dados.TEAM_ID ORDEM POR TOTAL_SCORES DESC; 
cópia de

Aqui está o resultado da consulta:

+---------+-----------------+--------------+ | team_id | nome | total_scores | +---------+-----------------+--------------+| 6 | Cantasant | 308 | | 4 | Equipe de terremoto | 300.5 | | 8 | Apoel nicotina | 290 | | 2 | Longobarda | 286.5 | | 3 | Real Siderno | 282 | | 9 | Dharma | 282 | | 7 | F.C. Mojito | 282 | | 1 | Havana Blu | 280.5 | | 5 | KALAPAGOS | 272 | | 10 | Real 1908 | 270 | +---------+-----------------+--------------+ 
cópia de

Como você pode ver, no final do quarto dia do campeonato, o time "Cantasant" foi o único com as pontuações mais altas. Outra coisa a perceber na consulta acima é o uso do TODOS palavra -chave junto com UNIÃO: era necessário porque quando o UNIÃO A declaração é usada, por padrão, as linhas duplicadas são removidas; se Union All é usado, em vez disso, as linhas são preservadas.

Conclusões

Neste tutorial, aprendemos a conhecer o UNIÃO Declaração nos bancos de dados Mariaadb/MySQL. Vimos um exemplo básico para demonstrar algumas das propriedades da declaração e um exemplo do mundo real, retirado de um projeto real. Para resumir, as características de um UNIÃO declaração:

  • Na tabela resultante, o nome das colunas selecionadas na primeira consulta são usadas;
  • O número de colunas deve ser o mesmo em todas as consultas;
  • Os tipos de dados das colunas podem ser diferentes, o banco de dados executará a conversão;
  • Por padrão, quando o UNIÃO A declaração é usada, linhas duplicadas nos resultados são removidas: para evitar isso, podemos usar Union All ;

Aceite mais expandir seu conhecimento da declaração da União, você pode dar uma olhada na documentação oficial.

Tutoriais do Linux relacionados:

  • Instale o MySQL no Ubuntu 20.04 LTS Linux
  • Como instalar o MySQL no Almalinux
  • Ubuntu 20.04 WordPress com instalação do Apache
  • Coisas para instalar no Ubuntu 20.04
  • Introdução aos mecanismos de armazenamento MySQL
  • Instalação do Ampache Raspberry Pi
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Como criar uma pilha de lâmpadas à base de docker usando o docker em…
  • Como alterar a senha do usuário do mariadb
  • Como persistir dados para pós -grausql em java