首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果一个子查询同时在SELECT和WHERE子句中使用,它是否会多次执行?

问如果一个子查询同时在SELECT和WHERE子句中使用,它是否会多次执行?
EN

Stack Overflow用户
提问于 2015-04-08 05:51:55
回答 2查看 73关注 0票数 1

例如,如果我写

代码语言:javascript
复制
SELECT (subquery) FROM table WHERE (subquery)

(subquery)是否会在每行执行一次以上?

我在SELECT中给它起了别名,并在WHERE中使用它,但这似乎是无效的。

EN

回答 2

Stack Overflow用户

发布于 2015-04-08 05:59:11

让我们看一下演示此用例的一个非常简单的查询的EXPLAIN PLAN。

代码语言:javascript
复制
EXPLAIN 
SELECT (SELECT 1 FROM YOURTABLE LIMIT 1) 
 FROM DUAL 
 WHERE (SELECT 1 FROM YOURTABLE LIMIT 1);

忽略LIMIT 1,它们只是为了避免在我的测试表上出现多行错误。

结果集将是

代码语言:javascript
复制
'1', 'PRIMARY', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'No tables used'
'3', 'SUBQUERY', 'YOURTABLE', 'index', NULL, 'PRIMARY', '4', NULL, '6', 'Using index'
'2', 'SUBQUERY', 'YOURTABLE', 'index', NULL, 'PRIMARY', '4', NULL, '6', 'Using index'

如你所见,是的,子查询将被执行两次。

如果要在多个位置使用子查询的值,则可以考虑使用JOIN。

票数 1
EN

Stack Overflow用户

发布于 2015-04-08 06:11:40

一般来说,答案是肯定的。尽管查询优化器有权消除这些通用子表达式,但查询优化器很少这样做。

如果将子查询放在from子句中,它应该只执行一次:

代码语言:javascript
复制
SELECT s.value
FROM table cross join
     (subquery) s
WHERE s.value

或者,如果使用子查询:

代码语言:javascript
复制
SELECT value
FROM (SELECT (subquery) as value
      FROM table
     ) s
WHERE value <> 0;

在MySQL中,后一种结构增加了实现子查询的成本。因此,有另一个MySQL扩展可能会使这一点更有效:

代码语言:javascript
复制
SELECT (subquery) as value
FROM table 
HAVING value <> 0;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29502012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档