Maison / Accéder / Comment utiliser l'opérateur SQL UNION pour combiner les résultats de la requête. Opérateur pour travailler avec des ensembles UNION Organiser des requêtes avec union

Comment utiliser l'opérateur SQL UNION pour combiner les résultats de la requête. Opérateur pour travailler avec des ensembles UNION Organiser des requêtes avec union

Plus Requêtes SQL une seule instruction est utilisée pour renvoyer les données d'une ou plusieurs tables. SQL vous permet également d'exécuter plusieurs requêtes distinctes en même temps et d'afficher le résultat sous la forme d'un ensemble de données unique. Ces requêtes combinées sont généralement appelées combinaisons ou demandes complexes.

1. Utilisation de l'opérateur UNION

Demandes dans la langue SQL combiné avec l'opérateur SYNDICAT. Pour cela, vous devez spécifier chaque demande SÉLECTIONNER et placez le mot-clé entre eux SYNDICAT. Limitation du nombre d'opérateurs utilisés SYNDICAT dans une demande générale n'est pas. Dans la section précédente, nous avons noté que Accéder incapable de créer jointure externe complète, nous allons maintenant voir comment nous pouvons y parvenir grâce à l'opérateur SYNDICAT.

SÉLECTIONNER *
FROM Sumproduct LEFT JOIN Sellers ON Sumproduct.City = Sellers.City
SYNDICAT
SÉLECTIONNER *

FROM Sumproduct RIGHT JOIN Sellers ON Sumproduct.City = Sellers.City

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

Il convient également de noter que dans de nombreux cas, au lieu de SYNDICAT nous pouvons utiliser l'offre avec de nombreuses conditions, et obtenir un résultat similaire. Cependant, en raison de SYNDICAT les enregistrements semblent plus concis et compréhensibles. Vous devez également suivre certaines règles lors de l'écriture de requêtes combinées :

  • demande SYNDICAT doit inclure deux opérateurs ou plus SÉLECTIONNER séparés par le mot-clé SYNDICAT(c'est-à-dire que si la requête utilise quatre instructions SELECT, il doit y avoir trois mots clés UNION)
  • chaque demande dans l'opérateur SYNDICAT doivent avoir les mêmes colonnes, expressions ou agrégats, et doivent également être répertoriés 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 du même type pour SGBD pourrait les convertir sans ambiguïté (par exemple, il pourrait s'agir de différents types de données numériques ou de différents types de date).

2. Activer ou désactiver les lignes répétées

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 avec plusieurs conditions dans une seule déclaration SÉLECTIONNER). Ce comportement de l'opérateur SYNDICAT par défaut, mais nous pouvons changer cela si nous le voulons. Pour ce faire, nous devons utiliser l'opérateur UNION TOUSà la place de SYNDICAT.

3. Trier les résultats des requêtes combinées

Résultats de l'exécution de l'instruction SÉLECTIONNER trié par phrase COMMANDÉ PAR. Lorsque vous combinez des requêtes avec SYNDICAT une seule offre COMMANDÉ PAR peut être utilisé et doit être inclus dans la dernière déclaration SÉLECTIONNER. En effet, en pratique cela n'a guère de sens de trier une partie des résultats dans un ordre, et l'autre partie dans un autre. Alors quelques suggestions COMMANDÉ PAR pas autorisé à postuler.

L'opérateur SQL UNION est conçu pour combiner les tables de base de données résultantes obtenues à l'aide du mot SELECT. La condition pour joindre les tables résultantes est la coïncidence du nombre, de l'ordre et du type de données des colonnes. ORDER BY doit être appliqué au résultat d'une jointure et placé uniquement à la fin d'une requête en plusieurs parties. L'opérateur UNION a la syntaxe suivante :

SELECT COLUMNAMES (1..N) FROM TABLE_NAME UNION SELECT COLUMN_NAMES (1..N) FROM TABLE_NAME

Dans cette construction, les requêtes fusionnées peuvent avoir ou non des conditions dans la clause WHERE. À l'aide de l'opérateur UNION, vous pouvez combiner des requêtes pour récupérer des données à la fois de la même table et de tables différentes.

