数据库基础(面试常见题)
一、数据库基础
数据抽象:物理抽象、概念抽象、视图级抽象。
数据库系统的三级模式结构:
- 内模式:是数据物理结构与存储方式的描述,定义数据在数据库内部的表示方式。
- 模式:是数据库中全体数据的全体逻辑结构描述,是所有用户的公共数据视图。包括数据的逻辑结构(数据项的名字、类型、取值范围等)、联系、安全性和完整性要求。
- 外模式:介于模式与应用之间,是特定数据库用户的数据视图。它面向具体的应用程序,独立于存储模式和存储设备。外模式与授权配合,限制用户只能访问所对应的外模式中的数据,可以保证数据库安全性。
三级模式、两级映像可以保证数据的独立性。
SQL语言包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control)
数据定义:Create Table,Alter Table,Drop Table, Craete/DropIndex等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke,commit,rollbackSQL常用命令:
CREATE TABLE Student(
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(50) NOT NULL);//建表CREATE VIEW view_name AS
Select * FROM Table_name;//建视图Create UNIQUE INDEX index_name ON TableName(col_name);//建索引
INSERT INTO tablename {column1,column2,…}values(exp1,exp2,…);//插入
INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入视图实际影响表
UPDATE tablename SET name=’zang 3’ condition;//更新数据
DELETE FROM Tablename WHERE condition;//删除GRANT (Select,delete,…) ON (对象) TO USER_NAME [WITHGRANT OPTION];//授权
REVOKE (权限表) ON(对象) FROM USER_NAME[WITH REVOKE OPTION] //撤权列出工作人员及其领导的名字:
Select E.NAME, S.NAME FROM EMPLOYEE E S
WHERE E.SUPERName=S.Name视图:命名的导出表,是从一个或几个基本表(或视图)导出的表,但是视图的数据并不物理的存储在数据库中(物化视图除外)。
完整性约束:实体完整性、参照完整性、用户定义完整性
- 实体完整性:每个关系的主码既不能为空,也不能取空值。
- 参照完整性:要么不参照,要么被参照的对象必须存在。(弱实体集必须包含外码且不能为空)。
- 用户定义完整性(系统提供定义和检验这类完整性的处理方法,比如check(<条件>),以及用户对属性的取值范围作出规定。
第三范式:
1NF:每个属性是不可分的。
2NF:若关系R是1NF,且每个非主属性都完全函数依赖于R的键。例SLC(SID#, CourceID#, SNAME,Grade),则不是2NF;
3NF:若R是2NF,且它的任何非键属性都不传递依赖于任何候选键。ER(实体/联系)模型:一种概念模型(从用户角度出发建模),可以转化成关系模型。
索引作用:
- 通过创建唯一性索引,可以保证该属性值的唯一性。
- 可以大大加快 数据的检索速度。
- 可以加快表之间的连接速度,加快表的分组和排序工作。
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务性质:原子性、隔离性、持久性、一致性。ACID原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。
一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。
持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。锁:共享锁(其他事务只能获得写锁)、排他锁
两段锁协议:阶段1:加锁阶段 阶段2:解锁阶段死锁:两个或两个以上的事务之间的循环等待现象。
活锁:饥饿,某个事务因等待锁而处于无限期等待状态。死锁的预防——操作系统中是“银行家算法”:
1. 一次封锁法——每个事务必须一次将所有要使用的数据全部加锁后,在实际执行事务操作。
2. 顺序封锁方法——预先对数据对象规定一个封锁顺序,所有的事务都按这个顺序实行封锁。死锁的检测:超时或事务等待图法(有向图,有环即死锁)——操作系统中的是“资源-进程图法”。
死锁的解除:撤销死锁集合内的事务并释放这些事务持有的所有的锁(该事务必须回滚,可能会有级联回滚)。
存储过程:存储过程就是编译好了的一些sql语句。
- 存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
- 可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
- 可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。
- 存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因
- 存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。
触发器trigger: 当满足触发器条件,则系统自动执行触发器的触发动作。
触发时间:有before,after.触发事件:有insert,update,delete三种。触发类型:有行触发、语句触发
实例:
银行透支:头知识将存款余额置0,然后建立一笔贷款,其金额=透支额。
存货报警。内联接,外联接(避免信息丢失)区别?
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
在外连接中,把不满条件的列也显示出来,对应元组在另一个表的属性取值为空。分左连接、右连接、全连接三种。隔离级别:读取未提交、读取已提交、可重复读、序列化(default)。
隔离级别 | 封锁协议 | 解决的问题 |
---|---|---|
读取未提交 | 一级 | 丢失修改 |
读取已提交 | 二级 | 度脏数据 |
可重复读 | 三级 | 不可重复读 |
序列化(default) | 幻影读 |
并发执行可能导致的问题:
问题 | 原因 |
---|---|
丢失修改 | A读-》B写-》A写 |
读脏数据 | A写-》B读-》A回滚 |
不可重复读 | A读-》B写-》A读 |
幻影读 | 数据条数增加或减少 |
以下是经典面试题(转载)
1. MySQL中varchar与char的区别?
1.char长度固定,varchar长度可变。varchar(40)代表最多存储40个字符。 (char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节))
2.char访问速度更快(可以理解为空间换时间)。 对于 innodb 存储引擎 建意使用varchar 类型
拓展:mysql的存储引擎
2、MySQL中myisam与innodb的区别,至少5点不同
1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁
3>.InnoDB支持MVCC, 而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持
5>.InnoDB不支持全文索引,而MyISAM支持。(2)、innodb引擎的4大特性
插入缓冲(insert buffer),二次写(double
(3)、2者selectcount(*)哪个更快,为什么
myisam更快,因为myisam内部维护了一个计数器,可以直接调取。