点击▲关注 “数据和云”   给公众号标星置顶

更多精彩 第一时间直达

SQL语言相信大家都不陌生,从本质上来说,它是一种结构化查询语言,是用来数据库之间的通信的编程语言。作为一名Java程序员,我们从Java角度来看,SQL语言相当于Java接口,而数据库是实现这个接口的实现类,SQL语句则是实现类的方法!!。从这里我们就可以理解了,每个数据库都有着自己独特的规则,但大体上是遵循SQL标准。

SQL 语句有一个让大部分人都感到困惑的地方,就是我写的 SQL 语句的跟我预想要的结果不一样。在这里,我们就以 Mysql 数据库为例,对一条 SQL 语句的执行顺序进行分析。

接下来再走一步,让我们看看一条 SQL 语句的前世今生。

首先看一下示例语句

它的执行顺序是这样的

准备数据

我们会先准备一些数据,即创建 classes、student 表,并插入测试数据, SQL语句如下:

OK,有了数据之后,我们就可以来看看 SQL 语句在 MySQL 中执行过程了,SQL 语句如下:

SQL执行之旅

可能你现在还对 Mysql 语句的执行顺序一知半解,没关系,下来我将按 SQL 执行的顺序详细介绍每个关键字的作用,以及注意的地方。

1、FROM:首先,是从 From 开始的,对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。

2、ON:对VT1应用ON筛选器,只有那些使为真才被插入到VT2。ON不能单独,在这里你可以把ON理解为WHERE。

3、JOIN:如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表(主表)中不符合ON条件匹配的行将作为外部行添加到VT2,生成VT3。如果FROM子句超过两个表,上一个联接生成的结果表会和下一个表重复执行步骤1到步骤3,直到处理完所有的表的关联。

4、WHERE:对VT3应用WHERE筛选器,只有为true的行才插入VT4。

5、GROUP BY:按GROUP BY子句中的列列表对VT4中的行进行分组,生成VT5。

在这里会有一个奇怪的现象,MySQL执行顺序GROUP BY -> HAVING -> SELECT,从顺序看SELECL在GROUP BY之后,GROUP BY 应该不可以使用SELECT字段别名,但是在GROUP BY却可以使用SELECT字段别名,主要原因MySQL扩展了标准SQL,允许GROUP BY子句使用的SELECT子句中的别名以及和非列表表达式等标准, 并认为语句是有效的。 从MySQL 5.7.5开始,默认SQL mode模式包括 ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL不检测功能依赖性,ONLY_FULL_GROUP_BY默认情况下不启用。

6、HAVING :对VT5应用HAVING筛选器,只有为true的组插入到VT6。

HAVING同GROUP BY一样,MySQL拓展SQL标准以允许HAVING可以使用别名和非列表表达式。

7、SELECT:将VT6每一组数据执行select xx,有几组就执行几次,产生VT7。

这里有一点要注意,当SQL mode 模式ONLY_FULL_GROUP_BY不开启,不会强制SELECT指定的字段必须属于GROUP BY后的条件。若符合条件的字段有多个,则只显示第一次出现的字段。虽然这种查询在语法上通过了,但结果并没有什么意义,因为其他字段并非需要的准确值。所以最好SELECT语句指定的字段必须是“分组依据字段”。

8、ORDER BY:将VT7中的行按ORDER BY子句中的列列表顺序,ORDER BY只能选择SELECT的字段

9、LIMIT:从VT7的开始处选择指定数量或比例的行,生成表VT8,并返回给调用者。

OK,到这里就执行结束了。我们可以发现,SQL 语句的语法顺序和执行顺序并不一致,如果你已经可以清醒知道它们之间差异,你就可以看出为什么以前写的SQL总是和我们预想的不一致。你看,哪怕只有一条小小的 SQL 语句都有这么多门道,只有不断专研探究,我们才可以真正掌握这一门技术。

