sql查询语句先执行select,字节跳动算法工程师面试(代码片段)

程序员超时空 程序员超时空     2022-12-19     254

关键词:

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

从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎会把查询重写成这样↓↓↓:


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

FROM table

GROUP BY CONCAT(first_name, ' ', last_name)

所以,这样 GROUP BY 仍然先执行。

另外,数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。

数据库很可能不按正常顺序执行查询(优化)

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

在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。

这个查询说明了为什么需要以不同的顺序执行查询:


SELECT * FROM

dept d LEFT JOIN student s ON d.student_id = s.id



# 惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

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


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

还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

[外链图片转存中...(img-o24VTF6k-1628591532162)]


[外链图片转存中...(img-KvLHOxFR-1628591532164)]

**[资料获取方式:戳这里免费领取](https://gitee.com/vip204888/java-p7)**

sql语句之查询(select)(代码片段)

目录SQL语句之查询(SELECT)简单查询限定查询模糊查询排序查询多表查询SQL语句之查询(SELECT)SQL是用于访问和处理数据库的标准计算机语言;中文:结构化查询语言;英文全称:StructuredQueryLanguage;而其中的核心就是查询。简单... 查看详情

sql查询语句先执行select,java中级程序员面试(代码片段)

<join_type>JOIN<right_table>ON<join_condition>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>ORDERBY<order_by_condition>10.LIMIT<limit 查看详情

面试官:sql 查询总是先执行select语句吗?你们都错了!(代码片段)

...多数据库知识来源| infoq.cn/article/Oke8hgilga3PTZ3gWvbg很多SQL查询都是以SELECT开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口... 查看详情

字节跳动算法工程师总结:mysql设置主键自增

...的性能损耗?2.2数据库优化方案(一):查询请求增加时,如何做主从分离?2.3数据库优化方案(二):写入数据量增加时,如何实现分库分表?2.4发号器:如何保证分库分表后I 查看详情

oracle的问题执行sql查询语句出现:部分多字节字符

请各位大神支支招。帮我解决这个问题。用PL/SQLDeveloper软件执行SQL语句会出现图片中的问题。。参考技术A给你一个参考的写法:select*from病人信息where登记时间betweento_date('2005-05-0800:00:00','yyyy-mm-ddhh24:mi:ss')andto_date(&... 查看详情

13mysql-查询缓存querycache

查询缓存原理QueryCache是MySQL中的一个缓存机制,可以缓存SELECT语句的查询结果,提高查询性能。当再次执行相同的查询语句时,MySQL会尝试从缓存中获取结果,而不必重新执行查询语句。QueryCache的工作流程如下:1、当一个SELECT... 查看详情

字节跳动算法工程师总结:java资料文件

一面(个人感觉回答得还不错)1.自我介绍2.说项目,项目问的非常深(本人提到之前做过的一篇关于FULLGC的问题定位和优化的项目以及一个多并发的项目)2.1对于自己产于过项目的系统定位是否清楚?2.2... 查看详情

mysql执行计划

参考技术A我们知道,当一条sql查询语句执行时,会通过服务层中的优化器生成“查询执行计划”。而使用explain关键字可以查询到执行的SQL查询语句,从而知道MySQL是如何处理SQL的,即SQL的执行计划。因此根据执行计划我们可以... 查看详情

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

...学习这方面的知识哪些书比较好呢?参考技术A先执行子查询然后从子查询中出来到外层查询然后关联分组排序追问那就是先执行里层的,得到结果后再按外层的条件进行匹配是吗?之后再与其他表进行关联?可不可以推荐一下... 查看详情

什么是oracle执行计划

...是一步一步执行sql,比如说先查数据再排序,或者先作子查询再作主查询什么的。oracle的执行计划很复杂的,一般我们看到的执行计划都是oracle通过内部算法计算以后选择的一个消耗比较少的执行路径,就像我们去哪里也要选择... 查看详情

关于explain(代码片段)

...SQL从大到小的执行id相同时,执行顺序由上至下如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行如果id相同,则认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行select_typeSIMPLE:简... 查看详情

使用explain查询select查询语句执行计划

1.使用explain查询select查询语句执行计划mysql>select*frombabawherename=‘fjdsjf‘;+------+--------+|id |name |+------+--------+|  1|fjdsjf|+------+--------+查询该sql语句的执行计划mysql>explainselect* 查看详情

一文讲懂sql子查询

参考技术A大家好,我是宁一。今天讲解SQL教程第18课:子查询。SQL语句可以嵌套,最常见的就是查询语句的嵌套。基本语法:我们一般称外面嵌套的语句为主查询,里面被嵌套的语句为子查询,有时也会叫外查询、内查询,大家... 查看详情

select语句的执行结果

...时间】:2011-05-1718:17:25【问题描述】:如何执行我的选择查询的结果。下面的查询给了我一些SQL语句作为结果。我想执行does语句,怎么做?所有这些都在SQLSeverManagementStudio中执行。查询:SELECT\'UPDATERolecopySETPartofFT=\'\'\'+R2.Playedb 查看详情

使用explain分析select语句

explain可以分析某条select语句会查询多少条记录、以怎样的方式查询,以及复杂select的执行顺序,借此可以了解到select语句的性能和查询是如何执行的如:select子句和from子句,先执行from子句ps: 我们的服务器上mysql版本是5.1.73,... 查看详情

select查询语句执行顺序

查询中用到的关键词主要包含六个,并且他们的顺序依次为select--from--where--groupby--having--orderby其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序与sql语句的书写顺序并不是一样的,而是按照下面的顺序来... 查看详情

mysql执行sql语句,批量更改为指定时间段的随机时间

...时间。1、首先打开mysql,连接一个数据库,点击上方的【查询】按钮,再点击【新建查询】,如图所示。2、在查询框中,输入sql语句“EXPLAINselect*fromusers”,前面加了EXPLAIN,则查询语句在执行时,会记录执行过程效率。3、在查... 查看详情

java动态拼接sql语句并且执行时给sql语句的参数赋值

问题在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题。解决方法1.就拿我上面的... 查看详情