Maison / l'Internet / Opérateur pour travailler avec les ensembles UNION. Union de UNION et UNION ALL en SQL - description et exemples Paramètres ou argument

Opérateur pour travailler avec les ensembles UNION. Union de UNION et UNION ALL en SQL - description et exemples Paramètres ou argument

Dans ce tutoriel, vous apprendrez à utiliser l'instruction SQL UNION TOUS avec syntaxe et exemples.

Description

L'opérateur SQL UNION ALL est utilisé pour combiner les jeux de résultats de 2 instructions SELECT ou plus. Il ne supprime pas les lignes en double entre les différentes instructions SELECT (toutes les lignes sont renvoyées).
Chaque instruction SELECT dans UNION ALL doit avoir le même nombre de champs dans les jeux de résultats avec les mêmes types de données.

Quelle est la différence entre UNION et UNION TOUS ?

  • L'opérateur UNION supprime les lignes en double.
  • UNION TOUS Pas supprime les lignes en double

Syntaxe

Syntaxe de l'opérateur UNION ALL dans SQL.

Paramètres ou argument

expression1 , expression2 , expression_n Les colonnes ou calculs que vous souhaitez récupérer. Les tables à partir desquelles vous souhaitez récupérer les enregistrements. La clause FROM doit spécifier au moins une table WHERE conditions Facultatives. Conditions à remplir pour que les enregistrements soient sélectionnés

Note

  • Les deux requêtes SELECT doivent avoir le même nombre d'expressions
  • Les expressions correspondantes doivent avoir le même type de données dans les requêtes SELECT. Par exemple : expression1 doit avoir le même type de données dans la première et la deuxième instruction SELECT.
  • Voir aussi opérateur

Exemple - champ unique avec le même nom

Voyons comment utiliser l'opérateur SQL UNION ALL, qui renvoie un seul champ. Dans cet exemple simple, le champ des deux instructions SELECT aura le même nom et le même type de données.
Par exemple.

PgSQL

SELECT fournisseur_id

DES fournisseurs

UNION TOUS

SELECT fournisseur_id

DE commandes

COMMANDE PAR fournisseur_id ;

Cet exemple UNION ALL SQL renverra supplier_id plusieurs fois dans le jeu de résultats si la même valeur apparaît dans les tables des fournisseurs et des commandes. Instruction SQL UNION ALL Pas supprime les doublons. Si vous souhaitez supprimer les doublons, essayez d'utiliser l'opérateur UNION.
Regardons maintenant cet exemple et fournissons quelques données ci-dessous.

Et vous avez exécuté l’instruction UNION ALL suivante.

PgSQL

SELECT fournisseur_id FROM fournisseurs UNION ALL SELECT fournisseur_id FROM commandes ORDER BY fournisseur_id ;

Comme vous pouvez le voir dans cet exemple, UNION ALL a pris toutes les valeurs supplier_id de la table des fournisseurs ainsi que de la table des commandes et a renvoyé un ensemble de résultats combinés. Les doublons n'ont pas été supprimés, comme vous pouvez le voir par la valeur supplier_id 2000 apparaissant deux fois dans le jeu de résultats.

Exemple - différents noms de champs

Les colonnes correspondantes dans chaque instruction SELECT n'ont pas besoin d'avoir les mêmes noms, mais elles doivent avoir les mêmes types de données correspondants.
Si vous n'avez pas les mêmes noms de colonnes dans vos instructions SELECT, cela devient un peu délicat, surtout si vous souhaitez trier les résultats de la requête à l'aide de la clause ORDER BY.
Voyons comment utiliser l'opérateur UNION ALL avec différents noms de colonnes et classer les résultats de la requête.
Par exemple.

PgSQL

Dans cet exemple UNION ALL SQL, étant donné que les noms de colonnes dans les deux instructions SELECT sont différents, il est plus avantageux de faire référence aux colonnes de la clause ORDER BY par leur position dans le jeu de résultats. Dans cet exemple, nous avons trié les résultats par supplier_id / company_id par ordre croissant, comme indiqué par ORDER BY 1 . Les champs supplier_id/company_id sont en position n°1 dans le jeu de résultats.
Examinons maintenant de plus près cet exemple avec des données.
Si vous aviez une table de fournisseurs remplie avec les enregistrements suivants.

