数据库概念
<1>数据库是一种数据的存储方式
<2>数据库存储的数据是有格式的
<3>数据库方便进行读取操作
<4>数据库的数据是一种长期的存储方式
数据库分类
一、关系型数据库
1、数据库的存储单位是表 2、表和表之间存在某种关系 3、方便进行关联查询 4、关系型数据库属于持久型数据库 5、MYSQL就是关系型数据库
二、非关系型数据库
1、没有表的概念 2、存储类似于Map key-value 3、非关系型属于顺时存储 4、Redis属于非关系型数据库
总结: 开发中两种数据库互补 关系型数据库的单位(E_R)
库: 最大的存储单位,存储表! 表:存储异类数据的单位,一个库中的表名唯一!对标java中的类概念 行:(元组)一行数据库,对标Java中的对象概念 类(域):最小的存储单位,对应一个属性,对标Java实例属性
数据库管理系统
1、概念: 管理数据库的系统和软件! DBMS(DataBase Management System)
MySQL版本: 1.8.xx 2020以后更新 有点新 2.5.7xx 2018时间刚好5.7.25 3.5.5xx 2011更新 有点老
MySQL
1. 卸载 2. 1. 停止服务 2. 1. 电脑 - 右键 - 管理 - 服务 - mysql服务停止 2. cmd (管理员身份运行) - net stop 服务名 、 net start 服务名 3. 卸载软件 4. 移除服务 5. 1. cmd - sc delete 服务名 6. 残留文件删除 7. 1. c:/program data / mysql 8. 删除注册表 9. 1. 建议使用电脑管家 3. 安装 4. 1. 直接安装软件 2. server only
- 卸载
-
- 停止服务
-
- 电脑 - 右键 - 管理 - 服务 - mysql服务停止
- cmd (管理员身份运行) - net stop 服务名 、 net start 服务名
- 卸载软件
- 移除服务
-
- cmd - sc delete 服务名
- 残留文件删除
-
- c:/program data / mysql
- 删除注册表
-
- 建议使用电脑管家
- 安装
-
- 直接安装软件
- server only
[mysql]
no-beep
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
- 修改配置文件
- 启动服务
- 测试连接数据库
mysql -u账号 -p密码 -P3307 -h127.0.0.1
- 环境变量
-
- mysql / bin - path
SQL语句概念
1、概念
SQL(Structure Query Language)结构化查询语言
用来操作关系型数据库的语法
SQL标准的语法,所有的关系型数据库都支持
注意:每种关系型数据哭都有自己的方言!其他的数据库不支持!例如mysql :limit
- 分类
DDL(DataBase Definition Language) | :数据库定义语言 创建和修改和删除容易 |
---|
DML(DataBase Manipulation Language) | :数据库操作语言 插入 删除和修改 | | | DQL(DataBase Query Language) | :数据库查询语言 | – | – | TPL(Transaction Process Language | :数据库实务操作语言 食物相关 | | | – | – | DCL(DataBase Control Language) | :用户控制语言 创建用户 权限赋予 和权限收回 |
3.标准 1. sql关键字不区分大小写 select == SELECT,但是值区分大小写! 2. 命名规范和Java相同 3. 不要使用关键字命名容器名 t_标识 4. 库名不能重复,表名同一个库内不能重复!
- 关系
- 基本语句
- 连接数据库管理系统
mysql -u用户 -p密码 -P端口号3306 -hip地址
注意:-p不输入 显示密文密码输入
DDL(Database Denifition Language):数据库定义语言
- DDL的作用和关键字
-
- DDL容器的创建、修改、删除
- create alter drop
- DDL库的操作
-
- 创建库
create database 库名;
create database 库名 character set 编码格式;
修改库: alter database 库名 character set 新编码格式
查看库:
-
查看所有库:show databases; -
查看当前库:select databa(); -
查看创建库语句:show create database 库名;
切换库:
- 注意:数据库数据操作必须限制名一个数据库!
- use 数据库名
- 删除库: drop databa 数据库名;
DDL表的操作:
-
创建表: create table 表名( 列名 数据类型 [约束], 列名 数据类型 [约束], )[charset=编码格式]; -
删除表: drop table 表名;
3.修改表 修改表名:alter table 原名 rename 新表名;
4.查看表信息: desc 表名; //查看表字段 show tables; #查看当前库的表
数据类型:
- 整数类型
-
- tinyint 1字节
- smallint 2字节
- mediumint 3字节
- int/integer 4字节
- bigint 8字节
- double(m,d) m数字总仓库 m最大16 double(5,1) 9999.9
- decimal(m,d) m数字的总长度 m最大65!
- 严谨超过范围,精准选择,节约空间!
- 字符串类型
-
- char 0-255 一旦定义长度,全部沾满! char(5) a --》 xxxxa
- varchar 0-65535 指定长度,可以伸缩占有!varchar(5) a-》 a
- text 0-65535 不支持索引查询!
- 时间类型
-
- date YYYY-MM-DD
- time HH:MM:ss
- year YYYY
- datetime YYYY-MM-DD HH:MM:ss 8字节 需要自己维护 1000-9999
- timestamp YYYY-MM-DD HH:MM:ss 4字节 自动维护【只维护一列】 1970-2038
- 案例:
-
- 学员信息表info
-
- 学号,要求非负数 并且零填充 id int unsigned zerofill
- 姓名,6个字符串 字符串 name varchar(6)
- 年龄,没有负数 age tinyint unsigned
- 性别, 固定2个字符串 sex char(2)
- 身高, 4位保留1个小数点 height double(4,1)
- 生日, 年月日 birthday date
- 修改时间, 记录添加和修改的数据列 updatetime timestamp
3.DDL列的操作
添加一列:
alter table 表名 add 列名 类型;
修改列名:
alter table 表名 change 原列名 新列名 类型;
修改类型:
alter table 表名 modify 列名 新类型;
删除一列:
alter table 表名 drop 列名;
DML(DataBase Manipulation Language)
1. 核心关键字
数据库数据数据修改语言: inset into/update/delete
插入: insert into 表名 value/vlues(值,值) #按照数据库的全部列和顺序插入数据! insert into 表名 (列,列,列) value/values(值,值,值) #指定列插入,值的顺序和列的顺序对应! 注意: values/value的区别: values支持插入多行,value只能插入一行! jdbc种有批量插入的api,value不支持!
1. 注意
修改:
update 表名 set 列名=值,列=运算、列 where 条件;
删除数据和表结构:
truncate table 表名;#删除数据和表结构 一般套娃项目
DQL(DataBase Query Language)
1. 介绍和关键字
数据库查询语句!也是数据库中最难的语句!
select
语法
select 列名,列名 from 表名 where 条件1[列名 运算符号 值/列名] 条件2 条件3... #指定列名查询
select * from 表名 where 条件 ;# 查询全部列
select 表名.列名 、 表名.* from 表名 条件; #多表查询,可以使用获取表的列名
基本查询:
where 列名(比较符号:> < >= <= != = <> / like / regexp / in () not in ()
between xx and 值 , is null is not null]
and or xor not
列名 [比较符号:> < >= <= != = <> / like / regexp / in () not in ()
between xx and 值 , is null is not null] )
模糊查询:
like就是非准确值查询,也就是模糊查询!
语法:
列名 like "[值,%,_]"
%:任意个字符
_:任意一个字符
%开头会破坏索引
分支查询:
位置:
查询列上,用于分级查询!
语法:
case
when 对比条件 then "值"
when 对比条件 then "值"
else "值"
end as "虚拟列名"
时间查询:
时间对比:
时间类型可以使用> < = !=对比
例如:hibedate > < ’2020-10-01‘
时间函数:
1.获取当前时间:
now();sysdate();
2.提取时间
year(时间)
month(时间);
day()
week(时间)
3.时间+-运算
datediff(时间,时间):两个时间节点的天数
adddate(时间,intererval +- 数量 单位):时间运算
聚合函数:
mysql的中,包含三种元素: 关键字,函数(),容器自定义命名!函数分类: 单行函数: 处理每一行的数据,最终查询结果可以是多行!
多行函数: 整体的数据统计,最终查询结果是一行!
注意: 多行函数时整体统计,在查询结果上就不应该统计单行的特性,例如:查询最大工资和员工姓名!员工姓名出现就不合理!
聚合语法:
sum() 统计总数量,如果为null,会计算成0!在运算!
avg() 统计平均值,如果为null,会计算成0!在运算!
max() 最大值
min() 最小值
count() 统计总数量! 如果count(列名) 列为null不计数! count(*) 代表匹配每一行的所有列! 效率低!
推荐count(1) 根据主键列统计,效率高!
字段控制:
字段控制!
使用字段控制,可以控制字段重复和null的默认值,或者字段起别名!
##查询有哪些工种:
SELECT DISTINCT job FROM emp;
##ifnull(字段,值)
查询员工的姓名和工资 和奖金和工资和
#数值+null =null
SELECT enamel,萨拉,community,sal+IFNULL(comm,0) AS cts FROM emp;
##字段起别名
SELECT enamel,sal,comm AS ergouzi,sal+IFNULL(comm,0) AS cts FROM emp;
SELECT ename,sal,comm ergouzi,sal+IFNULL(comm,0) AS cts FROM emp;
排序查询:
介绍:
排序不会筛选结果!指挥控制结果的显示顺序!
语法
order by 列名 asc/desc,列名 asc,desc。。。。。
注意:
1.注意多个列排序不是并列关系!有先后关系!前面相同参会比后面!
2.注意 asc属于默认值,可以省略!
3.order by 不依赖where,如果有条件,order by 一定会出现where的后面!【右边】
分组查询:
分组介绍
将尸体按照某一个或者多个类别进行分组,分组以后进行组的数据统计!
分组以后不再有单个实体的属性,分组一般都是统计的聚合函数或者分组字段!
分组语法
group by 字段,字段,字段
注意事项:
1.分组一般配合聚合函数
2.分组查询查询聚合函数和分组字段!
selec [列【分组字段】,【聚合函数】]from 表名 where group by 分组
having和where
where分组前的过滤条件,还没生成结果表!并且不能使用
列表的计算结果都不呢个使用!
having和group by 分组后的过滤条件,可以用列的计算结果!
绝大部分情况下having后面跟的都是聚合函数!
切割查询(分页查询)
介绍
进行结果切割显示!
语法
limit offset ,number;
limit number = limit 0,number;
注意:如果剩余数量少于number,指挥拆线呢剩余数据!
分页查询公式
limit的作用,可以用于分页查询!
分页查询必备的条件:page(当前页),pageSize(也容量)
limit (page-1)*pageSize,pageSize;
查询总结(顺序): select from 表 where group by order bylimt
数据库约束
约束概念和理解:
- 约束是创建表语句的一部分,列名 类型[约束],约束可省略!
- 约束的目的,约束和显示列的数据,保证数据的正确性!
- 如果违反了约束的内容,mysql会用sqlexception反馈,数据无法修改插入
- 约束不是必须的,但是是很有必要的
- 约束会降低数据库的查询效率(弊端)
约束分类
-
行约束[实体约束] 约束两行数据不重复 判断重复:行内所有列都一样 -
域[列]约束 显示一列数据的正确性 例如:不能为null,必要有默认值,check约束【男、女】,类型 <1>主键约束 为了却把一行数据不重复的列,这一类就叫主键 主键不能重复,并且不能为null 主键都叫xx_id 主键的分类:
自定义主键:人为添加的一列,就是保证不重复的主键!职责单一!
自然主键:自带的属性,当前是唯一,可以作为属性,也可以作为主键!
主键约束:
限制和保护住建列不重复和不为null,违反了抛异常!
#单一主键
create table表名(
主键列名 int primary key
)
#联合主键 联合两个逐渐的结果进行判断值!
create table 表名(
主键1 类型,
主键2 类型,
primary key (主键1,主键2)
)
-
唯一约束 语法:unique可以为Null,有值不能重复! -
自增长约束:(配合整数类型主键)auto_increment -
域约束[列约束] -
非空 1.默认情况下,所有的列可以为null 2.not null 3.primary key !=not null+unique -
默认值 :default 值 -
check约束 mysql不支持! check(男,女) enum(‘男’,‘女’)
create table student(
sid int primary key auot_increment "学生主键列",
sname varchar(20) not null comment"学生姓名",
phone varchar(13) unique comment"学生分数",
score int default 0 comment"学生分数",
sex enum('男','女')comment "学生性别"
)
后期修改表添加主外键约束:
alter table score addconstriaint s_ss_fk foreign key (student_id)
references student(sid)
数据库关系【表中的数据关系】
-
表关系理解: <1>两个表的数据的关系,并非容器的关系! <2>表关系值得是行和行的关系! <3>表关系值得的实体和实体的关系! <4>表关系值得是对象和对象的关系! <5>一对一,一对多、多对一,多对多 <6>表关系分析一定要从双向考虑! -
表关系分析 -
<1>子表创建外键 <2>子表添加主外键约束 <3>外键可以设置逐渐 <4>外键设置成unique+not null -
一对多 -
<1>子表创建外键 <2>子表添加主外键约束 <3>外键添加not null -
多对多 -
1、创建一个中间表 2、中间表包含连个外键 3、中间表的外键添加主外键约束+not null -
表关系总结 -
1、表关系出来多对多都是值两个表的关系! 2、多对多的两个表是平等的,谁先创建都可以!但是一对一和一对多 必须先创建主表!
CREATE TABLE qq_main(
qq VARCHAR(20) PRIMARY KEY COMMENT "qq号",
qname VARCHAR(20) NOT NULL COMMENT "qq名",
qianming VARCHAR(200) COMMENT "qq签名"
)
CREATE TABLE qq_detail(
did INT PRIMARY KEY AUTO_INCREMENT COMMENT "详情主键",
address VARCHAR(200) COMMENT "地址",
email VARCHAR(40) COMMENT "邮箱",
qq VARCHAR(20) NOT NULL UNIQUE ,
CONSTRAINT qq_detail FOREIGN KEY(qq) REFERENCES qq_main(qq)
)
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL
)
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(20) NOT NULL
)
CREATE TABLE student_teacher(
stid INT PRIMARY KEY AUTO_INCREMENT,
sid INT NOT NULL,
tid INT NOT NULL,
CONSTRAINT s_t_student FOREIGN KEY (sid) REFERENCES student(sid),
CONSTRAINT s_t_teacher FOREIGN KEY (tid) REFERENCES teacher(tid)
)
CREATE TABLE score(
cid INT PRIMARY KEY AUTO_INCREMENT,
number DOUBLE(4,1),
sid INT NOT NULL ,
CONSTRAINT s_score FOREIGN KEY(sid) REFERENCES student(sid)
)
数据库多表查询
- 多表查询理解
-
- 多表查询将多个表的数据合并到一个表中返回!
- 多表查询数据合并方式就有两种 水平合并 垂直合并
- 水平合并【连接查询、自然连接、子查询、自连接】 要求表必须有关系【主外键】,最终的结果合并到一个实体上!
- 垂直合并 将多个表的数据一股脑的放入一个表!垂直拼接,行和行之间没有关系!但是有一些限制!【列的类型一致】
- 为什么要有多表查询呢?【为什么拆表!】
-
- 拆表防止数据冗余!
- 拆表以后单个表的数据不能满足显示需求!需要关联其他表进行结果查询,才可以满足!
- 就有多表查询!
- 合并结果集
-
- 作用
将多个结果集两两垂直拼接到一起!最后形成一个结果表!
通常为了防止返回多个结果!
语法:
union:去掉重复数据
union all;直接合并,不去重复
select
union/union all
select
union/union all
select
练习:
CREATE TABLE a(
aid INT,
aname VARCHAR(10)
);
CREATE TABLE b(
bid INT,
bname VARCHAR(10)
);
INSERT INTO a VALUES(1,'aaaa'),(2,'bbbb'),(3,'cccc');
INSERT INTO b VALUES(4,'aaaa'),(2,'bbbb'),(3,'cccc');
SELECT * FROM a
UNION ALL
SELECT * FROM b;
连接查询:
-
- 作用
水平方向将多个表的数据两两拼接到一起!
注意水平查询结果是拼接到一行,一个实体一个对象,要求两个表的数据必须有关系【主外键】
- 语法
-
- 99查询大法【方言】
select * from 表1,表2,表3,表4
CREATE TABLE a(
aid INT,
aname VARCHAR(10)
);
CREATE TABLE b(
bid INT,
bname VARCHAR(10)
);
INSERT INTO a VALUES(1,'aaaa'),(2,'bbbb'),(3,'cccc');
INSERT INTO b VALUES(4,'aaaa'),(2,'bbbb'),(3,'cccc');
SELECT * FROM a
UNION ALL
SELECT * FROM b;
CREATE TABLE student(
stuid VARCHAR(10)PRIMARY KEY,
stuname VARCHAR(50)
)
DROP TABLE score;
CREATE TABLE score(
stuid VARCHAR(10),
score INT,
courseid INT,
CONSTRAINT fk_stu_sco FOREIGN KEY(stuid) REFERENCES student(stuid)
)
DROP TABLE student;
SELECT * FROM student;
INSERT INTO student VALUES('1001','张三峰');
INSERT INTO student VALUES('1002','张无忌');
INSERT INTO student VALUES('1003','王尼玛');
INSERT INTO student VALUES('1004','王老五');
SELECT * FROM score;
INSERT INTO score VALUES('1001',98,1);
INSERT INTO score VALUES('1002',95,1);
INSERT INTO score VALUES('1002',67,2);
INSERT INTO score VALUES('1003',83,2);
INSERT INTO score VALUES('1003',57,3);
CREATE TABLE course(
courseid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20) NOT NULL
)
CREATE TABLE course_teacher(
ctid INT PRIMARY KEY AUTO_INCREMENT,
tid INT NOT NULL,
courseid INT NOT NULL
)
INSERT INTO course VALUES(1,"java");
INSERT INTO course VALUES(2,"h5");
INSERT INTO course VALUES(3,"php");
INSERT INTO course VALUES(4,"python");
SELECT stuname FROM student;
SELECT student.stuid,student.stuname, score.stuid,score.score
FROM student,score WHERE student.stuid = score.stuid
SELECT s.stuid,s.stuname,c.score,u.cname
FROM student s,score c,course u
WHERE s.stuid = c.stuid
AND
c.courseid = u.courseid
AND
c.score > 60;
SELECT s.stuid,s.stuname,c.score,u.cname,t.tname FROM student s,score c ,course u ,
course_teacher ut , teacher t
WHERE s.stuid = c.stuid AND
c.courseid = u.courseid AND
u.courseid = ut.courseid AND
ut.tid = t.tid;
where 主外键 + 条件
内连接:
-
介绍: 标准化多表查询语法! 作用和99查询大法一样 只不过将主外键放在了一个固定的位置 select * from 表1 [inner] join 表2 on 主=外
[inner] join 表3 on 主=外
where order by
练习:
SELECT s.stuid ,s.stuname,c.score FROM student s INNER JOIN score c
ON s.stuid = c.stuid ;
SELECT s.*,c.score,u.cname FROM student s JOIN score c ON s.stuid = c.stuid
INNER JOIN course u ON c.courseid = u.courseid
SELECT s.*,c.score,u.cname,t.tname FROM student s JOIN score c ON s.stuid = c.stuid
INNER JOIN course u ON c.courseid = u.courseid
JOIN course_teacher ct ON u.courseid = ct.courseid
JOIN teacher t ON ct.tid = t.tid;
右外连接:
select * from 表1 right【outer】 join 表2 on 主=外;
1. 问题
当开发中,表的数据并不是平等!
开发中百分之95以上都是用外连接!
外连接的作用指定一个方向为逻辑主表!就算他的数据在其他表没有被引用结果也会查询出来!
一旦使用外连接,后续的全部查询都是外连接,并且方向一致!
1. 总结 2. 1. 多表查询有技巧的! 2. 确定内连接还是外连接 3. 一旦确定了外连接方向一致,都是外连接! 4. 两两拼接,两两连接! 5. 开发中绝大部分情况都是用外连接!
3. 自然连接
SELECT * FROM emp NATURAL JOIN dept ; 自然内连接
SELECT * FROM emp NATURAL LEFT JOIN dept; 自然左外连接
SELECT * FROM emp NATURAL RIGHT JOIN dept; 自然右外连接
注意根据列名判定主外键相等! 不稳妥!
子查询【重点】
介绍 查询里面嵌套查询! 语法
select * from 表 where 列 =(select xx)
select * from (select)as 别名 where 列 =(select xx)
出现位置
- 在from后面充当查询结果临时表、from表的时候需要取别名
- where后面充当查询条件
- 特殊记忆
子查询的结果集
- 单行单列 where直接俄使用对比符号 ><=等
- 单行多列 where in(列1,列2)in(子查询)in唱的那歌多列等和and关系!
- 多行单列 where any /all这两种方式可以转化为max、min
- 多行多列 from充当虚拟表,注意,虚拟表必须起别名
SELECT sal FROM emp WHERE ename = "JONES"
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = "JONES")
SELECT deptno FROM emp WHERE ename = "SCOTT"
SELECT * FROM emp WHERE ename != 'SCOTT' AND
deptno = (SELECT deptno FROM emp WHERE ename = "SCOTT")
SELECT sal FROM emp WHERE deptno = 30;
SELECT MAX(sal) FROM emp WHERE deptno = 30;
ALL / ANY
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30)
SELECT * FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30)
查询工作和工资与MARTIN完全相同的员工信息
SELECT job FROM emp WHERE ename = 'MARTIN'
SELECT sal FROM emp WHERE ename = 'MARTIN'
SELECT * FROM emp WHERE job = (SELECT job FROM emp WHERE ename = 'MARTIN') AND sal = (SELECT sal FROM emp WHERE ename = 'MARTIN')
SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename = 'MARTIN')
有2个以上下属的员工信息
SELECT mgr,COUNT(1) ct FROM emp GROUP BY mgr HAVING ct > 2;
SELECT * FROM emp e JOIN (SELECT mgr,COUNT(1) ct FROM emp GROUP BY mgr HAVING ct > 2) e2
ON e.empno = e2.mgr;
自连接 1.不是一种查询语法 2.同一个表多次服用查询 3.查询的结果无法在同一行数据获取到!然后这个数据还在自己表的另一行! 使用:
select * from emp e1 left join emp e2
on e1.mgr=e2.empno
left join emp e3 on e2.mgr=e3.empno
where e1.empno ="7369";
事务控制TPL
事务介绍
1.数据库事务集是sql语句的缓存机制、
2.当所有语句处理完毕,统一确定生效还是回滚
3.事务可以在错误的场景下,我们还有回滚的及hi!
4.事物的动作存在高度的一致性,成功,都成功,失败都失败
事务类型:
开启事务
insert into datas (id,name)value (“呵呵”,"拉拉")
提交事务【成功】
事务回滚【失败】
mysql自动提交事务
如何把多个动作的放在一个事务中,并且控制十五的提交或者回滚
- 自动提交事务
-
- 默认每条语句都在一个事务中!
- 执行语句之前开启事务
- 执行语句之后根据语句是否报错自动选择提交和回滚
SHOW VARIABLES LIKE '%auto%'
1. 手动提交事务 2. 1. 手动开启
start transaction; #开启事务
sql
sql
sql
手动提交
commit
手动回滚
rollback
1. 转账案例事务操作 2. 1. 事务操作 2. 1. 关闭自动提交事务 手动提交 【Java jdbc使用】
set autocommit = off;
sql
sql
commit; /rollback;
注意: off状态只保持本次窗口、当前连接!
主动开启一个事务,手动提交或者回滚
start transaction;
sql
sql
commit; / rollback;/
事务使用场景
- 一个业务涉及多条sql语句操作**
- 一个业务 - mvc - service - 方法
- **service方法中涉及多条DML语
事务特性总结:
- Atomicity【原子性】:一个事务中的动作是不可切割执行的
- Consistency【一致性】:
1.内部的动作一致成功都成功!失败都失败!(微观角度) 2.双方数据总额事务前后一致!(宏观角度) - Isolation【隔离性】:并发事务之间的影响程度可以控制!相当于多线程的锁!
- Durability【持久性】:一旦十五提交或者回滚,数据就会在数据库中持久化的改变
事物的隔离性理解:
- 指的是并发事务之间的排次情况
- 隔离性有不同的级别!从低到高有四个级别!
- 越高的隔离级别,并发事务互相排次越严重
隔离级别:
操作语法 查询隔离级别
select @@tx_isolation;
. 设置隔离级别
set transaction isolation level 隔离级别
1. 低隔离错误
- 脏读: 一个事务读取另一个事务未提交的数据! READ UNCOMMITTED
- 不可重读的:一个事务读取另一个事务提交的修改数据!READ UNCOMMITTED READ COMMITTED
- 虚读、幻读:一个事务读取了另一个事务提交的插入数据! READ UNCOMMITTED READ COMMITTED RPEATABLE READ【小概率】
- 隔离总结
-
- 隔离级别越高数据越安全
- 隔离级别越高性能越低
- 推荐使用第二个隔离级别!
账号控制DCL
创建账号
#创建一个 zhangsan 用户
CREATE USER `zhangsan` IDENTIFIED BY '123';
权限赋予
#将 companyDB下的所有表的权限都赋给 zhangsan
GRANT ALL全部权限 create,update,delete ON companyDB.* TO `zhangsan`;
. 权限收回
#将 zhangsan 的 companyDB 的权限撤销
REVOKE ALL ON companyDB.* FROM `zhangsan`;
账号删除
drop user 账号
数据备份
. 数据备份
mysqldump -u账号 -p密码 数据库>d:\文件位置.sql
数据恢复
mysql -uroot -proot 数据库<d:\文件.sql
|