首页 简历|笔试面试

面渣逆袭MySQL篇V2.0(暗黑版)

  • 25年9月4日 发布
  • 52.92MB 共372页
面渣逆袭MySQL篇V2.0(暗黑版)面渣逆袭MySQL篇V2.0(暗黑版)面渣逆袭MySQL篇V2.0(暗黑版)面渣逆袭MySQL篇V2.0(暗黑版)面渣逆袭MySQL篇V2.0(暗黑版)

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

No. 1 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

前⾔

5.4 万字 286 张⼿绘图,详解 83 道 MySQL ⾯试⾼频题(让天下没有难背的⼋股),⾯渣背

会这些 MySQL ⼋股⽂,这次吊打⾯试官,我觉得稳了(⼿动 dog)。整理:沉默王⼆,戳转

载链接,作者:三分恶,戳原⽂链接。

亮⽩版本更适合拿出来打印,这也是很多学⽣党喜欢的⽅式,打印出来背诵的效率会更⾼。

2025 年 02 ⽉ 27 ⽇开始着⼿第⼆版更新。

对于⾼频题,会标注在《Java ⾯试指南(付费)》中出现的位置,哪家公司,原题是什

么;如果你想节省时间的话,可以优先背诵这些题⽬,尽快做到知彼知⼰,百战不殆。

区分⼋股精华回答版本和原理底层解释,让⼤家知其然知其所以然,同时⼜能做到⾯试时

的⾼效回答。

结合项⽬(技术派、pmhub)来组织语⾔,让⾯试官最⼤程度感受到你的诚意,⽽不是

机械化的背诵。

No. 2 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

修复第⼀版中出现的问题,包括球友们的私信反馈,⽹站留⾔区的评论,以及 GitHub 仓

库中的 issue,让这份⾯试指南更加完善。

增加⼆哥编程星球的球友们拿到的⼀些 offer,对⾯渣逆袭的感谢,以及对简历修改的⼀

些认可,以此来激励⼤家,给⼤家更多信⼼。

优化排版,增加⼿绘图,重新组织答案,使其更加⼝语化,从⽽更贴近⾯试官的预期。

⻓按识别下⾯的⼆维码,关注⼆哥的公众号,回复【222】即可拉取最新版本。

No. 3 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

百度⽹盘、阿⾥云盘、夸克⽹盘都可以下载到最新版本,我会第⼀时间更新上去。

No. 4 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

No. 5 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

当然了,请允许我的⼀点点私⼼,那就是星球的 PDF 版本会⽐公众号早⼀个⽉时间,毕竟星

球⽤户都付费过了,我有必要让他们先享受到⼀点点福利。相信⼤家也都能理解,毕竟在线

版是免费的,CDN、服务器、域名、OSS 等等都是需要成本的。

更别说我付出的时间和精⼒了。

展示⼀下暗⿊版本的 PDF 吧,排版清晰,字体优雅,更加适合夜服,晚上看会更舒服⼀点。

MySQL 基础

0.什么是 MySQL?

MySQL 是⼀个开源的关系型数据库,现在⾪属于 Oracle 公司。是我们国内使⽤频率最⾼的

⼀种数据库,我在本地安装的是最新的 8.3 版本。

No. 6 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

怎么删除/创建⼀张表?

可以使⽤ DROP TABLE 来删除表,使⽤ CREATE TABLE 来创建表。

创建表的时候,可以通过 PRIMARY KEY 设定主键。

CREATE TABLE users (

id INT AUTO_INCREMENT,

name VARCHAR(100) NOT NULL,

email VARCHAR(100),

PRIMARY KEY (id)

);

请写⼀个升序/降序的 SQL 语句?

在 SQL 中,可以使⽤ ORDER BY ⼦句来对查询结果进⾏升序或者降序。默认情况下,查询结

果是升序的,如果需要降序,可以通过 DESC 关键字来实现。

