Select语句执行顺序

关键词:SELECT执行顺序

 


 在调优之前,还需要掌握的知识是,SQL语句的执行顺序,即一条正确的SQL语句,MySQL是先执行的哪部分,再执行的哪部分,最后执行的哪部分。SQL语句的顺序往往也会觉得执行效率,所以了解了SQL的执行顺序,有助于调整SQL结构来优化。


█ 思考

对于下面的SQL,它的执行顺序是怎样的?

SELECT DISTINCT s.name
FROM student s
left JOIN classroom c
ON s.class_id = c.id
WHERE s.age > 20
GROUP BY s.name
HAVING s.name is not null
ORDER BY s.age
LIMIT 10

█ 执行顺序

执行顺序 

关键字

作用

1

FROM、JOIN

选择和连接表获取数据集

2

ON

筛选连接表数据

3

WHERE

筛选数据集

4

GROUP BY

对数据集进行聚合分组

5

HAVING

对聚合分组之后的数据进行筛选

6

SELECT

选择查询所需的字段数据

7

DISTINCT

对查询后的数据进行去重

8

UNION

合并多个数据集

9

ORDER BY

对数据集进行排序

10

LIMIT

对数据集进行限制行数

想想上面的执行顺序,其实也比较容易理解。把数据库看做成一个大的货物仓库,一个个货架看做成一张张表,货架上的每一排货物就是一行数据。当老板安排你去取货架A、货架B上的小号笔记本时,操作刘畅我哪敢应该会是这样:首先你先确定要从哪几个货架上拿东西(FROM、JOIN),然后根据小号去筛选符合规定大小的笔记本(WHERE),如果要求按照笔记本的颜色分类,你就需要将前面筛选出来的笔记本按照颜色进行分类(GROUP HAVING)。紧接着按照某种颜色进行从早倒上进行排序(ORDER BY)。最后呢,如果说只要拿5个笔记本(LIMIT),那你就从这些结果集中取出5个笔记本拿给你老板就行了。

 

FROM、JOIN

数据库将首先计算FROM子句中指定的表(包括JOIN),以确定与查询相关的整个数据集。数据库将根据join ON子句合并来自所有表的数据,同时也从子查询中获取数据,甚至可能创建一些临时表来保存从这个子句中的子查询返回的数据。

但是在许多情况下,比如表或连接表中的数据量很大时,数据库的优化器会选择首先评估WHERE部分,以查看数据集的哪一部分可以忽略(最好使用索引),这样在没有必要的情况下就不会过多地膨胀数据集,提高效率。

 

WHERE

WHERE子句将是在FROM子句之后计算的第二个子句。经过FROM、JOIN已经有了工作数据集,现在可以根据WHERE子句中的条件过滤数据。从WHERE的执行顺序可以看出,在WHERE语句中是无法使用SELECT语句中字段的别名的以及聚合函数,比如“WHERE sum (available_stock) > 0”是不合法的。

 

GROUP BY

根据GROUP BY中出现的列来聚合数据,对数据进行分组。分组数据实际上是将数据分成不同的块或桶,其中每个桶有一个键和一个匹配该键的行列表。没有GROUPBY子句就像将所有行放入一个巨大的桶中。聚合数据之后,可以使用聚合函数为每个存储桶返回每个组的值。这些聚合函数包括COUNT、MIN、MAX、SUM等。由于我们已经对数据进行了分组,因此此时无法再访问原始行。这就是为什么通过GROUP BY聚合数据后,在SELECT语句中只能使用GROUP BY中的列或者聚合函数的原因。

 

HAVING

对通过GROUP BY进行分组后的数据进行筛选。可以引用聚合函数,比如“HAVING sum (available_stock) > 0”是合法的。

 

SELECT

获取到数据之后,我们可以通过SELECT来确定返回给客户端的字段数据。给你所需,你不需要的数据,数据库也不会多给你一点。可以在SELECT子句中使用列名、聚合和子查询。请记住,如果使用对聚合函数的引用,例如SELECT子句中的COUNT(*),那么它只是对分组时已经发生的聚合的引用,因此聚合本身不会发生在SELECT子句中,但这只是对其结果集的引用。

 

DISTINCT

虽然在语法上DISTANCT是使用在列名前面的,即SELECT DISTANCE COLUMN FROM TABLE。但其确实在根据字段筛选过数据之后执行。使用DISTINCT关键字时,数据库将丢弃筛选和聚合发生后剩余行中具有重复值的行。

 

UNION

UNION关键字将两个查询的结果集合并为一个结果集。大多数数据库允许您在UNION-DISTINCT(这将丢弃组合结果集中的重复行)或UNION ALL(只合并结果集而不应用任何重复检查)之间进行选择。可以对联合的结果集应用排序(orderby)和限制(LIMIT),方法与在常规查询上应用排序(ORDER BY)和限制(LIMIT)相同。

 

ORDER BY

对数据集进行升序(ASC)或降序(DESC)排列。

 

LIMIT

通过limit对结果集进行数量的限制,比如只返回前10条数据(LIMIT 10),或者从第6个开始,返回10条(LIMIT 6,10)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值