首页 - 通讯 - MySQL常见面试题

MySQL常见面试题

2023-09-30 10:18

java常见面试题_2022最新版

序列号 内容 链接
1 Java基础面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126399353
2 Java集合容器面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126425298
3 Java线程面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126518395
4 Java异常面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126482778
5 spring常见面试问题 https://www.gsm-guard.net/weixin_46030002/article/details/127281194
6 SpringMVC常见面试题 https://www.gsm-guard.net/weixin_46030002/article/details/127057785
7 Mybatis常见面试题https://www.gsm-guard.net/weixin_46030002/article/details/126026561
8 MySQL常见面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126557564
9 Redis常见面试题 https://www.gsm-guard.net/weixin_46030002/article/details/126435834
  • Java常见面试题_2022最新版持续更新中...

文章目录

  • Java常见面试题_2022最新版本
    • MySQL官网
  • 1。了解基本概念
    • 什么是数据库
    • 关系型数据库和非关系型数据库
    • 什么是SQL
  • 2. 常见面试问题
    • 数据库SQL语言有哪些
    • MySQL常用搜索引擎
    • MySQL、Oracle 默认端口号
    • SQL中常用的数据类型
    • SQL 中的日期和时间类型
    • SQL中日期时间和时间戳的区别
    • varchar 和 char 有什么区别?
    • 关联查询、分组、排序、分页、数据库聚合功能
    • MySQL 中用到了哪些函数
    • 表之间的关系
    • 拥有和哪里的区别
    • 查询时写入订单
    • 查询时的执行顺序
    • 丢弃、删除和截断的区别
    • union和union all的区别
    • 内连接和外连接的区别
    • 数据库的五个约束
    • 什么是交易
    • 如何在项目中使用事务:
    • 如何操作数据库中的事务
    • 交易四大特征
    • 事务隔离级别
    • 什么是视图,什么是光标
    • 什么是简单视图,什么是复杂视图
    • 如何优化数据库查询
    • MySQL和Oracle的区别
    • 三大数据库范式
    • 常用数据库对象
    • 如何在MySQL中实现远程连接
    • 您使用过哪些数据连接池?数据库连接池有什么用?
    • 索引
      • 什么是索引
      • 描述创建索引的几种方法
      • 指标分类
      • 如何检查SQL是否使用索引进行检索
      • 说说数据库索引的优缺点
      • 什么情况下,我们考虑给字段添加索引
      • 索引失败的场景以及什么情况下会导致索引失败

MySQL官网

MySQL官网


1。了解基本概念

什么是数据库

数据库(DataBase)是用来组织、存储和管理数据的仓库。

