前言
本文主要受众为开发人员,所以不涉及到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
- 示例2
- 示例3
- 错误的标量子查询,示例
- exists后面(也叫做相关子查询)
- 示例1
- 示例2
- 示例3
- 行子查询(子查询结果集一行多列)
- 示例
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笔记手册。