T-SQL逻辑查询
理解T-SQL的逻辑查询顺序是学习SQL Server的基础。
T-SQL逻辑执行顺序
(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>
注释
(1) 执行笛卡尔乘积。如果有多个表JOIN, 则逻辑执行顺序可以理解成: 先执行INNER JOIN, 再执行OUTER JOIN;或者理解成:按表出现的顺序逐个JOIN。当然,实际的执行顺序有赖于实际的执行计划,同一个SQL在不同的“环境”(索引、统计信息等)下,可能产生不同的执行计划。SQL Server的JOIN方式包括:INNER JOIN,LEFT JOIN,RIGHT JOIN,,FULL JOIN,CROSS JOIN,还有值得一提表运算符APPLY:CROSS APPLY,OUTER APPLY。
(2) 应用ON筛选器。注意把过滤条件放在ON和放在WHERE中的区别: 对于INNER JOIN,过滤条件放在哪里结果都正确;对于OUTER JOIN就要注意了:放在ON中,就是先过滤再JOIN,放在WHERE中,就是先JOIN再过滤,得到的结果很可能是不一样的。当然,生成实际的执行计划时,优化器会自动根据实际情况,把SQL中的LEFT JOIN改成INNER JOIN联接,但是,我的建议是:写SQL时,用INNER JOIN还是LEFT JOIN一定要依据实际的业务逻辑。在此还要注意一下三值逻辑:在筛选器中UNKNOW=FALSE, 在CHECK约束中UNKNOW=TRUE,UNIQUE约束, 排序操作和分组操作认为两个NULL是相等的。
(3) 添加外部行。外部联接包含: LEFT,RIGHT,FULL。为了说明“添加外部行”的概念,举个例子:A表有4行记录,B表有3行记录,且与A表中的3行记录一一对应。当A表LEFT JOIN B表时,它们实际上进行了两步操作:1.先INNER JOIN,结果产生3行记录,2.添加外部行:把A表中那1行没有与B表对应的记录“添加”到结果集末尾,最终结果集为4行记录。所以,大家经常说INNER JOIN比LEFT JOIN效率高,原因也就在于此,LEFT JOIN多了一个添加外部行的操作。
(4) 应用WHERE筛选器。再次注意过滤条件放在ON和放在WHERE中的区别:ON在第(2)步被应用, 而WHERE是在第(4)步被应用。
(5) 分组。注意SELECT语句和GROUP语句中的分组字段或表达式要一致,在不影响分组逻辑的前提下,也允许出现小小的不一致,如: SELECT YEAR(orderdate)+1 FROM table_name GROUP BY YEAR(orderdate)。如果用GROUP BY ALL(非标准遗留物),则相当于跳过第(4)步WHERE过滤,测试时可以一用。
(6) 应用CUBE或ROLLUP。注意GROUPING聚合函数在这里的应用:如果是由CUBE或ROLLUP产生的NULL,返回1,否则0。
(7) 应用HAVING筛选器。注意COUNT(*)、COUNT(1)和COUNT(field_name)的区别:前两者无区别,COUNT(field_name)统计时忽略值为NULL的记录。
(8) 处理SELECT列表。注意某些函数只会产生一个值,如GETDATE(),某些函数函数会产生多个值,如NEWID()。
(9) 应用DISTINCT子句。注意DISTINCT应该在TOP之前。
(10)应用ORDER BY子句。唯一一个可利用SELECT列列表中的别名的地方。如果有DISTINCT关键字, ORDER BY中只能出现SELECT列列表中的列。ORDER BY中可以使用数字代表SELECT列表中出现的列,但不推荐。因为ORDER BY只返回游标,所以结果不能用作表表达式(视图、内联表值函数、子查询、派生表、CTE), 但带TOP的选项除外,因为使用TOP后将返回一个结果集, 而并非游标:SELECT * FROM (SELECT TOP(10) * FROM dbo.table_name ORDER BY id DESC) T
(11)应用TOP选项。可以使用WITH TIES,但必须有ORDER BY:除了返回指定条数的记录,再返回与最后一条记录排序相等的所有记录。TOP()中的参数可以是表达式。如果不指定ORDER BY,查询结果顺序将是不确定的,因为生成的执行计划可能不一样,返回的行是SQL Server物理上最先访问到的行。所以说:有赖于排序的结果集一定要加上ORDER BY。
小结
当你写的SQL语法或结果集出现问题时,仔细分析一下T-SQL逻辑执行顺序,就会明白为什么^_^
T-SQL逻辑查询的更多相关文章
- 45、SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- 第四篇:记录相关操作 SQL逻辑查询语句执行顺序
http://www.cnblogs.com/linhaifeng/articles/7372774.html 一 SELECT语句关键字的定义顺序 SELECT DISTINCT <selec ...
- SQL逻辑查询语句执行顺序
阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SELECT语句关键字的定义顺序 SELE ...
- 9、SQL逻辑查询语句执行顺序
本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...
- SQL逻辑查询语句执行顺序 需要重新整理
一.SQL语句定义顺序 1 2 3 4 5 6 7 8 9 10 SELECT DISTINCT <select_list> FROM <left_table> <joi ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- mysql SQL 逻辑查询语句和执行顺序
关键字的执行优先级(重点) fromwheregroup byhavingselectdistinctorder bylimit 先创建两个表 CREATE TABLE table1 ( custom ...
- sql逻辑查询语句的执行顺序
SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN ...
- SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SELECT语句关键字的定义顺序 SELE ...
- mysql五补充部分:SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
随机推荐
- C++虚函数表理解
一,思维模式图 二,代码验证 class A { public: A(int x) { fProtected = x; } float GetFProtected() { return fProtec ...
- Elasticsearch-PHP 安装
安装 Elasticsearch-PHP只有三个要求你需要担心: PHP 5.3.9 或更高版本(查看更多信息) Composer ext-curl: Libcurl的PHP扩展 其它的依赖会通过Co ...
- axis2 webService开发指南(3)
复杂对象类型的WebService 这次我们编写复杂点的WebService方法,返回的数据是我们定义属性带getter.setter方法JavaBean,一维数组.二维数组等 1.服务源代码 新建一 ...
- centos7 yum 安装 mysql
CentOS7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1 ...
- 125. Valid Palindrome (Array; Two-Pointers)
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- Docker03 Docker基础知识、Docker实战
1 Docker基础知识 1.1 什么是Docker Docker是一个可以装应用的容器,就像杯子可以装水.书包可以装书一样:docker官网 Docker是Docker公司开发的,并开源到GitHu ...
- 344. Reverse String 最基础的反转字符串
[抄题]: [暴力解法]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: 还停留在 i < len / 2的阶段,不行,应该是指针对撞问题了 [一 ...
- Nginx 事件基本处理流程分析
说明:本文章重点关注事件处理模型.有兴趣的同学可以去http://tengine.taobao.org/book/查找更多资料.Tengine应该是淘宝基于Nginx自己做的修改.这个地址的文档还在不 ...
- [Cookie] Clear Cookie
import com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport def myCookies = testRunner.testCa ...
- LWIP网络接口管理
LAN8720+RJ45+MAC(STM32F4自带的)构成了网络接口层.