关系型数据库和非关系型数据库

  • 关系数据库:关系数据库是一种结构化数据库,基于关系模型(二维表格模型)创建,一般面向记录。
    • MySQL、Oracle、SQL Server
  • 非关系型数据库:NoSQL(NoSQL = Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。
    • Redis(键值类型)、MongoDB(文档类型)、HBase(列存储)、Neo4J(图)

什么是SQL

SQL(英文全称:Structured Query Language)是一种结构化查询语言,是一种专门用于访问和处理数据库的编程语言。

  • SQL 是一种数据库编程语言
  • SQL语言只能在关系型数据库中使用

2. 常见面试问题

数据库SQL语言有哪些

  • DQL 数据查询语言
    • 选择
  • DML 数据操作语言
    • 插入
    • 更新
    • 删除
  • DDL 数据定义语言
    • 创建
    • 掉落
    • 更改
  • DCL 数据控制语言
    • 授予
    • 删除

MySQL常用搜索引擎

  • InnoDB(常用,唯一支持事务的搜索引擎)
  • MyISAM(常用,​​查询多时性能好,ISAM的升级版)
  • ISAM(不常用)
  • 内存(不常用)

MySQL、Oracle默认端口号

  • MySQL:3306
  • 甲骨文:1521

SQL中常用的数据类型

  • 整数
    • tinyint
    • 小int
    • int
    • bigint
  • 浮点型
    • 浮动
    • 十进制
  • 角色类型
    • varchar
    • 文字
    • 斑点
  • 日期类型
    • 日期
    • 时间
    • 日期时间
    • 时间带

SQL 中的日期和时间类型

    • YYYY
  • 日期
    • 日历日期(年、月、日)
    • 年-月-日
  • 时间
    • 时、分、秒
    • HH-MM-SS
  • 日期时间
    • 年月日时分秒
    • YYYY-MM-DD HH:MM:SS
  • 时间戳
    • 混合日期和时间,可用作时间戳
    • YYYY-MM-DD HH:MM:SS
    • 可设置默认值
    • timestamp的值与时区有关
      • 存储在UTC(Universal Time Cooperative)系统协调时区(所有时间的统一通用时间),并以系统当前时区
      • 显示

SQL中日期时间和时间戳的区别

比较 时间戳 日期时间
储物空间 4 字节 8 字节
时区 取决于时区不受时区影响
时间范围 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

varchar 和 char 有什么区别?

  • char 是固定长度类型。不足的部分用隐藏的空间来填充。使用空间会被浪费
  • varchar是变长类型,节省空间
  • Char查询效率比varchar高
  • 一般固定长度数据使用char类型,比如身份证号、手机号码、电话号码等,如果长度变化较大,可以使用varchar类型

关联查询、分组、排序、分页、数据库聚合功能

  • 相关查询
    • 内联[内]加入
    • 外展
      • 左连接左连接
      • 右加入右加入
  • 分组依据
  • 订购订购者
    • 默认升序asc
    • 降序排列
  • 寻呼限制
    • 限制 num1(跳过的项目数)、num2(每页的项目数)
  • 聚合功能
    • max(最大值)
    • min(最小值)
    • 总和(总和)
    • avg(平均)
    • 计数(统计数)

MySQL中用到了哪些函数

  • 数值函数
    • abs(x)绝对值
    • ceil(x) 返回大于或等于 x 的最大整数
    • round(x) 返回四舍五入的整数
    • floor(x) 返回等于或小于 x 的最大整数
    • mod(x)获取a / b的余数(如果id需要为偶数或奇数,可以使用mod
  • 字符串函数
  • 日期功能
  • MySQL高级功能

表之间的关系

  • 一对一(不常用)
    • 一个人 => 一个身份证号码
    • 一个人=>一个国籍
    • 学生 => 学号
  • 一对多/多对一
    • 从班级表来看:一班=>多名学生
    • 从学生表来看:多个学生=>一个班级
    • 在一对多或多对一的表关系中,我们会在more表中维护两个表之间的关系
  • 多对多
    • 从学生表来看:一名学生=>多门课程
    • 从课程角度来看:一门课程=>多名学生
    • 所以对于多对多的关系,我们通常会有一个中间表来维护两个表之间的关系

拥有和哪里的区别

  • having是对分组后的数据进行过滤
  • 分组前在哪里过滤数据
  • 以后可以使用聚合函数了
  • 以后无法使用聚合的地方

查询时写下订单

select 字段 from 表名 where 查询条件 () 分组前)分组 by(含聚合) having 查询条件分组后排序) 订购 by排序限制分页;

查询时的执行顺序

来自 -> 哪里  -> 集团 BY -> 拥有 ->   SELECT 的字段 -> 独特 -> 订单   BY -> 限制

删除、删除和截断的区别

  • drop 是一条 DDL 语句。直接删除表和库(删除表、库数据和表结构)无法回滚;
  • truncate 是表截断命令。它可以截断表头和表数据,相当于快速删除整个表数据。它不能用于删除几行数据。删除数据后自增的id主键从1开始,是DDL语句,不支持事务,无法回滚
  • 删除可以删除表中的行或全部内容。是DML语句,支持事务,可以进行事务回滚。

union和union all的区别

  • union 和 union all 用于将两个或多个 select 语句的结果显示为一个整体。功能是将多个结果合并并显示在一起。
  • union all:重复的号码不会被去重。 (对两个结果集进行并集运算,包括重复行,即显示所有结果,不排序)
  • union:重复数据将被去重。 (对两个结果集进行并集操作,排除重复行,同时按默认规则排序,相当于distinct去重处理)

