一看就懂的MySQL教程

一、安装

直接网上下载,看着提示安装就行,要是看不懂英文,手机版的有道词典是个好东西,可以拍照翻译!!!

二、卸载

1、去mysql的安装目录找到my.ini文件
复制datadir = “路径名”

2、卸载mysql

3、删除C:/programdata目录下的MySQL文件夹(如果找不到就是被隐藏了,点击所在窗口左上方的查看—>选项—>查看—>找到隐藏文件和文件夹设置为显示隐藏文件

三、配置

1、MySQL服务启动

法一:手动
右键点击我的电脑—>管理—>服务和应用程序—>服务—>找到MySQL,右键点击启动。

法二:
打开cmd命令,输入services.msc打开服务的窗口

法三:使用管理员打开cmd

  • net start mysql :启动mysql的服务
  • net stop mysql :关闭mysql的服务

2、MySQL登录

法 1: mysql -u root -p 密码
法 2:mysql -hip -u root -p 连接目标的密码
法 3:mysql – host = ip – user = root – password = 连接目标的密码

3、MySQL 退出

法1:exit
法2:quit

四、SQL

1、什么是SQL

Structured Query Language :结构化查询语言
其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,称为“方言”。

在这里插入图片描述

2、SQL通用语法

1、SQL语句可以单行或多行书写,以分好结尾
2、可使用空格和缩进来增强语句的可读性
3、MySQL数据的SQL语句不区分大小写,关键字建议使用大写
4、3种注释
**** 单行注释: -- 注释内容 # 注释内容mysql特有
**** 多行注释/*注释 */

举例:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3、SQL分类

1)DDL

(Data Definition Language)数据定义语言

  • 用来定义数据库对象:数据库、表、列等。
  • 关键字:create, drop,alter 等

2)DML

(Data Manipulation Language) 数据库操作语言

  • 用来对数据库表的数据进行增、删、改
  • 关键字:insert 、 dalect 、 update等

3)DQL

(Data Query Language)数据查询语言

  • 用来查询数据库中表的记录(数据)。
  • 关键字:select 、where等。

4)DCL

(Data Control Language)数据控制语言

  • 用来定义数据库的访问权限和安全级别,及创建用户。
  • 关键字:Grant、 revoke等。

五、DDL:操作数据库、表

1、操作数据库:CRUD

  1. c(Create):创建
    创建数据库

    create databases 数据库名称;
    
    **创建数据库,判断不存在,再创建:**
    
    create database if not exists 数据库名称;
    
    **创建数据库,并指定字符集:**
    create database 数据库名称 character set 字符集名;
    ==eg==:***创建db4数据库,判断是否存在,并制定字符集为gbk***
    create database if not exists db1 character set gbk;
    
  2. R(Retrieve):查询
    查询所有数据库的名称:

     show databases;
    

    在这里插入图片描述

    查询某个数据库的字符集(查询某个数据库的创建语句):

    show create database 数据库名称;
    

    eg:在这里插入图片描述

  3. U(Update):修改
    修改数据库的字符集:

    alter database 数据库名称 character set 字符集名称;
    

    eg:在这里插入图片描述

  4. D(Delete):删除
    删除数据库:

    drop database 数据库名称;
    

    eg:
    在这里插入图片描述
    判断数据库存在,存在再删除(不会报错):

    drop database if exists 数据库;
    

    eg:
    在这里插入图片描述

  5. 使用数据库
    查询当前正在使用的数据库名称:

    select database();
    

    eg:
    使用数据库,如果没有正在使用的会如上显示
    使用数据库,如果没有正在使用的数据库正在使用的会如上显示
    在这里插入图片描述
    有正在使用的数据库,会如上显示

    使用数据库:

    use 数据库名称;
    

    在这里插入图片描述

2、操作表

