Utiliser des sous-requêtes comme champs calculés
Une autre façon d'utiliser les sous-requêtes consiste à créer des champs calculés. Supposons que vous deviez afficher le nombre total de commandes pour chaque client dans le tableau des clients. Les commandes sont stockées dans le tableau des commandes avec les identifiants clients correspondants.
Pour effectuer cette opération, suivez les étapes ci-dessous.
(1) Récupérez la liste des clients de la table clients.
(2) Pour chaque client récupéré, comptez le nombre de commandes dans le tableau des commandes.
Comme mentionné dans les deux chapitres précédents, vous pouvez utiliser SELECT COUNT (*) pour compter les lignes d'un tableau, et en fournissant une clause WHERE pour filtrer un identifiant client spécifique, vous pouvez filtrer uniquement pour celui-ci. Les commandes des clients sont comptées. Par exemple, le code suivant compte les commandes du client 10001 :
Entrée :
select count(*) as orders from orders where cust_id = 10001;
Afin d'effectuer un calcul COUNT(*) pour chaque client, vous devez utiliser COUNT(*) comme sous-requête. Veuillez regarder le code suivant :
Entrée :
select cust_name,cust_state,(select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;
Sortie :
Analyse : Cette instruction SELECT est dans les clients table Chaque client renvoie 3 colonnes : cust_name, cust_state et commandes. commandes est un champ calculé construit à partir d’une sous-requête entre parenthèses. Cette sous-requête est exécutée une fois pour chaque client récupéré. Dans cet exemple, la sous-requête est exécutée 5 fois car 5 clients ont été récupérés. La clause WHERE dans la sous-requête
est légèrement différente de la clause WHERE utilisée précédemment car elle utilise des noms de colonnes complets (mentionnés pour la première fois au chapitre 4). L'instruction suivante indique à SQL de comparer le cust_id de la table des commandes avec le cust_id actuellement récupéré de la table des clients :
where orders.cust_id = customers.cust_id
Sous-requête corrélée Une sous-requête impliquant la requête externe. Ce type de sous-requête est appelé sous-requête corrélée. Cette syntaxe (nom de table et nom de colonne séparés par un point) doit être utilisée chaque fois qu'un nom de colonne peut être ambigu. Pourquoi est-ce ?
Voyons ce qui se passe si nous n'utilisons pas de noms de colonnes complets :
Entrée :
select cust_name,cust_state,(select count(*) from orders where cust_id = cust_id) as orders from customers order by cust_name;
Sortie :
Analyse : Évidemment, les résultats renvoyés sont incorrects (veuillez comparer les résultats précédents), alors pourquoi cela se produit ? Il existe deux colonnes cust_id, une dans les clients et une dans les commandes, qui doivent être comparées pour faire correspondre correctement les commandes aux clients correspondants. Si vous ne qualifiez pas complètement le nom de la colonne, MySQL supposera que vous comparez le cust_id avec lui-même dans la table des commandes. Et SELECT COUNT(*) FROM commandes WHERE cust_id = cust_id; renvoie toujours le nombre total de commandes dans la table des commandes (car MySQL regarde si le cust_id de chaque commande correspond à lui-même, et bien sûr, c'est toujours le cas).
Bien que les sous-requêtes soient extrêmement utiles dans la construction de cette instruction SELECT, il faut veiller à limiter les noms de colonnes ambigus.
Plusieurs solutions Comme mentionné plus tôt dans ce chapitre, bien que l'exemple de code donné ici fonctionne bien, ce n'est pas le moyen le plus efficace de résoudre ce type de récupération de données. Nous retrouverons cet exemple dans les chapitres suivants.
Créez une requête en ajoutant progressivement des sous-requêtes. Tester et déboguer les requêtes avec des sous-requêtes peut être délicat, d'autant plus que la complexité de ces instructions augmente. Le moyen le plus fiable de créer (et de tester) une requête avec des sous-requêtes est de le faire de manière incrémentielle, de la même manière que MySQL les gère. Tout d’abord, créez et testez la requête la plus interne. Ensuite, créez et testez la requête externe avec des données codées en dur, et intégrez la sous-requête uniquement après avoir confirmé qu'elle fonctionne. À ce stade, testez-le à nouveau. Répétez ces étapes pour chaque requête que vous souhaitez ajouter. Cela n'ajoute qu'un peu de temps à la construction de la requête, mais permet d'économiser beaucoup de temps plus tard (découvrir pourquoi la requête ne fonctionne pas) et augmente considérablement la probabilité que la requête fonctionne correctement en premier lieu.
[Recommandations associées]
1. Qu'est-ce qu'une sous-requête MySQL ? Comment filtrer à l'aide d'une sous-requête ?
2. Que sont les jointures et les tables de relations 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!