MySql面试题总结

什么是数据库

1
2
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数
据进行增加,修改,删除及查询操作(CRUD)。

数据库的特点

1
2
3
4
5
6
7
1. 持久化存储数据的。其实数据库就是一个文件系统 
2. 方便存储和管理数据
存储数据有一定的格式
行和列的格式
3. 使用了统一的方式操作数据库
使用图形界面的形式查看数据
使用sql语言进行查看或管理数据

常见的数据库

1
2
3
4
5
6
7
8
关系型数据库:
MySQL :开源免费的数据库,中小型的数据库,已经被 Oracle 收购了。MySQL6.x 版本也开始收费。
Oracle :收费的大型数据库,Oracle 公司的产品。
SQL Server :MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用。

非关系型数据库:
MongoDB :MongoDB最流行的文档型数据库。
Readis : 基于内存的键值型数据库通过 Key-Value 键值的方式来存储数据

SQL语句的分类

1
2
3
4
5
6
7
8
9
10
11
12
13
DDL(Data Definition Language)数据定义语言 :定义数据库对象:数据库,表,列等.关键字:create, 
drop,alter 等。

DML(Data Manipulation Language)数据操作语言 :对数据库中表的数据进行增删改.关键字:insert,
delete, update 等。

DQL(Data Query Language)数据查询语言 :用来查询数据库中表的记录(数据).关键字:select, where 等。

DCL(Data Control Language)数据控制语言 :用来定义数据库的访问权限和安全级别,及创建用户.关键字:
GRANT,REVOKE 等。

TCL(Transaction Control Language) 事务控制语言 :用于控制数据库的事务操作,关键字; commit,savepoint,
rollback等。

MySql表的数据类型

1
2
3
4
5
6
7
8
int 整数类型
double 小数类型
date 日期,只包含年月日,yyyy-MM-dd
datetime 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
timestamp 时间戳类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss 如果将来不给这个字段赋值,或赋值为null,
则默认使用当前的系统时间,来自动赋值
varchar 可变字符
char 不可变字符

MySql表的约束类型

1
2
3
4
5
primary key  主键约束:非空且唯一
not null 非空约束 : 某一列的值不能为空
unique 唯一约束 : 某一列的值不能重复,但可以为空
auto_increment 自增器,每一次+1
foreign key 外键约束

数据库的三范式

1
2
3
第一范式: 必须明确字段
第二范式: 在第一范式的基础上,明确每一张表
第三范式: 在第一范式和第二范式的基础上,让表与表之间建立关系

char 和 varchar 的区别是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VARCHAR 用于存储可变字符串,是最常见的字符串数据类型。它比 CHAR 更节省空间,因为它仅使用必要的空间。
VARCHAR 需要 1 或 2 个额外字节记录字符串长度,如果列的最大长度不大于 255 字节则只需要 1 字节。
VARCHAR 不会删除末尾空格。

VARCHAR 适用场景:字符串列的最大长度比平均长度大很多、列的更新很少、使用了 UTF8 这种复杂字符集,
每个字符都使用不同的字节数存储。

CHAR 是定长的,根据定义的字符串长度分配足够的空间。CHAR 会删除末尾空格。

CHAR 适合存储很短的字符串,或所有值都接近同一个长度,例如存储密码的 MD5 值。对于经常变更的数据,
CHAR 也比 VARCHAR更好,因为定长的 CHAR 不容易产生碎片。对于非常短的列,CHAR 在存储空间上也更有效率,
例如用 CHAR 来存储只有 Y 和 N 的值只需要一个字节,但是 VARCHAR 需要两个字节,因为还有一个记录长度的额外字节。

varchar :表示的长度可变的字符串。最大长度不能超过定义字段的时候长度。

char :长度固定。

float 和 double 的区别是什么?

1
2
3
float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。

double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

mysql 的内连接、左连接、右连接有什么区别?

1
2
3
4
内连接关键字:inner join;左连接:left join;右连接:right join。

内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;
右连接正好相反。

