Oracle基础面试题:1.常见的数据库有哪些?区别是?尤其是mysql、oracle
大型数据库有:Oracle、Sybase、DB2、SQL server
小型数据库有:Access、MySQL等
Orcale :Orcale属于大型数据库系统,主要适用于大、中小型应用系统,或作为客户机/服务器系统中服务器端的数据库系统。
较安全、较贵
MySQL :由于其体积小、速度快、总体拥有成本低,开放源码
DB :最适于海量数据,性能较高适用于数据仓库和在线事物处理。
SQLServer :SQLServer是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,多用户时性能不佳
access :界面友好、易学易用、开发简单、接口灵活
sybase :是一种典型的UNIX或Windows平台上客户机/服务器环境下的大型数据库系统。
2.如何优化数据库
查询操作建立合适的索引
避免使用*,尽量使用字段代替*和常量
避免第一范式、第二范式
避免使用where子句中对字段进行表达式操作和函数操作
尽可能使用变长字段
避免使用游标、因为游标效率较差
尽量避免大事务操作,提高系统并发能力
3.数据库对象有哪些(模式)
表、视图、索引、序列、存储过程、触发器
4.char/varchar/varchar2的区别
char :长度固定、区分中英文、中文占2个字节、英文占一个字节、适用于长度比较固定的,一般不含中文的情况、最大长度为2K字节
varchar :长度不固定、区分中英文、最大长度为4K字节
varchar2 :基本和varchar一样、不同在于,varchar2用null代替varchar的空字符串
varchar和varchar2适合用于长度不固定的,一般不含中文的情况
nvarchar和nvarchar2是长度不固定的,不区分中英文,其长度定义的是字符数
nvarchar/nvarchar2适用于存放中文
5.to_date、to_char、to_number
to_date :将字符串按照指定的格式转换为日期数据
to_char :将日期数据转换为字符串数据
to_number :将字符转换为数字
6.nvl/trunc/round/initcap/lower/upper/trim/substr/length
nvl :空值处理
trunc :截取
round :四舍五入
initcap :将参数字符串的每个单词的第一个字母转换为大写,其余为小写
lower :转为大写
upper :转为小写
trim :删除指定的字符串
substr :返回字符串的一部分字符
substrb :返回字符串的一部分字节
length :求长度 返回以字符为长度单位
lengthb :求长度 返回以字节为长度单位
7.decode
相当于if ...
用法:decode(判断条件,匹配1,值1,匹配2,值2,...)
8.数据库中去重关键字
distinct
9.where/having的区别
having :必须用于有group by;先分组,再扫描表;条件中可以用聚合函数
where :可以单独使用;先扫描表,再分组;条件中不可以使用聚合函数
10.聚合函数有哪些?
count、avg、sum、max、min
11.排序的关键字,升序,降序,分别是什么,默认是什么?
order by
升序:asc
降序:desc
默认:asc
12.数据库的语言分类?
分为五类:
数据定义语言(DDL) :CREATE、DROP、ALTER等语句。
数据操作语言(DML) :INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
数据查询语言(DQL) :SELECT语句。(一般不会单独归于一类,因为只有一个语句)。
数据控制语言(DCL) :GRANT、REVOKE等语句。
事务控制语句(TCL) :COMMIT、ROLLBACK等语句。
分为三类:
DDL :CREATE、ALTER、DROP、TRUNCATE、COMMENT、GRANT、REVOKE
DML :SELECT、INSERT、UPDATE、DELETE、CALL(PL/SQL or Java subprogram)、EXPLAIN PLAN(explain access path to data)、LOCK TABLE(control concurrency)
DCL :COMMIT 、SAVEPOINT、ROLLBACK、SET TRANSACTION
13.数据库中删除操作有哪些?区别是?
DELETE :DML、删除数据,不腾出表空间的空间、可以在不删除表的情况下删除所有的行、Oracle数据库不要求必须使用FROM关键字TRUNCATE :DDL、删除表中所有行的数据,但是会保留表的结构、不能rollback、速度快、删的数据不能恢复、只能以表或簇为操作对象,而不能操作视图、同义词等模式对象、释放表所占用的磁盘空间、不会触发表的删除触发器
语法格式:TRUNCATE TABLE [schema.]table_name;
DROP :DDL、删除数据和表、使用DROP TABLE语句删除表时,表不会被立即删除,Oracle数据库将表进行了重命名并放入回收站中,这样还可以通过闪回操作复删除的表。14.关联查询与子查询的区别?
子查询就是查询中又嵌套的查询
子查询是指子查询返回的结果集是 N 行 N 列的一个表数据。
关联子查询会引用外部查询中的一列或多列,这种子查询之所以被称为关联子查询,是因为他的确与外部语句相关。
关联子查询 :exists 、not exists
exists 与 in 的比较 :
in操作符实现指定匹配查询
exists操作符只是检查行是否存在,针对行的存在性
在使用not exists 和 not in 时,如果一个值列表中包含有空值,not exists 返回true ,而 not in 返回false
15.内连接,左外连接,全外连接的结果集分别是什么?
内连接 : join ...on 表1 join 表2 on 条件
内连接结果集是可以在两张表中查询到匹配数据的数据记录
左外连接 : 表1 left join 表2 on 条件
左外连接结果集:驱动表的所有记录与其在匹配表中相匹配的数据===>驱动表的数据一个都不能少
全外连接 : 表1 full join 表2 on 条件
全外连接是将两个表的所有记录都查询出来
全外连接的结果集=内连接的结果集+驱动表在匹配表中与之匹配不上的记录和空值+匹配表中在驱动表中与之匹配不上的记录和空值
驱动表与匹配表可以互换
16.驱动表(主表)、匹配表(从表)?
驱动表与匹配表 : 表1 join 表2 on 条件
a.表1是驱动表(主表),表2是匹配表(从表)
b.等值连接下,驱动表与匹配表是可以互换位置的,不影响结果
c.执行方式:遍历驱动表,在匹配表中找到与驱动表相匹配的数据
17.并集、差集、交集的关键字
并集 :union/union all
交集 :intersect
差集 :minus
18.union和union all 的区别?
union :去重且排序
union all :不去重、不排序
19.什么是视图?索引?序列(定义,语法)?
视图(View)是一种虚拟表,内容由查询语句定义,本质上就是一条存储起来的SQL语句,是一个命名的查询,主要功能是用于改变基表(Base Table,组成视图的表)的数据显示,简化查询。
创建视图的语法格式如下:
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema].view_name
[(column_name[, column_name]...)]
AS Subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
Oracle数据库中的索引是一种建立表或簇基础上的数据对象,和表一样具有独立的段存储结构,需要在表空间中为其分配存储空间。
索引是减少磁盘 I/O的一种重要的手段,通过在表的一个或多个列上创建索引,可以提高查询表中数据的速度。
索引有两个特征,即唯一性索引和复合索引。
语法格式如下:
CREATE [ UNIQUE | BITMAP ] INDEX [schema.]index_name
ON [schema.] table_name (column_name1 [ ASC | DESC ][, column_name2 [ ASC | DESC ],...])
TABLESPACE tablespace_name
NOCOMPRESS | COMPRESS column_number
LOGGING | NOLOGGING
NOSORT | SORT
REVERSE
序列可以自动生成,主要用来自动为表中的数据类型的主键列提供有序的唯一值,这样就可以避免在向表中添加数据时,手工指定主键值。
序列和视图一样不占用实际的存储空间,只是在数据字典中保存信息。
创建序列的语法格式如下:
CREATE SEQUENCE [schema.]sequence_name
[ INCREMENT BY n ]
[ START WITH n ]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE n | NOCYCLE ]
[ CACHE n | NOCACHE ]
[ ORDER | NOORDER ]
20.视图的作用?
不占用实际存储空间,节约资源
可以优化查询
保证数据的安全
可以合并分离的数据,创建分区视图
适当的使用视图可以更清晰地表达查询
21.索引的作用以及优缺点?
创建索引可以大大提高系统的性能。
优点 :
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点 :
第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
何时使用索引 :
(1)表的数据量一定要很大。
(2)索引列的查询频率一定要高。
(3)满足查询条件记录数不能很多。
(4)在需要排序的列上创建索引。
(5)可以在查询频率高的组合列上创建索引。
(6)在多表连接查询中的连接列上创建索引。
(7)不要在低基数的列上创建索引。
(8)当需要对一个表频繁的进行增删改操作的时候,不应该为该表创建索引。
(9)要限制在表上创建索引的数量。
(10)在向数据库导入数据时,不要创建索引。
22.怎样创建一个序列?
创建序列的语法格式如下:
CREATE SEQUENCE [schema.]sequence_name
[ INCREMENT BY n ]
[ START WITH n ]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE n | NOCYCLE ]
[ CACHE n | NOCACHE ]
[ ORDER | NOORDER ]
23.Oracle数据库中的约束有哪些?(语法、应用在中的增删改)
约束 :主键,唯一,外键,非空,检查
(1)主键约束:列级、表级
--1)创建主键约束:
列级:
create table a(
id number(10) primary key ,
name varchar2(25)
);
表级:
create table a1(
id number(10) ,
name varchar2(25),
constraint a1_id_pk primary key(id)
);
--2)添加主键约束
--alter table 表名 add(constraint a1_id_pk primary key(id))
--alter table 表名 add(primary key(id))
--3)删除主键
--alter table 表名 drop primary key
--alter table 表名 drop constraint 约束名
--4)修改约束名
--alter table 表名 rename constraint old_name to new_name;
(2)唯一 unique 一张表可以有多个唯一约束 唯一约束值必须唯一 允许有空值,几个都无所谓
--1)创建唯一约束
列级:
create table tbb(
tbb_id number(10) primary key,
tbb_size number(20) not null,
tbb_colour varchar2(20),
constraint tbb_uq unique(tbb_size)
);
create table tb(
tb_id number(10) primary key,
tb_size number(20) not null,
tb_colour varchar2(20),
constraint tb_uq unique(tb_size,tb_colour)
);
上面是(tb_size,tb_colour)联合唯一
联合唯一与分别对不同字段定义为唯一约束的结果不同
--2).删除唯一约束
alter table 表名 drop unique(字段名)
alter table 表名 drop constraints unique uk_XX;
(3)外键约束 foreign key (fk)
--1)创建外键约束
列级约束:
create table tb(
tb_id number(10) primary key,
tb_size number(20) not null,
tb_colour number(20) constraint tb_a_fk references tbb(tbb_id)
);
create table tbb(
tbb_id number(10) primary key,
tbb_si number(20) not null,
tbb_co varchar2(20)
);
select * from tb;
drop table tbb;
表级约束
create table e2(
c1 number(12),
c2 number(12) constraint tb_a_fk foreign key(c2) references e(c1)
);
--2)删除外键约束
--alter table 表名 add 添加上外键关系 on delete cascade;
--alter table 表名 drop constraint 名;
alter table tbb add constraint tb_a_fk references tbb(tbb_id)
on delete cascade;
(4)非空
--1)创建:not null
--2)修改非空约束
--alter table 表名 modify(name null)
alter table tb modify(tb_size null);
alter table tb modify(tb_size not null);
(5)检查 check
--1).创建检查约束方式
列级:
create table con(
id number(6),
name varchar2(11),
sex char(10) constraint con_age_a check(sex in('男','女'))
);
--2)删除检查约束
--alter table 表名 drop constraint 名
alter table asd drop constraint asd_age_a;
--注意:检查约束不允许加在sysdate,rowid(伪列,唯一的),user(数据的所有用户或者所有表)
24.事务的特点ACID(关键字)?
事务必须同时满足四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称为ACID
A:原子性是指一个事务是不可分割的数据库逻辑工作单位
C:事务在完成时,必须使所有的数据都保持一致状态
I:个事务的执行不能被其它并发执行的事务干扰
D:持久性是指一个事务一旦提交,它对数据库中数据的改变应该是永久性的,即使发生任何故障也不应该对其结果有任何影响。
25.锁
基本的封锁类型有排它锁和共享锁两种。
锁可以进行同时执行控制
使用两相锁确保可序列化
手动加锁:
(1)SELECT FOR UPDATE语句
语法格式如下:
SELECT 语句 FOR UPDATE [OF columns] [WAIT n | NOWAIT] [SKIP LOCKED];
(2)LOCK TABLE语句
语法格式如下:
LOCK TABLE table_name IN lockmode MODE NOWAIT | WAIT n;
26.哪些操作是默认提交,哪些需要事务关键字处理?
在确保数据完整性的情况下,尽量及时使用COMMIT命令对DML操作进行提交。
commit、rollback、savepoint
27.oracle和mysql的分页是怎么实现的?
Oracle :rownum
例:
查询行号大于10的学生的学号、姓名和民族。
select s_id,s_name,s_nation from(
select rownum rn,s_id,s_name,s_nation from student)
where rn>10;mysql :limit
QUERY_SQL limit ?,?
使用limit关键字,第一个“?”是起始行号,第二个问号是返回条目数
28.存储过程,函数,触发器的定义与应用?
创建存储过程的语法格式如下:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [ IN | OUT | IN OUT ] datatype, …)]
IS | AS
declare_section;
BEGIN
statement;
END [procedure_name];
创建存储函数的语法格式如下:
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [ IN | OUT | IN OUT ] datatype, …)]
RETURN expression
IS | AS
declare_section;
BEGIN
statement;
END [function_name];
所谓触发器就是指执行由某个事件引起或激活操作的对象。触发器是一种特殊的存储过程
DML触发器语法格式如下:
CREATE [ OR REPLACE ] TRIGGER trigger_name
[BEFORE|AFTER ]trigger_event [OF column_name ]
ON tle_name
[ FOR EACH ROW]
[ WHEN trigger_condition ]
BEGIN
trigger_body;
END [ trigger_name ]
29.连接数据库的参数?
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
Connection conn = DriverManager.getConnection(url,username,userpwd);
30.段、块、区...定义?
逻辑存储结构,主要包括表空间、段、区、数据块
表空间是Oracle中最大的逻辑存储结构。表空间用于存储用户在数据库中创建的所有内容。
段是一组盘区,这组盘区组成了被Oracle视为一个单位的数据库随想,例如表或索引。因此,段一般是数据库终端用户将处理的最小存储单位
在Oracle数据库中,区是磁盘空间分配的最小单位,由一个或多个数据块组成。
数据块(块)是用来管理存储空间的基本单位,也是最小的逻辑存储单位。
原创文件,如有错误望指出