面渣逆袭MySQL篇V2.2




⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
前⾔ No. 1 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
前⾔
5.5 万字 331 张⼿绘图,详解 83 道 MySQL ⾯试⾼频题(让天下没有难背的⼋股),⾯渣背会这些 MySQL ⼋股
⽂,这次吊打⾯试官,我觉得稳了(⼿动 dog)。整理:沉默王⼆,戳转载链接,作者:三分恶,戳原⽂链接。
亮⽩版本更适合拿出来打印,这也是很多学⽣党喜欢的⽅式,打印出来背诵的效率会更⾼。
2025 年 02 ⽉ 27 ⽇开始着⼿第⼆版更新。
对于⾼频题,会标注在《Java ⾯试指南(付费)》中出现的位置,哪家公司,原题是什么,并且会加 ,⽬
录⼀⽬了然;如果你想节省时间的话,可以优先背诵这些题⽬,尽快做到知彼知⼰,百战不殆。
区分⼋股精华回答版本和原理底层解释,让⼤家知其然知其所以然,同时⼜能做到⾯试时的⾼效回答。
结合项⽬(技术派、pmhub)来组织语⾔,让⾯试官最⼤程度感受到你的诚意,⽽不是机械化的背诵。
修复第⼀版中出现的问题,包括球友们的私信反馈,⽹站留⾔区的评论,以及 GitHub 仓库中的 issue,让这
份⾯试指南更加完善。
增加⼆哥编程星球的球友们拿到的⼀些 offer,对⾯渣逆袭的感谢,以及对简历修改的⼀些认可,以此来激励
⼤家,给⼤家更多信⼼。
优化排版,增加⼿绘图,重新组织答案,使其更加⼝语化,从⽽更贴近⾯试官的预期。
No. 2 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
码,关注⼆哥的公众号,回复【222】即可拉取最新版本。
No. 3 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
当然了,请允许我的⼀点点私⼼,那就是星球的 PDF 版本会⽐公众号早⼀个⽉时间,毕竟星球⽤户都付费过了,
我有必要让他们先享受到⼀点点福利。相信⼤家也都能理解,毕竟在线版是免费的,CDN、服务器、域名、OSS
等等都是需要成本的。
更别说我付出的时间和精⼒了,⼤家觉得有帮助还请给个⼝碑,让你身边的同事、同学都能受益到。
我把⼆哥的 Java 进阶之路、JVM 进阶之路、并发编程进阶之路,以及所有⾯渣逆袭的版本都放进来了,涵盖 Java
基础、Java集合、Java并发、JVM、Spring、MyBatis、计算机⽹络、操作系统、MySQL、Redis、RocketMQ、分
布式、微服务、设计模式、Linux 等 16 个⼤的主题,共有 40 多万字,2000+张⼿绘图,可以说是诚意满满。
展示⼀下暗⿊版本的 PDF 吧,排版清晰,字体优雅,更加适合夜服,晚上看会更舒服⼀点。
No. 4 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
MySQL 基础
0. 什么是 MySQL?
MySQL 是⼀个开源的关系型数据库,现在⾪属于 Oracle 公司。是我们国内使⽤频率最⾼的⼀种数据库,我在本地
安装的是最新的 8.3 版本。
怎么删除/创建⼀张表?
可以使⽤ DROP TABLE 来删除表,使⽤ CREATE TABLE 来创建表。
创建表的时候,可以通过 PRIMARY KEY 设定主键。
No. 5 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
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 来完
成:
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. 6 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
内连接⽤于返回两个表中有匹配关系的⾏。假设有两张表,⽤户表和订单表,想查询有订单的⽤户,就可以使⽤内
连接 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;
查询前:
users orders
id name
1 王⼆
2 张三
3 李四
查询后:
id name order_id
1 王⼆ 10
2 张三 20
3 李四 null
右连接就是左连接的镜像,right join 会保留右表中符合条件的所有记录,如果左表中有匹配的记录,就返回匹配
的记录,否则就⽤ null 填充。
什么是交叉连接?
No. 7 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
交叉连接会返回两张表的笛卡尔积,也就是将左表的每⼀⾏与右表的每⼀⾏进⾏组合,返回的⾏数是两张表⾏数的
乘积。
假设有 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 ⾯试指南(付费)收录的⽤友⾯试原题:两张表怎么进⾏连接
2.内连接、左连接、右连接有什么区别?
MySQL 的连接主要分为内连接和外连接,外连接⼜可以分为左连接和右连接。
内连接可以⽤来找出两个表中共同的记录,相当于两个数据集的交集。
左连接和右连接可以⽤来找出两个表中不同的记录,相当于两个数据集的并集。两者的区别是,左连接会保留左表
中符合条件的所有记录,右连接则刚好相反。
No. 8 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
拿技术派实战项⽬的表为例来详细验证下。
有三张表,⼀张⽂章表 article,主要存⽂章标题 title, ⼀张⽂章详情表 article_detail,主要存⽂章的内容
content,⼀张⽂章评论表 comment,主要存评论 content,三个表通过⽂章 id 关联。
先来看内连接:
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)。
最后来看右连:
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;
No. 9 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
1. Java ⾯试指南(付费)收录的腾讯 Java 后端实习⼀⾯原题:请说说 MySQL 的内联、左联、右联的区
别。
memo:2025 年 2 ⽉ 27 ⽇修改⾄此。给⼤家看⼀条球友的⾯经,基本上都是⾯渣逆袭中常⻅的⼋股,所以只要
能把⾯渣中的⾼频题拿下,⾯试 OC 的概率真的很⼤,真⼼话。
3.说⼀下数据库的三⼤范式?
No. 10 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
第⼀范式,确保表的每⼀列都是不可分割的基本数据单元,⽐如说⽤户地址,应该拆分成省、市、区、详细地址等
4 个字段。
第⼆范式,要求表中的每⼀列都和主键直接相关。⽐如在订单表中,商品名称、单位、商品价格等字段应该拆分到
商品表中。
然后新建⼀个订单商品关联表,⽤订单编号和商品编号进⾏关联就好了。
No. 11 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
第三范式,⾮主键列应该只依赖于主键列。⽐如说在设计订单信息表的时候,可以把客户名称、所属公司、联系⽅
式等信息拆分到客户信息表中,然后在订单信息表中⽤客户编号进⾏关联。
建表的时候需要考虑哪些问题?
⾸先需要考虑表是否符合数据库的三⼤范式,确保字段不可再分,消除⾮主键依赖,确保字段仅依赖于主键等。
然后在选择字段类型时,应该尽量选择合适的数据类型。
在字符集上,尽量选择 utf8mb4,这样不仅可以⽀持中⽂和英⽂,还可以⽀持表情符号等。
当数据量较⼤时,⽐如上千万⾏数据,需要考虑分表。⽐如订单表,可以采⽤⽔平分表的⽅式来分散单表存储压
⼒。
No. 12 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
1. Java ⾯试指南(付费)收录的字节跳动⾯经同学 13 Java 后端⼆⾯⾯试原题:什么是三⼤范式,为什么
要有三⼤范式,什么场景下不⽤遵循三⼤范式,举⼀个场景
2. Java ⾯试指南(付费)收录的京东⾯经同学 5 Java 后端技术⼀⾯⾯试原题:建表考虑哪些问题
4.varchar 与 char 的区别?
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. 13 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
6.DATETIME 和 TIMESTAMP 有什么区别?
DATETIME 直接存储⽇期和时间的完整值,与时区⽆关。
TIMESTAMP 存储的是 Unix 时间戳,1970-01-01 00:00:01 UTC 以来的秒数,受时区影响。
No. 14 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
另外,DATETIME 的默认值为 null,占⽤ 8 个字节;TIMESTAMP 的默认值为当前时间——
CURRENT_TIMESTAMP,占 4 个字节,实际开发中更常⽤,因为可以⾃动更新。
7.in和exists的区别?
当使⽤ IN 时,MySQL 会⾸先执⾏⼦查询,然后将⼦查询的结果集⽤于外部查询的条件。这意味着⼦查询的结果集
需要全部加载到内存中。
⽽ EXISTS 会对外部查询的每⼀⾏,执⾏⼀次⼦查询。如果⼦查询返回任何⾏,则 EXISTS 条件为真。 EXISTS 关
注的是⼦查询是否返回⾏,⽽不是返回的具体值。
No. 15 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
-- 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 位是⼩数。
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?
No. 16 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
因为 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%'; 查看。
1. Java ⾯试指南(付费)收录的字节跳动⾯经同学 13 Java 后端⼆⾯⾯试原题:mysql 怎么存 emoji,怎
么编码
10.drop、delete 与 truncate 的区别?
DROP 是物理删除,⽤来删除整张表,包括表结构,且不能回滚。
DELETE ⽀持⾏级删除,可以带 WHERE 条件,可以回滚。
TRUNCATE ⽤于清空表中的所有数据,但会保留表结构,不能回滚。
memo:2025 年 3 ⽉ 4 ⽇修改⾄此。给⼤家传递⼀个喜报,⼀位球友拿到了科⼤讯⻜的 offer,这薪资在合肥真
的会很⾹。
No. 17 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
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;
No. 18 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
-- 结果:2 (NULL 不计⼊统计)
这⾥解释⼀下,假设有这样⼀张表:
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 列加上索引。
alter table t1 add primary key (id);
No. 19 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
再来看⼀下 select count(*) ,发现⽤了索引(MySQL 默认为给主键添加索引)。
另外,MySQL 8.0 官⽅⼿册有明确说明,InnoDB 引擎对 SELECT COUNT(*) 和 SELECT COUNT(1) 的处理⽅式完
全⼀致,性能并⽆差异。
No. 20 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
memo:2025 年 3 ⽉ 5 ⽇修改⾄此。再晒⼀个喜报给正在刷⼋股的你,⼀位球友拿到了咪咕的⼤模型应⽤开发,
很不错的⽅向,恭喜了!给你也加加好运 buff,你也加把劲。
No. 21 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
13.SQL 查询语句的执⾏顺序了解吗?
了解。先执⾏ FROM 确定主表,再执⾏ JOIN 连接,然后 WHERE 进⾏过滤,接着 GROUP BY 进⾏分组,HAVING
过滤聚合结果,SELECT 选择最终列,ORDER BY 排序,最后 LIMIT 限制返回⾏数。
No. 22 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
WHERE 先执⾏是为了减少数据量,HAVING 只能过滤聚合数据,ORDER BY 必须在 SELECT 之后排序最终结果,
LIMIT 最后执⾏以减少数据传输。
No. 23 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
执⾏顺序 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 的常⽤命令(补充)
2024 年 03 ⽉ 13 ⽇增补。
No. 24 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
MySQL 的常⽤命令主要包括数据库操作命令、表操作命令、⾏数据 CRUD 命令、索引和约束的创建修改命令、⽤
户和权限管理的命令、事务控制的命令等。
说说数据库操作命令?
CREATE DATABASE database_name; ⽤于创建数据库; DROP DATABASE database_name; ⽤于删除数据库;
SHOW DATABASES; ⽤于显示所有数据库; USE database_name; ⽤于切换数据库。
说说表操作命令?
No. 25 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
CREATE TABLE table_name (列名1 数据类型1, 列名2 数据类型2,...); ⽤于创建表; DROP TABLE
table_name; ⽤于删除表; SHOW TABLES; ⽤于显示所有表; DESCRIBE table_name; ⽤于查看表结构; ALTER
TABLE table_name ADD column_name datatype; ⽤于修改表。
说说⾏数据的 CRUD 命令?
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ⽤于插⼊数据;
SELECT column_names FROM table_name WHERE condition; ⽤于查询数据; UPDATE table_name SET
column1 = value1, column2 = value2 WHERE condition; ⽤于更新数据; DELETE FROM table_name
WHERE condition; ⽤于删除数据。
说说索引和约束的创建修改命令?
CREATE INDEX index_name ON table_name (column_name); ⽤于创建索引; ALTER TABLE table_name ADD
PRIMARY KEY (column_name); ⽤于添加主键; ALTER TABLE table_name ADD CONSTRAINT fk_name
FOREIGN KEY (column_name) REFERENCES parent_table (parent_column_name); ⽤于添加外键。
说说⽤户和权限管理的命令?
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; ⽤于创建⽤户; GRANT ALL PRIVILEGES ON
database_name.table_name TO 'username'@'host'; ⽤于授予权限; REVOKE ALL PRIVILEGES ON
database_name.table_name FROM 'username'@'host'; ⽤于撤销权限; DROP USER 'username'@'host';
⽤于删除⽤户。
说说事务控制的命令?
START TRANSACTION; ⽤于开始事务; COMMIT; ⽤于提交事务; ROLLBACK; ⽤于回滚事务。
1. Java ⾯试指南(付费)收录的⽤友⾦融⼀⾯原题:介绍⼀下 MySQL 的常⽤命令
15.MySQL bin ⽬录下的可执⾏⽂件了解吗(补充)
2024 年 03 ⽉ 13 ⽇增补
推荐阅读:MySQL bin ⽬录下的⼀些可执⾏⽂件
了解的。MySQL 的 bin ⽬录下有很多可执⾏⽂件,主要⽤于管理 MySQL 服务器、数据库、表、数据等。⽐如
说:
mysql:⽤于连接 MySQL 服务器
mysqldump:⽤于数据库备份,对数据备份、迁移或恢复时⾮常有⽤
mysqladmin:⽤来执⾏⼀些管理操作,⽐如说创建数据库、删除数据库、查看 MySQL 服务器的状态等。
mysqlcheck:⽤于检查、修复、分析和优化数据库表,对数据库的维护和性能优化⾮常有⽤。
mysqlimport:⽤于从⽂本⽂件中导⼊数据到数据库表中,适合批量数据导⼊。
mysqlshow:⽤于显示 MySQL 数据库服务器中的数据库、表、列等信息。
mysqlbinlog:⽤于查看 MySQL ⼆进制⽇志⽂件的内容,可以⽤于恢复数据、查看数据变更等。
16.MySQL 第 3-10 条记录怎么查?(补充)
No. 26 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
2024 年 03 ⽉ 30 ⽇增补
可以使⽤ limit 语句,结合偏移量和⾏数来实现。
SELECT * FROM table_name LIMIT 2, 8;
limit 语句⽤于限制查询结果的数量,偏移量表示从哪条记录开始,⾏数表示返回的记录数量。
2:偏移量,表示跳过前两条记录,从第三条记录开始。
8:⾏数,表示从偏移量开始,返回 8 条记录。
偏移量是从 0 开始的,即第⼀条记录的偏移量是 0;如果想从第 3 条记录开始,偏移量就应该是 2。
1. Java ⾯试指南(付费)收录的美团⾯经同学 16 暑期实习⼀⾯⾯试原题:MySQL 第 3-10 条记录怎么
查?
17.⽤过哪些 MySQL 函数?(补充)
2024 年 04 ⽉ 12 ⽇增补
⽤过挺多的,⽐如说处理字符串的函数:
CONCAT() : ⽤于连接两个或多个字符串。
LENGTH() : ⽤于返回字符串的⻓度。
SUBSTRING() : 从字符串中提取⼦字符串。
REPLACE() : 替换字符串中的某部分。
TRIM() : 去除字符串两侧的空格或其他指定字符。
实测数据:
-- 连接字符串
SELECT CONCAT('沉默', ' ', '王⼆') AS concatenated_string;
-- 获取字符串⻓度
SELECT LENGTH('沉默 王⼆') AS string_length;
-- 提取⼦字符串
SELECT SUBSTRING('沉默 王⼆', 1, 5) AS substring;
-- 替换字符串内容
SELECT REPLACE('沉默 王⼆', '王⼆', 'MySQL') AS replaced_string;
-- 去除字符串两侧的空格
SELECT TRIM(' 沉默 王⼆ ') AS trimmed_string;
处理数字的函数:
ABS() : 返回⼀个数的绝对值。
ROUND() : 四舍五⼊到指定的⼩数位数。
No. 27 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
MOD() : 返回除法操作的余数。
实测数据:
-- 返回绝对值
SELECT ABS(-123) AS absolute_value;
-- 四舍五⼊
SELECT ROUND(123.4567, 2) AS rounded_value;
-- 余数
SELECT MOD(10, 3) AS modulus;
⽇期和时间处理函数:
NOW() : 返回当前的⽇期和时间。
CURDATE() : 返回当前的⽇期。
实测数据:
-- 返回当前⽇期和时间
SELECT NOW() AS current_date_time;
-- 返回当前⽇期
SELECT CURDATE() AS current_date;
汇总函数:
SUM() : 计算数值列的总和。
AVG() : 计算数值列的平均值。
COUNT() : 计算某列的⾏数。
实测数据:
-- 创建⼀个表并插⼊数据进⾏聚合查询
CREATE TABLE sales (
product_id INT,
sales_amount DECIMAL(10, 2)
);
INSERT INTO sales (product_id, sales_amount) VALUES (1, 100.00);
INSERT INTO sales (product_id, sales_amount) VALUES (1, 150.00);
INSERT INTO sales (product_id, sales_amount) VALUES (2, 200.00);
-- 计算总和
SELECT SUM(sales_amount) AS total_sales FROM sales;
-- 计算平均值
SELECT AVG(sales_amount) AS average_sales FROM sales;
No. 28 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
-- 计算总⾏数
SELECT COUNT(*) AS total_entries FROM sales;
逻辑函数:
IF() : 如果条件为真,则返回⼀个值;否则返回另⼀个值。
CASE : 根据⼀系列条件返回值。
-- IF函数
SELECT IF(1 > 0, 'True', 'False') AS simple_if;
-- CASE表达式
SELECT CASE WHEN 1 > 0 THEN 'True' ELSE 'False' END AS case_expression;
1. Java ⾯试指南(付费)收录的华为 OD ⾯经同学 1 ⼀⾯⾯试原题:⽤过哪些 MySQL 函数?
2. Java ⾯试指南(付费)收录的 ⼩公司⾯经合集好未来测开⾯经同学 3 测开⼀⾯⾯试原题:知道 MySQL
的哪些函数,如 order by count()
18.说说 SQL 的隐式数据类型转换?(补充)
2024 年 04 ⽉ 25 ⽇增补
当⼀个整数和⼀个浮点数相加时,整数会被转换为浮点数。
SELECT 1 + 1.0; -- 结果为 2.0
当⼀个字符串和⼀个整数相加时,字符串会被转换为整数。
SELECT '1' + 1; -- 结果为 2
隐式转换会导致意想不到的结果,最好通过显式转换来规避。
SELECT CAST('1' AS SIGNED INTEGER) + 1; -- 结果为 2
实际验证结果:
No. 29 / 302
⾯渣逆袭MySQL篇V2-让天下所有的⾯渣都能逆袭
1. Java ⾯试指南(付费)收录的⼩公司⾯经合集同学 1 Java 后端⾯试原题:说说 SQL 的隐式数据类型转
换?
memo:2025 年 3 ⽉ 6 ⽇修改⾄此。
19. 说说 SQL 的语法树解析?(补充)
2024 年 09 ⽉ 19 ⽇增补
No. 30 / 302