sql面试


----1.数据库的三范式?
一范式: 每个列都是不可分割的原子单元;
二范式: 必须满足第一范式;每个列都依赖于主键。
三范式:必须满足第二范式;每个列不能传递依赖于主键。

----2.主键的设计原则有哪些?
一、唯一的标识一行;
二、作为一个可以被外键有效引用的对象;
三、不需要更新主键;
四、主键不应该包含动态变化的数据,如时间戳 等;
五、主键应当有计算机自动生成。

----3.数据的约束有哪些特点(主键约束,唯一约束, 非空约束, null约束, 默认值约束, check[枚举]约束, 外键约束, 长度约束)

一、主键约束:表中定义一个主键来唯一确定表中每一行数据的标识符;(非空,唯一)
二、唯一约束:保证在一个字段或者一组字段里的数据与表中其它行的数据相比是唯一的;
三、非空约束:强制列不接受 NULL 值;
四、null约束:只用于定义列约束,没有其他约束时默认是null约束;
五、默认值约束:用于向列中插入默认值,如果没有规定其他的值,那么会将默认值添加到所有的新记录;
六、check[枚举]约束:用于限制列中的值的范围;
七、外键约束:用于预防破坏表之间连接的动作;
八、长度约束:


----4.主键约束和唯一约束有哪些区别?

1.在一个表中,只能定义一个primary key约束,但可定义多个unique约束;
2.对于指定为primary key的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于unique所约束的唯一键,
则允许为null,只是null值最多有一个。

----5.内连接和外连接的区别

内链接:也叫自然连接,多表作为联查,满足条件的数据才能呈现;
外链接:分为左外连接,右外连接,全外连接,全外连接如果有on条件,在一定程度上等同于内联接,如果没有on条件表示笛卡尔积。


----6.左外连接,右外连接和全外连接的区别

左外连接:以左表为基准,查询满足条件的列,右表没有匹配到的数据以null代替;
右外连接:以右表为基准,查询满足条件的列,左表没有匹配到的数据以null代替;
全外连接:如果有on条件,在一定程度上等同于内联接,如果没有on条件表示笛卡尔积


----7.你使用过哪些mysql函数.

字符串函数: concat连接,lpad左填充,rpad右填充 ,ltrim删除左边空格,rtrim删除右边空格,replace替换,length返回字符长度
substring截取;
数字函数:ceil向上取整,floor向下取整,abs绝对值,mod取余,rand产生0~1的随机数,round四舍五入,可设置保留位数,
truncate可设置保留小数,但不会四舍五入
日期函数:now返回年月日时分秒,curdate返回年月日,curtime返回时分秒,week返回当前日期是当前年的第几周,
year返回当前日期的年份,date_format可设置时间格式,date_add可将日期往前推或向后推
流程函数:if(n,t,f)n为true时执行t,否则执行f ,ifnull(n,t,f)n为空时执行t,否则执行f。


----8.视图是什么? 视图的优点有哪些?
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改
视图的优点:
1.对数据库表的访问,因为视图可以有选择性的选取数据库里的一部分。
2.用户通过简单的查询可以从复杂查询中得到结果, 从而隐藏数据复杂性 。
3.维护数据的独立性,视图可从多个表检索数据。
4.对于相同的数据可产生不同的视图, 以不同的角度来显示基表中的数据.
5.视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。
6.通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制。


----9.常用的oracle的函数有哪些?

字符函数:initcap首字母大写,
lower字母全部转换成小写,
upper字母全部转换成大写,
replace替换,
substr截取字符串,
concat连接字符串,
lpad 和 和 rpad 左填充字符和右填充字符,
length返回字符串的长度;