表举例:
在这里插入图片描述

  1. C(Create):创建
    1、语法:

    create table 表名(
     		列名1  数据类型1,
     		列名2  数据类型2,
     		。。。。
     		列名n  数据类型n
     		);
    

    注意:最后一列,不需要加逗号(,)

    2、数据库类型(常用):
    1、int:整数类型
    age int
    2、double : 小数类型
    score double(5,2)[5是所有数字的总位数,2是小数的位数]
    3、date:日期,包含年月日,yyyy-MM-dd HH:mm:ss
    4、datetime:日期,包含年月日时分秒 yyyy- MM-dd HH:mm:ss
    5、timestamp:时间错类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
    如果将来不给这个字段赋值,或赋值null,则默认使用当前的系统时间,来自动赋值
    6、varchar:字符串

    name varchar(20): -- 姓名最大20个字符
    -- zhangsan 8个字符 	/张三  2个字符
    

    在这里插入图片描述

    创建表:

    create table student(
     	id int,
     	name varchar(32),
     	age int,
     	score double(4,1),
     	birthday date,
     	insert_time timestamp
     	);
    

    复制表:

    create table 表名 like 被复制的表名;
    

    eg:
    在这里插入图片描述

  2. R(Retrieve):查询
    查询某个数据库中所有表名称:

    alter tables

    查询表结构:

    desc 表名;
    

    eg:在这里插入图片描述

  3. U(Update):修改
    1、修改表名

    alter table 表名 rename to 新的表名;
    

    eg:在这里插入图片描述

    2、修改表的字符集:

    alter table 表名 character set 字符集名称;
    

    eg:在这里插入图片描述

    3、添加一列:

    alter table 表名 add 列名 数据类型;
    

    eg:
    在这里插入图片描述

    4、修改列表名称 、类型:

    alter table 表名 change 列名 新列名 新数据类型;
    alter table 表名 modify 列名 新数据类型;
    

    eg:
    在这里插入图片描述

    5、删除列:

    alter table 表名 drop 列表;
    

    eg:
    在这里插入图片描述

  4. D(Delete):删除

    1.drop table 表名;2.drop table if exists 表名;
    

    eg:
    在这里插入图片描述

六、DQL:增删改表中的数据

1、添加数据

  1. 语法

    insert into 表名(列名1,列名2...列名n) values(1,值2...值n);
    

    注意:

    1. 列名和值要一一对应。
    2. 如果表名后,不定义列名,则默认给所有列添值
      insert into 表名 values(1,值2,。。。值n);
      
    3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来
      eg:
      在这里插入图片描述

2、删除数据

语法:

delete from 表名[ where  条件]

注意:

  1. 如果不加条件,则删除表中所有记录。
  2. 如果要删除所有记录
	delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
	truncate table 表名;  -- 推荐使用,效率更高,先删除表,然后再创建一张一样的表。

eg:
在这里插入图片描述

3、修改数据

语法:

update  表名 set 列名1 =1, 列名2 =2... [where 条件];

eg:
在这里插入图片描述

注意:
如果不加任何条件,则会将表中所有记录全部修改。

eg:
在这里插入图片描述

七、DQL:查询语句

select * from 表名;

1、语法:

select 
		字段列表
	from
		表名列表
	where
		 条件列表
	group by
		分组字段
	having
		分组后的条件
	order by
		排序
	limit
		分页限定

2、基础查询

  1. 多个字段查询:

    select 字段1,字段2...from 表名;
    

    注意:
    如果查询所有字段,则可以使用*来代替字段列表。

  2. 去除重复:

    distinct
    
  3. 计算列:
    1)一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
    2)ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
    ***表达式1:哪个字段需要判断是否为null
    ***如果改字段为null后的替换值。

  4. 起别名:
    asas也可以省略

3、条件查询

  1. where字句后跟条件
  2. 运算符
    在这里插入图片描述
    • <、>、<= 、>=、=、<>;
      eg:
      在这里插入图片描述

    • between…and;

    • in(集合);

    • like:模糊查询

      占位符:
      _:单个任意字符
      %:多个任意字符

    • is null;

    • and 或 &&;

    • or 或 ||;

    • not 或 !
      举例:
      建表:

      create table student(
      		     id int, -- 编号
      		     name varchar(20), -- 姓名
      		     age int, -- 年龄
      		     sex varchar(5), -- 性别
      		     address varchar(100), -- 地址
      		    math int, -- 数学
      		     english int -- 英语
      		     );
      

      添加数据:

       insert into student(id,name,age,sex,address,math,english) values(
           1,"马云",55,"男","杭州",66,78),(2,"n马化腾",45,"男","深圳",98,87),
           (3,"马景涛",55,"男","香港",56,77),(4,"柳岩",20,"女","湖南",99,99),
           (5,"柳青",20,"男","湖南",86,null),(6,"刘德华",57,"男","香港",99,99),
           (7,"马德",22,"女","香港",99,99),(8,"德玛西亚",18,"男","广东",56,65);
      

      查询举例:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