⽐如说在员⼯表中,我们要按⼯资降序,就可以使⽤ ORDER BY salary DESC 来完成:

SELECT id, name, salary

FROM employees

ORDER BY salary DESC;

如果需对多个字段进⾏排序,例如按⼯资降序,按名字升序,就可以 ORDER BY salary

DESC, name ASC 来完成:

No. 7 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

SELECT id, name, salary

FROM employees

ORDER BY salary DESC, name ASC;

MySQL出现性能差的原因有哪些?

可能是 SQL 查询使⽤了全表扫描,也可能是查询语句过于复杂,如多表 JOIN 或嵌套⼦查

询。

也有可能是单表数据量过⼤。

通常情况下,添加索引就能解决⼤部分性能问题。对于⼀些热点数据,还可以通过增加 Redis

缓存,来减轻数据库的访问压⼒。

1. Java ⾯试指南(付费)收录的字节跳动⾯经同学 1 Java 后端技术⼀⾯⾯试原

题:你平时⽤到的数据库

2. Java ⾯试指南(付费)收录的腾讯云智⾯经同学 16 ⼀⾯⾯试原题:数据库⽤过

哪些,对哪个⽐较熟?

3. Java ⾯试指南(付费)收录的 360 ⾯经同学 3 Java 后端技术⼀⾯⾯试原题:⽤

过哪些数据库

4. Java ⾯试指南(付费)收录的招商银⾏⾯经同学 6 招银⽹络科技⾯试原题:了

解 MySQL、Redis 吗?

5. Java ⾯试指南(付费)收录的国企零碎⾯经同学 9 ⾯试原题:数据库⽤什么多

(说了 Mysql 和 Redis)

6. Java ⾯试指南(付费)收录的vivo ⾯经同学 10 技术⼀⾯⾯试原题:怎么删除/

创建⼀张表和设定主键

,举例⽤sql实现升序降序

7. Java ⾯试指南(付费)收录的滴滴⾯经同学 3 ⽹约⻋后端开发⼀⾯原题:

MySQL性能慢的原因

1.两张表怎么进⾏连接?

可以通过内连接 inner join 、外连接 outer join 、交叉连接 cross join 来合并多个表

的查询结果。

No. 8 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

什么是内连接?

内连接⽤于返回两个表中有匹配关系的⾏。假设有两张表,⽤户表和订单表,想查询有订单

的⽤户,就可以使⽤内连接 users INNER JOIN orders ,按照⽤户 ID 关联就⾏了。

SELECT users.name, orders.order_id

FROM users

INNER JOIN orders ON users.id = orders.user_id;

只有那些在两个表中都存在 user_id 的记录才会出现在查询结果中。

什么是外连接?

和内连接不同,外连接不仅返回两个表中匹配的⾏,还返回没有匹配的⾏,⽤ null 来填

充。

外连接⼜分为左外连接 left join 和右外连接 right join 。

left join 会保留左表中符合条件的所有记录,如果右表中有匹配的记录,就返回匹配的记录,

否则就⽤ null 填充,常⽤于某表中有,但另外⼀张表中可能没有的数据的查询场景。

假设要查询所有⽤户及他们的订单,即使⽤户没有下单,就可以使⽤左连接:

SELECT users.id, users.name, orders.order_id

FROM users

LEFT JOIN orders ON users.id = orders.user_id;

查询前:

No. 9 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

users orders

id name

1 王⼆

2 张三

3 李四

查询后:

id name order_id

1 王⼆ 10

2 张三 20

3 李四 null

右连接就是左连接的镜像,right join 会保留右表中符合条件的所有记录,如果左表中有匹配

的记录,就返回匹配的记录,否则就⽤ null 填充。

什么是交叉连接?

交叉连接会返回两张表的笛卡尔积,也就是将左表的每⼀⾏与右表的每⼀⾏进⾏组合,返回

的⾏数是两张表⾏数的乘积。

