MySQL UNION – Tutoriel complet
⚡ Résumé intelligent
MySQL L'instruction UNION combine les résultats de deux requêtes SELECT ou plus en un seul ensemble de résultats consolidé. Cette explication détaille les règles de colonnes qui rendent une union valide, la différence entre UNION DISTINCT et UNION ALL, et propose des exemples concrets exécutés sur la base de données myflixdb.
Qu'est-ce qu'un syndicat ? MySQL?
UNION est une MySQL L'opérateur `SELECT` combine les résultats de plusieurs requêtes SELECT en un seul ensemble de résultats consolidé. Les lignes renvoyées par la seconde requête sont placées sous celles renvoyées par la première, ce qui produit une seule liste verticale au lieu de deux listes distinctes.
La seule condition pour que cela fonctionne est que le nombre de colonnes soit identique dans toutes les requêtes SELECT à combiner.
Supposons que nous ayons deux tables comme suit.
Ces deux tables comportent deux colonnes identiques et peuvent donc être combinées. Les exemples suivants combinent précisément ces deux tables.
Pourquoi utiliser UNION ?
Supposons qu'il y ait un défaut dans la conception de votre base de données et que vous utilisiez deux tables différentes destinées au même usage. Vous souhaitez consolider ces deux tables en une seule tout en omettant les enregistrements dupliqués.ping dans la nouvelle table. Vous pouvez utiliser UNION dans ce cas.
Cet opérateur est également utile pour les tâches de reporting quotidiennes :
- Archidonnées vidéo et en direct : Il est possible de générer des rapports sur une table courante et une table d'archive partageant les mêmes colonnes, sans avoir à les fusionner physiquement.
- Plusieurs sources, un seul rapport : Les membres et les films, ou les ventes de deux régions, peuvent être listés dans un seul document pour un audit rapide.
- Contrôles de migration : Les lignes de l'ancienne table et de la nouvelle table peuvent être empilées et comparées avant que l'ancienne table ne soit supprimée.
Une union ne remplace pas une jointure. Une union ajoute des lignes sous les lignes, tandis qu'une jointure ajoute des colonnes à côté des colonnes ; cette distinction détermine l'opérateur à utiliser.
MySQL Syntaxe et règles de l'UNION
Maintenant que l'objectif est clair, examinez la structure de l'instruction et les règles appliquées par la base de données.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Trois règles régissent chaque syndicat :
- Nombre de colonnes égal. Chaque projet récompensé par un Instruction SELECT doit renvoyer le même nombre de colonnes, sinon MySQL génère l'erreur 1222.
- Types de données compatibles dans le même ordre. La première colonne de la première requête est mise en correspondance avec la première colonne de la seconde, donc un nombre doit correspondre à un nombre et un texte doit correspondre à un texte.
- Les noms proviennent de la première requête. L'en-tête du jeu de résultats est tiré de la première requête SELECT, c'est pourquoi tout alias doit y figurer.
An ORDER BY LIMIT La clause placée à la fin s'applique au résultat combiné plutôt qu'à une seule de ses branches, et elle doit faire référence aux noms de colonnes produits par la première requête SELECT.
UNION DISTINCT vs UNION ALL
Les règles étant établies, la décision restante est de savoir si les lignes dupliquées doivent être conservées.
Combinaison de tables à l'aide de DISTINCT
Créons maintenant une requête UNION pour combiner les deux tables en utilisant DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Ici, les lignes en double sont supprimées et seules les lignes uniques sont renvoyées.
À noter: MySQL utilise la clause DISTINCT par défaut lors de l'exécution de requêtes UNION si rien n'est spécifié.
Combinaison de tableaux utilisant TOUS
Créons maintenant une requête UNION pour combiner les deux tables en utilisant ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Les lignes en double sont incluses ici, car nous utilisons la fonction ALL.
Les deux images permettent de constater facilement la différence, et le tableau ci-dessous la résume.
| Point de comparaison | UNION DISTINCTE | UNION TOUS |
|---|---|---|
| Lignes en double | Retiré du résultat | Conservé dans le résultat |
| Comportement par défaut | Oui, appliqué lorsqu'aucune spécification n'est fournie. | Non, le mot-clé TOUS doit être écrit |
| Speed | Plus lentement, une passe de déduplication est nécessaire | Plus rapidement, les lignes sont renvoyées au fur et à mesure de leur lecture |
| Meilleur utilisé lorsque | La liste fusionnée doit contenir des lignes uniques. | Chaque ligne compte, sinon les doublons sont impossibles. |
Astuce : Si les deux branches ne peuvent pas produire de lignes en double, choisissez UNION ALL. La base de données évite alors le tri et la comparaison requis par DISTINCT, ce qui représente un gain appréciable pour les grandes tables.
Exemple pratique d'utilisation MySQL Workbench
Les exemples précédents utilisaient des tables fictives. La même requête est maintenant exécutée sur la véritable base de données myflixdb, où les deux tables contiennent des enregistrements très différents.
Dans notre base de données myFlixDB, combinons les membership_number et full_names colonnes de la table des membres avec les movie_id et title Les deux requêtes renvoient deux colonnes de la table « movies ». L'union est donc valide.
Nous pouvons utiliser la requête suivante.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Exécuter le script ci-dessus dans MySQL établi La requête SELECT sur la base de données myflixdb donne les résultats suivants (voir ci-dessous). Notez que les en-têtes proviennent de la première requête SELECT, même si les lignes suivantes correspondent à des enregistrements de films.
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |





