[+/-]
ANY
,
IN
et SOME
ALL
EXISTS
et NOT EXISTS
FROM
Une sous-requête est une commande SELECT
dans une autre commande. Par exemple :
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
La requête externe (ou commande
externe), et (SELECT column1 FROM
t2)
est la sous-requête. Nous
disons que la sous-requête est imbriquée
dans la requête externe, et en fait, il est possible
d'imbriquer des requêtes dans des sous-requêtes, avec d'autres
commandes. Une sous-requête doit toujours être entre
parenthèses.
Depuis la version 4.1, MySQL supporte toutes les formes de sous-requêtes et opérations que le standard SQL requiert, ainsi que quelques fonctionnalités spécifiques. Les avantages des sous-requêtes sont :
Elles permettent aux requêtes d'être structuré pour que chaque partie puisse être isolée.
Elles fournissent une méthode pour réaliser des opérations qui seraient complexes, et impliqueraient des unions et jointures.
Elles sont, au dire de nombreuses personnes, lisibles. En
fait, c'est les sous-requêtes qui ont donné aux inventeurs
le nom original de SQL
``Structured Query Language''
.
Dans les versions plus anciennes de MySQL, il fallait trouver des palliatifs, et contourner les sous-requêtes. Il est bien plus facile de se mettre aux sous-requêtes.
Voici un exemple de commande qui montre les principaux avantages des sous-requêtes et de leur syntaxe, aussi bien pour celle qui est proposée par le standard, que celle de MySQL.
DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
Pour les versions de MySQL antérieure à la version 4.1, la plupart des sous requêtes peuvent être réécrites avec des jointures et d'autres méthodes. See Section 13.1.8.11, « Se passer des sous-requêtes avec les premières versions de MySQL ».
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.