数据库常见面试题
(1)表的操作
表的创建:create table 表名 (列名1 类型 约束, 列名2 类型 约束…)
表的删除:drop table 表名
表的更改:alter table 表名 add|drop 列名|约束名
插入记录:insert into 表名… value…
更新记录:update 表名 set 列名=值 where 条件
删除记录:delete from 表名 where 条件
查询记录:select 列名… from 表名 where 条件
(2)什么是数据库约束,常见的约束有哪几种?
约束可以分为:主键约束primary key、外键约束foreign key、唯一约束unique、检查约束check、空值约束not null、默认值约束default
(3)主键和外键的区别?
主键在本表中是唯一的,不可为空的,外键可以重复可以为空。
外键和另一张表的主键关联,不能创建对应表中不存在的外键。
(4)什么是索引?优缺点?
对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
优缺点:优点:利用索引可以加速对数据的检索,索引是可以唯一的,创建索引允许指定单个列或者多个列
缺点:减慢了数据录入速度,同时也增加了数据库的尺寸大小
(5)order by和group by的区别?
order by为排序查询、ASC升序 DESC降序
group by为分组查询、having只能用于group by子句、作用于组内、having条件子句的查询语句需要使用聚合函数
(6)sql的表连接方式有哪些?
内连接、外连接、交叉连接
内连接:inner join in ,两表都满足的组合
外连接:分为左连接、右连接、全连接
– 左连接 A left(outer) join B 以A表为基础,A表的全部数据,B表有的组合,没有的为null
– 右连接 A right(outer) join B 以B表为基础,B表的全部数据,A表有的组合,没有的为null
– 全连接 A full(outer) join 两表相同的组合在一起,A表有,B表没有的数据(显示为null),同样B表有,A表没有的显示为null
交叉连接:cross join,即使笛卡尔乘积
(7)在数据库中查询语句速度很慢,如何优化?
① 建立索引
② 减少表之间的关联
③ 优化sql语句,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的排在前面
④ 简化查询字段,没用的字段不要
⑤ 尽量用PreparedStatement来查询,不要用Statement
(8)什么是游标?
游标是一种能从包括多条数据记录的结果中每次提取一条记录进行处理的机制。
游标的使用步骤:① 定义游标 declare cursor 游标名称 for select 查询语句[for {readonly|update}]
② 打开游标 open cursor
③ 从游标中操作数据 fetch… current of cursor
④ 关闭游标 close cursor
(9)如何在删除主表记录时,一并删除从表相关联的记录?
如果两张表存在主外键关系,那么在删除主键表的记录时,如果从表有相关联的记录那么将导致删除失败
在定义外键约束时,可以同时指定3种删除策略:一是将从表记录一并删除(级联删除);
二是将从表记录外键字段设置为NULL;
(10)列举几种常用的聚合函数?
sum函数 avg函数 max函数 min函数 count函数
(11)oracle基本数据类型?
① 字符串类型 char 、nchar 、 varchar 、 vachar2
② 数字类型 number 、 integer
③ 浮点类型 float
④ 日期类型 date 、 timestamp
⑤ LOB类型 blob 、 clob 、 nclob 、 bfile
(12)oracle和mysql的区别?
① 库函数不同
② oracle是用表空间来管理的,mysql不是
③ 显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本的语句的不同
④ 分页查询时,mysql用limit ;oracle用rownum
(13)union和union all有什么不同?
union在进行表连接后筛选重复的记录,所以在表连接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果
union all 只是简单地将两个结果合并后返回
从效率上说,union all比union快很多,所以,如果可以确认合并的两个结果集中不包括重复的数据的话,那么就使用union all
(14)truncate和delete的区别?
相同处:二者均删除表中的全部行
不同处:① truncate table比delete速度快
② delete语句每次删除一行,并在事务日志中为所删除的每行记录一项;truncate通过释放存储数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
③ truncate table删除内容,释放空间但不删除定义
④ delete table删除内容,不删除定义但不释放空间
⑤ drop table删除内容和定义,释放空间
(15)行转列、列转行怎么转?
① 使用decode函数
② 使用case when语句
(16)oracle怎么去重?怎么获取系统时间?
去重:使用distinct关键字 select distinct name from A
获取系统时间:select to_char(sysdate, ‘yyyy-MM-dd HH24:mi:ss’) from dual;
(17)序列的作用?
oracle使用徐磊来生成唯一编号,用来处理一个表中自增字段。
一旦访问一个序列号,oracle将在处理下一个请求之前自动递增下一个编号,从而确保不会出现重复值。
(18)什么是存储过程?存储过程的优缺点?
存储过程一个预编译的sql语句,优点是允许模块化的设计
就是说只需创建一次,以后在该程序中就可以调用多次,如果某次操作需要执行多次sql,使用存储过程比单纯的sql语句执行要快。
存储过程的优缺点:优点:① 存储过程是预编译过的,执行效率高
② 存储过程的代码存放于数据库中,通过存储过程名直接调用,减少网络通讯。
③ 安全性高,执行存储过程需要有一定权限的用户
④ 存储过程可以重复使用,可减少数据库开发人员的工作量
缺点:移植性差
(19)存储过程与函数的区别?
① 函数有返回值,存储过程没有返回值
② 因为存储过程没有返回值,所以不能将存储过程的执行结果赋值给变量;函数有返回值类型,调用函数时,可以将函数的执行结果赋值给变量。
也就是是说,函数可以在select语句中使用,而存储过程则不能。
下面是一些sql语句练习:
— 查询所有学生的数学成绩
select s.name,g.score
from student s, grade g
where s.id=g.id and g.kemu=’数学’;
— 统计每个学生的总成绩,显示字段:姓名、总成绩
select a.name sum(b.score) as sum_score
from student a, grade b
where a.id = b.id group by name;
— 列出各门课程成绩最好的学生,要求显示字段:学号、姓名、科目、成绩
select a.id, a.name, g.kemu, max(g.score)
from student a, grade g
where a.id = g.id group by g.kemu
— 列出数学成绩前三名的学生信息
select a.id, a.name, g.kemu, g.score
from student a, grade g
where g.score = ‘数学’ order by score limit 3;
— 统计英语课少于80分的人
select a.id, a.name, g.kemu, g.score
from student a, grade g where a.id g.id
and g.kemu = ‘英语’ orader by g.score <80;
— 查询每科成绩的前两名
select a.id , a.name, g.kemu, g.score
from student a, grade g
where a.id = g.id
order by g.kemu limit 2;