这是工作以来的第一次面试,虽然说是三个人的视频面试,说实话,心中有些紧张不安,仿佛回到了大学校招时期的面试,投递的岗位是Java研发,但是从一开始,技术面试官就阐明了,这是一次数据库开发面试,招聘的岗位也是一位数据库开发工程师,关键是技术面试官还笑眯眯的问是否接受这个岗位,该公司针对银行项目绩效系统,主要是做一些存储过程开发,sql查询,线上部署类的工作。心中一万句(gd),但还是同样笑着回应数据库开发我也接受这样的岗位,接下来就进入了正题,技术面试。
老事常谈,先是自我介绍,说实话,自我介绍一开始按照我的想法是介绍任务信息、工作经历、技能。但被面试一开始的岗位信息打蒙了,简单地结束了这个环节。然后进行了技术提问。以下问题不分先后顺序,见谅。
1.了解数据库索引吗?为什么这么快?
创建索引可以大大提高系统的性能:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
2.联合索引(两个字段)中只在where条件中使用一个字段是否触发索引?
- 使用联合索引的前面一个条件是会触发索引
- 两个条件一起使用也会触发索引,但是必须用and ,or不会触发索引
- 只用后面一个条件不会触发索引
3.假如遇到了一个sql查询很慢的问题,如何去优化?
查看表结构,考虑索引(是否未使用索引或索引使用不当)。
Sql语序是否不当。
4.什么是视图?
- 使用联合索引的前面一个条件是会触发索引
- 两个条件一起使用也会触发索引,但是必须用and ,or不会触发索引
- 只用后面一个条件不会触发索引
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
5.存储过程和函数的区别?
相同点:
1).创建语法结构相似,都可以携带多个传入参数和传出参数。
2).都是一次编译,多次执行。
不同点:
1).存储过程定义关键字用procedure,函数定义用function。
2).存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。
3).执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。
6.表分区的分类及使用?
- 范围分区
- 列表分区
- Hash分区:
1) HASH分区特点:
HASH分区主要通过hash算法确定相应数据行应该被存放到哪个分区中。
HASH分区比较适合列差异值很多的数据列。
2) 组合分区
组合分区的特点:
组合分区中,主要通过在不同列上,使用“范围分区”、“列表分区”以及“HASH分区”不同组合方式,进而实现组合分区。
组合分区中,分区本身没有相应的segment,可以认为是一个逻辑容器,只有子分区拥有实际的segment,用于存放数据。
组合分区的注意事项:
在11g以前,组合分区主要有两种组合方式:“RANGE-HASH”以及“RANGE-LIST”。
在11g以后,组合分区新增了四种组合方式:“RANGE-RANGE”、“LIST-RANGE”、“LIST-HASH”以及“LIST-LIST”。
7.数据库的三范式?
- 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
- 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
- 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
8.左外连接、右外连接、完全外连接使用?
左外连接:左表不加限制,保留左表的数据,匹配右表,右表没有匹配到的行中的列显示为null。
右外连接:右表不加限制,保留右表的数据。匹配左表,左表没有匹配到的行中列显示为null。
完全外连接:左右表都不加限制。即右外连接的结果为:左右表匹配的数据+左表没有匹配到的数据+右表没有匹配到的数据。
9.数据库中字段完全相同的记录如何去重,如何删除?
1)全部字段重复:select distinct * from tableName
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
10.如何设置表自增字段?
1)序列:
create sequence student_id_seq; --创建序列
insert into student values (student_id_seq.nextval,'张三');
insert into student values (student_id_seq.nextval,'李四');
2)触发器
create or replace trigger test_id
before insert on student --before:执行DML等操作之前触发
for each row --行级触发器
begin
select student_id_seq.nextval into :new.id from dual;
end;
/
检验:
insert into student(name) values ('张三');
insert into student (name) values ('李四');
select * from student;
3)自增字段
- CREATE TABLE Demo
- (
- id INT NOT NULL auto_increment PRIMARY KEY,
- key1 VARCHAR2(40) NULL,
- key2 VARCHAR2(40) NULL
- );
11.Union和union all的区别?
union:会自动压缩多个结果集中的重复结果,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
union all:对两个结果集进行并集操作,即将所有的结果全部显示出来,包括重复行,不进行排序。
拓展资料:
1、union和union all都可以将多个结果集合并,而不仅仅是两个。
2、使用union和union all 必须保证两个要联合的SQL语句 字段个数必须一样,而且字段类型要一致;
3、union因为要进行重复值扫描,所以效率低,如果合并没有刻意要删除重复行,那么久使用union all。
12.排序用什么关键字?默认是升序还是降序?
Order by ,升序