SQL 查询语句先执行 SELECT,Java中级程序员面试

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 查询语句先执行 SELECT,Java中级程序员面试相关的知识,希望对你有一定的参考价值。

  1. <join_type> JOIN <right_table>

  2. ON <join_condition>

  3. WHERE <where_condition>

  4. GROUP BY <group_by_list>

  5. HAVING <having_condition>

  6. ORDER BY <order_by_condition>

10.LIMIT <limit_number>




然而其执行顺序却是:



> **FROM**  

> <表名> # 笛卡尔积  

> **ON**  

> <筛选条件> # 对笛卡尔积的虚表进行筛选  

> **JOIN** <join, left join, right join...>   

> <join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中  

> **WHERE**  

> <where条件> # 对上述虚表进行筛选  

> **GROUP BY**  

> <分组条件> # 分组  

> <SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的  

> **HAVING**  

> <分组筛选> # 对分组后的结果进行聚合筛选  

> **SELECT**  

> <返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外  

> **DISTINCT**  

> \\# 数据除重  

> **ORDER BY**  

> <排序条件> # 排序  

> **LIMIT**  

> <行数限制>



*   其实,**引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表进行后续操作**,并释放没用的虚拟表的内存,以此类推。



具体解释:(注:下面“VT”表示 → 虚拟表 virtual )



1.   from:**select \\* from table\\_1, table\\_2; 与 select \\* from table\\_1 join table\\_2; 的结果一致,都是表示求笛卡尔积;**用于直接计算两个表笛卡尔积,得到虚拟表VT1,这是所有select语句最先执行的操作,其他操作时在这个表上进行的,也就是from操作所完成的内容

2.  on: 从VT1表中筛选符合条件的数据,形成VT2表;

3.  join: 将该 join 类型的数据补充到VT2表中,**例如 left join 会将左表的剩余数据添加到虚表VT2中,形成VT3表;若表的数量大于2,则会重复1-3步**;

4.  where: 执行筛选,(不能使用聚合函数)得到VT4表;

5.  group by: 对VT4表进行分组,得到VT5表;其后处理的语句,如select,having,所用到的列必须包含在group by条件中,没有出现的需要用聚合函数;

6.  having: 筛选分组后的数据,得到VT6表;

7.  select: 返回列得到VT7表;

8.  distinct: 用于去重得到VT8表;

9.  order by: 用于排序得到VT9表;

10.  limit: 返回需要的行数,得到VT10;



> 需要注意的是:

> 

> *   group by条件中,每个列必须是有效列,不能是聚合函数;

> *   null值也会作为一个分组返回;

> *   除了聚合函数,select子句中的列必须在group by条件中;



  

**上述内容让我们知道一个查询会返回什么,同时,也回答了以下这些问题:**



*   可以在 GRROUP BY 之后使用 WHERE 吗?(不行,GROUP BY 是在 WHERE 之后!)

*   可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后)

*   可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)

*   LIMIT 是在什么时候执行?(在最后!)



但是,数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在下方进行解释↓↓↓。



  

SQL中的别名会影响SQL执行顺序么?

======================



如下方SQL所示:



SELECT CONCAT(first_name, ’ ', last_name) AS full_name, count(*)

FROM table

GROUP BY full_name




![](https://img-blog.csdnimg.cn/img_convert/c29fa91d705ab8d67a1b7d730e9b3b7d.png)

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

[戳这里免费领取下面所有资料](https://gitee.com/vip204888/java-p7)

![](https://img-blog.csdnimg.cn/img_convert/bc178a2eb39b9a6a472a6f7edaa5d1ef.png)

点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

[戳这里免费领取下面所有资料](https://gitee.com/vip204888/java-p7)

[外链图片转存中...(img-kSP8K8wu-1628591597803)]

以上是关于SQL 查询语句先执行 SELECT,Java中级程序员面试的主要内容,如果未能解决你的问题,请参考以下文章

sql注入中级

灵魂拷问,SQL 查询语句先执行 SELECT吗?

面试官:SQL 查询总是先执行SELECT语句吗?你们都错了!

SQL语句之查询(SELECT)

SQL 查询语句先执行 SELECT,字节跳动算法工程师面试

带嵌套的Sql语句执行顺序问题