Maison  >  Article  >  base de données  >  Requête enfant de requête de données MySQL

Requête enfant de requête de données MySQL

coldplay.xixi
coldplay.xixiavant
2021-03-16 09:10:273138parcourir

Requête enfant de requête de données MySQL

Une sous-requête est une requête dans laquelle une instruction de requête est imbriquée dans une autre instruction de requête. La sous-requête est calculée en premier dans la clause select et le résultat de la sous-requête est utilisé comme condition de filtre d'une autre requête externe. La requête peut être basée sur une ou plusieurs tables.

Les opérateurs couramment utilisés dans les sous-requêtes incluent any (certains), all, in, exist. Des sous-requêtes peuvent être ajoutées pour sélectionner, mettre à jour et supprimer des instructions et peuvent être imbriquées à plusieurs niveaux. Les opérateurs de comparaison peuvent également être utilisés dans des sous-requêtes, telles que "<", "<=", ">", ">=" et "!=".


(1) Sous-requête avec n'importe quel ou quelques mots-clés
(2) Sous-requête avec tous les mots-clés
(3) Sous-requête avec le mot-clé exist
(4) Sous-requête avec in mot-clé
(5) Sous-requête avec opérateur de comparaison

(recommandation d'apprentissage gratuite : Tutoriel vidéo mysql)


(1), sous-requête avec n'importe quel et certains mots-clés

tous et certains mots-clés sont des synonymes, indiquant que l'une des conditions est remplie, permettant la création d'une expression à comparer la liste des valeurs de retour de la sous-requête. Tant qu'une condition de comparaison dans la sous-requête interne est remplie, un résultat est renvoyé comme condition de la requête externe.

Ce qui suit définit deux tables tbl1 et tbl2, et insère des données dans les deux tables :

mysql> create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql> create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql> insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4  Duplicates: 0  Warnings: 0mysql> insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4  Duplicates: 0  Warnings: 0

Le mot-clé any est suivi d'un opérateur de comparaison, indiquant que s'il est comparé à any renvoyé par la sous-requête Si la comparaison de tâches est vraie, renvoie vrai.

[Exemple] Renvoyez toutes les colonnes num2 de la table tbl2, puis comparez la valeur de num1 dans tbl1 avec elle Tant qu'elle est supérieure à toute valeur de num2, il s'agit d'un résultat qualifié.

mysql> select num1 from tbl1 where num1 > any(select num2 from tbl2);+------+| num1 |+------+|   13 ||   27 |+------+2 rows in set (0.00 sec)
(2), sous-requête avec tous les mots-clés
  • tous les mots-clés doivent satisfaire les conditions de toutes les requêtes internes en même temps. Le mot-clé
  • all est suivi d'un opérateur de comparaison, ce qui signifie que si toutes les valeurs renvoyées par la sous-requête sont comparées à true, alors true sera renvoyé.

[Exemple] Renvoie la valeur de la table tbl1 qui est supérieure à toutes les valeurs de la colonne num2 de la table tbl2. L'instruction SQL est la suivante :

mysql> select num1 from tbl1 where num1 > all(select num2 from tbl2);+------+| num1 |+------+|   27 |+------+1 row in set (0.00 sec)
(3), sous-requête avec le mot-clé exist
    Le paramètre après le mot-clé exist est une sous-requête arbitraire. Le système opère sur la sous-requête pour déterminer si elle renvoie des lignes. le résultat de exist est vrai. Dans ce cas, l'instruction de requête de couche interrogera ; si la sous-requête ne renvoie aucune ligne, alors le résultat renvoyé par exist est faux et l'instruction de couche externe n'interrogera pas pour le moment.
[Exemple 1] Demandez si le fournisseur avec s_id=107 existe dans la table des fournisseurs. S'il existe, interrogez les enregistrements de la table des fruits. L'instruction SQL est la suivante :

mysql> select * from fruits    -> where exists
    -> (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name     | f_price |+------+------+------------+---------+| 12   |  104 | lemon      |    6.40 || a1   |  101 | apple      |    5.20 || a2   |  103 | apricot    |    2.20 || b1   |  101 | blackberry |   10.20 || b2   |  104 | berry      |    7.60 || b5   |  107 | xxxx       |    3.60 || bs1  |  102 | orange     |   11.20 || bs2  |  105 | melon      |    8.20 || c0   |  101 | cherry     |    3.20 || m1   |  106 | mango      |   15.70 || m2   |  105 | xbabay     |    2.60 || m3   |  105 | xxtt       |   11.60 || o2   |  103 | coconut    |    9.20 || t1   |  102 | banana     |   10.30 || t2   |  102 | grape      |    5.30 || t4   |  107 | xbabay     |    3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)
. Par Les résultats montrent que le résultat de la requête interne montre qu'il existe un enregistrement de s_id=107 dans la table des fournisseurs, donc l'expression exist renvoie vrai après avoir reçu vrai, l'instruction de requête externe interroge la table des fruits et renvoie tous les enregistrements ; .

[Exemple 2] Recherchez s'il existe un fournisseur avec s_id=107 dans la table des fournisseurs. S'il existe, interrogez les enregistrements avec f_price supérieur à 10,20 dans la table des fruits. 🎜>
mysql> select * from fruits    -> where f_price > 10.20 and exists
    -> (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1  |  102 | orange |   11.20 || m1   |  106 | mango  |   15.70 || m3   |  105 | xxtt   |   11.60 || t1   |  102 | banana |   10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)

Oui On peut voir qu'il y a un enregistrement de s_id=107 dans la table des fournisseurs de noms de table de requête interne, donc l'expression exist renvoie true une fois que l'instruction de requête externe a reçu true, la table de fruits est interrogée en fonction ; à la condition de requête f_price>10.20, et le résultat renvoyé est 4 f_price Records supérieurs à 10.20.

not exist est utilisé de la même manière qu'existe, mais renvoie le résultat opposé. Si la sous-requête renvoie au moins une ligne, alors le résultat de not exist est faux et l'instruction de requête externe n'interrogera pas ; si la sous-requête ne renvoie aucune ligne, alors le résultat renvoyé par not exist est vrai et la requête externe ; L'instruction sera exécutée.
  • [Exemple 3] Demandez si le fournisseur avec s_id =107 existe dans la table des fournisseurs. S'il n'existe pas, interrogez les enregistrements de la table des fruits. L'instruction SQL est la suivante :
mysql> select * from fruits    -> where not exists
    -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)
