当前位置: 首页 > biancheng >正文

B站内部这份MySQL面试真题手册火了!太厉害了,值得收藏

前言

MySQL 是业务后台系统经常用到的结构化数据库。 掌握 MySQL 相关知识是研发人员必备的能力。 与此同时,在面试过程当中,MySQL 的知识点也是经常被当做面试题目,以此来考量候选人的能力。

随着业务量的增加,对于 MySQL 性能优化的要求也越来越高, 而索引方面是性能优化重点考虑的方向,所以深入理解 MySQL 索引对于未来的优化起到很重要的作用。

小编大致将这份MySQL面试真题手册分为27个知识点,观看的伙伴们可以了解一下目录!

一、MySQL基础知识

二、MySQL数据类型介绍

三、MySQL管理员常用的一些命令

四、DDL常见操作汇总

五、DML常见操作

六、select查下基础篇

七、select条件查询

八、排序和分页(order by 、limit)

九、分组查询(group by、having)

十、mysql常用函数汇总

十一、深入了解连接查询及原理

十二、子查询(本篇非常重要,高手必备)

十三、细说NULL导致的神坑,让人防不胜防

十四、事务详解

十五、视图

十六、变量

十七、存储过程&自定义函数详解

十八、流程控制语句介绍

十九、游标详解

二十、异常捕获及处理详解

二十一、什么是索引?

二十二、MySQL索引原理详解

二十三、MySQL索引管理

二十四、如何正确的使用索引?

二十五、sql中的where条件在数据库中提取与应用浅析

二十六、聊聊如何使用MySQL实现分布式锁

二十七、MySQL如何确保数据不丢失的?有几点我们可以借鉴

一、MySQL基础知识

1、数据库常见的概念

  • DB:数据库,存储数据的容器。
  • DBMS:数据库管理系统,又称为数据库软件或数据库产品,⽤于创建或管理DB。
  • SQL:结构化查询语⾔,⽤于和数据库通信的语⾔,不是某个数据库软件持有的,⽽是⼏乎所有的主流数据库软件通⽤的语⾔。中国⼈之间交流需要说汉语,和美国⼈之间交流需要说英语,和数据库沟通需要说SQL语⾔。

2、数据库存储数据的一些特点

  • 数据存放在表中,然后表存放在数据库中

  • ⼀个库中可以有多张表,每张表具有唯⼀的名称(表名)来标识⾃⼰

  • 表中有⼀个或多个列,列又称为“字段”,相当于java中的“属性”

  • 表中每⼀⾏数据,相当于java中的“对象”

3、MySQL常用的命令

  • 方式1:

cmd中运⾏services.msc

会打开服务窗⼜,在服务窗⼜中找到mysql服务,点击右键可以启动或者停⽌

  • 方式2

以管理员⾝份运⾏cmd命令

其他命令:

停⽌命令:net stop mysql

启动命令:net start mysql

C:\Windows\system32>net stop mysql

mysql 服务正在停⽌.

mysql 服务已成功停⽌。

C:\Windows\system32>net start mysql

mysql 服务正在启动 .

mysql 服务已经启动成功。

注意:命令后⾯没有结束符号

MySQL登录命令:

mysql -h ip -P 端⼜ -u ⽤户名 -p
C:\Windows\system32>mysql -h localhost -P 3306 -u root -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.25-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights
reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.

说明:

  • -P ⼤写的P后⾯跟上端⼜
  • 如果是登录本⾦ip和端⼜可以省略,如:mysql -u ⽤户名 -p
  • 可以通过上⾯的命令连接原创机器的mysql

查看数据库版本:

mysql --version 或者mysql -V⽤于在未登录情况下,查看本机mysql版本:
C:\Windows\system32>mysql -V
mysql Ver 14.14 Distrib 5.7.25, for Win64 (x86_64)

C:\Windows\system32>mysql --version
mysql Ver 14.14 Distrib 5.7.25, for Win64 (x86_64)

select version();:登录情况下,查看链接的库版本:

mysql> select version();
+------------+
| version() |
+------------+
| 5.7.25-log |
+------------+
1 row in set (0.00 sec)

显示所有数据库:

show databases;

查看其他库中所有的表:

show tables from 库名;

进⼊指定的库:use 库名

use 库名;

显示当前库中所有的表:

show tables;