Lorsque vous utilisez l'opérateur UNION sans le mot ALL, le résultat ne contient pas de doublons, mais avec le mot ALL, il contient des doublons.

Totaux et valeurs individuelles dans une table à l'aide de l'instruction SQL UNION

Avec une seule requête, vous pouvez afficher les valeurs de colonne individuelles de la table, par exemple, le nombre d'années travaillées par les employés de l'entreprise, leurs salaires et autres. Une autre demande - en utilisant fonctions d'agrégation- vous pouvez obtenir, par exemple, le montant des salaires perçus par les employés des services ou occupant certains postes, ou le nombre moyen d'années d'expérience professionnelle (le regroupement à l'aide de l'opérateur GROUP BY est utilisé dans de telles requêtes).

Mais que se passe-t-il si nous devons obtenir à la fois un résumé de toutes les valeurs individuelles et des valeurs totales dans un seul tableau ? C'est là que l'opérateur SQL UNION vient à la rescousse, à l'aide duquel deux requêtes sont combinées. Le tri doit être appliqué au résultat de la jointure à l'aide de la clause ORDER BY. Pourquoi cela est nécessaire sera mieux compris à partir d'exemples.

Exemple 1 La base de données de l'entreprise contient une table Personnel contenant des données sur les employés de l'entreprise. Il comporte des colonnes Salary (salaire), Job (poste) et Years (ancienneté). La première requête renvoie les salaires individuels triés par poste :

SELECT Nom, Poste, Salaire FROM STAFF ORDER BY Poste

NomtravailUn salaire
Ponceusesdirecteur18357.5
Marenghidirecteur17506.8
PernelVentes18171.2
DocteurVentes12322.4
facteurVentes16228.7

La deuxième requête renverra le salaire total par poste. Nous préparons déjà cette requête pour la joindre à la première, nous nous souviendrons donc que la condition de jointure est un nombre égal de colonnes, la coïncidence de leurs noms, ordre et types de données. Par conséquent, nous incluons également la colonne Nom avec une valeur arbitraire "Z-TOTAL" dans le tableau avec les totaux :

SELECT "Z-TOTAL" AS Nom, Poste, SOMME (Salaire) AS Salaire FROM STAFF GROUP BY Poste

Le résultat de la requête sera le tableau suivant :

NomtravailUn salaire
Z-TOTALdirecteur35864.3
Z-TOTALVentes46722.3

Combinons maintenant les requêtes à l'aide de l'opérateur UNION et appliquons l'opérateur ORDER BY au résultat de l'union. Il doit être regroupé en deux colonnes : travail (Job) et nom (Name), de sorte que les lignes avec des valeurs totales (total), dans lesquelles la valeur du nom est "Z-TOTAL", soient en dessous des lignes avec des valeurs individuelles. La combinaison des résultats de la requête sera la suivante :

(SELECT Name, Job, Salary FROM STAFF ) UNION (SELECT "Z-TOTAL" AS Name, Job, SUM (Salary) AS Salary FROM STAFF GROUP BY Job) ORDER BY Job, Name

Le résultat de l'exécution d'une requête avec l'opérateur UNION sera le tableau suivant, dans lequel chaque première ligne de chaque groupe de postes contiendra le salaire total des employés travaillant dans ce poste :

NomtravailUn salaire
Marenghidirecteur17506.8
Ponceusesdirecteur18357.5
Z-TOTALdirecteur35864.3
DocteurVentes12322.4
facteurVentes16228.7
PernelVentes18171.2
Z-TOTALVentes46722.3

Écrivez vous-même des requêtes en utilisant UNION, puis voyez la solution

Exemple 2 Les données sont les mêmes que dans l'exemple 1, mais la tâche est un peu plus compliquée. Il est nécessaire d'afficher dans un tableau non seulement les salaires individuels triés par postes et les salaires totaux par postes, mais les salaires totaux de tous les employés.

Exemple 3 La base de données de l'entreprise contient une table Personnel contenant des données sur les employés de l'entreprise. Il comporte des colonnes Nom (nom de famille), Dept (numéro de service) et Années (ancienneté).

Nomdépartementannées
Ponceuses20 7
Pernel20 8
Marenghi38 5
Docteur20 5
facteur38 8