Vous pouvez voir Ainsi, la requête interne renvoie false, et si l'expression externe reçoit false, elle n'interrogera plus les enregistrements de la table des fruits.

Remarque : les résultats pour exist et not exist dépendent uniquement de la question de savoir si les lignes seront renvoyées, et non du contenu de ces lignes, donc cette liste d'entrée de sous-requête n'est généralement pas pertinente.

(4), Sous-requête avec le mot-clé in

Lorsque le mot-clé in est utilisé pour effectuer une sous-requête, l'instruction de requête interne ne renvoie qu'une seule colonne de données. La valeur à l'intérieur sera fournie à l'instruction de requête externe pour l'opération de comparaison.
  • [Exemple 1] Recherchez le numéro de commande avec f_id c0 dans la table orderitems et interrogez le client c_id avec le numéro de commande en fonction du numéro de commande :
mysql> select c_id from orders where o_num in
    -> (select o_num from orderitems where f_id = 'c0');+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
Ce qui précède L'instruction est l'abréviation de la méthode de requête suivante :

mysql> select o_num from orderitems where f_id = 'c0';+-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql> select c_id from orders where o_num in (30003,30005);+-------+| c_id  |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)
Ce qui suit est le mot-clé not in qui est opposé à in :

[Exemple 2] est similaire à Exemple 1, mais le mot-clé not in est utilisé dans l'instruction select. L'instruction SQL est la suivante :

mysql> select c_id from orders where o_num not in
    -> (select o_num from orderitems where f_id ='c0');+-------+| c_id  |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)
Vous pouvez voir que trois tables sont renvoyées. En regardant les enregistrements dans les commandes, nous pouvons voir que le client avec c_id égal à 10001 a plus d'une commande :

mysql> select * from orders;+-------+---------------------+-------+| o_num | o_date              | c_id  |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)
Le résultat exclut uniquement le numéro de commande, mais il est toujours possible de sélectionner le même client.

La fonctionnalité d'une sous-requête peut également être réalisée avec une requête de jointure, mais les sous-requêtes facilitent la lecture et l'écriture du code MySQL.

(5)、带比较运算符的子查询

【例1】在suppliers表中查询s_city等于"Tianjin"的供应商s_id,然后在fruits表中查询所有该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id,f_name from fruits    -> where s_id =
    -> (select s1.s_id from suppliers as s1 where s1.s_city = 'Tianjin');+------+------------+| s_id | f_name     |+------+------------+|  101 | apple      ||  101 | blackberry ||  101 | cherry     |+------+------------+3 rows in set (0.00 sec)

【例2】在suppliers表中查询s_city等于"Tianjin"的供应商,s_id,然后在fruits表中查询所有非该供应商提供的水果的种类,SQL语句如下:

mysql> select s_id , f_name from fruits    -> where s_id <>
    -> (select s1.s_id from suppliers as s1 where s1.s_city ='Tianjin');+------+---------+| s_id | f_name  |+------+---------+|  104 | lemon   ||  103 | apricot ||  104 | berry   ||  107 | xxxx    ||  102 | orange  ||  105 | melon   ||  106 | mango   ||  105 | xbabay  ||  105 | xxtt    ||  103 | coconut ||  102 | banana  ||  102 | grape   ||  107 | xbabay  |+------+---------+13 rows in set (0.00 sec)

更多相关免费学习推荐:mysql教程(视频)

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer