SQL是否需要子查询?
想象一下关系数据库的结构化查询语言的足够通用的实现。由于规范SQL SELECT
语句的结构实际上对于使其有意义很重要,因此我不直接诉诸关系代数,但是您可以通过对表达式的形式进行适当的限制来用这些术语来构架。
一个SQL SELECT
查询通常由投影(的SELECT
部分)的一些数目的JOIN
操作(JOIN
部分),一些数目的SELECTION
操作(在SQL中,WHERE
条款),然后设置为单位的运算(UNION
,EXCEPT
,INTERSECT
等),接着再SQL SELECT
查询。
被连接的表可以是表达式的计算结果。换句话说,我们可以有一条语句,例如:
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;
我们将使用计算表作为SQL查询的一部分称为子查询。在上面的示例中,第二个(缩进的)SELECT
是一个子查询。
能否以不使用子查询的方式编写所有SQL查询?上面的示例可以:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
这个例子有些虚假,或者是琐碎的,但是可以想象实例中需要花费更多的精力来恢复等效的表达式。换句话说,是否对于每个带有子查询的SQL查询,都存在一个没有子查询的查询q ',从而确保q和q '对于相同的基础表产生相同的结果?让我们将SQL查询限制为以下形式:
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 ...
等等。我认为左右外连接并没有增加多少,但是如果我弄错了,请随时指出……无论如何,它们也是公平的游戏。就集合运算而言,我猜它们中的任何一个都很好……并集,差,对称差,交集等……任何有用的东西。是否存在可以将所有SQL查询简化为的已知形式?这些方法是否消除了子查询?还是在某些情况下不存在等效的无子查询的查询?引用是值得赞赏的...或者证明(不需要证明)证明将是很棒的。谢谢,如果这是庆祝(或微不足道)的结果,对此我感到无知,请对不起。
select count(*) from (select id from sometable group by id having count(*)>1) d
。因为它包括group by
我没有回答这个问题。
ON
,JOIN
s 是必需的子句,尽管仅使用逗号即可获得叉积。