Menu
Coddy logo textTech

Union

Parte da seção Fundamentos do Journey de SQL da Coddy. Lição 48 de 72.

Unions são diferentes de joins. Joins usam condições para combinar tabelas, mas unions apenas adicionam uma tabela em cima da outra. Para usar UNION, nós escrevemos:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

Ambos os selects devem obedecer às seguintes regras:

  • O número de campos deve ser igual
  • A ordem é importante
  • As colunas na mesma posição devem ter tipos de dados compatíveis

Por exemplo, vamos supor que temos as seguintes tabelas:

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

Problema: Queremos criar uma tabela grande com todos os nomes que temos.

SELECT name from germany_people
UNION
SELECT name from england_people

Resultado:

name
Lena
Leonie
George

UNION retorna apenas valores distintos, enquanto UNION ALL retorna todos os registros como estão:

SELECT name from germany_people
UNION ALL
SELECT name from england_people

Resultado:

name
Lena
Leonie
George
Lena

Você também pode combinar UNION ALL com funções de agregação, GROUP BY e ORDER BY para resumir dados em várias tabelas. O truque é envolver o UNION ALL dentro de uma subconsulta e, em seguida, aplicar o agrupamento e a ordenação sobre ele.

Por exemplo, suponha que queremos contar quantas vezes cada nome aparece em ambas as tabelas:

SELECT name, COUNT(*) AS total_count
FROM (
    SELECT name FROM germany_people
    UNION ALL
    SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESC

Resultado:

nametotal_count
Lena2
Leonie1
George1

Aqui, UNION ALL (não UNION) é usado para que duplicatas como Lena sejam mantidas — caso contrário, elas seriam removidas antes da contagem. A subconsulta combina todas as linhas e, em seguida, GROUP BY + COUNT as resumem. ORDER BY ordena o resultado final.

challenge icon

Desafio

Fácil

Tabelas e colunas disponíveis:

  • <strong>sales_2009</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2010</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2011</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>

Existem 3 tabelas de vendas.

Encontre a soma das vendas para cada produto de todas as tabelas juntas.

O resultado deve incluir o product_id e o total de vendas.

Nomeie esta coluna como total_sales.

Ordene os resultados pelo total de vendas em ordem decrescente.

Experimente você mesmo

-- Empilhe as três tabelas em um único resultado, mantendo todas as linhas
SELECT product_id, ____ AS total_sales
FROM (
    SELECT * FROM sales_2009
    ____
    SELECT * FROM sales_2010
    ____
    SELECT * FROM sales_2011
)
-- Uma linha por produto, maior total primeiro
GROUP BY ____
ORDER BY ____ DESC;
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Playground de SQL