目录
- 数据库
- SQL
- SQL语言包括
- 数据定义
- 数据操纵
- 数据控制
- 完整性约束
- SQL约束
- 存储过程
- 索引
- 适合建索引
- 索引的定义
- MySQL的基本索引类型
- 索引的优缺点
- 事务
- drop、delete与truncate
- 超健、候选键、主键、外键
- 视图
- 范式
- 乐观锁和悲观锁
- 表的连接方式
- 优化数据库查询语句速度
数据库
数据库的定义
数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度的特点、是与应用程序彼此独立的数据集合。
SQL
SQL语言包括
数据定义、数据操纵、数据控制
数据定义
Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵
Select ,insert,update,delete
数据控制
grant,revoke
完整性约束
实体完整性、参照完整性、用户定义完整性
SQL约束
- NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
- UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
- PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
- CHECK: 用于控制字段的值范围。
存储过程
存储过程的定义
存储过程是一些预编译的SQL语句,封装了我们的代码
存储过程的优点
- 存储过程是一个预编译的代码块,执行效率比较高
- 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
- 可以一定程度上确保数据安全
存储过程的缺点
- 每个数据库的存储过程语法几乎都不一样,十分难以维护
- 业务逻辑放在数据库上,难以迭代
索引
适合建索引
唯一、不为空、经常被查询的字段
索引的定义
索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构
MySQL的基本索引类型
普通索引、唯一索引、主键索引、全文索引
索引的优缺点
- 索引加快数据库的检索速度
- 唯一索引可以确保每一行数据的唯一性
- 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
- 索引降低了插入、删除、修改等维护任务的速度
- 索引需要占物理和数据空间
事务
事务的定义
并发控制的基本单位。是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
事务的性质
原子性、一致性、隔离性、持久性
drop、delete与truncate
相同点
都表示删除
不同点
- delete和truncate只删除表的数据不删除表的结构
- 速度,一般来说: drop>truncate>delete
- delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效,如果有相应的trigger,执行的时候将被触发。truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
场景使用
- 不再需要一张表的时候,用drop
- 想删除部分数据行时候,用delete,并且带上where子句
- 保留表而删除所有数据的时候用truncate
超健、候选键、主键、外键
超健
在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
候选键
最小超键,即没有冗余元素的超键。
主键
数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
外键
在一个表中存在的另一个表的主键称此表的外键。
视图
视图的定义
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作。视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
视图的使用场景
- 只暴露部分字段给访问者,所以就建一个虚表,就是视图
- 查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异
优点
- 对数据库的访问,因为视图可以有选择性的选取数据库里的一部分
- 用户通过简单的查询可以从复杂查询中得到结果
- 维护数据的独立性,试图可从多个表检索数据
- 对于相同的数据可产生不同的视图
缺点
- 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据
范式
- 第一范式
数据库表中的字段都是单一属性的,不可再分。
- 第二范式
所有非关键字段都完全依赖于任意一组候选关键字。
- 第三范式
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
乐观锁和悲观锁
作用
确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,乐观锁和悲观锁是并发控制主要采用的技术手段
悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
在查询完数据的时候就把事务锁起来,直到提交事务
实现方式:使用数据库中的锁机制
乐观锁
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性
在修改数据的时候把事务锁起来,通过version的方式来进行锁定
实现方式:使用version版本或者时间戳
表的连接方式
类型
内连接
只有两个元素表相匹配的才能在结果集中显示
外连接
左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示
右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示
全外连接:连接的表中不匹配的数据全部会显示出来
交叉连接
笛卡尔效应,显示的结果是链接表数的乘积
优化数据库查询语句速度
- 建索引
- 减少表之间的关联
- 优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
- 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
- 尽量用PreparedStatement来查询,不要用Statement