MySQL面试问什么?这份MySQL面试真题手册务必收好,因为真所以更实用!

前言

本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水.
前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来.
因此决定搞一个MySQL面试真题,让自己对知识点的理解更加深入一点。

此文不会事无巨细的从select的用法开始讲解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笔记手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值