4、排序查询

  • 语法: order by 子句

    order by 排序字段1   排序方式1,排序字段2  排序方式2......
    

    在这里插入图片描述

    - 排序方式:

     ASC:升序,默认的
    
     DESC:降序
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    注意:
    如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

    在这里插入图片描述

5、聚合函数

概念:将一列数据作为一个整体,进行纵向的计算。

  1. count:计算个数
    1、一般选择非空的列:主键
    2、count(*)

  2. max:计算最大值

  3. min:计算最小值

  4. sum:计算和

  5. avg:计算平均值

    eg:
    select max(math) from student;
    select min(math) from student;
    select sum(math) from student;
    

    在这里插入图片描述
    在这里插入图片描述

注意:
聚合函数的计算,排除null值。
解决方案:
1. 选择不包含非空的列进行计算
2. ifnull函数

6、分组查询

语法:

group by 分组字段;

在这里插入图片描述
可以取别名,方便一点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:

  1. 分组之后查询的字段:分组字段聚合函数
  2. wherehaving的区别?
    1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足限定, 则不会被查询出来
    2. where后不可以跟聚合函数,having可以进行聚合函数的判断。

7、分页查询

  • 语法:

    limit 开始的索引,每页查询的条数;
    

    在这里插入图片描述

  • 公式:
    开始的索引 = (当前页码 - 1)* 每页显示的条数
    eg:

    	---- 每页显示3条记录
    	select * from student limit 0,3;   -- 第一页
    	select * from student limit 3,3;   -- 第二页
    	select * from student limit 6,3;   -- 第三页
    	```
    
    
  • limit 是一个MySQL的"方言"

八、表的约束

1、概念

对表的数据进行限定,保证数据的正确性、有效性和完整性。

2、分类

1.主键约束:primary key

  1. 注意:

    • 含义:非空且唯一
    • 一张表只能有一个字段为主键
    • 主键就是表中记录的唯一标识
  2. 在创建表时,添加主键约束

    create table stu(
    	id int primary key, -- 给id添加主键约束
    	name varchar20);
    

    在这里插入图片描述

  3. 删除主键

    -- 错误 alter table stu modify id intl;
    	alter table stu drop primary key;
    
  4. 创建完表后,添加主键

    alter table stu modify id int primary key;
    
  5. 自动增长

    1. 概念:如果某一列是数值类型的,使用auto_increment 可以来完成值的自动增长

    2. 在创建表时,添加主键约束,并且完成自动增长

      eg:

      create table stu(
      		id int primary key auto_increment, -- 给id添加主键约束
      		name varchar(20)
      		);
      

      注意:
      自动增长,给选定值填入null是,会自动根据前一个数据加一

    3. 删除自动增长

      alter table stu modify id int;
      
    4. 添加自动增长

      alter table stu modify id int auto_increment;
      

2.非空约束:not null

  1. 创建表时添加约束

    create table stu(
    id int;
    name varchar20not null -- name为非空
    );
    

    在这里插入图片描述

  2. 创建完表后,添加非空约束

    alter table stu modify varchar(20) not null;
    
  3. 删除name的非空约束

    alter tble stu modify name varchar(20) ;
    

    在这里插入图片描述

3.唯一约束: unique,值不能重复

  1. 创建表时,添加唯一约束

    create table stu(
    		id int,
    		number varchar(20) unique --添加了唯一约束
    		);
    

    在这里插入图片描述

    注意:
    mysql中,唯一约束限定的列的值可以有多个null。

  2. 删除唯一约束

    alter table stu drop number;
    
  3. 在创建表后,添加唯一约束

    alter table stu modify number varchar20unique

4.外键约束:foreign key

功能:让表与表产生关系,从而保证数据的正确性。

  1. 在创建表时,可以添加外键
    语法:

    create table 表名(
    	...
    	外键列
    	constraint  外键名称 foreign key (外键列名称)references 主表名称(主表列名称)
    );
    
  2. 删除外键

    alter table 表名 drop foreign key 外键名称;
    
  3. 创建表之后,添加外键

    alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主列表名称);
    
  4. 级联操作

    1. 添加级联操作
      语法:

      alter table 表名 add constraint 外键名称 
      		foreign key (外键字段名称)references 主表名称(主列表名称)on update cascade / on delete cascade
    2. 分类:

      1. 级联更新:on update cascade
      2. 级联删除:on delete cascade

九、多表操作

1、分类

1.一对一(了解)

  • 如:人和身份证
  • 分析:一个人只有一个身份,一个身份证只能对应一个人
  • 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
    eg:
    在这里插入图片描述

2、一对多(多对一)

  • 如:部门和员工
  • 分析:一个部门有多个员工,一个员工只能对应一个部门
  • 实现方式:在多的一方建立外键,指向一的方向的主键。
    eg:
    在这里插入图片描述

3、多对多

  • 如:学生和课堂
  • 分析:一个学生可以选择很多课程,一个课程也可以被很多学生选择
  • 实现方式:多对多关系实现需要借助第三张中间表
    eg:
    在这里插入图片描述

案例:
在这里插入图片描述

具体操作:
1.

-- 创建旅游线路分类表tab_category
-- cid 旅游线路分类主键,自动增长
-- cname旅游线路分类名称非空,唯一,字符串100
create table tab_category(
	cid int primary key auto_increment,
	cname varchar(100) not null unique
	);
-- 创建旅游路线表tab_route
/*
rid旅游线路主键,自动增长
rename旅游线路名称非空,唯一,字符串100
price价格
radate 上架时间,日期类型
cid外键,所属分类
*/
create table tab_route(
	rid int primary key auto_increment,
	rname varchar(100) not null unique,
	price double,
	cid int,
	foreign key(cid) references tab_category(cid)
	);
-- 创建用户表tab_user
/*
uid用户主键,自增长
username用户名长度100,唯一,非空
password密码长度30,非空
name真实姓名长度100
birthday生日
sex性别,定长字符串1
telephone手机号,字符串11
email邮箱,字符串长度100
*/
create table tab_user(
	uid int primary key auto_increment,
	username varchar(100) unique not null,
	password varchar(30) not null,
	name varchar(100),
	birthday date,
	sex char(1) default"男",
	telephone varchar(11),
	email varchar(100)
	);
-- 创建收藏表tab_favorite
/*
rid旅游路线id,外键
date收藏时间
uid用户id,外键
rid和uid不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
*/
create table tab_favorite(
	rid int,
	date datetime,
	uid int,
	-- 创建复合主键
	primary key(rid,uid),
	forenign key (rid) references tab_route(rid),
	forenign key (uid) references tab_route(uid)
	);

各表创建完后拖到架构设计器中,可以看到对应关系:
在这里插入图片描述

十、三大范式

1、数据库设计的范式

概念

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

其实简单一点就是建立各种外键或者拆分表,让所有数据唯一

分类:

  1. 第一范式(1NF):每一列都是不可分割的原子数据项
    在这里插入图片描述

  2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
    几个概念:

    1. 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B的属性值,则称B依赖A
      例如:学号–>姓名(姓名依赖于学号)。 (学号,课程名称)–>分数
    2. 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖A属性中所有的属性值。
      例如:(学号,课程名称)–>分数
    3. 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中某一些值即可。
      例如:(学号,课程名称)–> 姓名
    4. 传递函数依赖:A–>B,B–>C. 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
      例如:学号–>系名,系名–>系主任
    5. :如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。
      例如:该表的码为:(学号,课程名称)
      1、主属性:码属性组中的所有属性
      2、非主属性:除过码属性组的属性
  3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

    第二范式能解决图中(即第一范式存在的)第一条问题
    第三范式能解决第二和第三条问题

十一、数据库的备份和还原

  • 命令行:
    语法:
    备份(在dos命令里输入):mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
    还原
    1. 登录数据库
    2. 创建数据库
    3. 使用数据库
    4. 执行文件:source 文件路径

十二、多表查询

1.查询语法

select 
	列名列表
from
	表名列表
where......

准备SQL:

在这里插入图片描述

2.笛卡尔积

  1. 有两个集合A、B,取这两个集合的所有组成情况。
  2. 要完成多表查询,需要消除无用的数据

3.多表查询的分类

  1. 内连接查询:
    1. 隐式内连接:使用where条件消除无用数据
    例子:

    -- 查询所有员工信息和对应的部门信息
    select * from emp,dept  where emp."dept_id" = dept."id";
    -- 查询员工表的名称,性别。部门表的名称
    select emp.name,emp.gender,dept.name from emp,dept where emp."dept_id"  = dept."id";
    
    select 
    t1.name,     -- 员工表的姓名
    t1.gender,  -- 员工表的性别
    t2.name  -- 部门表的名称
    from
    emp t1,
    dept t2
    where
    t1."dept_id" = t2."id";
    
    1. 显示内连接
      语法:

      select 字段列表 from 表名1  [inner] join 表名2 on 条件
      

      例如

      select * from emp inner join dept on emp."dept_id" = dept."id";
      select * from emp join dept on emp."dept_id" = dept."id";
      
    2. 内连接查询(注意事项
      1、 从那些表中查询数据
      2、条件是什么
      3、查询那些字段

4.外连接查询

  1. 左外连接:
    语法

    select 字段列表 from1 left  [outer] join2 on 条件;
    

    查询的是左表所有数据以及其交集部分
    例子:

    -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
    select  t1.*t2."name"  from emp t1 left  join dept t2 on t1."dept_id" = t2."id";
    
  2. 右外连接
    语法:

    select 字段列表 from1 right  [outer] join2 on 条件;
    

    查询的是右表所有数据以及其交集部分
    例子:

    select  t1.*t2."name"  from dept t1 right  join emp t1 on t1."dept_id" = t2."id";
    

十三、子查询

1.概念:

查询中嵌套查询,称嵌套查询为子查询。

```sql
-- 查询工资最高的员工信息
-- 1.查询最高的工资是多少 9000
select max(salary) from emp;
-- 2.查询员工信息,并且工资等于9000的;
select * from emp where emp."salary" = 9000;
-- 一条SQL就完成这个操作:子查询
select * from emp where emp."salary" = (select max(salary) from emp);
```

2. 子查询不同情况

  1. 子查询的结果是单行单列的
    子查询可以作为条件,使用运算符去判断。 运算符:> >= < <= =
    例子:

     ```sql
     -- 查询员工工资小于平均工资的人
     select * from emp where emp.salary < (select avg(salary) from emp);
     ```
    
  2. 子查询的结果是多行单列的
    子查询可以作为条件,使用运算符in去判断。

    	-- 查询“财务部”和“市场部”所有的员工信息
    	select  id from dept where  name = "财务部" or name = "市场部";
    	select * from emp where dept_id = 3 or dept_id = 2; 
    	```
    	用子查询:
    	
    	
    	```sql
    	select * from emp where dept_id in (select  id from dept where  name = "财务部" or name = "市场部");
    	```
    
  3. 子查询的结果是多行多列的
    子查询可以作为一张虚拟表参与查询

    -- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
    --子查询
    select * from dept t1,(select * from emp where emp."join_date" > "2011-11-11") t2 where t1.id = t2.dept_id;
    -- 普通内连接
    select * FROM emp t1,dept t2 where t1."dept_id" = t2."id" and t1."join_date" > 2011-11-11;
    

