数据库 & JDBC
文章目录
数据库三范式是什么
什么是范式:简而言之,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的数据库是需要满足一些规范来优化数据库存储方式。在关系型数据库中这些规范就可成为范式。
第一范式
:当关系模式R的所有属性都不能再分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求。(列不可再分)
第二范式
:如果关系模式R满足第一范式,并且R的所有非主属性完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。(属性完全依赖于主键)
第三范式
:属性不依赖于其他非主属性,属性直接依赖于主键。即数据不能存在传递关系。
SQL分为哪几个大类
SQL语言按照实现的功能不同,主要分为四类:
- 数据定义语言(DDL)
Data Definition Language : 数据库定义语言,操作数据库,表(创建,删除,修改)。常用命令有create、drop、alter - 数据操纵语言(DML)
Data Manipulation Language :数据库操作语言,操作表的数据(插入,删除,修改)。常用的命令insert,delete,update。 - 数据查询语言(DQL)
Data Query Language :数据库查询语言,操作表的数据,查询表的数据。常用命令select。 - 数据控制语言(DCL)
Data Control Language :数据控制语言,常用命令grant,revoke
having、where、groupby的执行顺序
select
from
where(先过滤单表/视图/结果集,再join)
group by
having (where过滤的是行,having过滤的是组,所以在group by 之后)
order by
什么是事务,事物有哪四个特性(详细解释,其中由隔离性触发的问题有哪些)
事务
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操纵;这些操作作为一个整体在一起向系统提交,要么都执行,要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)
事务具有4个属性,通常称为ACID特性:
- 原子性(Atomicity):操作这些指令时,要么全部执行,严么全部不执行。只要其中有一个指令执行失败,所有指令都执行失败,数据进行回滚,回到执行指令之前的数据状态。
- 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但对于整个数据的完整性保持稳定。
- 隔离性(Isolation):是当多个用户并发访问数据库时,比如操作同一张表,数据库为每一个用户开启的事务,不能被其他事务所干扰,多个并发事务之间要相互隔离
- 持久性(Durability)当事务正确完成后,它对于数据的改变是永久性的。
并发导致的事务问题
: - 脏读:是指在事务处理过程里读取了另一个未提交的事务的数据
- 幻读:一个事物执行两次查询,两次查询到的结果不一致。比如第一次共查到10条结果,第二次差到了11条结果。
- 不可重复读:一个事物两次读取同一行数据,得不到同样的结果。
事务的隔离级别
:
-读未提交:就是一个事物可以读取另一个事物未提交的数据 - 读已提交:一个事物要等另一个事物提交之后才能读取数据。
可避免脏读的发生
(Oracle默认事务隔离级别) - 可重复读:就是在开始读取数据时,不在允许修改操作。
可避免脏读、不可重复读的发生
。(MySQL默认事务隔离级别) - 可串行化:是最高的事务隔离级别,在该级别下,事务串行化,可避免脏读、幻读、不可重复读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不推荐。
Oracle和MySQL的区别(包括默认事务隔离级别)
- Oracle是大型数据库而MySQL是中小型数据库;MySQL是开源免费的,Oracle是收费的
- 对事务的提交:MySQL是默认自动提交,而Oracle默认不自动提交,需要用户手动提交。
- 分页查询:MySQL是直接在SQL语句中用limit就可以实现分页;而Oracle则是需要伪列ROWNUM和嵌套查询
- 事务的隔离级别:MySQL是可重复读,Oracle是可重复读
- 对事务的支持:MySQL对事务是默认不支持的,只是有些存储引擎如:innodb可支持事务;而Oracle对事务是完全支持的。
- 并发性:MySQL以表锁为主,对资源锁定的力度很大,如果一个session对一个表的加锁时间过长,会让其他session无法更新此表的数据。Oracle使用行级锁,对资源锁定的力度要小很多,知识锁定SQL需要的资源,并且加锁是在数据库中的数据行上,不依赖索引。所以Oracle对并发性的支持要好很多。
- 持久性:Oracle保证提交的事务均可以回复,因为Oracle把提交的SQL操作写入了在线联机日志中,保存到磁盘上,如果出现数据库或主机异常重启,重启Oracle可以靠联机在线日志恢复客户提交的数据。MySQL默认提交SQL语句,更新过程中如果出现主机重启问题,可能会丢失数据。
什么是视图,以及视图的优缺点
视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储
什么是索引,索引的分类,索引有哪些优缺点,建立索引有哪些原则
- 为什么要用索引:索引在数据库中的作用是快速找出某个列中一个特定值的行,不使用索引的话,MySQL必须从第一条记录遍历进行查询至相关行,表越大花费时间越多,但是有索引,就能够快速的到达某个位置去搜索数据,索引对优化数据库查询有着不可替代的作用。
- 索引的优点:
- 通过创建索引,可保证数据库中每一条数据的唯一性
- 可大大提高查询效率
- 可加速表与表之间的连接
- 可显著减少查询中分组和排序的时间
总结
:查询速度快
- 索引的缺点:
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 创建索引占用磁盘空间,如果有大量索引,可能比数据文件跟快达到最大文件尺寸
- 对表中的数据进行增加、修改、删除的时候,索引也是需要维护的,降低了维护速度。
总结
:并不是索引越多越好,够用就好
如何优化数据库
- 优化索引、SQL语句、分析慢查询
- 设计表的时候严格根据设计规范来设计数据库
- 使用缓存,把经常访问且不需要变化的数据放到缓存中
- 采用MySQL内存自带的表分区技术,把数据分层到不同的文件中
- 主从分离读写,采用主从复制把数据库的读操作和写操作分离开
详解优化数据库
描述JDBC连接数据库的步骤
什么是SQL注入,怎样防止
SQL注入:是一种注入攻击,可以执行恶意SQL语句,从而绕过网页或Web应用程序的身份验证或授权,并检索整个SQL数据库的内容,还可以使用SQL注入来添加,修改和删除数据库中的记录。
如何防止SQL注入?
- 采用PreparedStatement来代替Statement。因为PreparedStatement支持动态设置参数,Statement不支持;PreparedStatement支持预编译,可防止SQL注入,Statement不支持。
- 使用正则表达式过滤传入的参数
- 字符串过滤、敏感词过滤