存在/不存在:'select 1' vs 'select field'

11 浏览
0 Comments

存在/不存在:'select 1' vs 'select field'

在Oracle中,使用后者的性能更好。在SQL Server中,它们的性能相同。尽管在互联网上有很多关于这个问题的争论,但我的观点是两个关系数据库管理系统的优化器都足够成熟,可以理解子查询只需要一个布尔值。

0
0 Comments

在上述代码中,子查询的列列表中的表达式并不重要,它甚至不会被执行。在这个例子中,子查询中的表达式是1/0,也就是除以0,这是一个无效的操作。然而,尽管子查询中存在无效操作,查询仍然返回了结果。

这个问题的出现是因为 EXISTS 子查询只关心子查询是否返回结果,而不关心子查询的实际执行。因此,无论子查询中的表达式是否有效,EXISTS 子查询都会返回结果。

解决这个问题的方法是将 EXISTS 子查询中的表达式改为正确的查询条件。对于这个例子,可以将子查询改为 "select 1 from dual t2 where t2.dummy = t2.dummy",这样子查询就会正确执行,并且 EXISTS 子查询也会根据子查询的结果返回正确的结果。

总结起来,Exists / not exists: 'select 1' vs 'select field' 这个问题的原因是 EXISTS 子查询只关心子查询是否返回结果,而不关心子查询的实际执行。解决这个问题的方法是将 EXISTS 子查询中的表达式改为正确的查询条件。

0
0 Comments

在这篇文章中,讨论了在SQL查询中使用"select 1"和"select field"的差异。文章提到,即使exists只检查是否存在,当我们使用"select *"时,所有列都会被展开,除了这个轻微的开销,没有其他差异。

然而,文章中引用的一个链接指出了之前的文章有误。实际上,在SQL Server中,无论是使用"select 1"还是"select field",都会展开所有的列。这一点可以通过在某列上拒绝权限并运行"select 1 where exists (select 1 from T);"来验证。这可能会出现"对列'Foo'拒绝了SELECT权限"的意外失败,或者通过在两者中添加更多列并计时的方式来观察。因此,之前的观点是错误的。

根据这些观点,可以得出以下结论:

- 在使用exists子查询时,使用"select 1"或"select field"没有实质性的差异。

- "select *"会展开所有列,可能会带来一些轻微的开销。

- 之前的观点错误地认为"select 1"不会展开所有列,而实际上它会展开所有列。

总之,使用"select 1"或"select field"在exists子查询中没有本质上的差异,但是需要注意"select *"会展开所有列。

0
0 Comments

存在/不存在:'select 1' vs 'select field' 这个问题的出现的原因是存在一个子查询,用于测试行的存在与否。其中,exists 用于检查子查询是否至少有一行,如果有,则返回true。子查询中的列无论如何都不重要。

解决方法就是使用exists子查询进行判断,而不关心子查询中的列是什么。

根据MSDN的解释,exists 是用于测试行的存在与否的子查询。

Oracle文档中的解释是,exists 条件用于测试子查询中是否存在行。

MySQL文档中的解释可能更加详细,它解释道传统上,一个exists子查询以 SELECT * 开头,但也可以以 SELECT 5 或 SELECT column1 或其他任何内容开头。MySQL会忽略这种子查询中的SELECT列表,所以没有任何区别。

那么在Postgres中有什么区别吗?对此我不清楚,因为我没有使用过Postgres。

PostgreSQL也是一样的,你可以选择null或其他任何内容。

无论是在MSDN、Oracle还是MySQL和PostgreSQL中,exists和not exists的使用都是一样的,不关心子查询中的列是什么。

0