假设有 A 表和 B 表,A 表有 2 ⾏数据,B 表有 3 ⾏数据,那么交叉连接的结果就是 2 3=

6 ⾏。

SELECT A.id, B.id

FROM A

CROSS JOIN B;

笛卡尔积是数学中的⼀个概念,例如集合 A={a,b} ,集合 B={0,1,2} ,那么 A B=

{<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,} 。

1. Java ⾯试指南(付费)收录的⽤友⾯试原题:两张表怎么进⾏连接

No. 10 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

2.内连接、左连接、右连接有什么区别?

MySQL 的连接主要分为内连接和外连接,外连接⼜可以分为左连接和右连接。

内连接可以⽤来找出两个表中共同的记录,相当于两个数据集的交集。

左连接和右连接可以⽤来找出两个表中不同的记录,相当于两个数据集的并集。两者的区别

是,左连接会保留左表中符合条件的所有记录,右连接则刚好相反。

拿技术派实战项⽬的表为例来详细验证下。

有三张表,⼀张⽂章表 article,主要存⽂章标题 title, ⼀张⽂章详情表 article_detail,主要

存⽂章的内容 content,⼀张⽂章评论表 comment,主要存评论 content,三个表通过⽂章 id

关联。

先来看内连接:

No. 11 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

SELECT LEFT(a.title, 20) AS ArticleTitle, LEFT(c.content, 20) AS

CommentContent

FROM article a

INNER JOIN comment c ON a.id = c.article_id

LIMIT 2;

返回⾄少有⼀条评论的⽂章标题和评论内容(前 20 个字符),只返回符合条件的前 2 条记

录。

再来看做连接:

SELECT LEFT(a.title, 20) AS ArticleTitle, LEFT(c.content, 20) AS

CommentContent

FROM article a

LEFT JOIN comment c ON a.id = c.article_id

LIMIT 2;

返回所有⽂章的标题和⽂章评论,即使某些⽂章没有评论(填充为 NULL)。

最后来看右连:

No. 12 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

SELECT LEFT(a.title, 20) AS ArticleTitle, LEFT(c.content, 20) AS

CommentContent

FROM comment c

RIGHT JOIN article a ON a.id = c.article_id

LIMIT 2;

1. Java ⾯试指南(付费)收录的腾讯 Java 后端实习⼀⾯原题:请说说 MySQL 的

内联、左联、右联的区别。

memo:2025 年 2 ⽉ 27 ⽇修改⾄此。给⼤家看⼀条球友的⾯经,基本上都是⾯渣逆袭中常

⻅的⼋股,所以只要能把⾯渣中的⾼频题拿下,⾯试 OC 的概率真的很⼤,真⼼话。

No. 13 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

3.说⼀下数据库的三⼤范式?

No. 14 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

第⼀范式,确保表的每⼀列都是不可分割的基本数据单元,⽐如说⽤户地址,应该拆分成

省、市、区、详细地址等 4 个字段。

第⼆范式,要求表中的每⼀列都和主键直接相关。⽐如在订单表中,商品名称、单位、商品

价格等字段应该拆分到商品表中。

No. 15 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

然后新建⼀个订单商品关联表,⽤订单编号和商品编号进⾏关联就好了。

第三范式,⾮主键列应该只依赖于主键列。⽐如说在设计订单信息表的时候,可以把客户名

称、所属公司、联系⽅式等信息拆分到客户信息表中,然后在订单信息表中⽤客户编号进⾏

关联。

No. 16 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

建表的时候需要考虑哪些问题?

⾸先需要考虑表是否符合数据库的三⼤范式,确保字段不可再分,消除⾮主键依赖,确保字

段仅依赖于主键等。

然后在选择字段类型时,应该尽量选择合适的数据类型。

在字符集上,尽量选择 utf8mb4,这样不仅可以⽀持中⽂和英⽂,还可以⽀持表情符号等。