查看当前所在库:

select database();

查看系统变量及其值:

SHOW VARIABLES;

查看表的创建语句:

show create table 表名;

查看表结构:

desc 表名;

查看当前mysql⽀持的存储引擎:

SHOW ENGINES;

4、mysql语法规范

5、SQL的语⾔分类

二、MySQL数据类型介绍

1、MySQL的数据类型

  • 整数类型:bit、bool、tinyint、smallint、mediumint、int、bigint
  • 浮点数类型:float、double、decimal
  • 字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext
  • ⽇期类型:Date、DateTime、TimeStamp、Time、Year
  • 其他数据类型:暂不介绍,⽤的⽐较少。

2、案例:

  • 有符号类型

  • 无符号类型

     

3、类型n说明:

4、整数类型案例

5、浮点类型案例

6、日期类型案例

7、字符串类型案例

8、MySQL类型和Java类型对应关系

9、数据类型选择的一些建议

  • 选⼩不选⼤:⼀般情况下选择可以正确存储数据的最⼩数据类型,越⼩的数据类型通常更快,占⽤磁盘,内存和CPU缓存更⼩。

  • 简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型⽐字符操作代价要⼩得多,因为字符集和校对规则(排序规则)使字符⽐整型⽐较更加复杂。

  • 尽量避免NULL:尽量制定列为NOT NULL,除⾮真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值⽐较更加复杂。

  • 浮点类型的建议统⼀选择decimal。

  • 记录时间的建议使⽤int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进⾏存储,⽅便⾛索引。

三、MySQL管理员常用的一些命令

1、MySQL权限工作原理

  • mysql是如何来识别⼀个⽤户的呢?
  • Mysql权限验证分为2个阶段:

2、权限生效时间

⽤户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此

时⽣效

3、创建用户

4、查看MySQL 中所有用户

5、给用户授权

6、查看用户有哪些权限

7、修改密码的三种方式:

8、删除用户的2种方式、

9、撤销用户的权限

10、授权原则说明

  • 只授予能满⾜需要的最⼩权限,防⽌⽤户⼲坏事,⽐如⽤户只是需要查询,那就只给select权限就可以了,不要给⽤户赋予update、insert或者delete权限

  • 创建⽤户的时候限制⽤户的登录主机,⼀般是限制成指定IP或者内⽹IP段

  • 初始化数据库的时候删除没有密码的⽤户,安装完数据库的时候会⾃动创建⼀些⽤户,这些⽤户默认没有密码

  • 为每个⽤户设置满⾜密码复杂度的密码

  • 定期清理不需要的⽤户,回收权限或者删除⽤户

总结:

四、DDL常见操作汇总

1、表的管理

  • 创建表
  • 删除表
  • 修改表名
  • 表设置备注
  • 复制表
  • 只复制表结构
  • 复制表结构+数据

2、库的管理

  • 删除库
  • 创建库
  • 建库通用的写法
  • 示例

3、表中列的管理

  • 修改列
  • 添加列
  • 删除列

     

五、DML常见操作

1、数据更新

  • 多表更新

  • 语法:

  • 示例

  • 单标更新

  • 语法:

  • 示例

  • 使用建议

2、插入操作

  • 插入单行的2种方式

  • 方式1

  • 方式2

  • 批量插入的2种方式

  • 方式1

  • 方式2

3、删除数据操作

  • 使用delete删除

  • delete单表删除

  • 示例

  • 多表删除

  • 示例1

  • 示例2

  • 使用truncate删除

  • 语法

  • drop,truncate,delete区别

  • Mysql系列目录

六、select查下基础篇

1、查询常量

select 常量值1,常量值2,常量值3;

如:

mysql> select 1,'b';
+---+---+
| 1 | b |
+---+---+
| 1 | b |
+---+---+
1 row in set (0.00 sec)

2、查询表达式

3、基本语法

4、查询函数

5、表别名

6、查询所有列

7、列别名

8、查询指定的字段

总结

七、select条件查询

1、条件查询:

  • 语法:select 列名 from 表名 where 列 运算符 值

2、逻辑查询运算符:

  • AND(并且)
  • OR(或者)

3、条件查询运算符

  • 等于(=)
  • 不等于(<>、!=)
  • 大于(>)

4、模糊查询like

5、IN查询

6、NOT IN 查询