count(*) 和 count(0)、count(某一字段)的区别

1
2
3
4
5
6
count(*) :查询所有列

count(0):忽略所有列,用数字效率要高一些,因为统计行数,与列无关。

count(某一字段)在全满的表中是获取跟count(*)一样的结果,也就是所有的条数,
但是当某一条或者多条记录的那个字段为null的时候,这时并不会算进总条数中。

事务是什么?

1
2
3
事务是一组原子性的 SQL 查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的
全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不
会执行。也就是说事务内的语句要么全部执行成功,要么全部执行失败。

事务有什么特性?

1
2
3
4
5
6
7
8
9
10
11
12
13
原子性 atomicity
一个事务在逻辑上是必须不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,
对于一个事务来说不可能只执行其中的一部分。

一致性 consistency
数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性 isolation
针对并发事务而言,隔离性就是要隔离并发运行的多个事务之间的相互影响,一般来说一个事务所做的修改在最终提交
以前,对其他事务是不可见的。

持久性 durability
一旦事务提交成功,其修改就会永久保存到数据库中,此时即使系统崩溃,修改的数据也不会丢失。

MySQL 的隔离级别有哪些?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
未提交读 READ UNCOMMITTED
在该级别事务中的修改即使没有被提交,对其他事务也是可见的。事务可以读取其他事务修改完但未提交的数据,
这种问题称为脏读。这个级别还会导致不可重复读和幻读,性能没有比其他级别好很多,很少使用。

提交读 READ COMMITTED
多数数据库系统默认的隔离级别。提交读满足了隔离性的简单定义:一个事务开始时只能"看见"已经提交的事务所做的
修改。换句话说,一个事务从开始直到提交之前的任何修改对其他事务都是不可见的。也叫不可重复读,因为两次执行同样的查询可能会得到不同结果。

可重复读 REPEATABLE READ(MySQL默认的隔离级别)
可重复读解决了不可重复读的问题,保证了在同一个事务中多次读取同样的记录结果一致。但还是无法解决幻读,
所谓幻读指的是当某个事务在读取某个范围内的记录时,会产生幻行。InnoDB 存储引擎通过多版本并发控制MVCC 解决幻读的问题。

可串行化 SERIALIZABLE
最高的隔离级别,通过强制事务串行执行,避免幻读。可串行化会在读取的每一行数据上都加锁,可能导致大量的超时
和锁争用的问题。实际应用中很少用到这个隔离级别,只有非常需要确保数据一致性且可以接受没有并发的情况下才考虑该级别。

说一下乐观锁和悲观锁

1
2
3
4
5
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人
有没有去更新这个数据。

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,
直到这个锁被释放。

delete 和 truncate删除的区别

1
2
3
4
5
6
7
8
9
10
11
delete:
(1) 一行一行的把数据删除,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
(2) delete是数据操作语言(DML)命令。
(3)delete命令不会影响表结构

truncate:
(1)不能加where条件。
(2) 先删除表 (drop) ,重新创建(create)表 。因此,若表中有自增长,会把自增长id 重置成1开始。
(3) 速度更快 且 不可回滚。
(4) truncate是数据定义语言(DDL)命令。
(5)truncate命令会从数据库中删除表结构。

Innodb引擎和MyIASM引擎的区别

1
2
3
4
5
1、MyIASM是非事务安全的,而InnoDB是事务安全的
2、MyIASM锁的粒度是表级的,而InnoDB支持行级锁
3、MyIASM支持全文类型索引,而InnoDB不支持全文索引
4、MyIASM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyIASM
5、MyIASM表保存成文件形式,跨平台使用更加方便

常见的表关系

1
2
3
4
5
6
7
8
9
10
11
一对一:
公民和身份证号、公司和注册地、
一个公民只能有一个身份证号,一个身份证号对应一个公民

一对多(多对一):
班级和学生、部门和员工
一个班级下面有多名同学,多名同学属于某一个班级

多对多
老师和学生、学生和课程
一名老师可以教导多名学生,一名学生可以被多个老师教导