Maison  >  Article  >  base de données  >  Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à l'aide d'une sous-requête ?

Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à l'aide d'une sous-requête ?

巴扎黑
巴扎黑original
2017-05-10 13:25:132666parcourir

Sous-requête

MySQL 4.1 a introduit la prise en charge des sous-requêtes, donc pour utiliser le SQL décrit dans ce chapitre, vous devez utiliser MySQL 4.1 ou supérieur.

L'instruction SELECT est une requête SQL. Toutes les instructions SELECT que nous avons vues jusqu'à présent étaient de simples requêtes, c'est-à-dire des instructions uniques qui récupéraient les données d'une seule table de base de données.

Requête Toute instruction SQL est une requête. Cependant, ce terme fait généralement référence à l'instruction SELECT.

SQL permet également la création de sous-requêtes, c'est à dire de requêtes imbriquées au sein d'autres requêtes. Pourquoi faisons-nous cela ? La meilleure façon de comprendre ce concept est d’examiner quelques exemples.

Utilisez des sous-requêtes pour filtrer

Les tables de base de données utilisées dans tous les chapitres de ce livre sont des tables relationnelles (pour une description de chaque table et relation, veuillez consulter l'annexe B) . Les commandes sont stockées dans deux tables. La table des commandes stocke une ligne pour chaque commande contenant le numéro de commande, l'ID client et la date de la commande. Les articles de chaque commande sont stockés dans la table orderitems associée. Le tableau des commandes ne stocke pas les informations client. Il stocke uniquement l'identifiant du client. Les informations client réelles sont stockées dans la table clients. Maintenant, si vous devez répertorier tous les clients qui ont commandé l’article TNT2, comment devez-vous le récupérer ? Les étapes spécifiques sont répertoriées ci-dessous.

(1) Récupérez les numéros de toutes les commandes contenant l'article TNT2.

(2) Récupérez les identifiants de tous les clients avec le numéro de commande indiqué à l'étape précédente.

(3) Récupérez les informations client de tous les identifiants clients renvoyés à l'étape précédente.

Chacune des étapes ci-dessus peut être effectuée sous forme de requête distincte. Les résultats renvoyés par une instruction SELECT peuvent être utilisés dans la clause WHERE d'une autre instruction SELECT.

Vous pouvez également utiliser des sous-requêtes pour combiner 3 requêtes en une seule instruction.

La première instruction SELECT est claire, pour tous les articles de commande avec prod_id TNT2, elle récupère leur colonne order_num. La sortie répertorie deux commandes contenant cet article :

Entrée :

select order_num from orderitems where prod_id = 'TNT2';

Sortie :

Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à laide dune sous-requête ?

Ensuite, la requête a un ID client pour commandes 20005 et 20007. À l'aide de la clause IN, écrivez l'instruction SELECT suivante :

Entrée :

select cust_id from orders where order_num in (20005,20007);

Sortie :

Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à laide dune sous-requête ?

Maintenant, mettez le premier La requête (celle qui renvoie le numéro de commande) devient une sous-requête combinant les deux requêtes. Veuillez consulter l'instruction SELECT suivante :

Entrée :

select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2');

Sortie :

Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à laide dune sous-requête ?

Analyse : Dans l'instruction SELECT, le sous-requête Abordez-le toujours de l'intérieur vers l'extérieur. Lors du traitement de l'instruction SELECT ci-dessus, MySQL effectue en fait deux opérations.

Tout d'abord, elle exécute la requête suivante :

select order_num from orderitems where prod_id = 'TNT2';

Cette requête renvoie deux numéros d'ordre : 20005 et 20007. Ces deux valeurs sont ensuite transmises à la clause WHERE de la requête externe dans le format séparé par des virgules requis par l'opérateur IN. La requête externe devient :

select cust_id from orders where order_num in (20005,20007);

Comme vous pouvez le voir, le résultat est correct et identique à la valeur renvoyée par la clause WHERE codée en dur précédente.

Les instructions SQL SELECT formatées qui contiennent des sous-requêtes peuvent être difficiles à lire et à déboguer, surtout si elles sont complexes. Diviser la sous-requête en plusieurs lignes et la mettre en retrait de manière appropriée, comme indiqué ci-dessus, peut grandement simplifier l'utilisation des sous-requêtes.

Maintenant, j'ai obtenu les identifiants de tous les clients qui ont commandé l'article TNT2. L'étape suivante consiste à récupérer les informations client pour ces identifiants client. L'instruction SQL pour récupérer deux colonnes est :

Entrée :

select cust_name,cust_contact from customers where cust_id in (10001,10004);

Vous pouvez convertir la clause WHERE en sous-requête au lieu de coder en dur ces identifiants clients :

Entrée :

select cust_name,cust_contact from customers where cust_id in(select cust_id from orders where order_num in(select order_num from orderitems where prod_id = 'TNT2'));

Sortie :

Qu’est-ce qu’une sous-requête MySQL ? Comment filtrer à laide dune sous-requête ?

Analyse : Afin d'exécuter l'instruction SELECT ci-dessus, MySQL doit en fait exécuter 3 instructions SELECT. La sous-requête la plus interne renvoie une liste de numéros d'ordre utilisés dans la clause WHERE de sa sous-requête externe. La sous-requête externe renvoie la liste des ID client utilisés dans la clause WHERE de la requête la plus externe. La requête la plus externe renvoie les données requises.

On peut voir que l'utilisation de sous-requêtes dans la clause WHERE peut écrire des instructions SQL puissantes et flexibles. Il n'y a pas de limite au nombre de sous-requêtes pouvant être imbriquées, mais en utilisation réelle, en raison de limitations de performances, un trop grand nombre de sous-requêtes ne peuvent pas être imbriquées.

Les colonnes doivent correspondre Lorsque vous utilisez une sous-requête dans une clause WHERE (comme indiqué ici), vous devez vous assurer que l'instruction SELECT a le même nombre de colonnes que dans la clause WHERE. En règle générale, une sous-requête renvoie et correspond à une seule colonne, mais plusieurs colonnes peuvent être utilisées si nécessaire.

Bien que les sous-requêtes soient généralement utilisées conjointement avec l'opérateur IN, elles peuvent également être utilisées pour tester l'égalité ( = ), l'inégalité ( ), etc.

Sous-requête et performances Le code donné ici fonctionne et obtient les résultats souhaités. Cependant, l’utilisation de sous-requêtes n’est pas toujours le moyen le plus efficace d’effectuer ce type de récupération de données. Pour plus de détails, voir le chapitre 15, où cet exemple est à nouveau donné.

[Recommandations associées]

  1. mysql crée des champs calculés et utilise des sous-requêtes

  2. Que sont les jointures et les tables relationnelles dans MySQL ?

  3. Pourquoi utiliser des jointures et comment créer des jointures

  4. L'importance de la clause WHERE dans MySQL et comment joindre plusieurs tables

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn