(7) SELECT

(8) DISTINCT

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) HAVING

(9) ORDER BY

(10) LIMIT

前期准备工作

1、新建一个测试数据库

create database testData;

2、创建测试表,并插入数据如下:

用户表

订单表

准备SQL逻辑查询测试语句

SELECT a.user_id,COUNT(b.order_id) as total_orders

FROM  user as a

LEFT JOIN orders as b

ON a.user_id = b.user_id

WHERE a.city = 'beijing'

GROUP BY a.user_id

HAVING COUNT(b.order_id) < 2

ORDER BY total_orders desc

使用上述SQL查询语句来获得来自北京,并且订单数少于2的客户;

在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果

一、执行FROM语句

第一步,执行FROM语句。我们首先需要知道最开始从哪个表开始的,这就是FROM告诉我们的。现在有了和两个表,我们到底从哪个表开始,还是从两个表进行某种联系以后再开始呢?它们之间如何产生联系呢?——笛卡尔积

经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,VT1(vitual table 1),内容如下:

总共有28(user的记录条数 * orders的记录条数)条记录。这就是VT1的结果,接下来的操作就在VT1的基础上进行

二、执行ON过滤

执行完笛卡尔积以后,接着就进行ON a.user_id = b.user_id条件过滤,根据ON中指定的条件,去掉那些不符合条件的数据,得到VT2如下:

select * from user as a inner JOIN orders as b ON a.user_id = b.user_id;

三、添加外部行

这一步只有在连接类型为OUTER JOIN时才发生,如LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN。在大多数的时候,我们都是会省略掉OUTER关键字的,但OUTER表示的就是外部行的概念。

LEFT OUTER JOIN把左表记为保留表:即左表的数据会被全部查询出来,若右表中无对应数据,会用NULL来填充:

RIGHT OUTER JOIN把右表记为保留表:即右表的数据会被全部查询出来,若左表中无对应数据,则用NULL补充;

FULL OUTER JOIN把左右表都作为保留表,但在Mysql中不支持全连接,可以通过以下方式实现全连接:

select * from A left join B on A.id = B.id (where 条件)

union

select * from A right join B on A.id = B.id (where条件);

由于我在准备的测试SQL查询逻辑语句中使用的是LEFT JOIN,得到的VT3表如下:

四、执行where条件过滤

对添加了外部行的数据进行where条件过滤,只有符合条件的记录会被筛选出来,执行WHERE a.city = 'beijing'得到VT4如下:

但是在使用WHERE子句时,需要注意以下两点:

1、由于数据还没有分组,因此现在还不能在where过滤条件中使用where_condition=MIN(col)这类对分组统计的过滤;

2、由于还没有进行列的选取操作,因此在select中使用列的别名也是不被允许的,如:select  city as c from table1 wherec='beijing' 是不允许的

五、执行group by分组语句

GROU BY子句主要是对使用WHERE子句得到的虚拟表进行分组操作,执行GROUP BY a.user_id得到VT5如下:

六、执行having

HAVING子句主要和GROUP BY子句配合使用,对分组得到VT5的数据进行条件过滤,执行HAVING COUNT(b.order_id) < 2,得到VT6如下:

七、select列表

现在才会执行到SELECT子句,不要以为SELECT子句被写在第一行,就是第一个被执行的。

我们执行测试语句中的SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders,从VT6中选择出我们需要的内容,得到VT7如下:

八、执行distinct去重复数据

如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。测试SQL中没有DISTINCT字句,所以不会执行

九、执行order by字句

对虚拟表VT7中的内容按照指定的列进行排序,然后返回一个新的虚拟表,我们执行测试SQL语句中的ORDER BY total_orders DESC ,得到结果如下:

DESC倒序排序,ASC升序排序

十、执行limit字句

LIMIT子句从上一步得到的虚拟表中选出从指定位置开始的指定行数据,常用来做分页;

MySQL数据库的LIMIT支持如下形式的选择:limit n,m

