数据库常见的面试题
1.数据库三范式是什么?
第一范式:表中每个字段都不能再分。
第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。
第三范式:满足第二范式并且表中的非主键字段必须不传递依赖于主键字段。
2.什么是数据库事务?
事务具有四大特性:一致性、原子性、隔离性、持久性。
数据库事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账就是事务的典型场景。
数据库事务的三个常用命令:Begin Transaction、Commit Transaction、RollBack Transaction。
3.什么是视图?
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表。
视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。
通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。
在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。
创建视图时,只能使用单条select查询语句。
4.什么是索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引分为:聚集索引、非聚集索引、唯一索引等。
一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引。
索引可以包含多列。
合理的创建索引能够提升查询语句的执行效率,但降低了新增、删除操作的速度,同时也会消耗一定的数据库物理空间。
5.什么是存储过程?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
6.什么是触发器?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
7.写出一条Sql语句:取出表A中第31到第40记录 (MS-SQLServer)
解1:select top 10 * from A where id not in (select top 30 id from A)
2:select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
解3:select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROM A) as A where rowid between 31 and 40
8.写出一条Sql语句:取出表A中第31到第40记录 (Mysql)
select * from A limit 30, 10
9.写出一条Sql语句:取出表A中第31到第40记录 (Oracle)
select *
from (select A.*,
row_number() over (order by id asc) rank
FROM A)
where rank >=31 AND rank<=40;
10.在关系型数据库中如何描述多对多的关系?
在关系型数据库中描述多对多的关系,需要建立第三张数据表。比如学生选课,需要在学生信息表和课程信息表的基础上,再建立选课信息表,该表中存放学生Id和课程Id。
11.什么是数据库约束,常见的约束有哪几种?
数据库约束用于保证数据库表数据的完整性(正确性和一致性)。可以通过定义约束\索引\触发器来保证数据的完整性。
总体来讲,约束可以分为:
主键约束:primary key;
外键约束:foreign key;
唯一约束:unique;
检查约束:check;
空值约束:not null;
默认值约束:default;
12.列举几种常用的聚合函数?
Sum:求和\Avg:求平均数\Max:求最大值\Min:求最小值\Count:求记录数
13.什么是内联接、左外联接、右外联接?
内联接(Inner Join):匹配2张表中相关联的记录。
左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。
右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,左表中未匹配到的字段用NULL表示。
在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。
14.如何在删除主表记录时,一并删除从表相关联的记录?
如果两张表存在主外键关系,那么在删除主键表的记录时,如果从表有相关联的记录,那么将导致删除失败。
在定义外键约束时,可以同时指定3种删除策略:一是将从表记录一并删除(级联删除);二是将从表记录外键字段设置为NULL;三是将从表记录外键字段设置为默认值。
级联删除示例:
alter table 从表名
add constraint 外键名
foreign key(字段名) references 主表名(字段名)
on delete cascade
15.什么是游标?
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录进行处理的机制。
游标的使用步骤:
1.定义游标:declare cursor 游标名称 for select查询语句 [for {readonly|update}]
2.打开游标:open cursor
3.从游标中操作数据:fetch... ... current of cursor
4.关闭游标:close cursor
推荐阅读
-
Eclipse怎么打开数据库?Eclipse连接oracle等数据库的教程
-
Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法
-
纯Python开发的nosql数据库CodernityDB介绍和使用实例
-
看MySQL的参数调优及数据库锁实践有这一篇足够了
-
关于ImageView的几个常见问题
-
数据库的事务 - 初遇事务一(极客时间)
-
Python3数据库操作包pymysql的操作方法
-
flask框架实现连接sqlite3数据库的方法分析
-
Python使用win32com模块实现数据库表结构自动生成word表格的方法
-
Python eval的常见错误封装及利用原理详解