Menu
Coddy logo textTech

Union

Fait partie de la section Les fondamentaux du Journey SQL de Coddy. Leçon 48 sur 72.

Les unions sont différentes des jointures. Les jointures utilisent des conditions pour combiner des tables, mais les unions ajoutent simplement deux tables l'une au-dessus de l'autre. Pour utiliser UNION, nous écrirons :

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

Les deux requêtes SELECT doivent respecter les règles suivantes :

  • Le nombre de champs doit être identique
  • L'ordre est important
  • Les colonnes occupant la même position doivent avoir des types de données compatibles

Par exemple, supposons que nous ayons les tables suivantes :

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

Problème : Nous voulons créer une grande table de tous les noms que nous avons.

SELECT name from germany_people
UNION
SELECT name from england_people

Résultat :

name
Lena
Leonie
George

UNION retourne uniquement les valeurs distinctes tandis que UNION ALL retourne tous les enregistrements tels quels :

SELECT name from germany_people
UNION ALL
SELECT name from england_people

Résultat :

name
Lena
Leonie
George
Lena

Vous pouvez également combiner UNION ALL avec des fonctions d'agrégation, GROUP BY, et ORDER BY pour résumer des données à travers plusieurs tables. L'astuce consiste à envelopper le UNION ALL dans une sous-requête, puis à appliquer le groupement et le tri par-dessus.

Par exemple, supposons que nous voulions compter combien de fois chaque nom apparaît dans les deux tables :

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

Résultat :

nametotal_count
Lena2
Leonie1
George1

Ici, UNION ALL (et non UNION) est utilisé pour que les doublons comme Lena soient conservés — sinon ils seraient supprimés avant le comptage. La sous-requête fusionne toutes les lignes, puis GROUP BY + COUNT les résument. ORDER BY trie le résultat final.

challenge icon

Défi

Facile

Tables et colonnes disponibles :

  • <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>

Il y a 3 tables de ventes.

Calculez la somme des ventes pour chaque produit, toutes tables confondues.

Le résultat doit inclure le product_id et le total des ventes.

Nommez cette colonne total_sales.

Triez les résultats par total des ventes dans l'ordre décroissant.

Essayez vous-même

-- Empiler les trois tables en un seul résultat, en conservant chaque ligne
SELECT product_id, ____ AS total_sales
FROM (
    SELECT * FROM sales_2009
    ____
    SELECT * FROM sales_2010
    ____
    SELECT * FROM sales_2011
)
-- Une ligne par produit, le plus grand total en premier
GROUP BY ____
ORDER BY ____ DESC;
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les fondamentaux

Entraînez-vous par vous-même : Playground SQL