Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这些SQL语句等效吗?_Sql - Fatal编程技术网

这些SQL语句等效吗?

这些SQL语句等效吗?,sql,Sql,可能重复: Stmt1:选择。。。FROM((a连接b ON)连接c ON) Stmt2:选择。。。从a、b、c到何处 我不确定第二个语句是否能给出更小的结果集。如果B中有几行与A中的一行相匹配,那么我们是否使用第二条语句获得所有这些匹配?作为最终结果,是的。 关于执行:查询优化器可能最终为两个查询创建相同的查询执行计划 如果优化器根据其近似统计数据(例如,近似等深度直方图,顺便说一句,这些直方图并非始终是最新的),确定第一个联接比第二个联接更具选择性,并因此首先执行该联接,则会出现这种情况

可能重复:

Stmt1:选择。。。FROM((a连接b ON)连接c ON)
Stmt2:选择。。。从a、b、c到何处
我不确定第二个语句是否能给出更小的结果集。如果B中有几行与A中的一行相匹配,那么我们是否使用第二条语句获得所有这些匹配?

作为最终结果,是的。 关于执行:查询优化器可能最终为两个查询创建相同的查询执行计划

如果优化器根据其近似统计数据(例如,近似等深度直方图,顺便说一句,这些直方图并非始终是最新的),确定第一个联接比第二个联接更具选择性,并因此首先执行该联接,则会出现这种情况

Stmt1允许您指定联接的顺序,并且考虑到您确切知道表包含的内容,这可能是一个更好的解决方案。

最终结果是,是的。 关于执行:查询优化器可能最终为两个查询创建相同的查询执行计划

如果优化器根据其近似统计数据(例如,近似等深度直方图,顺便说一句,这些直方图并非始终是最新的),确定第一个联接比第二个联接更具选择性,并因此首先执行该联接,则会出现这种情况


Stmt1允许您指定联接的顺序,并且考虑到您确切地知道表包含的内容,这可能是一个更好的解决方案。

从语义上讲,查询是相同的。然而,试图依靠计划来证明这不是一个好主意

还可以插入任意的
,以便查询在第二种形式中有效,但在第一种形式中不合法


从这个意义上说,第二个是更一般的,但只要第一个是好的,那么第二个是等价的。

从语义上来说,查询是相同的。然而,试图依靠计划来证明这不是一个好主意

还可以插入任意的
,以便查询在第二种形式中有效,但在第一种形式中不合法



从这个意义上讲,第二个选项更一般,但只要第一个选项是好的,那么第二个选项就相当了。

你试过运行它们,看看结果是否相同吗?是的,我试过了,用我的例子,它是有效的。但我觉得这很烦人。可能还没有对等的工具。@StefanH谢谢-从未意识到“接受”按钮。这个问题是关于SQL的一般问题-我们在大学里使用MySQL和PostgreSQL。检查这个问题。你是否尝试运行它们以查看结果是否相同?是的,我做了,并且在我的示例中它工作正常。但我觉得这很烦人。可能还没有对等的版本。@StefanH谢谢-从未意识到“接受”按钮。这个问题是关于SQL的一般问题-我们在大学使用MySQL和PostgreSQL。检查这个问题谢谢。我猜查询优化器无论如何都会将第二个转换为连接(因为在关系代数中没有其他连接关系的可能性),第二个已经包含三个内部连接。第二个更为复杂,唯一的判断方法就是执行一个演出计划。根据统计数据,在许多情况下,两个查询可能会产生相同的计划,因此以相同的方式执行。例如,如果优化器根据索引的选择性和表中的行数决定第二个查询首先将a连接到b比将b连接到c更好,那么这两个查询将以相同的方式执行。我对此投了反对票,因为SQL是一种声明性语言。特定于数据库的执行计划。实际上,大多数数据库都会将这两个语句优化为同一个计划。@GordonLinoff我编辑了我的答案,这就是我给出第一个答案时的想法。谢谢。我猜查询优化器无论如何都会将第二个转换为连接(因为在关系代数中没有其他连接关系的可能性),第二个已经包含三个内部连接。第二个更为复杂,唯一的判断方法就是执行一个演出计划。根据统计数据,在许多情况下,两个查询可能会产生相同的计划,因此以相同的方式执行。例如,如果优化器根据索引的选择性和表中的行数决定第二个查询首先将a连接到b比将b连接到c更好,那么这两个查询将以相同的方式执行。我对此投了反对票,因为SQL是一种声明性语言。特定于数据库的执行计划。实际上,大多数数据库都会将这两个语句优化为同一个计划。@GordonLinoff我编辑了我的答案,这就是我给出第一个答案时的想法。
Stmt1: SELECT ... FROM ((a JOIN b ON <cond1>) JOIN c ON <cond2>)

Stmt2: SELECT ... FROM a, b, c WHERE <cond1> AND <cond2>