查询的逻辑执行顺序
<div id="cnblogs_post_body">查询的逻辑执行顺序[*]FROM < left_table>
[*]ON < join_condition>
[*]< join_type> JOIN < right_table>
[*]WHERE < where_condition>
[*]GROUP BY < group_by_list>
[*]WITH {cube | rollup}
[*]HAVING < having_condition>
[*]SELECT
[*]DISTINCT
[*]ORDER BY < order_by_list>
[*]< top_specification> < select_list>
标准的SQL 的解析顺序为:
[*].FROM 子句 组装来自不同数据源的数据
[*].WHERE 子句 基于指定的条件对记录进行筛选
[*].GROUP BY 子句 将数据划分为多个分组
[*].使用聚合函数进行计算
[*].使用HAVING子句筛选分组
[*].计算所有的表达式
[*].使用ORDER BY对结果集进行排序
<ul>执行顺序
<ol>FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1
ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2
OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4
GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5
CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6
HAVING:对vt6应用HAVING筛选器只有使< having_condition> 为true的组才插入vt7
SELECT:处理select列表产生vt8
DISTINCT:将重复的行从vt8中去除产生vt9
ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10
TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者
看到这里,那么用过linqtosql的语法有点相似啊?如果我们我们了解了sqlserver执行顺序,那么我们就接下来进一步养成日常sql好 习惯,也就是在实现功能同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实际就是批量运算,就是尽量减少 在客户端进行大数据量的循环操作,而用SQL语句或者存储过程代替。
只返回需要的数据
返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器、网络和客户端的无效劳动,其害处是显而易见的,避免这类事件需要注意:
1. 横向来看:
[*]不要写SELECT *的语句,而是选择你需要的字段。
[*]当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
如有表table1(ID,col1)和table2 (ID,col2)
<div class="cnblogs_code">1 Select A.ID, A.col1, B.col22 -- Select A.ID, col1, col2 &ndash;不要这么写,不利于将来程序扩展3 from table1 A inner join table2 B on A.ID=B.ID Where
页:
[1]