*EXISTS 子查询:SELECT 1 与 SELECT 的比较**
在 SQL 中使用 EXISTS 子查询时,一个常见的问题是:子查询中应该使用 SELECT 1 还是 SELECT *?
*SELECT 与 SELECT 1**
过去,人们认为在 EXISTS 子查询中,SELECT 1 比 SELECT * 更高效。然而,事实并非如此。SQL Server 会优化 EXISTS 检查,无论子查询的 SELECT 列表中指定了哪些列,它都会向系统返回 NO DATA。
微软的观点
根据微软的说法:“由 EXISTS 引入的子查询的 SELECT 列表几乎总是包含星号 (*)。没有理由列出列名,因为您只是在测试是否存在满足子查询中指定条件的行。”
演示
为了验证这一点,请考虑以下查询:
<code class="language-sql">SELECT whatever FROM yourtable WHERE EXISTS( SELECT 1/0 FROM someothertable WHERE a_valid_clause )</code>
如果 SELECT * 实际上对选定的列执行任何操作,则查询将导致除以零错误。但是,它不会,这表明子查询的 SELECT 列表被忽略,仅用于确定行的存在。
SQL 标准
SQL 标准也支持这种观点:“如果 '' 仅仅包含在一个直接包含在
结论
总之,在 EXISTS 子查询中使用 SELECT 1 或 SELECT * 不会产生性能差异。因此,建议使用哪种选项更易读或与您的编码风格一致。
以上是EXISTS 子查询:SELECT 1 或 SELECT * – 这对性能重要吗?的详细内容。更多信息请关注PHP中文网其他相关文章!