1. 说明数据库主键、外键的作用。以及独立主键的好处及坏处
答:主键:唯一标识一条记录,不能重复的,不允许为空
作用:用来保证数据完整性
个数:主键只能有一个
外键:表的外键是另一表的主键,外键可以是重复的,可以是空值
作用:用来和其他表建立关系
个数:是提高查询排序的速度
索引:该字段没有重复值,但可以有一个空值
作用:是提高查询排序的速度
个数:一个表可以有多个唯一索引
聚集索引和非聚集索引的区别?
聚集索引一定是唯一索引但唯一索引不一定是聚集索引
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引。这些索引指向专门的数据页的数据
参考:https://blog.csdn.net/haluoluo211/article/details/42432895
2. 简述什么是数据库事物?事物存在哪些属性?
答:数据库事务是指作为单个逻辑工作单元执行的一系列操作。属性:ACID
· 原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
· 一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。
· 隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
· 持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
DBMS的责任和我们的任务
参考:https://www.cnblogs.com/xuechao/archive/2011/10/11/2206974.html
3.如何写出高性能的SQL语句?
答:(1)整合简单,无关联数据库访问: 如果你有几个简单数据库查询语句,你可以把它们整合到个查询
中(即使它们的间没有关系)
(2)删除重复记录: 最高效删除重复记录思路方法 ( 使用了ROWID)例子: DELETE FROM
EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(3)用TRUNCATE替代DELETE: 当删除表中记录时,在通常情况下, 回滚段(rollback
segments ) 用来存放可以被恢复信息. 如果你没有 COMMIT事务,ORACLE会将数据恢复到删除的前状态(准确地说是恢复到执行删除命令的前状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复信息.当命令运行后,数据不能被恢复.因此很少资源被,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
(4)选择最有效率表名顺序(只在基于规则优化器中有效): ORACLE 解析器按照从右到左顺序
处理FROM子句中表名FROM子句中写在最后表(基础表 driving table)将被最先处理在FROM子句中包含多个表情况下,你必须选择记录条数最少表作为基础表如果有3个以上表连接查询,那就需要选择交叉表(ersection table)作为基础表, 交叉表是指那个被其它表所引用表.
(5)WHERE子句中连接顺序.: ORACLE采用自下而上顺序解析WHERE子句,根据这个原理,
表的间连接必须写在其它WHERE条件的前, 那些可以过滤掉最大数量记录条件必须写在WHERE子句末尾.
(6)SELECT子句中避免使用 ’ * ‘: ORACLE在解析过程中, 会将’’ 依次转换成所有列名, 这个
工作是通过查询数据字典完成, 这意味着将耗费更多时间
(7)减少访问数据库次数: ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引利用率,
绑定变量 , 读数据块等;
(8)在SQLPlus , SQLForms和ProC中重新设置ARRAYSIZE参数, 可以增加每次数据库访问
检索数据量 ,建议值为200 (9)使用DECODE来减少处理时间: 使用DECODE可以避免重复扫瞄相同记录或重复连接相同表. (11) 用Where子句替换HAVING子句;
参考:https://www.cnblogs.com/atree/archive/2011/02/13/sql_optimize_1.html
4. 数据库连接池的工作机制是什么?
答:连接池的实现是以空间换时间。
以典型的数据库连接池为例: 首先普通的数据库访问是这样的:程序和数据库建立连接,发送数据操作的指令,完成后断开连接。等下一次请求的时候重复这个过程,即每个请求都需要和数据库建立连接和断开连接,这样当数据量大的时候系统的消耗是很大的。连接池就是为了解决这个问题:在一个空间中预先建立好一定数量的连接,当程序请求数据时直接使用池中的现存的连接,不需要重复建立连接和断开的过程,节省了时间提高了性能。
参考:https://zhidao.baidu.com/question/582722874062957165.html
5. 左连接、右连接和内连接的区别是什么?
答:假设数据库中有A、B两张表
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B表记录不足的地方均为NULL.
Right join以右表(B)为基础的,A表不足的地方用NULL填充.
inner join并不以谁为基础,它只显示符合条件的记录