12.12 Oracle数据库相关面试题精简版(后续继续完善)
-
oracle数据库
-
数据库是什么
-
数据库是持久化数据管理系统
-
SQL是什么
-
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
-
作用:用于存取数据、查询、更新和管理关系数据库系统。
-
MYSQL和Oracle的区别
-
MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
-
分页查询: MySQL是直接在SQL语句中写"select... from ...where...limit x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询
-
事务隔离级别: MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别
-
MySQL是轻量型数据库,并且免费,没有服务恢复数据。Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务
-
MySQL的分区表还不太成熟稳定。 Oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
-
数据库的应用场景
-
数据需要永久保存
-
系统需要管理数据
-
数据库的优缺点
-
数据保存在内存
-
优点:存取数据快
-
缺点:数据不能永久保存
-
存在文件里
-
优点:数据可以永久报春
-
缺点:频繁的IO操作,性能慢,读写慢,查询数据不方便
-
保存在数据库
-
数据永久保存
-
使用SQL语句,查询效率高
-
管理数据方便
-
数据库技术的原理和核心——SQL
-
数据库三范式是什么?
-
第一范式:每个列都不可以再拆分。
-
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
-
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
-
数据库事务四大特性ACID(数据库的事务管理)
-
事务的意义
-
事务可以将一系列的数据操作捆绑成一个整体进行统一的管理,如果某一事务执行成功,则该事务中进行的所有数据均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误,则就是必须取消或回滚。取消或回滚后,数据将全部恢复到操作前的状态,所以数据更改均被消除。
-
Mysql 通过事务保证数据的一致性
-
四大特性
-
原子性:一个事务是一个不可分割的最小工作单元,其操作要么全部成功,要么全部失败
-
一致性:数据库总是从一个一致性状态转换为另一个一致性状态。所谓一致性状态,就是数据库的所有完整性约束(尤其注意用户定义约束)都被遵守,以银行转账为例,“转账操作必然导致一个账户减少金额,另一个账户增加金额,且这两个账户总金额之和不变”就是一个完整性约束。
-
持久性:一旦事务提交,则其所作的修改就会永久保存到数据库中。
-
隔离性:隔离性用于定义事务之间的相互隔离程度,存在四个隔离级别。
-
事务隔离
-
脏读: 表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
-
不可重复读: 是指在一个事务内,多次读同一数据。比如,事务A要读取数据两次,先读取了一次,然后事务B更改了此数据,当事务A再读取时与第一次读的不是同一个数据。
-
幻读: 指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
-
READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
-
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
-
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
-
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
-
ORacle的使用方式,怎样通过SQL使用?
-
三种语言类型
-
DML 数据操纵语言,用于查询和修改数据
-
增:INSERT 表 INTO (表字段)VALUES (值)
-
删:truncate、delete、drop的区别
-
用法:truncate 表名;delete from 表名 where...;drop table 表名;
-
truncate、drop是不可以rollback的,但是delete是可以rollback的;原因是:delete删除是一行一行的删除,会触发触发器,删除可以返回行数,每删除一行会进行一次日志记录,所以可回滚;而truncate删除是删除表的所有数据,通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放,所以不能回滚,可以重置自增字段的计数器;Drop语句将删除表的结构、被依赖的约束(constrain)、触发器 (trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。
-
注意:drop、truncate不能删除有外键约束的表。
-
改: UPDATE 表名SET 修改的数据字段 = 值 WHERE 条件
-
查:
-
单表查询:公式是SELECT 字段 FROM 表名 WHERE 条件 GROUP BY(分组)HAVING ORDER BY
-
多表查询:自关联,左关联,右关联,子查询
-
DCL 定义数据库权限
-
给用户授权
-
GRANT 权限 TO 用户
-
收回权限REVOKE 权限 TO
-
DDL数据定义语言
-
创建表
-
修改表
-
删除表
-
常用函数
-
DISTINCT() 去重函数
-
SUM()求和 MAX()最大值
-
LOWER()变小写UPPER()变大写
-
length长度、to_date转化日期、to_char转化字符、to_number转化数字Ltrim去左边空格、rtrim去右边空格、substr截取字符串、add_month增加或减掉月份
-
数据库性能优化相关
-
索引的意义
-
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
-
具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
-
索引创建 create index 索引名 on 表名(列名)
-
主键,外键,有特殊意义适合当索引
-
较频繁作为查询条件的字段才去创建索引
-
首先应考虑在 where 及 order by 涉及的列上建立索引
-
定义有外键的数据列一定要建立索引
-
更新频繁字段不适合创建索引
-
若是不能有效区分数据的列不适合做索引列、
-
对于那些查询中很少涉及的列,重复值比较多的列不要建立索引
-
SQL查询优化
-
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
-
减少交互次数
-
尽量避免在 where 子句中使用 != 或 <> 操作符以及is null、不用or 来连接条件、in和 not in 也要慎用
-
数据库优化
-
调整数据库结构的设计:需要考虑是否使用分区功能、是否建立索引等
-
调整数据库的SQL语句
-
调整服务器的内存分配
-
调整硬盘I/O
-
调整操作系统参数
-
表分区
-
Oracle的相关问题
-
索引注意的点
-
MYSQL有索引的最左原则
-
存储过程
-
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
-
优点:
-
存储过程是预编译过的,执行效率高。
-
存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
-
安全性高,执行存储过程需要有一定权限的用户。
-
存储过程可以重复使用,减少数据库开发人员的工作量。
-
缺点:
-
调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
-
移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
-
重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
-
如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
-
数据库恢复和克隆
努力不一定成功,但不努力一定会失败~