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)
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)
[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)
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)
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.mysql> select * from fruits -> where not exists -> (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)
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
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)
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)
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)
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)
【例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!