十四、事务

事务举例:
在这里插入图片描述
在这里插入图片描述

1.概念

如果一个包含步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

2.操作

  1. 开启事务:start transaction;
  2. 回滚:rollback;
  3. 提交:commit;

3.例子

在这里插入图片描述
添加数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.MySQl数据库中事务默认自动提交

  1. 事务提交的两种方式:
    1. 自动提交
      *mysql就是自动提交的
      *一条DML(增删改)语句会自动提交一次事务。
    2. 手动提交:
      *Oracle数据默认是手动提交事务
      *需要先开启事务,再提交
  2. 修改事务的默认提交方式:
    1. 查看事务的默认提交方式:

      select @@autocommit; -- 1 代表自动提交 0代表手动提交
      
    2. 修改默认提交方式:

      set @@autocommit = 0;
      

5.事务的四大特征

  1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
  2. 持久性:当事务提交或回滚后,数据库会持久化保存数据
  3. 隔离性:多个事务之间,相互独立
  4. 一致性:事务操作前后,数据总量不变

6.事务的隔离级别(了解)

  1. 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

  2. 存在问题
    1. 脏读:一个事务,读取到另一个事务中没有提交的数据
    2. 不可重复读(虚读):在同一个事务中,两次读取到的事务不一样
    3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。

  3. 隔离级别

    1. read uncommitted:读未提交
      产生问题:脏读、不可重复读、幻读
    2. read committed:读已提交(Oracle)
      产生问题:不可重复读、幻读
    3. repeatable read:可重复读(MySQL默认)
      产生问题:幻读
    4. serializable:串行化
      可以解决所有问题

    注意: 隔离级别从小到大安全级别越来越高,但是效率越来越低

    数据库查询隔离级别:

    select @@tx_isolation;
    

    数据库设置隔离级别:

    set globlal transaction isolation level 你别字符串;
    

    设置隔离级别eg:在这里插入图片描述
    查看隔离级别:
    在这里插入图片描述