7、BETWEEN AND(区间查询)

8、IS NULL/IS NOT NULL(NULL值专用查询)

9、NULL存在的坑

10、<=>(安全等于)

11、经典面试题

下⾯的2个sql查询结果⼀样么?

select * from students;
select * from students where name like '%';

总结

八、排序和分页(order by 、limit)

1、limit介绍

  • 获取前n行记录
  • 获取最大的一条记录
  • 获取排名第n到m的记录

2、排序查询(order by)

  • 单字段排序
  • 多字段排序
  • 按函数排序
  • 按别名排序
  • where之后进行排序

3、避免踩坑

  • limit后面的2个数字不能为负数
  • 排序分页存在的坑
  • limit中不能使用表达式

总结

九、分组查询(group by、having)

1、单字段分组

需求:查询每个⽤户下单数量,输出:⽤户id、下单数量,如下:

mysql> SELECT
 user_id ⽤户id, COUNT(id) 下单数量
 FROM
 t_order
 GROUP BY user_id;
+----------+--------------+
| ⽤户id | 下单数量 |
+----------+--------------+
| 1001 | 3 |
| 1002 | 4 |
| 1003 | 2 |
+----------+--------------+
3 rows in set (0.00 sec)

2、多字段分组

3、分组前筛选数据

4、聚合函数

5、分组后筛选数据

6、准备数据

7、分组后排序

8、where和having的区别

9、分组查询

10、mysql分组中的坑

11、where & group by & having & order by & limit 一起协作

总结

十、mysql常用函数汇总

1、MySQL 字符串函数

  • length:返回字符串直接长度
  • insert:替换字符串
  • concat:合并字符串
  • lower:将字母转换成小写
  • left:从左侧截取字符串
  • upper:将字母转换成大写
  • right:从右侧截取字符串
  • trim:删除字符串两侧空格
  • substr 和 substring:截取字符串
  • replace:字符串替换
  • reverse:反转字符串

2、MySQL 数值型函数

  • sqrt:求二次方跟(开方)
  • abs:求绝对值
  • ceil和ceiling:向上取整
  • mod:求余数
  • rand:生成一个随机数
  • sign:返回参数的符号
  • floor:向下取整
  • sin:正弦函数
  • pow 和 power:次方函数

3、MySQL 日期和时间函数

  • **curtime 和 current_time: **获取系统当前时间
  • **curdate 和 current_date: **两个函数作用相同,返回当前系统的日期值
  • **unix_timestamp: **获取UNIX时间戳
  • **now 和 sysdate: **获取当前时间日期
  • **week: **获取指定日期是一年中的第几周
  • **dayname: **获取指定日期的星期名称
  • **from_unixtime: **时间戳转日期
  • **month: **获取指定日期的月份
  • **monthname: **获取指定日期月份的英文名称
  • **dayofmonth: **获取指定日期在一个月的位置
  • **timetosec: **将时间转换为秒值
  • **dayofweek: **获取日期对应的周索引
  • **date_sub和subdate: **日期减法运算
  • **date_add和adddate: **向日期添加指定时间间隔
  • **dayofyear: **获取指定日期在一年中的位置
  • **subtime: **时间减法运算
  • **year: **获取年份
  • **datediff: **获取两个日期的时间间隔
  • **weekday: **获取指定日期在一周内的索引位置
  • **sectotime: **将秒值转换为时间格式
  • **date_format: **格式化指定的日期
  • **addtime: **时间加法运算

4、MySQL 聚合函数

5、MySQL 数值型函数

**sign: **返回参数的符号

**abs: **求绝对值

sqrt: 求二次方跟(开方)

**sign: **返回参数的符号

mod: 求余数

**ceil和ceiling: **向上取整

**sign: **返回参数的符号

**floor: **向下取整

**rand: **生成一个随机数

sin: 正弦函数

**round: **四舍五入函数

十一、深入了解连接查询及原理

1、内连接

  • 示例1:有连接条件
  • 示例2:无连接条件
  • 示例3:组合条件进行查询

2、外连接

3、笛卡尔积

笛卡尔积简单点理解:有两个集合A和B,笛卡尔积表⽰A集合中的元素和B集合中的元素

任意相互关联产⽣的所有可能的结果

  • sql中笛卡尔积语法

4、理解表连接原理

  • 示例1:内连接
  • 示例2:左连接

