数据库面试相关
一.oracle实现分页 rownum;
select * from (select aa.* , rownum rn from (select * from student )aa where rownum <=5) where rn>=2
二、mysql分页
2.1基本用法
mysql分页基本语法:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
可以接收一个或者两个参数,参数必须为整数。
1、给定一个参数:表示的是返回记录数的最大行数
2、给定两个参数:第一个参数表示返回记录行的偏移量,注意偏移量从0开始
第二个参数表示返回的记录行数
2.2实际开发常用
由上面的基本分页方法,可知:
select * from table limit 0,10; //表示查询第一页的10条数据,也就是第1 -10条数据
select * from table limit 10,10; //表示查询第二页的10条数据,也就是第11-20条数据
select * from table limit 20,10; //表示查询第三页的10条数据,也就是第21-30条数据。
但是项目环境中,一般传到后台服务中的数据是:currentPage(当前页数,一般从1开始)和 pageSize(记录行数),所以,在实际应用到sql中的时候,必须经过换算页码来进行分页查询。
通用的换算:select * from table limit (currentPage-1)*pageSize,pageSize。
3. oracle视图和表的区别是什么
区别:1、视图是已经编译好的sql语句,而表不是;2、视图没有实际的物理记录,而表有;3、表是内容,视图是窗口;4、表是内模式,视图是外模式;5、表属于全局模式中的表,是实表,而视图属于局部模式的表,是虚表。
三、数据库事务的四大特性
事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。
1) 原子性(Atomicity)
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。
(2)一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。
(3)隔离性(亦称独立性Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
(4)持久性(Durability)
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,(RDBMS,数据库系统)保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。
四、SQL的四个事务隔离级别
1)未提交读(Read Uncommitted):一个事务能够读取到 别的事务中没有提交的更新数据。事务可以读取到未提交的数据,这也被称为脏读(dirty read)。
所以这种级别很有可能读到脏数据,隔离级别最低。
2)提交读(Read Committed):一个事务只能读取到别的事务提交的更新数据。
一般我们提交读就可以了。只能读取到已经提交的数据。即解决了脏读,但未解决不可重复读。(oracle默认的)
3)可重复读(Repeated Read):保证同一事务中先后执行的多次查询将返回同意结果,不受其他事务的影响。这种隔离级别可能出现幻读。(mysql默认的)
4)序列化(Serializable):不允许事务并发执行,强制事务串行执行,就是在读取的每一行数据上都加上了锁,读写相互都会阻塞。这种隔离级别最高,是最安全的,性能最低,不会出现脏读,不可重复读,幻读,丢失更新。
六、oracle的三大范式
https://blog.csdn.net/Dove_Knowledge/article/details/71434960
在设计与操作维护数据库时,最关键的问题就是要确保数据能够正确地分布到数据库的表中。使用正确的数据结构,不仅有助于对数据库进行相应的存取操作,还可以极大地简化应用程序中的其他内容(查询、窗体、报表、代码等),按照“数据库规范化”对表进行设计,其目的就是减少数据库中的数据冗余,以增加数据的一致性。
泛化时在识别数据库中的一个数据元素、关系以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。常见的范式有1NF、2NF、3NF、BCNF以及4NF。下面对这几种常见的范式进行简要分析。
1、1NF(第一范式) 属性不可分
第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或是由一组属性构成。
简而言之,第一范式就是无重复的列。例如,由“职工号”“姓名”“电话号码”组成的表(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。
2、2NF(第二范式) 非主键属性,完全依赖于主键属性
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
如果关系模型R为第一范式,并且R中的每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性)。
例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外关键字课程号联系,在需要时进行连接。
3、3NF(第三范式) 非主键属性无传递依赖
如果关系模型R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。
以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,所以该表有两个候选码(学号,课程号)和(姓名,课程号),故存在函数依赖:学号——>姓名,(学号,课程号)——>成绩,唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。
七、sql常见面试题目
https://blog.csdn.net/u012467492/article/details/46790205
八、.主键和唯一索引的区别
1、主键每张表只可以有一个,唯一索引可以有多个
2、主键列不允许有NULL数据,唯一索引可以
3、主键列一定是唯一索引列,唯一索引列不一定是主键列
九、组合索引
十、乐观锁和悲观锁
悲观锁(Pessimistic Lock), 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,比如行锁,表锁等,读锁,写锁等
乐观锁(Optimistic Lock), 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制