Affichez dans un tableau l'ancienneté moyenne par département et les valeurs individuelles de la durée d'ancienneté des salariés, regroupées par numéros de département.

Autres cas de jointure de requêtes sur la même table à l'aide de l'opérateur SQL UNION

Exemple 4 La base de données de l'entreprise contient une table Personnel contenant des données sur les employés de l'entreprise. Il comporte des colonnes Salary (salaire), Job (poste) et Years (ancienneté). La première requête est nécessaire pour obtenir des données sur les employés dont le salaire est supérieur à 21 000 :

Le résultat de la requête sera le tableau suivant :

Nous avons maintenant besoin de données combinant les critères de sélection appliqués dans les deux requêtes. Nous combinons les requêtes à l'aide de l'opérateur UNION :

Le résultat de l'exécution d'une requête avec l'opérateur UNION sera le tableau suivant :

IDENTIFIANTNom
10 Ponceuses
30 Marenghi
100 Se casser la gueule
140 Fraye
160 Molinaré
240 Daniels
260 Jones

Une requête avec l'opérateur UNION peut renvoyer plus de colonnes, il est important, nous le répétons, que dans les requêtes combinées le nombre de colonnes, leur ordre et les types de données correspondent.

Commençons par obtenir des données sur les catégories et les parties des catégories d'annonces qui contiennent plus de 100 annonces par semaine. Nous écrivons la requête suivante :

Le résultat de la requête sera le tableau suivant :

Le résultat de la requête sera le tableau suivant :

Nous voulons maintenant récupérer les données qui correspondent aux critères des première et deuxième requêtes. Nous combinons les requêtes à l'aide de l'opérateur UNION :

Le résultat de la requête sera le tableau suivant :

Combinaison de résultats de requête sur deux tables à l'aide de l'opérateur SQL UNION

Jusqu'à présent, nous avons examiné les requêtes UNION qui combinent les résultats d'une même table. Nous allons maintenant combiner les résultats de deux tables.

Exemple 6 Il existe une base de données d'entrepôt de matériaux de construction. Il a une table contenant des données de papier peint. La table Vinil contient des données sur les papiers peints en vinyle, la table Paper - sur les papiers peints en papier. Il est nécessaire de connaître les données sur les prix des papiers peints de l'un et de l'autre tableau.

Pour récupérer des données non répétitives sur les prix des papiers peints en vinyle, nous allons créer une requête avec le mot DISTINCT :

SÉLECTIONNER LE PRIX DISTINCT DE VINIL

Le résultat de la requête sera le tableau suivant :

Faisons maintenant une requête combinée avec l'opérateur UNION :

SÉLECTIONNER UN PRIX DISTINCT À PARTIR DE VINIL UNION SÉLECTIONNER UN PRIX DISTINCT À PARTIR DE PAPIER

Puisque nous n'utilisons pas le mot ALL, il n'y aura pas de valeurs en double pour 400, 500 et 530. Le résultat de la requête sera le tableau suivant :

le prix
300
320
360
400
430
500
530
610
720
800
850

Exemple 7 La base de données et les tables sont les mêmes que dans l'exemple précédent.

Vous souhaitez obtenir toutes les données de prix, y compris celles récurrentes. La requête pour combiner les résultats à l'aide de l'opérateur UNION sera similaire à la requête de l'exemple précédent, mais au lieu de simplement UNION, nous écrivons UNION ALL :

SÉLECTIONNER UN PRIX DISTINCT À PARTIR DE VINIL UNION TOUS SÉLECTIONNER UN PRIX DISTINCT À PARTIR DE PAPIER

Le résultat de la requête sera le tableau suivant :

le prix
300
320
360
400
400
430
500
500
530
530
610
720
800
850

A l'aide de l'opérateur SQL UNION, vous pouvez combiner à la fois des requêtes simples et requêtes contenant des sous-requêtes (requêtes imbriquées). Considérons un exemple correspondant.

Exemple 8 Il existe une base de données "Théâtre". Sa table Play contient des données sur les productions (titres - dans la colonne Name), dans la table Director - des données sur les réalisateurs (dans la colonne Fname - le prénom, dans la colonne Lname - le nom de famille). La clé primaire de la table Director est dir_id - le numéro d'identification du directeur. Dir_id est également une clé étrangère de la table Play, il fait référence à la clé primaire de la table Director. Il est nécessaire d'afficher des performances dirigées par John Barton et Trevor Nunn.