当数据量较⼤时,⽐如上千万⾏数据,需要考虑分表。⽐如订单表,可以采⽤⽔平分表的⽅

式来分散单表存储压⼒。

1. Java ⾯试指南(付费)收录的字节跳动⾯经同学 13 Java 后端⼆⾯⾯试原题:

什么是三⼤范式,为什么要有三⼤范式,什么场景下不⽤遵循三⼤范式,举⼀个

场景

2. Java ⾯试指南(付费)收录的京东⾯经同学 5 Java 后端技术⼀⾯⾯试原题:建

表考虑哪些问题

4.varchar 与 char 的区别?

No. 17 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

varchar 是可变⻓度的字符类型,原则上最多可以容纳 65535 个字符,但考虑字符集,以及

MySQL 需要 1 到 2 个字节来表示字符串⻓度,所以实际上最⼤可以设置到 65533。

latin1 字符集,且列属性定义为 NOT NULL。

char 是固定⻓度的字符类型,当定义⼀个 CHAR(10) 字段时,不管实际存储的字符⻓度是多

少,都只会占⽤ 10 个字符的空间。如果插⼊的数据⼩于 10 个字符,剩余的部分会⽤空格填

充。

值 CHAR(4) 存储需求(字节) VARCHAR(4) 存储需求(字节)

'' '' 4 '' 1

'ab' 'ab ' 4 'ab' 3

'abcd' 'abcd' 4 'abcd' 5

'abcdefgh' 'abcd' 4 'abcd' 5

5.blob 和 text 有什么区别?

blob ⽤于存储⼆进制数据,⽐如图⽚、⾳频、视频、⽂件等;但实际开发中,我们都会把这

些⽂件存储到 OSS 或者⽂件服务器上,然后在数据库中存储⽂件的 URL。

text ⽤于存储⽂本数据,⽐如⽂章、评论、⽇志等。

memo:2025 年 2 ⽉ 28 ⽇修改⾄此。今天有球友反馈拿到了理想汽⻋的补录

offer, 真的恭喜了!

No. 18 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

6.DATETIME 和 TIMESTAMP 有什么区别?

DATETIME 直接存储⽇期和时间的完整值,与时区⽆关。

TIMESTAMP 存储的是 Unix 时间戳,1970-01-01 00:00:01 UTC 以来的秒数,受时区影响。

No. 19 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

另外,DATETIME 的默认值为 null,占⽤ 8 个字节;TIMESTAMP 的默认值为当前时间——

CURRENT_TIMESTAMP,占 4 个字节,实际开发中更常⽤,因为可以⾃动更新。

7.in 和 exists 的区别?

当使⽤ IN 时,MySQL 会⾸先执⾏⼦查询,然后将⼦查询的结果集⽤于外部查询的条件。这

意味着⼦查询的结果集需要全部加载到内存中。

⽽ EXISTS 会对外部查询的每⼀⾏,执⾏⼀次⼦查询。如果⼦查询返回任何⾏,则 EXISTS

条件为真。 EXISTS 关注的是⼦查询是否返回⾏,⽽不是返回的具体值。

No. 20 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

-- IN 的临时表可能成为性能瓶颈

SELECT * FROM users

WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);

-- EXISTS 可以利⽤关联索引

SELECT * FROM users u

WHERE EXISTS (SELECT 1 FROM orders o

WHERE o.user_id = u.id AND o.amount > 100);

IN 适⽤于⼦查询结果集较⼩的情况。如果⼦查询返回⼤量数据, IN 的性能可能会下降,因

为它需要将整个结果集加载到内存。

⽽ EXISTS 适⽤于⼦查询结果集可能很⼤的情况。由于 EXISTS 只需要判断⼦查询是否返回

⾏,⽽不需要加载整个结果集,因此在某些情况下性能更好,特别是当⼦查询可以使⽤索引

时。

NULL值陷了解吗?