内连接和外连接的区别

  • 内连接:[内]连接仅显示两个表共有的数据(交集数据)

    #查找emp中所有有部门的员工信息(还包括部门信息)
    选择 * FROM emp e INNER  加入 部门 ON e .dNo = d.deptNo;
    
  • 外连接:

    • Left join:left join on 显示join左侧表中的所有数据(无论两个表是否匹配),不匹配部分用NULL表示
    • right join:right join on 显示join右侧表中的所有数据(无论两个表是否匹配),不匹配部分用NULL表示

谁为主的所有信息出现

选择 * FROM emp e LEFT   加入 部门 ON e .dNo = d.deptNo;选择 *  emp e  加入 部门 ON e .dNo = d.deptNo;

数据库的五个约束

  • 主键约束(Primay Key Coustraint)唯一性、非空性(unique and non-null)
  • 唯一约束唯一性(可以为空,但只能有一个)
  • 外键约束需要在两个表之间建立关系。数据库中InnoDB存储引擎支持外键约束,但MyISAM不支持外键约束
  • 默认约束 该数据的默认值
  • 非空约束 该字段不能为空
  • 检查约束(Check Constraint)限制列的格式和范围,自定义约束,自己决定限制

网上有人讲数据库的五大约束,也有人说六大约束,MySQL中没有检查约束

/*Oracle*/
创建 桌子学生(
   id int primary key auto_increment ,/*主键约束*/
   名称 varchar(50) 不是null,/*非空约束*/
   性别 varchar(10) 默认 '男' ,/*默认约束*/年龄(9),
   检查年龄>=18年龄<=70)/*检查合同*/
);
/*MySQL*/
创建 数据库 IF NOT存在公司;
使用公司;
DROP桌子IF存在部门;
DROP桌子IF存在 emp;
创建部门(
  做了 INT PRIMARY KEY AUTO_INCRMENT  评论 '部门ID', /*主关键约束*/
  dname VARCHAR(50)唯一评论  '部门名称'/*唯一合同*/
);
创建  emp(
  uid INT PRIMARY KEY AUTO_INCRMENT  评论 '员工ID',名称 VARCHAR(50) NOT NULL  COMMENT '员工姓名',/*非空约束*/
  etype VARCHAR(50) DEFAULT '普通员工'   NOT NULL 评论'员工类型',
  dept_id INT COMMENT '部门 ID', /* 默认约束 */
  国外 KEY(dept_id) 参考部门did/ *外键约束*/
);

什么是交易

事务是数据库操作的最小逻辑工作单元。它包含一项或多项业务操作。这些操作要么执行,要么不执行。它们是不可分割的,一起提交给系统。事务通常用于保证数据的一致性。

如何在项目中使用交易:

项目中,我们传递了@Transactional注释。这个注解就是spring框架
提供的事务管理(声明式事务管理)通常我们在业务层,如果一个方法涉及到多个增删改查操作。这时候就需要通过方法上的@Transactional注解来开启事务管理;也可以在业务层界面添加@Transactional

如何操作数据库中的事务

  • 开启交易
    • 开始交易
  • MySQL 数据库中默认启用事务
    • 查看交易状态
      • 显示“自动提交”等变量;
        • 开就是开
    • SET AUTOCOMMIT=0禁用自动提交
    • SET AUTOCOMMIT=1开启自动提交
  • 提交交易
    • 承诺
  • 回滚事务
    • 回滚

交易的四大特征

  • 原子性:
    • 事务是数据库的最小工作单元。事务中包含的所有操作要么已完成,要么没有。
  • 一致性:
    • 事务执行的结果一定是使数据库从一种一致性状态改变到另一种一致性状态。当事务失败时,所有受事务影响的数据都应该恢复到事务执行前的状态。
  • 坚持:
    • 一旦提交事务,它对数据库中数据的更改应该是永久性的。
  • 隔离:
    • 事务执行期间对数据的修改在事务提交之前对其他事务不可见。后续的其他操作或失败不应对其执行结果产生任何影响