隔离案例:

第一个窗口表示张三,执行转账操作后并没有提交事务
在这里插入图片描述
第二个窗口代表李四,在张三没有提交事务的情况下查询到已经转账,然后写了欠条,具备法律效应了
在这里插入图片描述

但是,张三一回滚
在这里插入图片描述
李四第二次查账的时候发现钱没过来
在这里插入图片描述

但是这时候李四已经写下了具有法律效应的欠条,所以在没收到张三钱的情况下反倒欠张三500块

这就是脏读
上面的是第一隔离级别

——————————————————————————————
我们重新设置第二个隔离级别
在这里插入图片描述
这回在张三没提交之前,李四查询不到钱到账
在这里插入图片描述
只有当张三提交之后,李四才查询到修改的数据
在这里插入图片描述

在这里插入图片描述
——————————————————————————————

设置为第三隔离级别,同时开启事务

李四查询不到转账记录
在这里插入图片描述
在这里插入图片描述
当张三提交事务后李四还是查询不到记录

在这里插入图片描述
在这里插入图片描述
只有当李四也提交之后才能查询到记录
在这里插入图片描述
这样就解决了不可重复读的问题

——————————————————————————————

设置为第四个隔离级别
在这里插入图片描述
在张三还没提交时,李四不可以查询记录,光标一直在闪
在这里插入图片描述
只要张三一提交,李四立马就会显示查询结果
在这里插入图片描述
在这里插入图片描述

