SQL a-t-il besoin de sous-requêtes?
Imaginez une implémentation suffisamment généralisée du langage de requête structuré pour les bases de données de relations. Étant donné que la structure de l' SELECT
instruction SQL canonique est en fait assez importante pour que cela ait un sens, je ne fais pas directement appel à l'algèbre relationnelle, mais vous pouvez l'encadrer en ces termes en faisant des restrictions appropriées sur la forme des expressions.
Un SQL SELECT
requête est généralement constitué d'une saillie (la SELECT
partie) un certain nombre d' JOIN
opérations (la JOIN
partie), un certain nombre d' SELECTION
opérations (en SQL, les WHERE
clauses), puis mis en fonctionnement à goutte ( UNION
, EXCEPT
, INTERSECT
, etc.), suivie d' une autre Requête SELECT
SQL.
Les tables jointes peuvent être les résultats calculés d'expressions; en d'autres termes, nous pouvons avoir une déclaration telle que:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
Nous ferons référence à l'utilisation d'une table calculée dans le cadre d'une requête SQL en tant que sous-requête. Dans l'exemple ci-dessus, le second (en retrait) SELECT
est une sous-requête.
Toutes les requêtes SQL peuvent-elles être écrites de manière à ne pas utiliser de sous-requêtes? L'exemple ci-dessus peut:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Cet exemple est quelque peu faux ou trivial, mais on peut imaginer des cas où beaucoup plus d'efforts pourraient être nécessaires pour récupérer une expression équivalente. En d'autres termes, est-il vrai que pour chaque requête SQL avec sous-requêtes, il existe une requête q ' sans sous-requêtes telle que q et q ' sont garantis pour produire les mêmes résultats pour les mêmes tables sous-jacentes? Limitons les requêtes SQL au formulaire suivant:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
Etc. Je pense que les jointures externes gauche et droite n'ajoutent pas grand-chose, mais si je me trompe, n'hésitez pas à le signaler ... en tout cas, elles sont également équitables. En ce qui concerne les opérations d'ensemble, je suppose que l'une d'entre elles est correcte ... union, différence, différence symétrique, intersection, etc. tout ce qui est utile. Existe-t-il des formulaires connus auxquels toutes les requêtes SQL peuvent être réduites? L'un de ces éléments élimine-t-il les sous-requêtes? Ou existe-t-il des cas où il n'existe pas de requête sans sous-requête équivalente? Les références sont appréciées ... ou une démonstration (par preuve) qu'elles sont ou non requises serait fantastique. Merci et désolé si c'est un résultat célèbre (ou insignifiant) dont je suis douloureusement ignorant.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Parce qu'il comprend, group by
je n'ai pas mis cela comme une réponse.
ON
clause est requise pour JOIN
s, bien qu'un produit croisé soit obtenu avec juste une virgule.