交易隔离级别

  • READ UNCOMMITTED(读取未提交的数据)
    • 特点:安全性最差,无法防止任何并发读取问题,但性能最高,不推荐
  • READ COMMITTED(读取提交的数据)
    • Oracle 默认隔离级别
    • 特点:安全性优于“读未提交”。它可以防止脏读,但不能防止不可重复性和幻读。性能比“未提交读”还要差。
  • 可重复阅读
    • MySQL 默认隔离级别
    • 特点:比“Read Comlated”安全性更好,可以防止脏读和不可重复读,但不能防止幻读,性能比“Read Comlated”差。
    • 由于mysql默认的隔离级别不允许脏读和不可重复读,如果想在mysql中演示这两种现象,就必须将mysql的隔离级别设置为最低级别,即“读未提交” “
  • 可串行化(序列化)
    • 特点:安全性最好,可以防止脏读、不可重复读、幻读,性能最差,不推荐

什么是视图,什么是光标

  • 查看:
    • 是虚拟表,与物理表具有相同的功能,代表一张表的部分数据或多张表的综合数据。其结构和数据基于查询表。可以对视图进行添加、修改、查看和操作。视图通常是一个表或多个表的行或列的子集。对视图的修改会影响基础表。相比多表查询,它让我们更容易获取数据。
    • 视图不存储数据。其中的所有数据都来自真实的表。实际数据源可以来自多个表,因此如果实际数据发生变化,视图也会发生变化。视图可嵌入设置
    • 视图无法提高查询效率
    • 执行视图是执行对应的书面SQL语句
  • 光标:
    • 是将查询结果集作为一个单元进行有效的处理。可以将光标定位在单元格中的特定行上,以从结果集中的当前行中检索一行或多行。您可以对结果集的当前行进行更改。游标一般用不到,但是当需要对数据进行一项一项处理时,游标就非常重要了

创建视图:

创建 视图视图名称 as 选择  查询语句...创建 视图视图名称列名称1, 列名称2... ) as select查询语句...

使用视图:

选择 * 来自视图名称

删除视图:

drop 视图视图名称

用途:

  • 过滤表中的行
  • 防止未经授权的用户访问敏感数据
  • 降低数据库复杂性
  • 将多个物理数据库/表抽象为一个逻辑数据库/表

什么是简单视图,什么是复杂视图

  • 简单视图:从表中提取的字段信息创建简单视图
  • 复杂视图:从多个表中提取字段信息创建复杂视图

如何优化数据库查询

  • 索引关键字
    • 如果您经常使用某个条件,可以为该条件添加索引,例如:
      • 如果您经常通过用户名搜索,可以在用户名上添加索引
  • 使用存储过程,使得SQL更加灵活高效
  • 备份数据库并清理垃圾数据
    • 短信发送验证码(4-6位),验证功能;有一个表会存储我们的验证码并定期(晚上)清理它,SSM,springboot并且框架有
  • SQL语句语法优化
    • 在数据库中查询时尽量不要写*。写下要检查的字段
    • 明确要查询的sql中只有1条记录,或者我们要求只有1条记录
      • 从员工限制1中选择*;
    • 尽量不要使用(不推荐)关键字,容易导致索引失败
  • 构建缓存(redis、memcache)
    • 将我们经常使用的数据和不会被修改的数据存储在缓存中。这样会减少数据库的压力

MySQL和Oracle的区别

  • MySQL开源,Oracle付费
  • 端口号
    • MySQL:3306
    • 甲骨文:1521
  • 数据类型
    • MySQL(tinyint、int、bigint、varchar、数据(日期)、日期时间(时间)、时间戳)
    • Oracle(数字、varcher2、nvvarchar2、日期(年、月、日、时、分、秒))
    • MySQL(限制)
    • Oracle(rownum 伪类)
  • 支持交易
    • MySQL
      • InnoDB存储引擎支持事务
      • 默认自动提交
    • 甲骨文

三大数据库范式

  • 第一范式
    • 属性不能再细分
  • 第二范式
    • 在范式的基础上,数据库表中的每个实例或行必须是唯一可区分的。通常,需要在表中添加一列来存储每个实例的唯一标识。这个唯一的属性列称为主键或主键。
  • 第三范式
    • 基于第二范式,要求数据库表不包含已经包含在其他表中的非主键信息。因此,第三范式具有以下特点: 1).每列只有一个值。 2)。每一行都可以区分。 3)。每个表不包含其他表已包含的非主键信息

