1、数据库三大范式你能说一下吗?
第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;比如有一张学生表(学号,学生姓名,联系方式),表主键为学号,因为学生的联系方式又可以拆分为手机号和家庭座机,这时候为了满足1NF,需要将联系方式字段拆分为手机号和家庭座机两个字段。
第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;比如有一张学生表(学号,学生姓名,年龄),表主键为(学号,学生姓名),此时表设计是不满足2NF的,因为年龄部分依赖于主键,主键可以决定年龄,但是复合主键内的学号也可以决定年龄,为了满足2NF,需要将复合主键拆分为以学号为主键的表设计。
第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如有一张学生表(学号,姓名, 年龄, 学院编号, 学院地点),表主键为学号,此时表设计是满足2NF的,(学号) → (姓名, 年龄, 所在学院, 学院地点),但是是不满足3NF的,因为存在着(学号) → (学院编号) → (学院地点)的传递依赖关系,学院地点不是直接依赖于学号,而是通过学院编号依赖于学号,为了满足3NF,应该将表拆分,学号,姓名, 年龄, 学院编号),(学院编号, 学院地点)。
2、sql语句分类:
DDL:数据定义语言(create drop)
DML:数据操作语句(insert update delete)
DQL:数据查询语句(select )
DCL:数据控制语句,进行授权和权限回收(grant revoke)
TPL:数据事务语句(commit collback savapoint)
3、SQL 的 select 语句完整的执行顺序
1、from 子句组装来自不同数据源的数据;
2、where 子句基于指定的条件对记录行进行筛选;
3、group by 子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用 having 子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用 order by 对结果集进行排序。
4、delete、drop、truncate区别
truncate 和 delete只删除数据,不删除表结构 ,drop删除表结构,并且释放所占的空间。
删除数据的速度,drop> truncate > delete
delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。
使用场合:
当你不再需要该表时, 用 drop;
当你仍要保留该表,但要删除所有记录时, 用 truncate;
当你要删除部分记录时(always with a where clause), 用 delete.
注意: 对于有主外键关系的表,不能使用truncate而应该使用不带where子句的delete语句,由于truncate不记录在日志中,不能够激活触发器。
5、char和varchar的区别?
char 是一种固定长度的字符串类型,(如果数据类型不足固定长度的话,会自动用0补齐)
varchar 是一种可变长度的字符串类型,(如果数据类型不足长度的话,自动将长度缩放成我们所输入的数据类型的长度)
6、事务是什么?事务的四大特性是什么?
事务是一组原子性的 SQL 语句,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组操作的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态;
一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。
7、事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。
读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。
可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。
串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
MySQL的默认隔离级别是Repeatable read。
8、索引是什么?它是如何加快查询性能的?
索引是对数据库表中一列或多列的值进行排序的一种数据结构,也就是说索引是一种数据结构。数据库在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中通过二分法等高效率算法一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询性能。类似新华字典的目录,如果没有目录的话,我们想要查找一个汉字的话,就必须检索整本字典,而正因为有了目录,我们只要知道我们所要查找的偏旁或者拼音首字母,就可以快速地定位到我们想要查找汉字的所在页码。
9、MySQL主要的索引类型
普通索引:是最基本的索引,它没有任何限制;
唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;
全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,MySQL中MyISAM支持全文索引而InnoDB不支持;
10、说一说什么是外键?它的优缺点是什么?
外键指的是外键约束,目的是保持数据一致性,完整性,控制存储在外键表中的数据,使两张表形成关联,外键只能引用外表中列的值;
优点:由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。外键在一定程度上说明的业务逻辑,会使设计周到具体全面。
缺点:可以用触发器或应用程序保证数据的完整性;过分强调或者说使用外键会平添开发难度,导致表过多,更改业务困难,扩展困难等问题;不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快);
11、在什么时候你会选择使用外键,为什么?
在我的业务逻辑非常简单,业务一旦确定不会轻易更改,表结构简单,业务量小的时候我会选择使用外键。因为当不符合以上条件的时候,外键会影响业务的扩展和修改,当数据量庞大时,会严重影响增删改查的效率。
12、说一说你能想到的sql语句优化,至少五种
1)避免select *,将需要查找的字段列出来;
2)使用连接(join)来代替子查询;
3)拆分大的delete或insert语句;
4)使用limit对查询结果的记录进行限定;
5)用 exists 代替 in 是一个好的选择;
6)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤;
7)不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引尽量避免在where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;
8)尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描;
9)尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;
13、MyISAM与InnoDB的区别?
1)InnoDB 支持事务;MyISAM 不支持事务;
2)InnoDB 支持行级锁;MyISAM 支持表级锁;
3)InnoDB 支持 MVCC(多版本并发控制);MyISAM 不支持;
4)InnoDB 支持外键,MyISAM 不支持;
5)InnoDB 不支持全文索引;MyISAM 支持;
6)InnoDB 不保存表的总行数,执行 select count(*) from table 时需要全表扫描;MyISAM 用一个变量保存表的总行数,查总行数速度很快;
7)InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。辅助索引需要两次查询,先查询到主键,再通过主键查询到数据。主键太大,其他索引也会很大;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
后续补充