IN : 如果⼦查询的结果集中包含 NULL 值,可能会导致意外的结果。例如, WHERE column

IN (subquery) ,如果 subquery 返回 NULL ,则 column IN (subquery) 永远不会为

真,除⾮ column 本身也为 NULL 。

EXISTS : 对 NULL 值的处理更加直接。 EXISTS 只是检查⼦查询是否返回⾏,不关⼼⾏的具

体值,因此不受 NULL 值的影响。

memo:2025 年 3 ⽉ 1 ⽇修改⾄此。

8.记录货币⽤什么类型⽐较好?

如果是电商、交易、账单等涉及货币的场景,建议使⽤ DECIMAL 类型,因为 DECIMAL 类型

是精确数值类型,不会出现浮点数计算误差。

例如, DECIMAL(19,4) 可以存储最多 19 位数字,其中 4 位是⼩数。

No. 21 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

CREATE TABLE orders (

id INT AUTO_INCREMENT,

amount DECIMAL(19,4),

PRIMARY KEY (id)

);

如果是银⾏,涉及到⽀付的场景,建议使⽤ BIGINT 类型。可以将货币⾦额乘以⼀个固定因

⼦,⽐如 100,表示以“分”为单位,然后存储为 BIGINT 。这种⽅式既避免了浮点数问题,同

时也提供了不错的性能。但在展示的时候需要除以相应的因⼦。

为什么不推荐使⽤ FLOAT 或 DOUBLE?

因为 FLOAT 和 DOUBLE 都是浮点数类型,会存在精度问题。

在许多编程语⾔中, 0.1 + 0.2 的结果会是类似 0.30000000000000004 的值,⽽不是预期

的 0.3 。

9.怎么存储 emoji?

因为 emoji( )是 4 个字节的 UTF-8 字符,⽽ MySQL 的 utf8 字符集只⽀持最多 3 个字节

的 UTF-8 字符,所以在 MySQL 中存储 emoji 时,需要使⽤ utf8mb4 字符集。

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE

utf8mb4_unicode_ci;

MySQL 8.0 已经默认⽀持 utf8mb4 字符集,可以通过 SHOW VARIABLES WHERE

Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; 查

看。

No. 22 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

1. Java ⾯试指南(付费)收录的字节跳动⾯经同学 13 Java 后端⼆⾯⾯试原题:

mysql 怎么存 emoji,怎么编码

10.drop、delete 与 truncate 的区别?

DROP 是物理删除,⽤来删除整张表,包括表结构,且不能回滚。

DELETE ⽀持⾏级删除,可以带 WHERE 条件,可以回滚。

TRUNCATE ⽤于清空表中的所有数据,但会保留表结构,不能回滚。

memo:2025 年 3 ⽉ 4 ⽇修改⾄此。给⼤家传递⼀个喜报,⼀位球友拿到了科⼤讯⻜的

offer,这薪资在合肥真的会很⾹。

No. 23 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

11.UNION 与 UNION ALL 的区别?

UNION 会⾃动去除合并后结果集中的重复⾏。UNION ALL 不会去重,会将所有结果集合并

起来。

12.count(1)、count(*) 与 count(列名) 的区别?

在 InnoDB 引擎中, COUNT(1) 和 COUNT(*) 没有区别,都是⽤来统计所有⾏,包括

NULL。

如果表有索引, COUNT(*) 会直接⽤索引统计,⽽不是全表扫描,⽽ COUNT(1) 也会被

MySQL 优化为 COUNT(*) 。

COUNT(列名) 只统计列名不为 NULL 的⾏数。

-- 假设 users 表:

+----+-------+------------+

| id | name | email |

+----+-------+------------+

| 1 | 张三 | zhang@xx.com |

| 2 | 李四 | NULL |

| 3 | 王⼆ | wang@xx.com |

+----+-------+------------+

-- COUNT(*)

SELECT COUNT(*) FROM users;

