MySQL
1.数据库介绍
数据库:数据仓库
DataBase:简称DB,用于长期存储有结构的,大量的,共享的数据
长期的:持久存储,永久存储
有结构:
有类型,有内部的数据类型
有关系,数据与数据之前是有关联的
大量的:
大多数据库都是以文件系统存在的,可以将数据存储在磁盘中
共享的:
多个应用之间可以共享一个或多个数据库资源
2.数据库的分类
关系型数据库
关系型数据库采用关系表的形式进行数据的存储
可以通过表与表之间的关系来维护数据的关系
例如:用户 --- 购买 --- 商品
用户信息 --- 用户类 --- 用户表
常用的库:MySQL,Oracle,SQLServer...
非关系型数据库
采用键值对的数据模型来存储数据的,只完成数据的记录,不会有任何的关联关系
NoSQL:Not Only SQL
常见的库:redis,MongoDB...
3.数据库中的常用术语
数据库(DataBase):存储数据的集合
数据(Data):被描述的事物符号记录
数据库管理系统(DBMS,DataBase Management System) 用于管理数据库软件系统
数据库管理员(DBA,DataBase Administrator) 负责创建数据库,使用以及维护数据库的专业人员
数据库系统(DBS,DataBase System) 数据库管理员,数据库管理系统以及数据库组成的整个单元结构
4.数据库安装和配置
MySQL环境准备
下载,安装,配置,卸载
版本:
企业中主流的版本5.x和8.x
本次使用mysql8
安装:
参考攻略
mysql服务的启动和停止:
此电脑--->右键--->管理--->服务和应用程序--->服务--->mysql相关
服务停止的原因:1.计算机改名 2.手动停止 3.外部的一些游戏加速器会停止该服务
软件卸载:
官方:关闭服务--->控制面板点击程序卸载--->自带的卸载程序--->删除目录:mysql安装目录--->删除注册表:win+r输入regedit
geek:直接卸载所有内容
管理工具:
可视化工具,数据库的一个图形管理工具
mysql自带clc(免费的)
Navicat for MySql(需要破解的) mysql8配合navicat12+ mysql5配合navicat11-
SQLyog(需要破解的)
DBeaver(免费的)
5.MySQL的逻辑结构
MySQL在数据库存储时是按照一定的结构进行存储的,MySQL的常见结构是表
MySQL本质是一个服务器(数据库服务器)
navicat是一个客户端(进行数据库的访问操作)
数据库软件都可以管理很多的数据库,每个库中可以管理若干张表,表中用于存储数据
记录/元组:表中的一条(行)数据就是记录/元组 在JDBC中一条数据库记录就是一个java对象
学号 |
姓名 |
性别 |
年龄 |
身高 |
体重 |
出生时日期 |
入学日期 |
毕业日期 |
休学日期 |
1 |
张三 |
男 |
19 |
190 |
200 |
20000101 |
20070901 |
20130601 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6.SQL语句
Structured Query Language
结构化查询语句,关系型数据库的主要使用语言,用于数据的增删改查,数据库管理对象等操作.
SQL作为关系型数据库的通用语言,对不同的数据库的支持是不一样的,有7成左右的相似度
例如:oracle中分页使用rownum,mysql中使用limit,SQLServer中使用top
SQL的扩展名为.sql
SQL语句的分类:
根据不同的功能,可以将SQL划分为多类
DML:数据操作语言,用于对数据的增删改查操作
DQL:数据查询语言,用于对数据的查询
DDL:数据定义语言,用于完成对数据库对象(表,视图,索引等)的操作(创建,删除,修改)
TCL:事务控制语言
DCL:数据控制语言,权限操作
7.DML
7.1DQL
数据查询语言
SQL可以在mysql中自带的工具中或者第三方工具(navicat)中使用
SQL语法:
不区分大小写
每天SQL以分号结尾,但不是强制的
SQL中关键字之间使用空格进行分割
SQL之间不限制换行,有空格的位置就可以使用换行
SQL的注释:
单行注释: --注释内容
单行注释: # 注释内容
多行注释: /*注释内容*/
7.1.1基本查询
语法
select 列名1,列名2,列名3... | *
from 表名;
* 表示的是所有字段,在测试环境使用,但数据库调优时会进行调整
*是不会写的,使用具体的字段名称
select empno,ename,job
from emp;
select *
from emp;
select *
from dept;
7.1.2过滤查询
语法
select 列名1,列名2,列名3... | *
from 表名
where 条件;
进行数据的筛选,等到我们需要的数据,过滤掉不符合的数据
select *
from emp
where sal > 5000;
select *
from emp
where sal <= 5000;
7.1.2.1条件运算符
= 等于
!=
<> 不等于
>
>=
<
<=
select *
from emp
where sal <> 5000;
select *
from emp
where sal != 5000;
select *
from emp
where ename = '九元';
7.1.2.2逻辑运算符
not and or
select *
from emp
where sal >= 5000
and ename = '九元';
select *
from emp
where sal >= 5000
or ename = '九元';
select *
from emp
where deptno is not null;
select *
from emp
where deptno is null;
7.1.2.3特殊的比较运算符
is null 判断数据是否为空;为空显示,不为空不显示
in(值的列表) 返回符合值列表中的数据
like 模糊查询*****
between ... and ... 在范围之内,包含范围的
上述的四个可以和not配合使用
select *
from emp
where deptno is null;
select *
from emp
where deptno is not null;
select *
from emp
where deptno in (10,20);
select *
from emp
where deptno = 10 or deptno = 20;
select *
from emp
where deptno not in (10,20);
select *
from emp
where deptno != 10 and deptno != 20;
select *
from emp
where ename like '%6%';
select *
from emp
where ename like '6%';
select *
from emp
where ename like '%6';
select *
from emp
where ename like '__6%';
select *
from emp
where ename like '%6__';
select *
from emp
where ename not like '%6%';
select *
from emp
where sal between 3000 and 5000;
select *
from emp
where sal >= 3000 and sal <= 5000;
select *
from emp
where 3000 <= sal and 5000 >= sal;
select *
from emp
where sal not between 3000 and 5000;
select *
from emp
where sal < 3000 or sal > 5000;
7.1.3计算列
可以对查询的记录进行一定的计算之后进行显示
可以使用 + - * / 四个运算符
select ename,sal + 500,comm - 100
from emp;
7.1.4列别名
使用 as 和 空格为某个列去添加别名
-- 列别名
select ename,sal + 500 as 工资,comm - 100 奖金
from emp;
7.1.5 distinct去除重复行
select distinct deptno
from emp;
7.1.6 order by排序
必须是查询的最后一个字句
asc表示升序,默认不写就是
desc表示降序
select *
from emp
order by sal;
select *
from emp
order by sal asc;
select *
from emp
order by sal desc;
select *
from emp
order by hiredate;
7.1.7组合函数
组函数,聚合函数
类似于java中的方法
select count(empno) from emp;
select count(1) from emp;
select count(*) from emp;
select min(sal) from emp;
select max(sal) from emp;
select sum(sal) from emp;
select avg(sal) from emp;
7.1.8日期函数
可以通过字符串进行赋值,格式为"yyyy-MM-dd hh:mm:ss"
表示当前的日期函数:now() sysdate()
select *
from emp
where hiredate < '2023-01-01';
select *
from emp
where hiredate < '2023-01-01 08:00:00';
select *
from emp
where hiredate between '2023-01-01' and now();
select *
from emp
where hiredate between '2023-01-01' and sysdate();
7.1.9字符函数
处理字符使用
select concat(ename,job)
from emp;
select concat(ename,'-',job)
from emp;
select upper(ename) from emp;
select lower(ename) from emp;
select ename,substring(ename,2,1) from emp;
7.1.10分组查询
group by
配合组函数进行使用,分组后的过滤使用having
语法:
select 字段
from 表名
where 条件
group by 分组字段
having 分组后的过滤
order by 排序
select deptno,count(*)
from emp
group by deptno;
select deptno,count(*)
from emp
group by deptno
having count(*) > 3;
7.1.11分页查询
一次性将所有数据都展示给用户,体验太差了,可以使用分页查询
limit关键字
limit param1,param2
parma1:从指定位置开始,不包含这个位置
param2:查几个
select *
from emp
limit 0,3;
select *
from emp
limit 3,3;
7.2连接查询
我们无法从一张表获取到所有的数据,需要将多张表关联在一起
n张表需要至少n-1个条件连接在一起
7.2.1笛卡尔积
笛卡尔积/集,叉积/集
多张表连接在一起,没有使用过滤条件,会将多张表的数据乘在一起
语法
select *
from a表,b表;
select *
from emp,dept;
select *
from emp,dept,users;
select *
from emp,dept
where emp.deptno = dept.deptno;
select *
from emp,dept
where emp.deptno = dept.deptno
and empno = 1;
7.2.2内连接
查询出只符合条件的数据
消除笛卡尔积就是内连接
select *
from emp,dept
where emp.deptno = dept.deptno
and empno = 1;
select *
from emp,dept
where emp.deptno = dept.deptno
and ename = '小白666';
7.2.3表别名
简化表名的操作
select *
from emp e,dept d
where e.deptno = d.deptno
and ename = '小白666';
select *
from emp as e,dept as d
where e.deptno = d.deptno
and ename = '小白666';
7.2.4SQL语法分类
92语法
上面写的内连接是92语法,在mysql中不支持其他的92语法
99语法
使用join将多张表连接在一起
7.2.4.1 99语法-内连接
select *
from emp e inner join dept d
on e.deptno = d.deptno;
select *
from emp e inner join dept d
on e.deptno = d.deptno
where empno = 1;
7.2.4.2 99语法-外连接
可以查询到不符合条件的数据
外连接分为左外连和右外连
outer left join ... on 条件
outer right join ... on 条件
inner/outer关键字可以省略
select *
from emp e left outer join dept d
on e.deptno = d.deptno;
select *
from dept d right outer join emp e
on e.deptno = d.deptno;
select *
from emp e right outer join dept d
on e.deptno = d.deptno;
select *
from emp e full outer join dept d
on e.deptno = d.deptno;
7.2.5子查询
又称查询嵌套,内部查询的数据可以被外部查询所使用
select sal from emp where ename = '九元';
select * from emp where sal > 50000;
select * from emp where sal > (select sal from emp where ename = '九元');
7.3DML
数据操作语言
主要用于数据的删除,修改,插入
7.3.1添加数据
语法
insert into 表名(列名1,列名2...)
values (值1,值2....)
列与值一一对应
insert into dept(deptno,dname,city)
values (50,'小卖部','昌图');
insert into dept
values (60,'外联部','庄河');
insert into dept(deptno,dname)
values (70,'技术部');
insert into dept(deptno,dname,city)
values (80,'小卖2部','昌图'),(90,'小卖3部','昌图'),(100,'小卖4部','昌图');
7.3.2删除数据
语法
delete from 表名 where 条件;
oracle中from可以省略,但是mysql中不行
where 条件可以省略,省略了就是删除全部数据,在oracle中可以回滚的,在mysql中默认不可以回滚
delete from users;
delete from dept where deptno = 80;
逻辑删除:
本质修改,改变某个字段
Goods(id,name,type,status[状态:0启动,1禁用])
物理删除:
本质删除,从磁盘下将数据删除了
7.3.3修改数据
语法
update 表名 set 列 = 值,列 = 值... where 条件;
where 可以省略,但是修改全部
update emp set ename = '张三';
update emp set ename = '李四',sal = 1000000 where empno = 11;
8.DDL(表操作)
数据库对象操作
8.1创建数据库
数据库的创建类似于java中二维数组,外部的一维表名,内部就是字段(字段名,类型,默认值,约束等)
create table student(
stu_no char(8),
stu_name varchar(20),
stu_gender char(2),
stu_age int,
stu_qq varchar(12)
)
insert into student
values (1,'王成輝','未知',22,'1233456678'),(2,'王成輝2号','未知',22,'1233456678');
8.2修改表
8.2.1添加列
alter table 表名 add 列名 类型;
alter table student add birthday date;
8.2.2修改列(列名和类型)
alter table 表名 change 旧列名 新列名 类型;
alter table student change stu_name name varchar(30);
8.2.3修改列(类型)
alter table 表名 modify 列名 类型;
alter table student modify stu_no char(30);
8.2.4删除列
alter table 表名 drop 列名;
alter table student drop stu_qq;
8.2.5表改名
alter table 表 rename to 新名;
alter table student rename to stu;
8.3删除表
drop table 表名;
若没有对应的表,则报错
drop table if exists 表名;
若没有对应的表,则报错,也不删除;存在则删除
drop table student;
drop table if exists student;
drop table if exists stu;
9.MySQL数据类型
存储数据时,支持的类型
9.1数值型
int/integer 整数 4byte
double 双精度浮点型 8byte
其他:
tinyint 特小的整数型 1byte
smallint 小整数型 2byte
bigint 大整数型 8byte
float 单精度浮点型 4byte
9.2字符型
char
定长字符串,长度0~255 若存储的长度不足时,使用'\u0000'进行补位
用于存储长度的固定的内容,例如:手机号,身份证号,性别...
varchar
变长字符串,长度0~65535
其他:
blob
存储二进制字符串
longblob
存储二进制字符串
longtext
存储文本内容的,例如:小说,博客,base64的图片
9.3日期型
date
日期型,存储的是年月日
datetime
日期型,存储的是年月日 时分秒
其他
time
时间,存储时分秒
year
年,年份
10.约束
创建表时,为指定的字段添加限定条件
来保证数据的准确,完整和正确
约束的分类:
非空约束 not null 被限定的字段不能为null
唯一约束 unique 被限定的字段不能重复
主键约束 primary key 非空且唯一,每张表中的唯一表示
外键约束 foreign key 必须依赖主键才能使用(先有主键才能有外键)
检查约束 check 对某个字段进行限制(mysql5中不支持 mysql8中支持)
10.1非空约束
create table goods (
goods_id char(4),
goods_name varchar(20) not null,
goods_pirce double default 0
)
insert into goods
values (1,'黑人牙膏',2);
insert into goods (goods_id) value (2);
insert into goods (goods_id,goods_name) value (2,"白人药膏");
10.2唯一约束
create table student (
stu_no char(4),
stu_name varchar(20) unique
);
insert into student (stu_no,stu_name) values (1,'张春啸');
insert into student (stu_no,stu_name) values (1,'张春啸');
10.3主键约束
10.3.1主键的基本使用
一张表的唯一表示,主键一张表中只能有一个
唯一且非空的
唯一和非空在一张表中可以有多个
主键一般是自增的数值,所有的表中都会有xxx_id、xxx_no的字段
create table teacher (
tea_id int primary key,
tea_name char(3)
);
insert into teacher values (1,'殷亮');
insert into teacher values (1,'殷亮');
insert into teacher values (null,'殷亮');
10.3.2主键自增长
主键希望有一个自动增长的字段为其服务
mysql中有自增长功能
oracle中需要是sequence对象进行服务
定义int类型的主键,设置自动增长,auto_increment
create table pet (
pet_id int primary key auto_increment,
pet_name varchar(20)
)
insert into pet (pet_name) values ('咪咪');
10.3.3联合主键
一张表中的多个字段共同承担主键的任务,是一个主键由多个值组成
定义联合主键比较少
create table kecheng (
stu_no int,
cls_no int,
score int,
primary key (stu_no,cls_no)
)
insert into kecheng values (1,1,80);
insert into kecheng values (1,1,80);
insert into kecheng values (1,null,80);
insert into kecheng values (null,1,80);
insert into kecheng values (null,null,80);
insert into kecheng values (1,2,80);
insert into kecheng values (2,1,80);
学生表
学号(主键) |
姓名 |
性别 |
年龄 |
1 |
张三 |
男 |
19 |
2 |
李四 |
男 |
20 |
课程表
课程编号(主键) |
课程名 |
学分 |
1 |
JavaSE |
4 |
2 |
MySQL |
3 |
3 |
WEB |
3 |
选课(关联表:可以使用联合主键,不用也不会影响,关联表往往都没有主键)
学号 |
课程号 |
成绩 |
补考成绩 |
1 |
1 |
88 |
90 |
1 |
2 |
77 |
|
2 |
3 |
66 |
|
10.4外键约束
10.4.1表之间的关系
四种:
一对一 人和身份证
一对多
多对一
班级和学生
多对多
讲师和学生
在sql中使用主外键的形式来体现这种关联关系
主键所在表,称之为主表
外键所在表,称之为从表
外键必须依赖主键,有主键了才能有外键
外键的值都是从主键中选的
外键可以重复,可以为空,必须依赖主键
10.4.2外键约束
语法
constraint 外键的名字 foreign key(当前表的外键字段) references 主表名(主表的主键字段)
名字:fk_主表名_从表名
create table classes (
c_id int primary key auto_increment,
c_name varchar(20) not null,
c_info varchar(200)
);
create table students (
s_id int primary key auto_increment,
s_name varchar(20) not null,
s_gender char(1) default '0',
s_age int not null,
c_id int,
constraint fk_stu_cls foreign key(c_id) references classes(c_id)
);
insert into students (s_name,s_age,c_id) values ('zs',19,null);
insert into students (s_name,s_age,c_id) values ('ls',19,null);
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');
insert into students (s_name,s_age,c_id) values ('ww',19,1);
10.4.3外键的级联操作
级联删除:主键数据删除,对应的外键数据一起删除
级联置空:主键数据删除,对应者外键字段赋值为null
级联修改:主键的id修改,外键对应的字段会同步修改
10.4.3.1级联删除
create table classes (
c_id int primary key auto_increment,
c_name varchar(20) not null,
c_info varchar(200)
);
create table students (
s_id int primary key auto_increment,
s_name varchar(20) not null,
s_gender char(1) default '0',
s_age int not null,
c_id int,
constraint fk_stu_cls foreign key(c_id) references classes(c_id) on delete cascade
);
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);
delete from classes where c_id = 1;
10.4.3.2级联置空
create table classes (
c_id int primary key auto_increment,
c_name varchar(20) not null,
c_info varchar(200)
);
create table students (
s_id int primary key auto_increment,
s_name varchar(20) not null,
s_gender char(1) default '0',
s_age int not null,
c_id int,
constraint fk_stu_cls foreign key(c_id) references classes(c_id) on delete set null
);
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);
delete from classes where c_id = 1;
10.4.3.3级联更新
create table classes (
c_id int primary key auto_increment,
c_name varchar(20) not null,
c_info varchar(200)
);
create table students (
s_id int primary key auto_increment,
s_name varchar(20) not null,
s_gender char(1) default '0',
s_age int not null,
c_id int,
constraint fk_stu_cls foreign key(c_id) references classes(c_id) on update cascade
);
insert into classes (c_name,c_info) values ('4教室','班级可以容纳47人');
insert into classes (c_name,c_info) values ('3教室','班级可以容纳44人');
insert into students (s_name,s_age,c_id) values ('zs',19,1);
insert into students (s_name,s_age,c_id) values ('ls',19,2);
update classes set c_id = 3 where c_name = '4教室';
10.5检查约束
mysql5.x没有该约束
mysql8.x中添加该约束
oracle中任何版本都可以使用
create table person (
p_id int primary key,
p_name varchar(20) check(length(p_name) >= 3)
);
insert into person values (1,'王成輝6');
insert into person values (2,'王成');
insert into person values (3,'ab');
11.DDL(库操作)
11.1 MySQL Command Line Cilent
mysql自带的管理工具,纯命令行的
打开:
开始菜单--->MySQL--->CLC工具
连接MySQL:
在CLC中输入密码即可,若闪退说明密码输出错误
关闭CLC:
输入exit指令即可
11.2DDL(库操作)
11.2.1查询库
show databases;查询本地所有数据库的列表
show create database mysql;显示指定名称的数据库的创建SQL指令
11.2.2创建库
create database 库名;创建指定数据库名字的库
create database if not exists 库名;若库名不存在时则创建
create database 库名 character set 字符集;创建库时采用何种编码集
11.2.3删除库
drop database 库名;
drop database if exists 库名;
11.2.4使用库
use 库名;
12.视图
命名化查询,由数据库中的一张或者多张表组成,构成的虚拟表
视图是基于表存在的,简化查询,安全性高,可以只公开表的部分数据
12.1视图的创建
语法
create view 视图名
as
子查询;
视图只能通过子查询创建
视图的分类:简单视图,复杂视图
12.1.1简单视图
由一张表组成
create view myemp
as
select empno,ename,sal from emp;
select * from myemp;
12.1.2简单视图和表中的数据关系
简单视图和表中的数据添加是会同步的
insert into emp values (23,'王成輝','总经理助理','2022-12-12',1200,500,40);
insert into myemp values (24,'李昊阳睡着了',1200);
简单视图和表中的数据删除是会同步的
delete from emp where empno = 24;
delete from myemp where empno = 23;
简单视图和表中的数据修改是会同步的
update emp set ename = '王成輝' where empno = 22;
update myemp set ename = '李昊阳' where empno = 21;
12.1.3复杂视图
create view mydept_emp
as
select empno,ename,d.deptno,dname
from emp e,dept d
where e.deptno = d.deptno;
12.1.4复杂视图和表中的数据关系
添加
向表中添加数据,可以同步到视图中
向视图中添加数据
只能向对应的某一张表的视图去添加数据
添加的数据不能是连接字段(外键)
可以添加到复杂视图中的数据是单表
insert into emp values (23,'王成輝','总经理助理','2022-12-12',1200,500,40);
insert into mydept_emp values (24,'毕明辉',40,'行政部');
insert into mydept_emp (empno,ename) values (24,'毕明辉');
insert into mydept_emp (dname) values ('毕明辉部');
删除
删除表中数据,复杂视图同步
无法删除复杂视图中的数据
delete from emp where empno = 23;
delete from mydept_emp where empno = 21;
delete from mydept_emp where ename = '李昊阳';
delete from mydept_emp where deptno = '101';
delete from mydept_emp where dname = '毕明辉部';
修改
修改表,视图中数据同步
修改视图,表中数据同步
update emp set ename = '王成輝' where empno = 18;
update mydept_emp set ename = '王成輝66' where empno = 18;
update mydept_emp set ename = '王成輝66' where dname = '总部';
update mydept_emp set dname = '王成輝66部' where empno = 18;
13.索引
提供查询效率,增强用户的体验
13.1索引的分类
主键索引:被primary key修饰,就自动的添加了主键索引,每张表中只有一个主键索引
唯一索引:添加唯一键时就添加唯一索引
主键索引和唯一索引都自动的添加的
13.2索引的优缺点
优点:
提高查询效率,减少磁盘IO的过程
缺点:
占用磁盘资源,做DML时慢
14.数据库事务
事务就同时完成一组DML操作,或者一个DDL操作
事务就是一个功能,也是业务中的某个功能,按照指定的步骤去完成DML操作
14.1事务的特性
ACID
原子性:一个事务中多个DML操作,要么同时执行成功,要么同时执行失败
一致性:事务执行前后,数据库中的数据要保持一致,完整的不能被破坏的
隔离性:多个事务之间执行操作是互不干扰的
持久性:事务完成之后,数据库中的数据是永久保存的
14.2MySQL中的事务管理
MySQL中的事务默认是自动提交的
只要执行了一个DML语句,那么自动的进行数据同步
事务管理
1.开启事务管理,关闭自动提交
2.在执行DML操作前,执行strat transcation(事务管理开启)
3.以此的执行DML操作
4.若执行成功,选择使用commit(提交)事务语句
5.若执行失败,选择使用rollback(回滚)事务语句
commit提交,将数据保存
rollback回滚,数据恢复原样
commit和rollback只能需要一个
start TRANSACTION;
update t_user set u_balance = u_balance - 200 where u_id = 1;
update t_user set u_balance = u_balance + 200 where u_id = 2;
commit;
rollback;
select * from t_user;
14.3事务的隔离级别
在数据库中是允许多个事务并行的操作,多个事务之间是互不干扰的,相互独立的;若多个事务之间没有隔离操作,可能会导致多个事务之间同时操作同一条数据,可能会破坏数据的一致性
读未提交:
read uncommitted,两个事务同时执行,T2可以读取到T1未提交的数据,可能造成脏读。脏读:一个事务读取到另一个事务未提交的数据。
读已提交:
read committed,T2只能读取到T1以提交的数据,避免了脏读,但可能出现虚读。虚读(重复读取数据):在一个事务中的两次查询结果不一致。
可重复读:(mysql中事务隔离级别的默认值)
repeatable read:T2执行查询时,无论T1进行了任何操作,都不会影响到T2,避免了虚读。可能会出现幻读:T1在做操作的同时T2也在做操作,T1和T2是互不干扰的,但是T1执行完成之后,T2也执行完成了,T1看到了T2数据。
串行化:
serializable,同时只能允许一个事务对一张表进行操作(单线程的),效率非常低的。可以避免脏读,幻读,虚读。
隔离级别 |
脏读 |
虚读 |
幻读 |
read uncommitted |
√ |
√ |
√ |
read committed |
× |
√ |
√ |
repeatable read |
× |
× |
√ |
serializable |
× |
× |
× |
14.4MySQL中设置事务的隔离级别
MySQL默认的隔离级别为可重复读
select @@transaction_isolation;
set session transaction isolation level serializable;
15.数据库设计
MySQL数据库作为数据存储的介质,需要为应用程序提供数据存储功能,那么就要设计出合理的数据和数据表
15.1数据库设计流程
1.根据应用系统的功能,分析数据实体(数据对象)
学生管理系统:学生,课程,成绩...
外卖管理系统:商家,客户,骑手...
2.提取实体的数据项(实体属性)
学生:学号,姓名,性别,爱好,生日...
3.根据数据库设计的三大范式进行数据表的设计
数据设计有自己的规则,遵循规则会使得我们的数据库更加的合理,使用起来更方便
若不满足三大范式,会导致数据冗余,维护困难
4.绘制ER图
展现出实体与实体之间的关联关系,直观的展现出每个实体之间的联系
5.进行数据库建模
三线图进行数据库设计
...
6.创建数据库
编写sql指令完成库和表的创建
7.CRUD的SQL功能测试
15.2数据库设计的三大范式
在数据设计时不止三大范式,但是三大范式是我们必须遵守的
第一范式:要求数据表中的字段不可分割的
下面的联系方式可以被分割
ID |
姓名 |
性别 |
联系方式(手机号,QQ,微信…) |
1 |
张三 |
男 |
|
联系方式字段可以被分割为若干字段,不合理,至少可以被分为3个字段
遵循第一范式进行设计,如下
ID |
姓名 |
性别 |
手机号 |
QQ |
微信 |
… |
1 |
zs |
男 |
134xxxxxxxxx |
12xxxxxxx |
xxxxxx |
|
第二范式:在满足第一范式的基础上,不存在非关键字段对关机字段段的部分依赖
下面例子中有部分的依赖
学号和课程号,是这张表的联合主键,我们就认定学号和课程号是关键字段,除了关键字段以外都是非关键字段
姓名和性别只依赖于学号,课程名只依赖于课程号,就存在非关键字段对关键字段的部分依赖
学号 |
课程号 |
姓名 |
性别 |
课程名称 |
成绩 |
1001 |
1 |
张三 |
男 |
java |
88 |
1002 |
1 |
李四 |
男 |
mysql |
76 |
遵循第二范式,设计上述表结构如下:
非关键字段只依赖于关键字段
成绩编号(可以没有的,只是关联表) |
学号 |
课程号 |
成绩 |
|
1 |
1 |
88 |
第三范式:在满足第二范式的基础上,不存在非关键字段之间的传递依赖
如下就不符合
姓名,性别,年龄,院系编号是依赖学号;但是存在院系名称和院系描述依赖于院系编号
学号 |
姓名 |
性别 |
年龄 |
院系编号 |
院系名称 |
院系描述 |
… |
|
|
|
|
|
|
|
|
遵循第三范式设计如下:
学号 |
姓名 |
性别 |
年龄 |
院系编号 |
1 |
zs |
男 |
19 |
1 |
2 |
ls |
男 |
20 |
1 |
|
|
|
|
|
院系编号 |
院系名称 |
院系描述 |
1 |
计算机科学与计算 |
挺好 |
15.3ER图
数据库建模
可以直观的体现出实体与实体之间的联系
图形:
矩形:实体
菱形:关系
直线:连接
椭圆:属性
15.4三线表
每个实体都会对应着一个三线表