java面试------Oracle数据库

Oracle数据库

一、sql语言基础

1、 三大范式?

第一范式的目标是确保每列的原子性。
第二范式的要求在满足第一范式的基础上,每个表只描述一件事情。
第三范式如果一个关系满足2NF,并且除了主键以外的其他列都不间接依赖
于主键列,则满足第三范式。

2、 RBAC模型是什么?(权限模块的理论基础 Role-Based Access Control)

RBAC是一套成熟的权限模型。在传统权限模型中,我们直接把权限赋予用户。而在RBAC中,增加了“角色”的概念,我们首先把权限赋予角色,再把角色赋予用户。这样,由于增加了角色,授权会更加灵活方便。在RBAC中,根据权限的复杂程度,又可分为RBAC0、RBAC1、RBAC2、RBAC3。其中,RBAC0是基础,RBAC1、RBAC2、RBAC3都是以RBAC0为基础的升级。

3、 truncate和delete区别?

区别一:delete需要和where一起使用,删除指定的行,否则所有行都会
删除了。
truncate是整表截断,删除大量数据块,truncate不能删除有外
键的表。
区别二:delete删除以后,可以回滚。
Truncate删除以后,就无法恢复了。
区别三:delete删除慢,truncate 删除快。

二、运算符及单表查

1、Sql中去重的关键字是什么?

在select语句中,可以使用distinct关键字删除重复的行。

2、Sql中如何判断是否为null?

列名 is null。

3、Sql中模糊查询怎么写?

可以再where子句中使用like运算符。
下划线(_):表示匹配某个位置的字符。
百分号(%):表示在某个位置的任意个字符。

4、Having和Where的区别?

① 不能在where子句中使用聚合函数,可以在having子句中使用聚合函数。
② having子句不能离开group by 子句单独使用。
③ where对from后数据进行筛选,having对group by后的数据进行筛选。

5、常见的聚合函数有哪些?

Avg,Sum,Min,Max,Count。

三、函数及分组、表的约束、高级查询

1、 左外连接和右外连接的区别?

左外连接是以左边表中的数据为基准,若左表有数据右表没有数据,则显示左表中的数据,右表中的数据显示为空。(左边为主表,右边为从表)
右外连接与左外连接相反。

2、 rowid与rownum的区别?

区别一:rowid 是地址,rownum是序号。
区别二:使用insert语句插入数据时,oracle会自动生成rowid并将
值与表数据一起存放到表行中。
区别三:rownum不是表中原本的数据,是在查询操作时由oracle为每一行记录自动生成的一个编号,每一次查询ROWNUM都会重新生成

3、 oracle中分页如何实现?mysql中分页如何实现?

第一种方法:
select *
from (select s.*, rownum rn
from (select * from student) s
where rownum <= 8)
where rn >= 5;
第二种方法:
select * from(select rownum rn,字段1,字段2 from 表) t
where t.rn >= 某一页开始的行数
and t.rn <= 某一页结束的行数
Mysql中的分页是使用Limit分页的,首行是从0开始的。
select * from tablename limit start , pagesize;

四、索引、视图、表

1、 Oracle的索引有哪些?

B树索引:在Oracle中是一个通用索引。在创建索引时它就是默认的索引
类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合
(多个列)的索引。B树索引最多可以包括32列。
唯一索引:B树索引的一种形式,不允许有索引值相同的行。
位图索引:通常用于数据仓库,当表中有大量的数据,只进行查询和分析。
适用于字段值取值不多的情况下。
函数索引:适用于应用了SQL函数的列。

2、 视图和表的区别?

区别一:表是物理存在的,视图是虚拟的内存表。
区别二:在表中可以用update,insert,delete等sql操作,而视图只能
select操作。

五、横纵标示例

1、 横纵表的区别?

区别一:纵表方便数据的存储,横表方便数据的展示。
区别二:横表一行表示了一个实体记录,清晰可见,一目了然。
纵表数据描述不是很清晰,而且会造成数据库数据很多。另如果
需要分组统计,要先group by,较繁琐。
区别三:横表如果现在要给这个表加一个字段,那么就必须重建表结构。
纵表如果现在要给这个表加一个字段,只需要添加一些记录。
结 论:应该把不容易改动表结构的设计成横表,把容易经常改动不确定
的表结构设计成纵表。