-- 结果:3 (统计所有⾏)

-- COUNT(1)

SELECT COUNT(1) FROM users;

-- 结果:3 (统计所有⾏)

-- COUNT(email)

SELECT COUNT(email) FROM users;

-- 结果:2 (NULL 不计⼊统计)

No. 24 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

这⾥解释⼀下,假设有这样⼀张表:

CREATE TABLE t1 (

id INT,

name VARCHAR(50),

value INT

);

插⼊的数据为:

INSERT INTO t1 VALUES

(1, 'A', 10),

(2, 'B', NULL), -- NULL in value column

(3, 'C', 30),

(4, NULL, 40), -- NULL in name column

(5, 'E', NULL); -- NULL in value column

因为 id 列没有索引,所以 select count(*) 是全表扫描。

然后我们给 id 列加上索引。

No. 25 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

alter table t1 add primary key (id);

再来看⼀下 select count(*) ,发现⽤了索引(MySQL 默认为给主键添加索引)。

另外,MySQL 8.0 官⽅⼿册有明确说明,InnoDB 引擎对 SELECT COUNT(*) 和 SELECT

COUNT(1) 的处理⽅式完全⼀致,性能并⽆差异。

No. 26 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

memo:2025 年 3 ⽉ 5 ⽇修改⾄此。再晒⼀个喜报给正在刷⼋股的你,⼀位球友拿到了咪咕

的⼤模型应⽤开发,很不错的⽅向,恭喜了!给你也加加好运 buff,你也加把劲。

No. 27 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

13.SQL 查询语句的执⾏顺序了解吗?

No. 28 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

了解。先执⾏ FROM 确定主表,再执⾏ JOIN 连接,然后 WHERE 进⾏过滤,接着 GROUP

BY 进⾏分组,HAVING 过滤聚合结果,SELECT 选择最终列,ORDER BY 排序,最后 LIMIT

限制返回⾏数。

WHERE 先执⾏是为了减少数据量,HAVING 只能过滤聚合数据,ORDER BY 必须在

SELECT 之后排序最终结果,LIMIT 最后执⾏以减少数据传输。

No. 29 / 372

⾯渣逆袭MySQL篇第⼆版-让天下所有的⾯渣都能逆袭

执⾏顺序 SQL 关键字 作⽤

① FROM 确定主表,准备数据

② ON 连接多个表的条件

③ JOIN 执⾏ INNER JOIN / LEFT JOIN 等

④ WHERE 过滤⾏数据(提⾼效率)

⑤ GROUP BY 进⾏分组

⑥ HAVING 过滤聚合后的数据

⑦ SELECT 选择最终返回的列

⑧ DISTINCT 进⾏去重

⑨ ORDER BY 对最终结果排序

⑩ LIMIT 限制返回⾏数

这个执⾏顺序与编写 SQL 语句的顺序不同,这也是为什么有时候在 SELECT ⼦句中定义的别

名不能在 WHERE ⼦句中使⽤得原因,因为 WHERE 是在 SELECT 之前执⾏的。

LIMIT 为什么在最后执⾏?

因为 LIMIT 是在最终结果集上执⾏的,如果在 WHERE 之前执⾏ LIMIT,那么就会先返回所

有⾏,然后再进⾏ LIMIT 限制,这样会增加数据传输的开销。

ORDER BY 为什么在 SELECT 之后执⾏?

因为排序需要基于最终返回的列,如果 ORDER BY 早于 SELECT 执⾏,计算 COUNT(*) 之

类的聚合函数就会出问题。

SELECT name, COUNT(*) AS order_count

FROM orders

GROUP BY name

ORDER BY order_count DESC;

14.介绍⼀下 MySQL 的常⽤命令(补充)

No. 30 / 372

开通会员 本次下载免费

所有资料全部免费下载! 推荐用户付费下载获取返佣积分! 积分可以兑换商品!
一键复制 下载文档 联系客服