Et vous avez exécuté la requête suivante contenant UNION ALL.

En majorité Requêtes SQL un seul opérateur est utilisé pour renvoyer les données d’une ou plusieurs tables. SQL vous permet également d'exécuter plusieurs requêtes distinctes simultanément et d'afficher le résultat sous la forme d'un seul ensemble de données. De telles requêtes combinées sont généralement appelées combinaisons ou requêtes complexes.

1. Utilisation de l'opérateur UNION

Requêtes en langage SQL sont combinés à l'aide de l'opérateur SYNDICAT. Pour ce faire, vous devez préciser chaque demande SÉLECTIONNER et placez le mot-clé entre eux SYNDICAT. Limites du nombre d'opérateurs utilisés SYNDICAT dans une demande générale no. Dans la section précédente, nous avons noté que Accéder n'a pas la capacité de créer jointure externe complète, nous allons maintenant voir comment nous pouvons y parvenir via l'opérateur SYNDICAT.

SÉLECTIONNER *
DEPUIS Sumproduct GAUCHE REJOINDRE Sellers ON Sumproduct.City = Sellers.City
SYNDICAT
SÉLECTIONNER *

DEPUIS Sumproduct REJOIGNEZ À DROITE Vendeurs SUR Sumproduct.City = Sellers.City

Nous voyons que la requête affiche à la fois toutes les colonnes de la première table et de l'autre, que tous les enregistrements aient ou non des correspondances dans l'autre table.

Il convient également de noter que dans de nombreux cas, au lieu de SYNDICAT nous pouvons utiliser la suggestion avec de nombreuses conditions, et obtenez un résultat similaire. Cependant, en raison de SYNDICAT les entrées semblent plus concises et compréhensibles. Il est également nécessaire de suivre certaines règles lors de l'écriture de requêtes combinées :

  • demande SYNDICAT doit inclure deux ou plusieurs déclarations SÉLECTIONNER, séparés par un mot clé SYNDICAT(c'est-à-dire que si une requête utilise quatre instructions SELECT, alors il doit y avoir trois mots-clés UNION)
  • chaque demande dans la déclaration SYNDICAT doivent avoir les mêmes colonnes, expressions ou fonctions statistiques, qui doivent en outre être répertoriées dans le même ordre
  • Les types de données de colonne doivent être compatibles. Il n'est pas nécessaire qu'ils soient du même type, mais ils doivent être d'un type similaire pour pouvoir SGBD pourrait les convertir de manière unique (par exemple, il pourrait s'agir de différents types de données numériques ou de différents types de date).

2. Activez ou désactivez les lignes répétitives