La solution. Combinons les résultats de deux requêtes - l'une renvoie les performances du réalisateur John Barton, l'autre - le réalisateur Trevor Nunn. Et nous effectuons chacune de ces requêtes combinées sur la table Play avec une sous-requête sur la table Director, qui renvoie dir_id par le nom et le prénom du réalisateur. Chaque requête externe prend la valeur de la clé dir_id de la sous-requête et retourne les noms des productions (Name) :

Bases de données relationnelles et langage SQL

L'opérateur de jeu de données UNION combine les jeux de résultats de deux requêtes ou plus et affiche toutes les lignes de toutes les requêtes sous la forme d'un jeu de résultats.

UNION appartient à la classe des opérateurs permettant de travailler avec des ensembles de données (opérateur d'ensemble). D'autres opérateurs de ce type incluent INTERSECT et EXCERT (EXCEPT et MINUS sont des équivalents fonctionnels, mais EXCEPT est dans la norme ANSI.) Tous les opérateurs d'ensemble de données sont utilisés pour manipuler les ensembles de résultats de deux requêtes ou plus en même temps, d'où leur nom.

Syntaxe S0L2003

Il n'y a pas de limite technique au nombre de requêtes dans un opérateur UNION. La syntaxe générale est la suivante.

SYNDICAT

SYNDICAT

Mots clés

SYNDICAT

Indique que les jeux de résultats seront fusionnés en un seul jeu de résultats. Les lignes en double sont supprimées par défaut.

TOUT

Les lignes en double de tous les ensembles de résultats sont également fusionnées.

DISTINCT

Les lignes en double sont supprimées du jeu de résultats. Les colonnes contenant des valeurs NULL sont considérées comme des doublons. (Si les mots clés ALL et DISTINCT ne sont pas utilisés, la valeur par défaut est DISTINCT.)

Règles générales

Il n'y a qu'une seule règle importante à garder à l'esprit lors de l'utilisation de l'opérateur UNION : l'ordre, le nombre et le type de données des colonnes doivent être identiques dans toutes les requêtes.

Les types de données ne doivent pas nécessairement être identiques, mais ils doivent être compatibles. Par exemple, les types CHAR et VARCHAR sont compatibles. Par défaut, le zabor résultant utilise la taille du plus grand des types compatibles, et dans une requête qui combine trois colonnes CHAR - CHAR(5), CHAR(IO) et CHAR(12), les résultats seront en CHAR(12 ) et dans les colonnes, des tailles plus petites ajouteront des espaces supplémentaires.

Bien que la norme ANSI donne à l'opérateur INTERSECT la priorité sur les autres opérateurs d'ensemble, de nombreuses plates-formes traitent ces opérateurs comme ayant la même priorité. Vous pouvez contrôler explicitement la priorité des opérateurs à l'aide de parenthèses. Sinon, le SGBD les exécutera très probablement dans l'ordre de gauche à droite.

La clause DISTINCT peut (selon la plate-forme) avoir un coût de performance important car elle nécessite souvent un passage supplémentaire dans le jeu de résultats pour supprimer les enregistrements en double. La clause ALL peut être utilisée pour améliorer les performances dans tous les cas où aucun doublon n'est attendu (ou si les doublons sont autorisés).

Selon la norme ANSI, une seule clause ORDER BY peut être utilisée dans une requête. Placez-le à la fin de la dernière instruction SELECT. Pour éviter toute ambiguïté lors de la spécification des colonnes et des tables, assurez-vous d'attribuer des alias appropriés à toutes les colonnes de toutes les tables. Cependant, lorsque vous spécifiez des noms de colonne dans une requête SELECT ... UNION, seul l'alias de la première requête est utilisé. Par exemple:

SELECT au_lname AS nom, au_fname AS prénom FROM auteurs UNION SELECT emp_lname AS nom, emp_fname AS prénom FROM employés ORDER BY nom, prénom;

De plus, étant donné que les requêtes d'opérateur UNION peuvent contenir des colonnes avec des types de données compatibles, le comportement du code peut varier d'une plate-forme à l'autre, notamment en ce qui concerne la longueur du type de données de la colonne. Par exemple, si la colonne au_fname de la première requête est sensiblement plus longue que la colonne emplname de la deuxième requête, différentes plates-formes peuvent avoir des règles différentes pour déterminer la longueur à utiliser. Cependant, en général, les plates-formes choisissent un type de données plus long (et moins restrictif) pour l'ensemble de résultats.

Chaque SGBDR peut appliquer ses propres règles pour déterminer le nom d'une colonne si les colonnes de différentes tables ont des noms différents. En règle générale, les noms de la première requête sont utilisés.

DB2

La plateforme DB2 prend en charge les mots clés ANSI UNION et UNION ALL ainsi que la clause VALUES.

[, (expression-!, expression2, …)] […] […]

Vous permet de spécifier un ou plusieurs ensembles de valeurs définies manuellement pour les enregistrements dans l'ensemble de résultats combinés. Chacune de ces valeurs doit contenir exactement le même nombre de colonnes que dans les requêtes de l'opérateur UNION. Les chaînes de valeur dans le jeu de résultats sont séparées par des virgules.

Bien que la clause UNION DISTINCT ne soit pas prise en charge, l'équivalent fonctionnel est la clause UNION. La clause CORRESPONDING n'est pas prise en charge.

Les types de données tels que VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK et les types de structure ne peuvent pas être utilisés avec le mot clé UNION (mais ils peuvent être utilisés avec la clause UNION ALL).

Si toutes les tables utilisent le même nom de colonne, le jeu de résultats utilise ce nom. Si les noms de colonne sont différents, DB2 génère un nouveau nom de colonne. Après cela, cette colonne ne peut plus être utilisée dans une clause ORDER BY ou une clause FOR UPDATE.

Si plusieurs opérateurs d'ensemble de données sont utilisés dans une seule requête, ceux entre parenthèses sont exécutés en premier. Après cela, les instructions sont exécutées dans l'ordre de gauche à droite. Cependant, toutes les opérations INTERSECT sont effectuées avant les opérations UNION ou EXCEPT. Par exemple:

SELECT empno FROM employé WHERE workdept LIKE "E%" UNION SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001), (AB0002"), ("AC0003")

Dans cet exemple, nous obtenons tous les ID des employés de la table des employés qui se trouvent dans n'importe quel service dont le nom commence par "E", ainsi que les ID de tous les employés de la table comptable emp_act qui travaillent dans les projets IF1000", "IF2000" , et " AD3110". De plus, les ID d'employé " AA000T, " AB0002 " et " AC00031.

MySQL

Non supporté.

Oracle

La plate-forme Oracle prend en charge les mots clés UNION et UNION ALL de la norme ANSI SQL. La syntaxe est la suivante.

Oracle ne prend pas en charge la clause CORRESPONDING. La clause UNION DISTINCT ne le fait pas. est pris en charge, mais l'équivalent fonctionnel est la clause UNION. La plate-forme Oracle ne prend pas en charge l'utilisation des clauses UNION ALL et UNION dans les situations suivantes.

Si la première requête de l'instruction contient des expressions dans la liste d'éléments, attribuez un alias à cette colonne à l'aide de la clause AS. De plus, seule la dernière requête d'une instruction peut contenir une clause ORDER BY. Par exemple, vous pouvez obtenir tous les ID de magasin uniques (store_id) sans doublons à l'aide de la requête suivante.

SELECT stor_id FROM magasins UNION SELECT stor_id FROM ventes ;

PostgreSQLName

La plate-forme PostgreSQL prend en charge les mots-clés UNION et UNION ALL dans la syntaxe ANSI standard.

Instruction SELECT 2 UNION

La plate-forme PostgreSQL ne prend pas en charge l'utilisation des clauses UNION et UNION ALL dans les requêtes avec une clause FOR UPDATE. PostgreSQL ne prend pas en charge la clause CORRESPONDING. La clause UNION DISTINCT n'est pas prise en charge ; l'équivalent fonctionnel est la clause UNION.

La première requête d'une instruction ne peut pas contenir de clauses ORDER BY ou LIMIT. Les requêtes ultérieures avec les clauses UNION et UNION ALL peuvent contenir ces clauses, mais ces requêtes doivent être placées entre parenthèses. Dans le cas contraire, la clause ORDER BY ou LIMIT à droite s'appliquera à l'ensemble de l'opération.

SELECT a.au_lname FROM auteurs AS a WHERE a.au_lnanie LIKE "P%" UNI0N SELECT e.lname FROM employé AS e WHERE e.lname LIKE "P%" ;

serveur SQL

La plate-forme SQL Server prend en charge les mots clés UNION et UNION ALL dans la syntaxe ANSI standard.

Instruction SELECT 1 UNION

Instruction SELECT 2 UNION

SQL Server ne prend pas en charge la clause CORRESPONDING. La clause UNION DISTINCT n'est pas prise en charge, mais la clause UNION est l'équivalent fonctionnel.

Avec les clauses UNION et UNION ALL, vous pouvez utiliser l'instruction SELECT…INTO, mais le mot-clé INTO doit figurer dans la première requête de l'opérateur d'union. Des mots clés spéciaux tels que SELECT TOP et GROUP BY…WITH CUBE peuvent être utilisés dans toutes les requêtes de jointure. Cependant, assurez-vous d'inclure ces clauses dans toutes les demandes de fusion. Si vous utilisez les clauses SELECT TOP ou GROUP BY... WITH CUBE dans la même requête, l'opération échouera.

Toutes les requêtes d'une jointure doivent contenir le même nombre de colonnes. Les types de données des colonnes n'ont pas besoin d'être identiques, mais ils doivent être implicitement castables les uns par rapport aux autres. Par exemple, les colonnes CHAR et VARCHAR sont autorisées. Lors de la sortie des données, SQL Server utilise la taille de la plus grande colonne lors de la détermination de la taille du type de données pour une colonne d'ensemble de résultats. Ainsi, si les colonnes CHAR(5) et CHAR(IO) sont utilisées dans une instruction SELECT... UNION, les deux colonnes seront affichées dans la colonne CHAR(IO). Les types de données numériques sont convertis et affichés en tant que type avec la plus grande précision.

Par exemple, la requête suivante combine les résultats de deux requêtes indépendantes qui utilisent la clause GROUP BY…WITH CUBE.

J'ai déjà écrit sur . Et là, la sortie d'une table dépendait du contenu d'une autre. Mais cela se produit lorsque vous avez besoin d'une indépendance complète de la sortie d'une table par rapport à une autre. Tout ce que tu veux c'est juste récupérer des enregistrements de plusieurs tables en une seule requête, Pas plus. Et pour cela utilisé dans le mot-clé SQL UNION.

Découvrons-le avec vous Requête SQL utilisant UNION:

SELECT `connexion`, `montant` FROM `employeurs` UNION SELECT `connexion`, `montant` FROM `personnel` ;

Cette requête renverra les identifiants et les montants sur les comptes de tous les employeurs et employés d'un certain site. Autrement dit, les données se trouvaient dans des tables différentes, mais leur similitude vous permet de les afficher immédiatement. D'ici, soit dit en passant, vient la règle d'utilisation Demandes de l'UNION: Le nombre et l'ordre des champs doivent correspondre dans toutes les parties de la requête.

Tel UNION-pièces peut être beaucoup, mais le plus important après la dernière UNION, il faut mettre un point-virgule.

Une autre bonne fonctionnalité SYNDICAT est le manque de répétition. Par exemple, si la même personne est parmi les employés et parmi les employeurs, bien sûr, avec le même montant dans le compte, alors dans l'échantillon, il sera pas 2 fois mais seulement 1 qui est habituellement requis. Et si vous avez encore besoin de répétition, alors il y a UNION TOUS:

SELECT `connexion`, `montant` FROM `employeurs` UNION ALL SELECT `connexion`, `montant` FROM `personnel` ;

Comme ça un opérateur UNION assez simple est utilisé dans une requête SQL, ce qui simplifie la procédure d'affichage des données du même type à partir de plusieurs tables à la fois, ce qui aura un très bon effet sur les performances.

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


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

Un mot de fonction est utilisé pour combiner plusieurs requêtes SYNDICAT.
Syntaxe:

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

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

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

Si utilisé paramètre TOUT, toutes les lignes de sortie en double sont conservées. Si le paramètre est absent, seules les lignes uniques restent dans le jeu de résultats.

N'importe quel nombre de requêtes peut être combiné ensemble.

L'utilisation de l'opérateur UNION nécessite le respect de plusieurs conditions :

  1. le nombre de colonnes de sortie de chacune des requêtes doit être le même ;
  2. les colonnes de sortie de chacune des requêtes doivent être comparables entre elles en termes de types de données (dans l'ordre de leur priorité) ;
  3. l'ensemble résultant utilise les noms de colonne spécifiés dans la première requête ;
  4. ORDER BY ne peut être utilisé qu'à la fin d'une requête en plusieurs parties, car il s'applique au résultat d'une 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:

Prenons un exemple plus complexe avec une jointure interne :

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


✍Solution :
1 2 3 4 5 6 7 8 Sélectionner un produit. `Type` , pc. `Nombre` , `Prix` DE pc INNER JOIN produit SUR pc. `Nombre` = produit. `Numéro` produit UNION SELECT. `Tapez` , cahier. `Number` , `Price` FROM notebook INNER JOIN product ON notebook. `Nombre` = produit. `Nombre` ORDER BY `Prix`

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

Résultat:

Syndicat SQL 1. Trouver 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

Prédicat d'existence SQL EXISTS

Le langage SQL a des fonctionnalités pour effectuer des opérations d'intersection et de différence de requête - la clause INTERSECT (intersection) et la clause EXCEPT (différence). Ces clauses fonctionnent de la même manière que UNION : seules les lignes présentes dans les deux requêtes - INTERSECT , ou uniquement les lignes de la première requête absentes de la seconde - EXCEPT entrent dans le jeu de résultats. Mais le problème est que de nombreux SGBD ne prennent pas en charge ces propositions. Mais il y a une issue - en utilisant le prédicat EXISTS.

Le prédicat EXISTS est TRUE si la sous-requête renvoie un nombre quelconque de lignes, sinon EXISTS est FALSE. Il existe également un prédicat NOT EXISTS qui fait le contraire.

En règle générale, EXISTS est utilisé dans des sous-requêtes dépendantes (comme IN).

EXISTE(sous-requête de table)

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


✍Solution :

SELECT DISTINCT Manufacturer FROM product AS pc_product WHERE Type = "Ordinateur" AND EXISTS (SELECT Manufacturer FROM product WHERE Type = "Notebook" AND Manufacturer = pc_product.Manufacturer)

Résultat:

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

Mots clés SQL SOME | TOUT et TOUT

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

Syntaxe:

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

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

Si pour toute valeur de X obtenue à partir de la sous-requête, le résultat de l'opération " " renvoie TRUE , alors le prédicat ANY est également égal à TRUE .

Exemple: Trouvez des fournisseurs d'ordinateurs qui n'ont pas de numéros de pièces en vente (c'est-à-dire pas dans le tableau des ordinateurs)


✍Solution :

Données initiales des tables :

Résultat:

Dans l'exemple, le prédicat Number = ANY(SELECT Number FROM pc) renverra TRUE si le Number de la requête principale est trouvé dans la liste des Numbers de la table pc (renvoyée par la sous-requête). De plus, NOT est utilisé. Le jeu de résultats se composera d'une colonne - Fabricant. Pour éviter qu'un même fabricant ne s'affiche plusieurs fois, le mot-clé DISTINCT a été introduit.
Considérons maintenant l'utilisation du mot-clé ALL :

Exemple: Trouvez les numéros et les prix des 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 génèrent une valeur booléenne (booléenne) peut entraîner une erreur d'exécution de la requête


Exemple: Trouvez les nombres et les prix des ordinateurs qui coûtent plus que le prix minimum des ordinateurs portables


✍Solution :


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

Fonctions de chaîne SQL

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

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

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

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

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


✍Solution :

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

Résultat:

Exemple: Imprimer les noms de fabricants qui commencent et se terminent par la même lettre


✍Solution :

Fonction de remplacement SQL

Syntaxe:

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