六、事务、过程和函数

1、 事务的ACID?

原子性(atomicity ):整个事务中的所有操作,要么全部完成,要么全部
不完成,不可能停滞在中间某个环节。
一致性(consistency):在事务处理执行前后,数据库的状态应该是一致
的。
隔离性(isolcation):事务是并行执行的,事务与事务之间应该互不影响。
持续性(durability) :事务处理的效果能够被永久保存下来。
并发:并发指的是两个线程同时去处理同一个程序“抢着去做串行指的是
先完成A在完成B。并行指的是多个线程下同时去处理一件事,提
高效率。

2、 Oracle的存储过程怎么创建?(定义,优点,语法)

定义:存储过程是一组为了完成特定功能的sql语句,经编译后存储在
数据库中。
优点:① 减轻网络流量。
② 可以重复使用,减少数据库开发人员的工作量。
③ 执行的效率更高,更安全。
语法:create or replace procedure 名字(参数部分)
As 声明部分
Begin 执行部分
Exception异常处理部分
End;

3、 存储过程和函数的区别?

区别一:存储过程没有返回值,函数有。
区别二:函数可以单独执行,而过程必须通过call或execute执行。
区别三:函数可以嵌入SQL语句中执行,而过程不行。

4、 说说Oracle与MySql的区别?

区别一:Oracle是大型数据库,Mysql是中小型数据库。
区别二:Oracle需要收费,Mysql是开源的。
区别三:Oracle安装需要的空间很大,Mysql安装很小。
区别三:Oracle分页是rownum,MySQL分页是limit。
区别四:Oracle有序列,MySQL有自增长,两者类似但又不同。

七、游标、触发器和数据库的优化

1、 如何使用Oracle的游标?

第一步:定义游标,cursor curse_name is select_statement;
第二步:打开游标,open cursor_name;
第三步: 提取数据,
fetch curse_name into variable1(变量名),variable2,…;
第四步:关闭游标,close cursor_name;

2、 触发器的定义,语法,作用。

定义:触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。
语法:
create [or replace] trigger 触发器名 触发时间 触发事件
on 表
[for each row]
begin
pl/sql语句
End;
作用:数据确认、实施复杂的安全性检查、做审计、跟踪表上所做的数据
操作、数据的备份和同步。

3、 如何进行数据库的优化?

① 合理的数据库设计
要点一:合理数据库设计非常重要,好的设计对优化很重要,采用第
1,2,3范式进行数据库的设计。
要点二:对比较频繁的数据表关联查询应适当提高数据冗余设计(违
反了范式要求,但利大于弊)。
要点三:通过复杂计算的列,在存储就计算好存放。例如:存放语文,
数学,英语成绩时,在insert时候,顺带把三个科目的总
分存进去。
要点四:把频繁被访问的数据同较少被访问的数据分开存储(分库实现,读写分离)。
② 索引的使用
要点一:索引是改进查询性能的最简单、最有效的方法,尤其是当您总
是对几个关键字字段进行搜索时,这种方法最合适。
要点二:索引并不是越多越好,索引固然可以提高相应的 select 的
效率,但同时也降低了insert 及update 的效率,因为insert 或update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
要点三:WHERE子句中,如果索引列是函数的一部分,优化器将不使用
索引而使用全表扫描。
要点四:分离表和索引。
③ SQL语句的调优
要点一:在FROM子句中包含几个表的情况下,记录少的放在右边,如果是三个以上的表,交叉表放在右边。
要点二:可以过滤掉最大数量记录的条件必须写在WHERE子句的末
尾。
要点三:select子句中避免使用*。
要点四:减少访问数据库的次数,尽量sql一次读取数据,避免多次
读取。
要点五:使用decode减少处理时间。
要点六:用where子句替换having子句。
要点七:含有子查询的sql语句中,要特别注意减少对表的查询。
要点八:使用表的别名(Alias)。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值