文章目录
1.内连接和外连接的区别?
- 内连接 (自然连接) :a inner join b 查询的是a表和b表的交集数据。
- 左外连接:a left join b 查询a表的全部数据,以及a表与b表的交集数据 。
- 右外连接:a right join b 查的是b表的全部数据,以及b表与a表的交集数据。
2.什么是事务?
事务是数据库中一个单独的执行单元(Unit),它通常由高级数据库操作语言(例如SQL)和编程语言(s例如Java)编写的用户程序的执行所引起的。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。
事务必须满足4个属性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),即ACID 4种属性。
- 原子性:事务是一个不可分割的整体,要么都执行要么都不执行。
- 一致性: 一个事务执行之前和执行之后,数据库数据必须保持一致性状态。
- 隔离性:一个事务的执行不受其他事务的干扰。
- 持久性: 一个事务一旦提交,则会永久的改变数据库的数据。
3.什么是存储过程?
SQL语句在执行时要先编译,然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。
- 存储过程增强了SQL语言的功能和灵活性:存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 存储过程允许标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且可以随时对存储过程进行修改,对应用程序源代码毫无影响。
- 存储过程能实现较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
- 存储过程能减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织成存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
- 存储过程可被作为一种安全机制来充分利用:系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
4.存储过程与函数有什么区别和联系?
存储过程不等于函数,二者虽然本质上没有区别,但还是有如下几个方面的不同:
- 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。由于函数可以返回一个对象,因此它可以在查询语句中位于From关键字的后面。
- 一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性较强。
- 函数需要用括号包住输入的参数,且只能返回一个值和表对象,而存储过程可以返回多个参数。
- 函数可以嵌入在SQL中使用,可以在select中调用,存储过程则不行。
- 函数不能直接操作实体表,只能操作内建表。
- 存储过程创建时即在服务器上进行了编译,其执行速度比函数快。
5.数据库三范式?
级别 | 概念 |
---|---|
1NF | 属性不可分 |
2NF | 非主键属性,完全依赖于主键属性 |
3NF | 非主键属性无传递依赖 |
6.什么是触发器?
触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动,当数据库有特殊的操作时,这些操作由数据库中的事件来触发,自动完成这些SQL语句。使用触发器可以用来保证数据的有效性和完整性,完成比约束更复杂的数据约束。
7.触发器与存储过程的区别?
触发器 | 存储过程 |
---|---|
当某类数据操作DML(增删改)语句发生时隐式地调用 | 从一个应用或过程中显式地调用 |
在触发器体内禁止使用COMMIT和ROLLBACK语句 | 在过程体内可以使用所有PL/SQL块中都能使用的SQL语句,包括COMMIT和ROLLBACK语句 |
不能接受参数输入 | 可以接受参数输入 |
8.什么是游标?
数据库中,游标提供了一种对表中检索出的数据进行操作的灵活手段,它实际上是一种能从包含多条数据记录的结果集中每次提取一套记录的机制。
9.如果数据库日志满了,会出现什么情况?
日志文件(Log File)记录了所有对数据库的修改,主要是保护数据库以防故障发生,以及恢复数据时使用。其特点如下:
- 每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员。
- 日志文件组以循环方式进行写操作。
- 每一个日志文件成员对应一个物理文件。
通过日志文件来记录数据库事务可以最大限度地保证数据的一致性与安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作,原因是任何写操作都要记录日志,也就是说,基本上处于不能使用的状态。
10.关系型数据库和非关系型数据库区别
关系型数据库
优点:
- 容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解。
- 使用方便:通用的SQL语言使得操作关系型数据库非常方便。
- 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
- 支持SQL,可用于复杂的查询。
- 支持事务。
缺点:
- 为了维护一致性所付出的巨大代价就是其读写性能比较差。
- 固定的表结构。
- 不支持高并发读写需求。
- 不支持海量数据的高效率读写。
非关系型数据库
使用键值对存储数据;分布式;
优点:
- 无需经过sql层的解析,读写性能很高。
- 基于键值对,数据没有耦合性,容易扩展。
- 存储数据的格式:nosql的存储格式是key,value形式
缺点:
- 不提供sql支持
11.索引的优缺点,什么时候使用索引,什么时候不能使用索引?
- 索引最大的好处是提高查询速度。
- 缺点是更新数据时效率低,因为要同时更新索引。
- 对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。
12.对sql语句优化
- 子查询变成left join。
- limit 分布优化,先利用ID定位,再分页。
- or条件优化,多个or条件可以用union all对结果进行合并(union all结果可能重复)。
- 减少不必要的排序。
- where代替having,having 检索完所有记录,才进行过滤。
- 避免嵌套查询。
- 对多个字段进行等值查询时,使用联合索引。
13 事务隔离级别
数据库定义了4个隔离级别:
Serializable【可避免脏读,不可重复读,虚读】
Repeatable read【可避免脏读,不可重复读】
Read committed【可避免脏读】
Read uncommitted【级别最低,什么都避免不了】
分别对应Connection类中的4个常量
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_READ_COMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
脏读:一个事务读取到另外一个事务未提交的数据。
不可重复读:一个事务读取到另外一个事务已经提交的数据,也就是说一个事务可以看到其他事务所做的修改。
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
14.数据库连接池的作用?
- 限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃。
- 数据库连接不需要每次都去创建或销毁,节约了资源。
- 由于数据库连接不需要每次都去创建,响应时间更快。
15.简单说一说drop、delete与truncate的区别?
- 不再需要一张表的时候,用drop。
- 想删除部分数据行时候,用delete,并且带上where子句。
- 保留表而删除所有数据的时候用truncate。