原文链接:http://www.tuicool.com/articles/fERNv2

写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序。可以有时间自己写一个简单的数据库,理解会更加深入。下面就写写我的一些理解,以SQL SERVER2008为例,进行说明。

先看下面这条简单SQL语句:

1 select
2 top 10 *
3 from Student 4 where age>20

这条SQL语句是否可以有下面两种理解呢

(1)先从Student表中选出age>20的数据,然后从这些数据中选择前面的10条数据。

(2)先从Student表中选出前10条数据,然后从这些数据中选择age>20的数据。

那么到底哪个是正确的呢?你可能会说,这还不容易,肯定是(1)是正确的。没错,对于这样的简单的语句,一眼就能看出来,可是对于稍微复杂一些的SQL语句或者更加复杂的SQL语句,有时我们一眼就看不出来了,为了能够正确分析SQL语句以及写出正确的SQL语句,有必要了解一下SQL语句各部分的执行顺序。

好了,我们再看下面的一条SQL语句:

select
distinct
top 1
Table1.id,COUNT(Table1.name) as nameCount from Table1 inner join Table2 on Table1.id=Table2.id where Table1.id<4 group by Table1.id having Table1.id<3 order by Table1.id desc

其中Table1和Table2就是我随便建立的两个非常简单的表,为了讲解方便,我也没有弄一些跟实际相结合的表,要不还要理解业务逻辑,干脆越简单越好,毕竟目的是为了说明SQL语句的执行顺序,Table1和Table2如下:

Table1 Table2

下面先给出上面的SQL语句的执行顺序,然后进行讲解:

(8)  select
(9)  distinct
(11)  top 1
(6)   Table1.id,COUNT(Table1.name) as nameCount (1)  from Table1 (3)  inner join Table2 (2)  on Table1.id=Table2.id (4)  where Table1.id<4 (5)  group by Table1.id (7)  having Table1.id<3 (10)  order by Table1.id desc

红色序号给出了执行的顺序:

(1)from:对Table1和Table2执行笛卡尔积,也就是两个表的行的各种组合,共5*5=25行,生成虚拟表VT1

(2)on:选择VT1中的那些Table1.id=Table2.id的所有行,生成虚拟表VT2。

(3)inner join:这里是内部连接,直接就是VT2,如果是outer join,如left join、right join、full join,那么还需要按照外部连接的规则,把VT1中没有匹配的行添加到VT2,生成VT3.

(4)where:选出VT3中Table1.id<4的表格,给虚拟表VT4.

(5)group by:按照Table1.id进行分组。

(6)COUNT:执行聚合函数,选出对应Table1.id的行数,生成的结果给虚拟表VT5

(7)having:选择VT5中Table1.id<3的所有结果,给虚拟表VT6

(8)select:选择VT6中相应的列,给虚拟表VT7

(9)distinct:将VT7中重复的行去除,生成VT8

(10)order by:将VT8的结果按照Table1.id进行排序, 这里没有生成一个新的表VT9 ,而是生成游标VC9。

(11)top:从游标VC9的开始处选择指定的行数,这里是1行,生成虚拟表VT10.

经过上面的过程,最终的SQL语句将VT10返回给用户使用。

所以以后再写SQL语句的时候,可以按照上面的顺序写SQL语句了,读SQL语句也可以按照上面的顺序去读,做到心里明白。

好了,啰啰嗦嗦说了这么多,上个图吧(真是奇丑无比),一图胜千言,自己做个总结,也希望对大家有所帮助。

SQL语句中各个部分的执行顺序(转)相关推荐

  1. SQL语句中 and or执行优先级

    首先,sql语句中not and or的执行优先级从高到低依次为:not,and,or 举例如下: select * from table where a=1 and b=2 or c=3 and d ...

  2. 【C# .NET】Oracle数据库连接的坑之传入parameters参数名SQL语句中的参数变量名不匹配(顺序不一致)的问题

    问题描述 有一个user表,需要修改id为10086的用户的姓名和年龄,在C#的后台这样写: using (IDbConnection db = DapperFactory.GetConnection ...

  3. oracle 执行带参数的sql语句_当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?...

    当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现? 描述详细一点就是:在要执行的SQL语句中所用到(: parameter)这种参数的个数,因具体条件不同,而 ...

  4. SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...

    declare @sqlstr varchar(3000) set @sqlstr='declare @subsqlstr varchar(1000);' set @sqlstr=@sqlstr+'s ...

  5. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  6. SQL语句中的select高级用法

    #转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...

  7. sql语句中使用函数会耗费性能吗_挽救数据库性能的 30 条黄金法则 | 原力计划...

    作者 | geekguy 责编 | 王晓曼 出品 | CSDN博客 1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于 ...

  8. sql语句中case_SQL中的CASE语句

    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case sta ...

  9. SQL语句中,为什么where子句不能使用列别名,而order by却可以?

    当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件.    例如下面的SQL语句: select id, (c1 + c2) as s from t1  where ...

最新文章

  1. mac apache 和 nginx ssl 配置自签名的SSL
  2. 安卓实训项目:基于储存卡音乐播放器实训报告4.0
  3. JS正则表达式使用详解
  4. c语言 函数多个参数,C语言函数可变参数
  5. CSS里的inline-size和逻辑属性
  6. 网页里面的下拉框与数据库交互
  7. 集合附加属性(HACK)
  8. 无论是工作还是生活都要记住这些话
  9. 微信视频开发jquery mobile
  10. 联想小新锐7000主板型号_2020年高性价比游戏本选购推荐指南——7000价位游戏本推荐...
  11. Let's Encrypt(开源SSL证书管理工具)
  12. mysql server再次安装失败_MySQL在windows上多次安装失败
  13. MfC基础--绘图基础--win32
  14. 图片服务器 文件系统,调研分享:图片文件在各文件系统上的访问性能对比
  15. HaDoop安装配置笔记
  16. 腾讯内部出品Android编程入门教程,快快收藏吧!!!
  17. OCR识别缺点_常用的OCR文字识别软件有哪些_软件动态论坛
  18. MDWechat(微信美化)
  19. 关闭linux防火墙永久
  20. 二代测序下机数据的数据处理

热门文章

  1. MODE ——计算了 任意多个数字的平均值(知识点:for的循环)
  2. 案例:使用jquery的ajax load方法更新局部页面并应用NProgress库实现顶部进度条
  3. 前端 在浏览器端存储数据
  4. zabbixp-监控 php-fpm
  5. 更新版PowerBI发布了-- Power BI Report Server Update – March 2018
  6. luogu p1459 三值的排序
  7. springMVC注解@initbinder日期类型的属性自动转换
  8. 20135331 文艺 java实验
  9. 北京邦永科技有限公司
  10. 弹出窗口, 不显示工具栏等。