首页 简历|笔试面试

面渣逆袭MySQL篇V2.2

  • 25年9月4日 发布
  • 53.56MB 共302页
面渣逆袭MySQL篇V2.2面渣逆袭MySQL篇V2.2面渣逆袭MySQL篇V2.2面渣逆袭MySQL篇V2.2面渣逆袭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

开通会员 本次下载免费

所有资料全部免费下载! 推荐用户付费下载获取返佣积分! 积分可以兑换商品!
普通用户: 5.25元
网站会员:
本次下载免费

开通网站会员 享专属特权

  • 会员可免费

    下载全部资料!

  • 推荐用户下载

    获取返佣积分!

  • 积分可以

    兑换商品!

一键复制 下载文档 联系客服