5、java代码实现连接查询

6、左连接

  • 语法
  • 示例1:
  • 示例2:

7、右连接

  • 语法
  • 示例

8、java代码改进版本

十二、子查询(本篇非常重要,高手必备)

1、where和having后面的子查询

  • mysql中的in、any、some、all
  • where或having后面,可以使用
  • 特点
  • 标量子查询
  • mysql中的in、any、some、all
  • 多个标量子查询,示例
  • 一般标量子查询,示例
  • 子查询+分组函数,示例
  • 列子查询(子查询结果集一列多行)
  1. 示例1
  2. 示例2
  3. 示例3
  • 错误的标量子查询,示例
  • exists后面(也叫做相关子查询)
  1. 示例1
  2. 示例2
  3. 示例3
  • 行子查询(子查询结果集一行多列)
  1. 示例

2、子查询

  • 按结果集的行列数不同分为4种
  • 按子查询出现在主查询中的不同位置分

3、from后面的子查询

  • 示例1

4、准备测试数据

5、NULL的大坑

6、select后面的子查询

  • 示例1
  • 示例2

7、子查询分类

9、总结

十三、细说NULL导致的神坑,让人防不胜防

1、聚合函数中NULL的坑

  • 示例
  • 再继续看

2、EXISTS、NOT EXISTS和NULL比较

3、IN、NOT IN和NULL比较

  • NOT IN 和NULL比较
  • IN和NULL比较

4、比较运算符中使用NULL

5、NULL不能作为主键的值

6、判断NULL只能用IS NULL、IS NOT NULL

总结

十四、事务详解

1、隔离性(Isolation)

2、脏读

3、一致性(Consistency)

4、显式事务

5、持久性(Durability)

6、Mysql中事务操作

7、事务的几个特性(ACID)

8、隐式事务

9、什么是事务?

10、savepoint关键字

11、可重复读

12、只读事务

13、查看隔离级别

14、事务中的一些问题

15、各种隔离级别中会出现的问题

16、事务的隔离级别

17、读已提交

18、幻读

19、原子性(Atomicity)

20、幻读演示

21、REPEATABLE-READ:可重复读

22、关于隔离级别的选择

23、READ-COMMITTED:读已提交

24、隔离级别的设置

25、SERIALIZABLE:串行

26、READ-UNCOMMITTED:读未提交

总结

十五、视图

1、准备测试数据

2、什么是视图

  • 概念
  • 视图和表的区别
  • 使用场景
  • 视图的好处

3、创建视图

  • 语法
  • 视图的使用步骤
  • 案例1
  • 案例2

4、删除视图

  • 语法
  • 示例

5、查询视图结构

6、更新视图【基本不用】

  • 示例

7、需求背景

8、修改视图

  • 方式1
  • 示例
  • 方式2
  • 示例

总结

十六、变量

1、本文内容

2、会话变量

  • 示例
  • 作用域
  • 查看所有会话变量
  • 查看指定的会话变量的值
  • 查看满足条件的会话变量
  • 为某个会话变量赋值

3、变量分类

4、全局变量

  • 示例
  • 作用域
  • 查看包含'tx'字符的变量
  • 查看所有全局变量
  • 为某个变量赋值

5、自定义变量

  • 概念
  • 分类
  • 使用

6、用户变量

  • 使用
  • 作用域
  • 赋值(更新变量的值)
  • 使用
  • 声明并初始化(要求声明时必须初始化)
  • 综合示例

7、局部变量

  • 使用
  • 声明
  • 作用域
  • 赋值
  • 使用(查看变量的值)
  • 示例
  • 上面示例的效果
  • delimiter关键字

8、系统变量

  • 概念
  • 系统变量分类
  • 使用步骤
  • 查看系统变量
  • 查看满足条件的系统变量
  • 查看指定的系统变量
  • 赋值

9、用户变量和局部变量对比

总结

十七、存储过程&自定义函数详解

1、需求背景介绍

2、准备数据

3、函数

  • 概念
  • 创建函数
  • 删除函数
  • 调用函数
  • 查看函数详细
  • 示例

4、存储过程

  • 概念
  • 删除存储过程
  • 创建存储过程
  • 调用存储过程
  • 修改存储过程
  • 查看存储过程

