数据库面试内容

1. 主键 超键 候选键 外键

主 键:

数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null);

超 键:

在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键:

是最小超键,即没有冗余元素的超键。

外 键:

在一个表中存在的另一个表的主键称此表的外键。

2.数据库事务的四个特性及含义

事务:数据库恢复和并发控制的基本单位;

数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

隔离中要注意下面四种隔离级别,默认级别是重复读

 脏读:一个事务访问并修改了数据,但是还未提交到数据库,另一个数据就访问了这个数据;

不可重复读:一事务两次读同一数据的过程中,另一事务修改了这个数据;

幻度:一事务修改了数据,另一事务也修改这个数据;(可能第一个事务出现幻觉认为自己没改动数据)

二.数据库的常用对象和关键字

对象:

1.用户(User):对数据库有权限访问的人

2.视图(View):用来简化数据只显示用户需要的数据但在数据库中不存在;

3.表(table)

4.索引(index):专门用来进行查询的,可以增加查询效率

5.触发器(trigger):当数据库表执行特定操作时如删除、插入、修改的时候,它就能够自动去执行一些指令

关键字:

数据操作:select ,insert,drop ,update

数据定义:create table ,drop table ,create view ,drop view,create index ,drop index...

数据控制:grant(授予用户访问权限),deny(拒绝用户访问),revoke(解除用户访问权限)

事务权限:commit(结束当前事务),rollback(取消执行事务)

open :检索查询结果创建一个游标;

close:关闭游标

3.视图的作用,视图可以更改么?

视图是从一个或多个表(或视图)导出的表,可以简化复杂的sql操作,保护数据;它主要用于查询,不能索引

如果视图是由单个表使用选择或投影操作导出的,且包含主键,才可以执行更新操作;其他情况不能

4.drop,delete与truncate的区别

drop是把整个表删除掉,truncate是把整个表清空(即初始化表),delete是可选择性的删除某些数据(通过where语句);

范围上讲:drop>truncate>delete;

1.delete的操作会记为事务记录在日志中,以便回滚(即可恢复);而truncate是不可恢复的;

2.truncate只能对于table,不能用于视图view;

3.truncate和不带where的delete相比,truncate速度快,因为它不需要在日志中记录;但delete还可以做恢复操作

5.索引的工作原理及其种类

数据库中采用了特殊的排序结构来使查询更加的高效,这种数据结构就是索引;采用的是B+树的结构;

索引的优点:可以提高查询效率;

但不是表中所有列的数据都要由索引来进行查询: 1.创建索引和更新索引耗费时间;2.索引要占用物理空间;

如果一个列它的数据量很小的话,就没必要创建索引;

哪些列需要创建索引呢(索引的优化)?:

1.主键的列上

2.经常搜索的列

3.经常用于连接的列(外键)

4.需要排序的列

5.经常要用到where语句的列

总共分为三种:唯一索引、主键索引和聚集索引:

如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓;

在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同,一个表只能包含一个聚集索引。

聚集索引打个比方:就像新华字典中索引A-Z,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放;缺点就是修改慢,为了满足聚集索引的基本条件,需要对数据页重排序;

而非聚集索引打比方:新华字典中按偏旁来进行索引的,非聚集索引顺序和物理顺序并不是按顺序存放的;

聚集索引就类似新华字典中的拼音排序索引,都是按物理顺序进行,例如找到字典中的“爱”,就里面顺序执行找到“癌”。而非聚集索引则类似于笔画排序,索引顺序和物理顺序并不是按顺序存放的

6.连接的种类

首先:having和where语句都可以表示指定特定的条件,但是where语句一定要放在group By语句前,而Having语句一定在group By后面执行;where是不能加聚合函数(SUM,COUNT,AVG等等),而Having可以包含这些函数;

外连接有三种:左外连接,右外连接,全外连接;(不符合的全用Null值代替)

如表

table1 | table2 |

id name |id score |
1 lee |1 90|
2 zhang| 2 100|
4 wang| 3 70|

左外连接的结果:sql 语句:select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
————-结果————-
idnameidscore

1lee190
2zhang2100
4wangNULLNULL

右外连接的结果:sql语句:select a.a, a.b, a.c, b.c, b.d, b.f from a RIGHT OUT JOIN b ON a.a = b.c
————-结果————-
idnameidscore

1lee190
2zhang2100
NULLNULL370

全外连接:sql 语句:select * from table1 full join table2 on table1.id=table2.id
————-结果————-
idnameidscore

1lee190
2zhang2100
4wangNULLNULL
NULLNULL370

内连接(不匹配就不出现记录):sql 语句:select * from table1 join table2 on table1.id=table2.id
————-结果————-
idnameidscore

1lee190
2zhang2100

注释:只返回符合条件的table1和table2的列;

等价(与下列执行效果相同)
A:select a.,b. from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id

交叉连接(笛卡尔积)cross join (不带条件where…):sql语句:select * from table1 cross join table2
————-结果————-
idnameidscore

1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370

注释:返回3*3=9条记录,即笛卡尔积

4.等价(与下列执行效果相同)
select * from table1,table2

7.数据库范式(NF:Normal Form)

第一范式(1NF):指的是数据库中不能出现相同的列;

第二范式(2NF),前提要先满足1NF):规定数据库必须有一个唯一属性列来区分每一行;

第三范式(3NF),前提要先满足2NF:一个表中不能包含另一个表的非主键列;换句话说,只能包含外键;这样的好处是消除冗余;

第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束

8.数据库优化的思路

1.SQL语句优化:

1):不使用正则表达式在SQL语句中,这样会使引擎放弃使用索引而采用全表扫描

2):应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null改为num=0

2.数据库结构优化:

1).上述说道,采用第三范式的消除冗余;

2)拆分表:当I/O数据量大的时候,磁盘页需要分区,这样就不需要全盘扫描,只需要在对应的磁盘页上扫描

3.索引的优化

表分区和分表的区别:

分区:将一张表分为多个易管理的部分,指的是物理内存进行分区,表并没有被分开;

分表:将一张表分解成多张的表

分区的好处:将内存细分,增加查询效率;使表的维护方便;

分区的要求:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列;它不受外键约束(第三范式)

分区种类:Range分区(按照范围分区),Hash分区(按照hash值分区)等等

数据库的存储过程:

一个SQL语句的集合,通过在某个时机主动调用,类似于Java中的方法;

优点:类似方法函数,可以实现复杂的逻辑;速度快,首次执行只需要进行编译步骤,后面执行就可直接调用;

key和index区别:

key有两层含义(物理结构):一代表约束(用来指示主值之类),二代表index索引(用来辅助查询);

index索引(物理结构):用来辅助查询的;

Mysql 的存储引擎 MyISAM 和 InnoDB 的区别有哪些?

  • 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
  • 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。(因为M保存了表的信息,InnoDB没有,所以查询起来M快;而且M支持全文索引,InnoDB不支持)
  • InnoDB都是聚集索引,物理内存是相邻的;而M都是非聚集索引,索引保存的是数据的指针;
  • 系统奔溃后,MyISAM恢复起来更困难,能否接受;
  • MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差

猜你喜欢

转载自blog.csdn.net/emmmsuperdan/article/details/82697142