十五、用户管理和权限管理

1.管理用户

  1. 添加用户
    语法:

    create user “用户名” @“主机名” identified by “密码”;
    
  2. 删除用户
    语法:

    drop user “用户名” @“主机名”;
    
  3. 修改用户密码

    update user password = password("新密码") where user = "用户名"update user password = password("abc") where user = "lisi"
    set password for  "用户名"@"主机名" = password("新密码");
    set password for  "root"@"localhost" = password("123");
    

    mysql中忘记了root密码怎么办?
    1. cmd --> net stop mysql 停止mysql服务
    需要管理员打开该cmd
    2. 使用无验证方式启动mysql服务:mysql – skip - grant - tables
    3. 打开新的·cmd窗口,直接输入mysql命令,敲回车。就可以登陆成功
    4. use mysql;
    5. update user set password = password(“你的新密码”) where user = “root”;
    6. 关闭两个窗口
    7. 打开任务管理器,手动结束mysql.exe的进程
    8. 启动mysql服务
    9. 使用新密码登录

  4. 查询用户

    -- 1. 切换到mysql数据库
    user mysql;
    -- 2.查询user表
    select * from user;	
    

    通配符:% 表示可以在任意主机使用用户登录数据库

2.权限管理

  1. 查询权限

    show grants for  "用户名"@"主机名";
    show grants for "lisi"@"%";
    
  2. 授予权限

    grant 权限列表 on 数据库名.表名 to "主机名";
    -- 给张三用户授予所有权限,在任意数据库任意表上
    grant all on *.* to "zhangsan"@"localhost";
    
  3. 撤销权限

    revoke 权限列表 on 数据库名.表名 from "用户名"@"主机名";
    	revoke update on db3."account" from "lisi"@"%"
    

关于mysql就分享到这里,请继续关注小编哦~~

原创文章 1 获赞 1 访问量 61

猜你喜欢

转载自blog.csdn.net/weixin_45641191/article/details/105771088