询问这两个sql语句的工作机理
语句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
与
select *
from sheet a ,sheet b
c where c.yy = b.yy
and a.xx = b.xx
等价。
------解决方案--------------------inner join只是外部可察看的连接方式,你可以通过“查询计划”查看内部查询计划,必要时也可自己修改hints来修改默认的查询方式,also see here:
http://www.cnblogs.com/downmoon/archive/2012/04/13/2445694.html
------解决方案--------------------also see here,please:
http://blog.csdn.net/downmoon/article/details/7458203
------解决方案--------------------
SQL code
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、 是a and b 交叉连接的虚拟表
2、on条件是在a和b形成的虚拟表上立马生效的,where是在所有的连接生效后的