语句1
select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx
语句2
select *
from sheet a
inner join sheet b on b.xx = a.xx
inner join c on c.yy = b.yy
where a.xx = ...
问题1
语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?
问题2
哪个语句的花的时间会比较少?我自己碰到了一个例子 就是用语句2 一个下午都没搜索结束 用了语句1全部数据在1个小时内搜索出来了。当然join的不仅仅只有一个c表。join的还有一个表d和表e。其中表e重复用了两次join。(因为取完数据再反查这个表里的内容,表sheet也是这个原因)
select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx
语句2
select *
from sheet a
inner join sheet b on b.xx = a.xx
inner join c on c.yy = b.yy
where a.xx = ...
问题1
语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?
问题2
哪个语句的花的时间会比较少?我自己碰到了一个例子 就是用语句2 一个下午都没搜索结束 用了语句1全部数据在1个小时内搜索出来了。当然join的不仅仅只有一个c表。join的还有一个表d和表e。其中表e重复用了两次join。(因为取完数据再反查这个表里的内容,表sheet也是这个原因)
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx与select *
from sheet a ,sheet b
c where c.yy = b.yy
and a.xx = b.xx等价。
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx与select *
from sheet a ,sheet b
c where c.yy = b.yy
and a.xx = b.xx等价。F大仙说的
http://www.cnblogs.com/downmoon/archive/2012/04/13/2445694.html
http://blog.csdn.net/downmoon/article/details/7458203
语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?等价的意思是它和语句2所经历的步骤是一样的嘛?
问题2
既然是等价。那条件都是一样的。索引会针对where和join进行不同的优化?问题1是优先回答 问题2可以不回答。
SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
另外:一个查询语句各个部分的执行顺序:
--8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
--(1) FROM <left_table>
--(3) <join_type> JOIN <right_table>
--(2) ON <join_condition>
--(4) WHERE <where_condition>
--(5) GROUP BY <group_by_list>
--(6) WITH {CUBE | ROLLUP}
--(7) HAVING <having_condition>
--(10) ORDER BY <order_by_list> 我觉得这个问题有必要把MSSQL执行的顺序贴出来
所以我提问了如下问题:
语句1里 c join的到底是 a还是b 还是 a和b经过where得到的新表,是经过怎样的步骤才显示出最后的结果的?等价的意思是它和语句2所经历的步骤是一样的嘛?(这个问题有助于分析清楚 语句一是在自连接后再INNER JOIN c 还是 b先经过inner join c后的 再和a一起from
有没有索引的问题就略过吧。因为这个sql语句很简单。所以把索引的效果忽略掉吧
select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
where a.xx = b.xx应该是等价于:select *
from sheet a ,sheet b
inner join c on c.yy = b.yy
and a.xx = b.xx
2、on条件是在a和b形成的虚拟表上立马生效的,where是在所有的连接生效后的
语句1 一张交叉表连接了C连接了D连接了E搜索+导出 1个小时
语句2 A连接了B连接了C连接了D连接了E搜索一个下午都没能搜索完。。
由于A和B是同一张表。。
怎么都想不通。。搜索时间上的差距这么大,交叉表明显比连接的表的内容要多,但搜索时间的长短却是反过来的。SQL语句这么简单不应该归结于索引的问题?