日期时间函数:add_months 增加或减去月份,
months_between计算指定的两个日期之间月数之差,
last_day 返回日期的最后一天,
round 和 和 trunc按照指定的精度进行四舍五入,
next_day 给出日期 date 和星期几计算下一个星期的日期,
数字函数:abs绝对值,
round四舍五入,
trunc指定截尾取整的数字和截取精度的数字
mod取余
ceil向上取整
floor向下取整
Power(x,y) 返回 x 的 的 y
Mod (x ,y )返回 x 除 除 y 的余数
转换函数:to_char转换成字符类型
to_date转换成时间类型
to_number转换成数字类型
混合函数:nvl(string1, replace_with)如果 string1 为 null,则 nvl 函数返回 replace_with
的值,否则返回 string1 的值
nvl2(e1, e2, e3) 如果 e1 为 null,则函数返回 e3,否则返回 e2。
nullif(exp1,expr2)如果 exp1 和 exp2 相等则返回空(null),否则返回第一个值

分组函数:AVG (columname) 返回指定列的平均值
MAX (columname) 返回指定列的最大值
MIN (columname) 返回指定列的最小值
SUM (columname) 返回指定列的总值
COUNT
COUNT (*) 统计所有行个数,包括重复行和空值得行
COUNT (columname) 统计指定列非空值的个行数
COUNT (DISTINCR columname) 统计指定列中 非重复,非空值得行个数

----10.存储函数和存储过程的区别?
1.存储函数有且只有一个返回值,而存储过程可能有返回值。
2.存储函数只能有输入函数 而存储过程可以有多个 in,out,inout 参数。
3.存储过程中的语句功能更强大,存储过程可以实现很复杂的业务逻辑,而函数有很多限制,如不能在函数中使用 insert,update,delete,create 等语句;存储函数只完成查询的 工作,可接受输入参数并返回一个结果,也就是函数实现的功能针对性比较强。
4.存储过程可以调用存储函数。但函数不能调用存储过程。
5.存储过程一般是作为一个独立的部分来执行(call 调用)。而函数可以作为查询语句的一个部分来调用。


----11.存储过程的缺点 和 优点?
优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,可提高数据库执行速度。
2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
5. 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性和安全性。
6. 可以降低网络的通信量。
7. 使体现企业规则的运算程序放入数据库服务器中,以便集中控制;

缺点:
1.调试麻烦;
2.移植问题,数据库端代码当然是与数据库相关的;
3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,
受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译);
4.如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增
加会导致数据结构的变化。


----12.jdbc中如何调用存储过程?
1.class.forname加载数据库驱动;
2.创建connection连接;
3.通过connection对象创建callableStatement对象;
4.设置传入的参数和注册传出参数;
5.执行sql语句,获取传出参数;
6.释放资源,关闭结果集,callableStatement对象、connection对象。

----13.jdbc的执行步骤
1.class.forname加载数据库驱动;
2.创建connection连接;
3.通过connection对象创建Statement对象;
4.通过Statement对象执行sql语句完成增删查改操作;
5.如果是查询,返回一个结果集对象,循环迭代结果集。


----14.触发器是什么? 触发器的类型有哪些?
数据库触发器:是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,
Oracle 自动地执行触发器中定义的语句序列。

语句级触发器
在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。
行级触发器(FOR EACH ROW)
触发语句作用的每一条记录都被触发。在行级触发器中使用 old 和 new 伪记录变量,识别值的状态。

-----15.游标的作用?
1. 指定结果集中特定行的位置。
2. 基于当前的结果集位置检索一行或连续的几行。
3. 在结果集的当前位置修改行中的数据。
4. 对其他用户所做的数据更改定义不同的敏感性级别。
5. 可以以编程的方式访问数据库。


----16.mysql的端口? oracle的端口?
mysql的端口:3306;
oracle的端口:1521;


----17.mysql的分页? oracle的分页?

limit分页:Select * from table_name limit n,m;//n为起始行数,m为要截取的行数;
rownum分页:select a.* ,rownum rn from (select * from table_name rownum<=n) a where rn>m;


----18.简单说下数据库的事务;
事务是保持数据的一致性,它由相关的 DDL 或者 DML 语句做为载体,这组语句执行的
结果要么一起成功,要么一起失败;
数据库事务的四个特点(ACID):原子性,一致性,隔离性,持久性。


----19.oracle的索引.
索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据
的读取速度和完整性检查。

原文地址:https://www.cnblogs.com/zlazm/p/7898606.html