Demande de SYNDICAT supprime automatiquement toutes les lignes en double du jeu de résultats de la requête (c'est-à-dire se comporte comme des phrases avec plusieurs conditions dans une seule instruction SÉLECTIONNER). Ce comportement de l'opérateur SYNDICAT par défaut, mais nous pouvons changer cela si nous le souhaitons. Pour ce faire, nous devons utiliser l'opérateur UNION TOUS au lieu de SYNDICAT.

3. Tri des résultats des requêtes combinées

Résultats de l'exécution de l'instruction SÉLECTIONNER trié à l'aide d'une clause COMMANDÉ PAR. Lors de la combinaison de requêtes à l'aide de SYNDICAT une seule phrase COMMANDÉ PAR peut être utilisé et doit être inclus dans la dernière déclaration SÉLECTIONNER. En effet, en pratique, cela ne sert à rien de trier une partie des résultats dans un ordre et l’autre partie dans un autre. Par conséquent, quelques suggestions COMMANDÉ PAR l'utilisation n'est pas autorisée.

La leçon couvrira le sujet de l'utilisation des opérations de requêtes d'union, d'intersection et de différence. Exemples d'utilisation Requête SQL Union, Exists et utilisation des mots-clés SOME, ANY et All. Fonctions de chaîne couvertes


Vous pouvez effectuer les opérations d'union, de différence et de produit cartésien sur un ensemble. Les mêmes opérations peuvent être utilisées dans les requêtes SQL (effectuer des opérations avec des requêtes).

Un mot spécial est utilisé pour combiner plusieurs requêtes SYNDICAT.
Syntaxe:

< запрос 1 >UNION[TOUS]< запрос 2 >

<запрос 1>SYNDICAT<запрос 2>

La requête Union SQL est utilisée pour combiner les lignes de sortie de chaque requête en un seul jeu de résultats.

Si utilisé paramètre TOUS, alors toutes les lignes de sortie en double sont enregistrées. Si le paramètre est manquant, seules les lignes uniques restent dans le jeu de résultats.

Vous pouvez combiner n’importe quel nombre de requêtes ensemble.

L'utilisation de l'opérateur UNION nécessite que plusieurs conditions soient remplies :

  1. le nombre de colonnes de sortie de chaque requête doit être le même ;
  2. les colonnes de sortie de chaque requête doivent être comparables entre elles par type de données (par ordre de priorité) ;
  3. l'ensemble résultant utilise les noms de colonnes spécifiés dans la première requête ;
  4. ORDER BY ne peut être utilisé qu'à la fin d'une requête composée car il s'applique au résultat de la jointure.

Exemple: Afficher les prix des ordinateurs et des ordinateurs portables, ainsi que leurs numéros (c'est-à-dire, décharger de deux tables différentes en une seule requête)


✍Solution :
1 2 3 4 5 6 SELECT `Nombre`, `Prix` FROM pc UNION SELECT `Nombre`, `Prix` FROM notebook ORDER BY `Prix`

SELECT `Nombre`, `Prix` FROM pc UNION SELECT `Nombre`, `Prix` FROM notebook ORDER BY `Prix`

Résultat:

Regardons un exemple plus complexe avec une jointure interne :

Exemple: Trouver le type de produit, le nombre et le prix des ordinateurs et ordinateurs portables


✍Solution :
1 2 3 4 5 6 7 8 Sélectionner un produit. `Type` , pc. `Numéro`, `Prix` DEPUIS le produit INNER JOIN SUR le PC. `Numéro` = produit. Produit UNION SELECT `Numéro`. `Type`, cahier. `Numéro`, `Prix` DEPUIS le notebook INNER JOIN produit SUR le notebook. `Numéro` = produit. `Nombre` ORDER PAR `Prix`

SELECT product.`Type` , pc.`Number` , `Price` FROM pc INNER JOIN product ON pc.`Number` = produit.`Number` UNION SELECT product.`Type` , notebook.`Number` , `Price` FROM notebook INNER JOIN produit ON notebook.`Number` = produit.`Number` ORDER BY `Price`

Résultat:

Union SQL 1. Trouvez le fabricant, le numéro de pièce et le prix de tous les ordinateurs portables et imprimantes

Union SQL 2. Trouvez les numéros et les prix de tous les produits fabriqués par le fabricant Russie

Le prédicat d'existence SQL EXISTE

SQL dispose de fonctionnalités permettant d'effectuer des opérations d'intersection et de différence sur les requêtes : la clause INTERSECT (intersection) et la clause EXCEPT (différence). Ces clauses fonctionnent de la même manière que UNION : le jeu de résultats inclut uniquement les lignes présentes dans les deux requêtes - INTERSECT, ou uniquement les lignes de la première requête qui manquent dans la seconde - EXCEPT. Mais le problème est que de nombreux SGBD ne prennent pas en charge ces propositions. Mais il existe un moyen de s'en sortir : utiliser le prédicat EXISTS.

Le prédicat EXISTS est évalué à TRUE si la sous-requête renvoie au moins quelques lignes ; sinon, EXISTS est évalué à FALSE. Il existe également un prédicat NOT EXISTS, qui fait le contraire.

EXISTS est généralement utilisé dans les sous-requêtes dépendantes (par exemple, IN).

EXISTE (sous-requête de table)

Exemple: Trouvez des fabricants d'ordinateurs qui produisent également des ordinateurs portables


✍Solution :

SELECT Fabricant DISTINCT FROM produit AS pc_product WHERE Type = "Ordinateur" ET EXISTE (SELECT Fabricant FROM produit WHERE Type = "Ordinateur portable" ET Fabricant = pc_product.Manufacturer)

Résultat:

Trouvez les fabricants d'ordinateurs qui ne fabriquent pas d'imprimantes

SQL QUELQUES Mots-clés | TOUT et TOUS

Les mots-clés SOME et ANY sont synonymes, vous pouvez donc utiliser l'un ou l'autre dans votre requête. Le résultat d'une telle requête sera une colonne de valeurs.

Syntaxe:

< выражение>< оператор сравнения>CERTAINS | N'IMPORTE LEQUEL (< подзапрос> )

<выражение><оператор сравнения>CERTAINS | N'IMPORTE LEQUEL (<подзапрос>)

Si, pour une valeur X renvoyée par une sous-requête, le résultat de l'opération " " renvoie TRUE , alors le prédicat ANY est également évalué à TRUE .

Exemple: Trouver des fournisseurs d'ordinateurs dont les numéros ne sont pas en vente (c'est-à-dire pas dans le tableau PC)


✍Solution :

Données sources du tableau :

Résultat:

Dans l'exemple, le prédicat Number = ANY(SELECT Number FROM pc) renverra la valeur TRUE lorsque le Number de la requête principale sera trouvé dans la liste des Numbers de la table pc (renvoyée par la sous-requête). De plus, NOT est utilisé. L'ensemble de résultats sera composé d'une colonne - Fabricant. Pour éviter qu'un fabricant soit affiché plusieurs fois, le mot de service DISTINCT a été introduit.
Voyons maintenant l'utilisation du mot-clé ALL :

Exemple: Trouvez le nombre et les prix d'ordinateurs portables qui coûtent plus cher que n'importe quel ordinateur


✍Solution :

Important: Il convient de noter qu'en général, une requête avec ANY renvoie un ensemble de valeurs. Par conséquent, l'utilisation d'une sous-requête dans une clause WHERE sans les opérateurs EXISTS , IN , ALL et ANY , qui produisent une valeur booléenne, peut entraîner une erreur d'exécution de la requête.


Exemple: Trouver le nombre et les prix des ordinateurs dont le coût dépasse le coût minimum des ordinateurs portables


✍Solution :


Cette requête est correcte car l'expression scalaire Prix est comparée à une sous-requête qui renvoie une valeur unique

Fonctions pour travailler avec des chaînes en SQL

La fonction LEFT coupe le nombre de caractères spécifié par le deuxième argument à partir de la gauche d'une chaîne :

GAUCHE (<строка>,<число>)

La fonction RIGHT renvoie le nombre spécifié de caractères à droite d'une expression de chaîne :

DROITE(<строка>,<число>)

Exemple: Imprimez les premières lettres des noms de tous les fabricants


✍Solution :

SELECT DISTINCT LEFT(`Fabricant`, 1) FROM `product`

Résultat:

Exemple: Imprimer les noms de fabricants commençant et se terminant par la même lettre


✍Solution :

Fonction de remplacement SQL

Syntaxe:

SELECT `nom` , REPLACE(`nom` , "a", "aa") FROM `enseignants`

Il est temps de parler de la combinaison des données par des moyens de conception syndicat Et syndicat tous, car cela est parfois très utile, et parfois il est impossible de se passer d'une telle conception. Nous écrirons des exemples dans le SGBD MSSQL 2008 en utilisant le langage SQL.

Et je voudrais commencer par le fait que vous et moi avons déjà examiné de nombreux exemples de demandes d'écriture de SQL, par exemple, l'instruction select du langage SQL, ou l'utilisation de fonctions de chaîne SQL, est également prise en compte dans la programmation à la fois en plpgsql et en transact-sql, par exemple, Comment écrire une fonction en PL/pgSQL et Transact-sql - Fonctions de table et tables temporaires respectivement.

J'ai indiqué les articles ci-dessus pour une raison, mais je les ai indiqués car pour une meilleure compréhension et assimilation de la leçon d'aujourd'hui, vous avez besoin de connaissances de base (il s'agit d'un site pour programmeurs débutants), que vous pouvez obtenir à partir du matériel mentionné ci-dessus.

Alors commençons. Et d’abord, regardons ce que sont ces syndicats et tous les opérateurs syndicaux.

Que sont UNION et UNION ALL en SQL ?

  • SYNDICAT est une instruction SQL pour combiner l'ensemble de résultats de plusieurs requêtes, et cet opérateur ne génère que des lignes uniques dans les requêtes, c'est-à-dire par exemple, vous combinez deux requêtes et chacune d'elles contient les mêmes données, c'est-à-dire complètement identiques, et l'opérateur union les combinera en une seule ligne pour qu'il n'y ait pas de doublons ;
  • UNION TOUS est un opérateur SQL permettant de combiner l'ensemble de données résultant de plusieurs requêtes, mais cet opérateur affichera absolument toutes les lignes, même les doublons.

Conditions préalables au syndicat et à l'union de tous les opérateurs

  1. Le champ défini doit être même dans toutes les demandes, c'est-à-dire le nombre de champs dans chaque requête qui seront combinés à l'aide de l'union ou de l'union toutes les constructions doit être le même ;
  2. Types de données les champs doivent également correspondre dans chaque demande, c'est-à-dire par exemple, si vous souhaitez écrire une requête dans laquelle le type de données est int et dans la deuxième requête le type de données est varchar, alors votre requête ne sera pas exécutée et la fenêtre de requête affichera une erreur ;
  3. En cas de tri, l'opérateur commandé par vous pouvez seulement préciser après la dernière demande.

Parlons maintenant du moment où nous pourrions avoir besoin d'utiliser ces opérateurs. Eh bien, par exemple, vous disposez de plusieurs bases de données avec une structure similaire, chacune étant créée, par exemple, pour une succursale, et vous devez combiner ces données pour fournir des rapports pour toutes les succursales à la direction, et le moyen le plus simple de le faire consiste à écrire des requêtes en SQL, dont chacune accédera à des bases de données différentes, et à utiliser la construction union ou union all pour les combiner. De plus, il est parfois nécessaire de combiner les données dans une seule base de données de telle sorte que cela ne puisse pas être réalisé avec des syndicats ordinaires et que vous deviez utiliser un syndicat. Pourquoi je dis « devoir », c'est parce que cette construction augmente considérablement le temps d'exécution des requêtes, si, par exemple, il y a beaucoup de données, et qu'il n'est pas nécessaire d'en abuser.

Assez de théorie, passons à la pratique.

Note! Comme déjà mentionné, nous écrirons des requêtes dans Management Studio pour SQL Server 2008

Exemples d'utilisation d'union et d'union all

Tout d'abord, créons deux tables simples test_table et test_table_2

CREATE TABLE ( IDENTITY(1,1) NOT NULL, (18, 0) NULL, (50) NULL, CONTRAINTE CLÉ PRIMAIRE CLUSTERED ( ASC)AVEC (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO SET ANSI_PADDING OFF GO --et la deuxième table CREATE TABLE ( IDENTITY(1,1) NOT NULL, (18, 0) NULL, (50) NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)AVEC ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO SET ANSI_PADDING OFF GO

Ce sont les mêmes par exemple, juste des noms différents. Je les ai remplis avec les données suivantes :

Écrivons maintenant une requête qui combinera les données résultantes en une seule, par exemple via une union. La syntaxe est très simple :

Demande 1 syndicat Demande 2 syndicat Demande 3, etc.

Voici la demande :

Sélectionnez le numéro, le texte de test_table union sélectionnez le numéro, le texte de test_table_2

Comme vous pouvez le voir, seules 5 lignes ont été affichées, puisque la première ligne de la première requête et la première ligne de la deuxième requête sont les mêmes, elles ont donc été combinées.

Maintenant, unissons-nous via l'union de tous

Voici la demande :

Sélectionnez le numéro, le texte de test_table union all select number, le texte de test_table_2

Toutes les lignes ont déjà été affichées ici, puisque nous avons spécifié union all.

Voyons maintenant quelles erreurs peuvent survenir même dans cette simple requête. Par exemple, nous avons mélangé la séquence de champs :

Ou nous avons spécifié un champ supplémentaire dans la première requête, mais ne l'avons pas fait dans la seconde.

De plus, par exemple, lors de l'utilisation de order by :

Ici nous avons précisé le tri dans chaque requête, mais il n'était nécessaire que dans la dernière, par exemple :

Sélectionnez le numéro, le texte de test_table union tous sélectionnez le numéro, le texte de test_table_2 commandez par numéro

Et enfin, je voulais vous parler d'une astuce qui peut être utilisée lorsque, par exemple, vous devez toujours afficher un champ dans une requête, mais dans d'autres, il n'est pas là ou il n'est tout simplement pas nécessaire, pour cela vous pouvez écrire la demande suivante :

Sélectionnez l'identifiant, le numéro, le texte de test_table union, sélectionnez tous "", le numéro, le texte de test_table_2

ceux. Comme vous pouvez le constater, il suffit de mettre le champ vide là où il doit être et la requête fonctionnera parfaitement, par exemple :

Probablement tout ce que je voulais vous dire sur le design union et union de tout le langage SQL J'ai dit, si vous avez des questions sur l'utilisation de ces opérateurs, posez-les dans les commentaires. Bonne chance!

Dans ce tutoriel, vous apprendrez à utiliser Opérateur MySQL UNION avec syntaxe et exemples.

Description

Opérateur MySQL UNION utilisé pour combiner les ensembles de résultats de 2 clauses SELECT ou plus. Il supprime les lignes en double entre les différentes clauses SELECT.

Chaque clause SELECT de l'opérateur UNION doit avoir le même nombre de champs dans les jeux de résultats avec les mêmes types de données.

Syntaxe

La syntaxe de l'opérateur UNION dans MySQL est :

Paramètres ou arguments

expression1 , expression2 , ... expression_n sont les colonnes ou les calculs que vous souhaitez renvoyer.
tables - tables à partir desquelles vous souhaitez obtenir des enregistrements. Il doit y avoir au moins une table répertoriée dans la clause FROM.
Conditions OÙ - facultatives. Conditions qui doivent être remplies pour les enregistrements sélectionnés.
DISTINCT - facultatif. Supprime les doublons du jeu de résultats, mais l'inclusion du modificateur DISTINCT n'affecte pas le jeu de résultats de l'opérateur UNION car l'opérateur UNION supprime déjà les doublons par défaut.

Note

  • Les deux clauses SELECT doivent avoir le même nombre d'expressions.
  • Étant donné que l'opérateur UNION supprime par défaut toutes les lignes en double du jeu de résultats, le fait de fournir le modificateur UNION DISTINCT n'affecte pas les résultats.
  • Les noms de colonnes de la première clause SELECT de l'instruction UNION sont utilisés comme noms de colonnes pour le jeu de résultats.

Exemple renvoyant un champ

Vous trouverez ci-dessous un exemple d'opérateur MySQL UNION qui renvoie un champ à partir de plusieurs clauses SELECT (et les deux champs ont le même type de données) :

MySQL

SELECT supplier_id FROM fournisseurs UNION SELECT supplier_id FROM order_details ;

SELECT fournisseur_id

DES fournisseurs

SYNDICAT

SELECT fournisseur_id

DE détails_commande ;

Dans cet exemple d'opérateur MySQL UNION, si supplier_id est utilisé à la fois dans les tables fournisseurs et order_details, il apparaîtra une fois dans votre jeu de résultats. L'opérateur MySQL UNION supprimera les doublons. Si vous ne souhaitez pas supprimer les doublons, essayez d'utiliser l'opérateur MySQL UNION ALL.

Exemple - Utilisation de ORDER BY

L'opérateur MySQL UNION peut utiliser une clause ORDER BY pour déterminer les résultats d'une requête.