面渣逆袭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