4.2 事务的特性
- A :原子性
说明事务是最小的工作单元,不可以再分。 - C :一致性
所有的事务要求:在同一个事务当中,所有操作必须同时进行,或者同时失败,保证数据的一致性。 - I :隔离性
A事务和B事务之间具有一定的隔离。
A和B事务同时操作同一个表,结果会怎么样? - D:持久性
事务最终结束的一个屏障。事务提交,将没有保存到硬盘上的数据保存到硬盘上。
4.2.1 事务的隔离性
1 事务的隔离级别
- 读未提交:read uncommitted (最低的隔离级别) 《提交之前就可以读到》
- 事务A可以读取到事务B未提交的数据
- 脏读现象 (Dirty read)
- 理论情况下
- 读已提交:read committed 《提交之后才能读到》
- 事务A只能读取到事务B提交之后的数据
- 解决了脏读现象
- 不可重复读取数据
- 每一次读取到的数据是真实数据
- 可重复读:repeatable read 《提交之后也读不到 :读取到开启事务时的数据。事务不结束数据就不会改变》
- 事务A开启之后,每一次在事务A中读取到的数据都是一致的。即使事务B修改数据,事务A中读取到的数据依然没有改变。
- 解决了不可以重复读问题
- 出现幻影读:读取的数据都是幻想
- 序列化 / 串行化:serializable (最高的隔离级别)
- 效率最高,解决所有问题
- 事务要进行排队,不能并发!!
- 查看事务隔离级别:
select @@tx_isolation
- 设置全局隔离级别
set global transaction isolation level read uncommitted -- 读wei
5 索引
- 索引是在数据表字段上添加的,提高查询效率
- 一个字段可以添加一个索引,多个字段联合起来也可以添加索引
添加索引条件:
- 数据量庞大
- 以条件查询的形式存在
- 很少的DML(insert 、update、delete)操作
5.1创建索引
- 创建索引语法:
create index 索引名 on 表名(字段);
- 删除索引
drop index 索引名 on emp;
底层原理:二叉树(B-tree)
- 查看索引
explain select * from 表 where 条件
5.2索引失效
- 模糊查询尽量避免以“%” 开始,则会开始进行索引查询,否则不会进行索引查询。索引查询时必须知道第一个字母是什么
- 使用 or 的情况失效,or两边字段同时有索引才会走索引。
- 复合索引,没有使用左侧的列查找
- where当中索引列参加了运算
- 在where当中索引列使用了函数
5.3 索引的分类
- 单一索引 :单个字段添加索引
- 复合索引 :两个或多个字段添加索引
- 主键索引 :主键上添加索引
- 唯一性索引 :具有unique 约束的字段上添加索引 (唯一性较弱的字段上索引用处不大)
union 不会使用索引失效
6 视图
view
- 不同角度看同一份数据
6.1 创建视图
create view 视图名 as select * from 表名
- 室友DQL语句才能以view的形式创建
6.2 删除视图
drop view 视图名
6.3 视图的CRUD
- 视图的操作会影响到原表的操作。
- 视图是一张临时表
7 DBA命令
7.1 新建用户
CREATE USER username IDENTIFIED BY 'password';
- username:你将创建的用户名,
- password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.
7.2 授权
grant all privileges on dbname.tbname to 'username'@'login ip' identified by 'password' with grant option;
- dbname=*表示所有数据库
- tbname=*表示所有表
- login ip=%表示任何ip
- password为空,表示丌需要密码即可登录
- with grant option; 表示该用户还可以授权给其他用户
用户权限表
权限名 |
权限描述 |
alter |
修改数据库的表 |
create |
创建新的数据库戒表 |
delete |
删除表数据 |
drop |
删除数据库/表 |
index |
创建/删除索引 |
insert |
添加表数据 |
select |
查询表数据 |
update |
更新表数据 |
all |
允许任何操作 |
usage |
只允许登录 |
7.2.1 回收授权
revoke privileges on dbname[.tbname] from username; 刷新权限: flush privileges;
7.3 数据的导入导出
7.3.1数据的导出
- 在dos命令窗口进行
导出指定数据库
C:\Users\25849>mysqldump bookshop>D:\bookshop.sql -uroot -p123456
- 导出指定表
C:\Users\25849>mysqldump bookshop emp> D:\ bookshop_emp.sql -uroot -p123456
7.3.2数据的导入
C:\Users\25849>mysql -uroot -p123456 mysql>create database bookshop; mysql>use bookshop; mysql>source D:\bookshop.sql
8 数据库设计的三规范
数据表的设计依据,对数据库表的设计
- 第一范式(1NF):要求任何一张表必须要有主键,每一个字段为原子性,字段不可以再分。
- 第二范式(2NF):建立在第一范式基础上,要求所有非主键字段完全依赖于主键,不存在部份依赖
- 第三范式(3NF):建立在第二范式基础上,要求所有非主键字段直接依赖于主键,不存在传递依赖
- 减少数据表的冗余
9 SQL高级应用
8.1 T-SQL程序设计
8.1.1 变量
- 全局变量
@@ -- @@开头的变量
- 系统定于和维护,用户无法进行修改或管理
- 局部变量
declare @i int -- 使用关键declare 声明变量 i,数据类型为:int
- 局部变量赋值
-- 使用 set 或 select
set @i = 123
select @i = 1
8.1.2 流程控制语句
1 if 语句
# 类似 java 中的 if ··· else if ··· else if <条件表达式> <命令行或程序块> else <命令行或程序块>
2 begin ··· end语句
BEGIN <命令行或程序块> END
3 IF [NOT] EXISTS 语句
IF [NOT] EXISTS(select 子查询) <命令行或程序块> else <命令行或程序块>
4 CASE 语句
格式一: CASE <表达式> WHEN <表达式> THEN <表达式> ··· WHEN <表达式> THEN <表达式> [ELSE <表达式>] END 格式二: CASE <表达式> WHEN <表达式> THEN <表达式> ··· WHEN <表达式> THEN <表达式> [ELSE <表达式>] END SELECT SNo,CNo,Score = CASE WHEN Score is null THEN '未考' WHEN Score < 60 THEN '不及格' WHEN Score >= 60 AND Score <= 90 THEN '良好' WHEN Score >= 90 THEN '优秀' END FROM SC 5 WHILE 语句 WHILE (条件) <命令行或程序块>
8.2存储过程
8.2.1 存储过程 的有点
- 模块化的程序设计
- 高效率的执行
- 较少网络流量
- 可以作为安全机制使用
8.2.2 存储过程的分类
- 系统存储的过程
- 用户自定义存储过程
- 扩展存储过程
8.2.3 创建存储过程
DROP TABLE IF EXISTS t_student; CREATE TABLE t_student ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT(11) NOT NULL ); INSERT INTO t_student VALUES(NULL,'懿',22),(NULL,'小懿',18);
8.3触发器
8.3.1 分类
- DML 触发器
- DDL 触发器
8.3.2 创建DML触发器
格式:
CREATE TRIGGER 触发器名称 ON { table | view } { FOR | AFTER | INSTEAD OF } { [INSERT] | [UPDATE] | [DELETE] } AS SQL语句[,...n]
例子:修改student 表数据,修改之后查询修改后的数据。
--创建修改之后的触发器 CREATE TRIGGER trig_student_After ON student FOR UPDATE AS PRINT 'THE TRIGGER IS AFTER' SELECT * FROM student
- FOR 和AFTER 作用一样
8.3.3 创建DDL触发器
CREATE TRIGGER 触发器名称 ON { ALL SERVER | DATABASE } { FOR | AFTER } { 事件类型|事件组}[,...n] AS SQL语句[,...n] 例子:插入数据库后输入 ‘创建数据库’ CREATE TRIGGER trig_create ON ALL SERVER AFTER CREATE_DATABASE AS PRINT '创建数据库'