这里多提一下,在SQL语法有几点要特别注意,SELECT虽然在GROUP BY和HAVING 之后,但是如果SQL mode模式 ONLY_FULL_GROUP_BY不开启,GROUP BY和HAVING是允许使用SELECT的字段,而且也不会强制SELECT指定的字段必须属于GROUP BY后的条件。至此SQL的解析之旅就结束了,最后用一张图总结一下今天的内容:

转载自:哈尔的数据城堡


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

产品推荐

云和恩墨Bethune Pro企业版,集监控,巡检,安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!

一条SQL语句的千回百转相关推荐

  1. Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

    目录 1.Mybatis 获取当前序列和下一个序列值 2.Mybatis 在一个方法中写多条SQL 语句 1.Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_seq ...

  2. python执行mysql多个sql语句_mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

  3. mysql数据库会同时执行sql吗_mysql 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

  4. 用一条sql语句删除表中所相同记录

    用一条sql语句删除表中所相同记录如下一.具有主键的情况 a.具有唯一性的字段id(为唯一主键) delete table where id not in ( select max(id) from ...

  5. 执行多条SQL语句,执行数据库事务(可传入Sql参数)

    上篇博客,实例介绍了一个事务执行多条SQL语句函数(int ExecuteSqlTran(List<String> SQLStringList))点击打开链接,方便之余又发现了它的缺陷-- ...

  6. 一条SQL语句在MySQL中是如何执行的

    来源:http://t.cn/E6U9Z9T 概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架 ...

  7. 面试题:一条 sql 语句是如何经过 MySQL 的体系结构的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:有了这 4 款工具,老板再也不怕我写烂SQL了个人原创+1博客:点击前往,查看更多 作者:李福春 来源:http ...

  8. 52条SQL语句性能优化策略

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引. 2.应尽量避免在 WHERE 子句中对字 ...

  9. 判断resultset是否遍历到最后一条记录_干货:一条SQL语句执行得很慢的原因

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...

最新文章

  1. 防止论坛批量小广告指南
  2. [H5表单]一些html5表单知识及EventUtil对象完善
  3. 2021暑假每日一题 【week2 完结】
  4. 此情应是长相守 你若无心我便休
  5. java操作redis简单学习3
  6. 自动生成三层结构代码(2)--生成实体类
  7. 3. 逻辑漏洞之支付漏洞
  8. MySQL管理之 MyISAM和InnoDB存储引擎简单对比
  9. 还在痴迷于大数据?未来 “小数据” 会让你大开眼界
  10. 在【使用QNX Momentics IDE构建的(只读QNX系统)】中搭建SSH方法
  11. 速卖通关键词挖掘工具_SEMer如何利用工具挖掘更多的关键词?拓词技巧
  12. HEVC之CU\PU\TU
  13. SKYPE的BUG 7/8
  14. 如何提高思维能力和逻辑能力?
  15. 【语音唤醒】MDTC:Multi-scale dilated temporal convolutional network
  16. svn服务器搭建(一) VisualSVN-Server
  17. 怎么用计算机实现复数开平方,用你手中的计算器进行复数运算
  18. HTML网页错误状态码
  19. 傻瓜式linux下安装Chrome和chromedriver
  20. 人性的劣根 — 如何战胜另一个你

热门文章

  1. 区块链和区块链联盟_区块链是安全主题吗?
  2. raspberry pi_书评:“ Raspberry Pi for Secret Agents”的使用效果不佳
  3. 如何充分利用开源项目_5个技巧:在开源项目中利用以用户为中心的设计
  4. 图例 | Java混合模式分析之火焰图实例
  5. Bootstrap 文档类型
  6. 伺服电机三环控制系统 一
  7. scara机器人本体介绍
  8. matlab 中sumg,MATLAB)课后实验答案[1]
  9. layui获取input信息_python爬虫—用selenium爬取京东商品信息
  10. mysql修改工资字段_mysql- 修改字段