示例

  • 示例1:空参列表
  • 示例2:带in参数的存储过程
  • 示例3:带out参数的存储过程
  • 示例4:带inout参数的存储过程
  • 示例5:查看存储过程

5、存储过程和函数的区别

十八、流程控制语句介绍

1、if函数

  • 示例
  • 语法

2、if结构

  • 示例

3、CASE结构

  • 用法1
  • begin end中使用
  • select中使用
  • 函数中使用

4、循环

  • 循环控制
  • mysql中循环有3种写法
  • 结束本次循环
  • 退出循环

5、repeat循环

  • 语法
  • 无循环控制语句

6、while循环

  • 语法
  • 添加leave控制语句
  • 无循环控制语句
  • 添加iterate控制语句
  • 嵌套循环

7、loop循环

  • 语法
  • 无循环控制语句

总结

十九、游标详解

1、游标定义

2、游标的使用步骤

3、游标的作用

4、游标语法

  • 打开游标
  • 声明游标
  • 遍历游标
  • 关闭游标

5、游标过程详解

6、单游标示例

7、嵌套游标

总结

二十、异常捕获及处理详解

1、Mysql内部异常

2、异常分类

3、外部异常

4、总结

二十一、什么是索引?

二十二、MySQL索引原理详解

1、什么是索引?

2、我们迫切的需求是什么?

3、二分法查找

4、循环遍历查找

5、有序数组

6、链表

  • 双向链表
  • 单链表
  • 链表的缺点:
  • 链表的优点:

7、平衡二叉树(AVL树)

8、二叉查找树

9、b+树

  • b+树与b-树的几点不同
  • b+树的特征
  • B-Tree和B+Tree该如何选择?

10、B-树

11、页结构

  • 对page的结构总结一下
  • 数据检索过程

12、Mysql的存储引擎和索引

  • MyISAM引擎中的索引
  • InnoDB中的索引
  • InnoDB数据检索过程
  • InnoDB数据检索过程

二十三、MySQL索引管理

1、索引管理

2、删除索引

3、创建索引

  • 方式1:
  • 方式2:

4、索引修改

5、查看索引

6、示例

  • 无索引我们体验一下查询速度
  • 准备200万数据
  • 创建索引
  • 创建索引并指定长度
  • 查看表中的索引
  • 删除索引

2、索引分类

  • 非聚集索引(辅助索引)
  • 聚集索引
  • 单列索引
  • mysql中非聚集索引分为
  • 唯一索引
  • 数据检索的过程

3、示例

二十四、如何正确的使用索引?

1、索引区分度

2、b+树中数据检索过程

  • 查询某个值的所有记录
  • 唯一记录检索
  • 模糊匹配
  • 范围查找
  • 查询以f开头的所有记录
  • 最左匹配原则
  • 查询包含f的记录
  • 查询a=1 and b=5的记录
  • 查询a=1的记录
  • 按照c的值查询
  • 查询b=1的记录
  • 按照[a,c]两个字段查询
  • 查询a=1 and b>=0 and c=1的记录

3、正确使用索引

  • 无索引检索效果
  • 主键检索
  • 准备400万测试数据
  • 这个速度很快,这个走的是上面介绍的唯一记录检索。
  • in的检索
  • between and范围检索
  • 模糊查询
  • 多个索引时查询如何走?
  • 索引覆盖
  • 回表
  • 索引下推
  • 数字使字符串类索引失效
  • 运算符使索引无效
  • 函数使索引无效
  • 使用索引优化排序

4、总结一下使用索引的一些建议

二十五、sql中的where条件在数据库中提取与应用浅析

1、关系型数据库中的数据组织

2、所有SQL的where条件,均可归纳为3大类

3、SQL的where条件提取

二十六、聊聊如何使用MySQL实现分布式锁

1、预备技能:乐观锁

2、分布式锁的功能

3、使用mysql实现分布式锁

4、留给大家一个问题

二十七、MySQL如何确保数据不丢失的?有几点我们可以借鉴

1、mysql确保数据不丢失原理分析

2、案例2:跨库转账问题

3、案例:电商中资金账户高频变动解决方案

以上就是小编分享的MySQL面试真题手册,由于篇幅只展示了部分知识点,小编已经把每个专题对应的知识点整理成了文档,下面是整理的MySQL笔记手册。

相关文章:

  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)
  • 持续精进,改变自己