常用数据库对象

  • 桌子
  • 田野
  • 索引
  • 查看
  • 存储过程
  • 触发器
  • 默认值

如何在MySQL中实现远程连接

  • 授权法
    • 使用GRANT命令添加新用户并授予远程访问权限
      授予 全部 特权  *.* root@"%"  识别 By   "root" ; 
      刷新 权限; # 强制刷新
      
  • 如何更换桌子
    • localhost上登录mysql后,将数据库中的mysql用户更改为表中主机项,替换本地主机重命名为%
      更新 用户 设置主机=  '%' 哪里主机 =  'localhost'  用户=‘根’;刷新 权限; # 强制刷新
      

您使用过哪些数据连接池?数据库连接池有什么用?

  • 德鲁伊(我们用的)
  • HikariCP(SpringBoot 2.x默认支持)
  • c3p0
  • dbcp
  • 维护数据库连接的缓存,以便将来需要向数据库发出请求时可以重用连接。连接池用于提高在数据库上执行命令的性能。保护数据库连接总数以避免连接过载。

索引

什么是索引

索引是一种对数据库表中一个或多个列的值进行排序的结构。索引可用于快速访问数据库表中的特定信息。
在数据中,索引相当于字典的目录,通过索引可以快速检索数据。

描述创建索引的几种方法

MySQL索引的建立对于MySQL的高效运行非常重要。索引可以大大提高MySQL的检索速度。
创建索引时,需要保证索引应用于SQL查询语句的条件(通常作为where子句的条件)
我们建议用于创建索引的字段是唯一的、不为空且经常查询的字段。

  • 正常指数:
    • 创建索引
      • CREATE INDEX indexName ON tableName(用户名);
    • 修改表结构(添加索引)
      • ALTER TABLE 表名 ADD INDEX 索引名(列名);
    • 删除索引
      • DROP INDEX 索引名称 ON 表名称;
    • 创建表时直接指定
      创建 表名(ID INT NOT NULL
             用户名 VARCHAR(16) NOT NULL ,
             索引 [索引名称] () 用户名)
          );
      
  • 唯一索引:
    • 创建索引
      • CREATE UNIQUE INDEX indexName ON tableName(用户名);
    • 修改表结构
      • ALTER table tableName ADD UNIQUE [indexName](用户名);
    • 创建表时直接指定
      创建 表名(
             ID INT NOT NULL
             用户名 VARCHAR(16) NOT NULL ,
             独特[索引名称]() 用户名)
          );
      

指标分类

  • 按领域分类
    • 正常指数
    • 唯一索引
    • 主键索引
    • 组合索引
    • 全文索引
  • 按物理存储方式分类
    • 聚集索引
    • 非聚集索引
  • 按编号分类
    • 单列索引
    • 联合索引

如何检查SQL是否使用索引进行检索

解释一下

说说数据库索引的优缺点

索引会大大提高查询速度,但同时会降低更新表的速度,如INSERTUPDATE、 删除。因为在更新表时,MySQL不仅需要保存数据,还需要保存(更新)索引文件。

  • 优点:
    • B-Tree平衡二叉树结构)可以大大加快数据检索速度,这也是创建索引的主要原因。
  • 缺点:
    • 增加数据库存储空间
    • 减慢数据输入速度

什么情况下,我们考虑给字段添加索引

  • 数据量巨大

  • 该字段经常用作查询条件

  • 该字段很少有DML操作(插入、删除、更新),因为操作后索引需要重新排序

    推荐

    • 建议不要随意添加索引,因为索引需要维护,索引过多会降低系统性能。
    • 建议通过主键查询(默认添加索引)
    • 建议通过唯一约束字段查询(默认添加索引)

索引失败的场景以及什么情况下会导致索引失败

  • 不满足最左匹配原则
  • 已使用选择*
  • 索引栏有计算
  • 该函数用于索引列
  • 字段类型不同
  • 喜欢左侧包含%
  • 列比较
  • 使用关键字
  • 不在不存在
  • 订购者

– [x] 持续更新中…