2022-10-27 366
大家好,我是狼王,一个爱打球的程序员
大家平时和SQL语句打交道的时间肯定不少,有写过简单SQL的,也有为很复杂的业务逻辑的SQL绞尽脑汁的,那我在这里问下大家一个简单的问题:那你知道SQl语句的查询顺序是怎么样的吗?
当我刚看到这个问题的时候,我的内心是这样的
这个问题应该很好回答,毕竟自己已经写了无数个 SQL 查询语句了,有一些还很复杂的。还装不了这个逼了??
但事实是,我仍然很难确切地说出它的顺序是怎样的。
好了,不调侃了,我们先来看下SELECT语句的完整语法:
1.SELECT 2.DISTINCT<select_list> 3.FROM<left_table> 4.<join_type>JOIN<right_table> 5.ON<join_condition> 6.WHERE<where_condition> 7.GROUPBY<group_by_list> 8.HAVING<having_condition> 9.ORDERBY<order_by_condition> 10.LIMIT<limit_number>
然而其执行顺序却是下面这样的
FROM <表名>#笛卡尔积 ON <筛选条件>#对笛卡尔积的虚表进行筛选 JOIN<join,leftjoin,rightjoin...> <join表>#指定join,用于添加数据到on之后的虚表中,例如leftjoin会将左表的剩余数据添加到虚表中 WHERE <where条件>#对上述虚表进行筛选 GROUPBY <分组条件>#分组 <SUM()等聚合函数>#用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的 HAVING <分组筛选>#对分组后的结果进行聚合筛选 SELECT <返回数据列表>#返回的单列必须在groupby子句中,聚合函数除外 DISTINCT #数据除重 ORDERBY <排序条件>#排序 LIMIT <行数限制>
其实,sql引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作,并释放没用的虚拟表的内存,以此类推。
具体过程如下:(下面“VT”表示 → 虚拟表 virtual )
group by条件中,每个列必须是有效列,不能是聚合函数;
null值也会作为一个分组返回;
除了聚合函数,select子句中的列必须在group by条件中;
但是,数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在下方进行解释↓↓↓。
如下方SQL所示:
SELECT CONCAT(first_name,'',last_name)ASfull_name, count(*) FROMtable GROUPBYfull_name
从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎会把查询重写成这样:
SELECT CONCAT(first_name,'',last_name)ASfull_name, count(*) FROMtable GROUPBYCONCAT(first_name,'',last_name)
所以,这样 GROUP BY 仍然先执行。
另外,数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。
在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。
这个查询说明了为什么需要以不同的顺序执行查询:
SELECT*FROM deptdLEFTJOINstudents ONd.student_id=s.id WHEREs.name='狼王'
如果只需要找出名字叫狼王学生信息,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。
好了。今天就说到这了,我还会不断分享自己的所学所想,希望我们一起走在成功的道路上!
原文链接:https://77isp.com/post/10397.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态