表示从第n条记录开始选择m条记录。对于小数据,使用LIMIT子句没有任何问题,当数据量非常大的时候,使用LIMIT n, m是非常低效的。因为LIMIT的机制是每次都是从头开始扫描,如果需要从第60万行开始,读取3条数据,就需要先扫描定位到60万行,然后再进行读取,而扫描的过程是一个非常低效的过程。

mysql sql先后执行_MySQL中SQL语句执行顺序相关推荐

  1. mysql sql 时间比较_mysql中sql语句进行日期比较

    这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAY ...

  2. mysql特殊字符小于 大于_MySQL 中SQL语句特殊字符如何处理(大于号, 小于号等)

    前言: 我们在使用mybatis时SQL是写在xml映射文件中,如果写的sql中有一些特殊字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,因为转义之后可能会出现一些问题比如SQL语句无 ...

  3. hmi中的宏指令是c语言,HMI中的宏指令编程中的语句执行顺序是?

    HMI中的宏指令编程中的语句执行顺序是? 以威纶通里的例子为例: 4. if结构语句 macro_command main() int k[10], j for j = 0 to 10 k[j] =  ...

  4. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  5. mysql排序显示行数的语句_MySQL中sql语句count(*),orderby,随机数据展示。

    count(*)这么慢,我该怎么办? MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高: 而 InnoDB 引擎就麻烦了,它执行 count ...

  6. mysql删除列前判断_MySQL中,删除列的SQL语句是( )

    参考答案如下 除列[单选题]在某个事件过程中定义的变量是______ 语句[单选题]Moving forward even in the face of great difficulties has ...

  7. mysql sql 事务写作_mysql中的事务

    MySQL事务相关 一. 什么是事务 事务(Transaction)是一个逻辑序列,该序列要么执行,要么不执行. 例如:转换业务 A 给 B 转账 1000 元,设计两个操作: A减少1000元 B增 ...

  8. mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...

    致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...

  9. mysql教程or怎么用_MySQL中or语句用法示例

    1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...

最新文章

  1. (转)javascript关于运动的各种问题经典总结
  2. apache activemq ActiveMQ 修改密码
  3. jQuery三级下拉菜单
  4. bzoj1013球形空间
  5. Mac用户SVN图形界面推荐
  6. MySQL优化filler值_MySQL 性能优化神器 Explain 使用分析
  7. Oracle 安装 网络配置 警告
  8. 讲讲金融业务(一)--自助结算终端POS
  9. Mac 开发 Hue
  10. Spring依赖注入流程【完整版】(populateBean方法内部执行流程)
  11. xp任务栏一直闪跳怎么办_电脑任务栏闪烁以及任务栏图标闪烁解决办法
  12. 物理卷、卷组与逻辑卷的关系及相关操作详述
  13. 【Flocking算法】海王的鱼塘是怎样炼成的
  14. python 排产计划_生产排程计划表
  15. day06 Elasticsearch搜索引擎2
  16. IP-guard如何实现远程控制或远程文件传送时,不在客户端弹出授权提示
  17. android 多个按钮居中,Android手机开发 使用线性布局和相对布局实现Button垂直水平居中...
  18. 批量注释基因到基因座上(map gene to locus)
  19. 对互联网的认识和看法,直接关系到产业互联网的路径发展
  20. 实现制作萝莉语音包前的准备——百度AI的使用介绍

热门文章

  1. 【Python基础知识-pycharm版】第七节-函数
  2. java部署jar还是war优劣_详解Spring Boot 部署jar和war的区别
  3. linux系统限制内存使用率,linux中限制CPU和内存占用率方法
  4. python xlrd使用_python处理Excel xlrd的简单使用
  5. 一份北大信科内部流传的 “CS 自救指南”
  6. 关于深度学习,我们写了一本1400页的全栈手册
  7. pycharm插件之SonarLint
  8. 【HTML/CSS】display相关属性
  9. Windows下如何搭建Gradle环境?
  10. 用vb.net实现拖放功能