1.三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。
第一范式:确保每列保持原子性,不可分割(不产生冗余数据)
第二范式:确保表中的每列都和主键相关,消除部分依赖
第三范式:确保每列都和主键列直接相关,而不是间接相关,消除传递依赖
2.INODB与MyISAM的区别
InnoDB支持事务,MyISAM不支持,
InnoDB支持外键,而MyISAM不支持。
InnoDB是聚集索引,MyISAM是非聚集索引.
Innodb不支持全文索引(5.7版本后也支持全文索引),而MyISAM支持全文索引
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
3.mysql如何做模糊查询
SELECT * FROM 表名 WHERE 字段 LIKE 条件;
在WHERE子句中,使用LIKE关键字进行模糊查询;
与“%”一起使用,表示匹配0或任意多个字符;
与“_”一起使用,表示匹配单个字符。
4.mysql聚合函数
AVG(col) 返回指定列的平均值
COUNT(col) 返回指定列中非NULL值的个数
MIN(col) 返回指定列的最小值
MAX(col) 返回指定列的最大值
SUM(col) 返回指定列的所有值之和
5.关键词delete和truncate区别
DELETE FROM 表名 [ WHERE 条件]
WHERE”可以通过where子句增加删除的条件
TRUNCATE [TABLE] 表名
TRUNCATE是一个特殊的删除语句,又叫做清空语句;
功能:清空某一张表内的全部数据,重置自增计数器;
特点:由于没有条件约束,所以速度快,而且效率高。
6.内连接和外连接的区别
内连接(inner join on)
只返回两个表之间匹配的行,只有两个表的行在联接条件匹配时,才出现在结果中
外连接(左联left inner join on、右联right inner join on、全外连接)
返回主表所有的行和副表里和主表行匹配的行,
7.union和unionall区别
union是求两个查询的并集。会将重复的行过滤掉。
union all 是求两个查询的并集,但是不会把重复的过滤掉,而是全部显示出来
8.视图的定义
从一个或者几个基本表(或视图)导出的表。它与基 本表不同,是一个虚表。SO语句不可更改
9.存储过程的定义
是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后,再次调用不需要重复编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
10.存储过程与函数的区别
语法 关键字不同,存储过程是procedure,函数是function;
返回值 存储过程可以定义多个返回结果, 函数只有一个返回值;
功能 函数不易做复杂的业务逻辑,但是存储过程可以。
执行 存储过程可以独立执行,函数必须依赖表达式的调用;
11.触发器定义
是数据库中针对数据库表操作触发的特殊的存储过程。
12.触发器与存储过程的区别
功能 存储过程是一组特定功能的SQL语句,触发器则是SQL语句前后执行,本身不影响原功能。
执行 存储过程需要调用才执行,触发器自动执行;
返回值 存储过程可以定义返回值,但是触发器没有返回值;
语法 关键字不同,存储过程是procedure,触发器是trigger;
13.事务是什么?
就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。(MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。)
原子性、一致性(之前之后完整性约束不会破坏)、隔离性、持久性(完成后针对回滚)
14.事务并发问题
脏写
对于两个事务 Session A、Session B,如果事务Session A 修改了 另⼀个 未提交 事务Session B 修改过 的数据,那就意味着发⽣了 脏写
脏读
对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提 交 的字段。 之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且⽆效 的。 Session A和Session B各开启了⼀个事务,Session B中的事务先将studentno列为1的记录的name 列更新 为'张三',然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的值为'张 三',⽽ Session B中的事务稍后进⾏了回滚,那么Session A中的事务相当于读到了⼀个不存在的数据,这 种现象 就称之为 脏读
可重复读
对于两个事务Session A、Session B,Session A 读取 了⼀个字段,然后 Session B 更新 了该字 段。 之后 Session A 再次读取 同⼀个字段, 值就不同 了。那就意味着发⽣了不可重复读。 我们在Session B中提交了⼏个 隐式事务 (注意是隐式事务,意味着语句结束事务就提交了),这 些事务 都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可 以查看 到最新的值,这种现象也被称之为 不可重复读 。
幻读
对于两个事务Session A、Session B, Session A 从⼀个表中 读取 了⼀个字段, 然后 Session B 在 该表中 插 ⼊ 了⼀些新的⾏。 之后, 如果 Session A 再次读取 同⼀个表, 就会多出⼏⾏。那就意味着发⽣了幻 读。 Session A中的事务先根据条件 studentno > 0这个条件查询表student,得到了name列值为'张 三'的记录; 之后Session B中提交了⼀个 隐式事务 ,该事务向表student中插⼊了⼀条新记录;之后Session A 1. 事务并发会出现的问题2 中的事务 再根据相同的条件 studentno > 0查询表student,得到的结果集中包含Session B中的事务新插⼊ 的那条记 录,这种现象也被称之为 幻读 。我们把新插⼊的那些记录称之为 幻影记录 。
15.事务的隔离级别
读未提交 READ_UNCOMMITTED
事务读取:不加锁
事务写入:加写锁
解决问题:脏写
存在问题:脏读,不可重复读、幻读。
读提交(不可重复读) READ_COMMITTED
事务读取:加读锁(每次select完成都会释放读锁)
事务写入:加写锁
解决问题:脏写、脏读
存在问题:不可重复读、幻读。
可重复读 REPEATABLE_READ
事务读取:加读锁(每次select完不会释放锁,而是事务结束后才释放)(如果是Mysql
的innodb还会加间隙锁)。
事务写入:加写锁
解决问题:脏写、脏读、不可重复读,幻读(如果是Mysql的innodb则已解决)
存在问题:幻读(如果是Mysql的innodb则不存在)。
串行化 SERIALIZABLE
不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束。
16.行锁和表锁的区别
表锁:这种锁是在表级别上加的,通常⽤于MyISAM存储引擎。表锁包括表共享读锁和表排他 写锁,它们分别对应于共享锁和排他锁。
⾏级锁:这种锁是在⾏级别上加的,主要⽤于InnoDB存储引擎。⾏级锁包括记录锁(Record Locks)、间隙锁(Gap Locks)和临键锁(Next-Key Locks)。这些锁主要⽤于实现 MVCC(多版本并发控制)和避免幻读现象。
17.悲观锁和乐观锁的区别(举例)
乐观锁:这种锁机制假设并发冲突较少,事务在提交时才检查是否有冲突。通常通过版本号或 时间戳来实现。
悲观锁:这种锁机制假设并发冲突较多,事务在开始时就加锁,以防⽌其他事务的修改。这种 ⽅式可能导致锁等待和性能下降。
18.索引的概念(类型)
对数据库表中一列或多列的值进行排序的一种结构,
主键索引、唯一索引、常规索引、全文索引
19.索引什么情况下失效
1. 最佳左前缀法则
2. 主键插⼊顺序
3. 计算、函数导致索引失效
4. 类型转换导致索引失效
5. 范围条件右边的列索引失效
6. 不等于(!= 或者<>)索引失效
7. is null可以使⽤索引,is not null⽆法使⽤索引
8. like以通配符%开头索引失效
9. OR 前后存在⾮索引的列,索引失效
10. 数据库和表的字符集统⼀使⽤utf8mb4
20.btree和b+tree区别.
B树(B-Tree)和B+树(B+-Tree)是两种常用的数据结构,特别是在数据库和文件系统中用于实现索引。它们的主要区别:
1. 数据存储位置
B树: 数据可以存储在非叶子节点和叶子节点中。每个节点包含一组键值对,这些键值对按顺序排列。
B+树: 所有数据记录都存储在叶子节点中。非叶子节点仅包含键值,用于指导搜索路径。
2. 节点结构
B树: 每个节点包含多个键值对和多个子节点指针。节点内的键值对和子节点指针数量之间存在一定的关系,以保持平衡。
B+树: 每个非叶子节点包含多个键值和相同数量的子节点指针。叶子节点除了包含数据记录外,还包含指向相邻叶子节点的指针,形成一个链表。
3. 搜索性能
B树: 搜索操作可能需要访问非叶子节点,搜索路径上的每个节点都需要比较和跳转。
B+树: 搜索操作只需访问叶子节点。由于叶子节点形成一个链表,搜索过程中可以快速遍历所有键值。
4. 插入和删除操作
B树: 插入和删除操作可能导致节点分裂或合并,维护树的平衡。
B+树: 插入和删除操作仅影响叶子节点,非叶子节点仅需更新键值和指针信息。
5. 应用场景
B树: 适用于需要快速访问中间节点数据的场景,如文件系统中的目录结构。
B+树: 适用于需要频繁搜索、插入和删除操作的场景,如数据库索引。由于所有数据都在叶子节点,B+树在范围查询和排序方面更具优势。
21.主键索引和唯一索引区别
主键索引:只能有一个,且不能为空,基于主键创
唯一索引:可以有多个,允许有空值,基于数据的唯一性创建
22.什么是SQL注入
SQL注入(SQL Injection)是一种网络安全漏洞,允许攻击者在应用程序的SQL查询中插入恶意代码。这种攻击通常发生在应用程序没有正确验证或清理用户输入数据的情况下,导致攻击者能够操纵数据库查询,获取、修改或删除敏感信息。
23.防止sql注入
使用预编译的语句(Prepared Statements):如使用?占位符,并通过编程语言的库绑定参数。
使用存储过程(Stored Procedures):将SQL代码预先存储在数据库中,并通过参数调用。
验证和清理用户输入:确保用户输入不包含恶意字符或SQL关键字。
使用ORM(Object-Relational Mapping)工具:许多ORM工具会自动处理SQL构建,减少注入风险。
24.char和varchar的区别
char:固定长度的字符串类型,1-255
varchar:可变长度字符串类型,根据实际存储分配空间