• MySql入门教程


    MySql

    学习来源黑马视频教程

    1.数据库的基本概念

    什么是数据库(DataBase)?

    ​ 用于存储和管理数据的仓库

    数据库的特点

    • 持久化存储数据的。其实数据库就是一个文件系统
    • 方便存储和管理数据
    • 使用了统一的方式操作数据库

    2.SQL

    什么是SQL?

    ​ Structured Query Language:结构化查询语言

    ​ 其实就是定义了操作所有关系型数据库的规则。

    SQL的分类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffSVnze7-1659168214131)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220728173538949.png)]

    3.DDL

    DESC people; -- 查询表结构
    
    create table student(
    	id INT(11),
    	`name` VARCHAR(20),
    	age int(3),
    	score DOUBLE(4,1),
    	birthday date,
    	createTime TIMESTAMP
    );
    
    DESC student; -- 查询表结构
    
    -- 删除表 drop table if exists 表的名称
    
    
    -- 复制表  create table 表名 like 被复制的表名
    
    -- 修改表名 alter table 表名 rename to 新的表名
    alter table student rename to stu;
    
    
    -- 查看表的字符集
    show create table stu;  
    /* CREATE TABLE `stu` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `age` int DEFAULT NULL,
      `score` double(4,1) DEFAULT NULL,
      `birthday` date DEFAULT NULL,
      `createTime` timestamp NULL DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
    */
    
    -- 修改表的字符集 alter table 表名 character set utf8;
    
    -- 添加一列 alter table 表名 add 列名 数据类型;
    -- 修改列名 类型 
    -- 1.修改列名   alter table 表名 change 列名 修改后的新列名 新的数据类型
    -- 2.修改类型   alter table 表名 modify 列名 新数据类型
    
    
    -- 删除列 alter table 表名 drop 列名
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    4.DML

    -- 添加数据
    INSERT INTO stu(id,`name`,age) VALUES(1,'张三',18);
    INSERT INTO stu VALUES(2,'李四',19,99.9,NULL,NULL);
    
    
    -- 查询语句
    SELECT * FROM stu;
    
    -- 删除数据
    DELETE FROM stu WHERE id = 2;
    -- 若要删除表的全部记录,推荐使用以下方式
    TRUNCATE table stu; -- 先删除表,然后在创建一张一样的表
    
    -- 修改数据
    UPDATE stu SET age = 20 WHERE id = 1;
    UPDATE stu SET age = 20 ,score = 100 WHERE id = 2;
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.DQL

    查询语句

    基础查询

    多个字段查询、去除重复、计算列、起别名

    -- 查询 姓名和年龄
    select `name`,age from student;
    select * from student;
    
    -- 去除重复的结果
    select distinct address from student;
    select distinct name,address from student;
    
    -- 计算math和chinese的分数之后
    select `name`,chinese,math,math+chinese as 总分 from student;
    
    -- 如果有null 参与的运算,计算机结果都为null
    select `name`,chinese,math,IFNULL(math,0)+IFNULL(chinese,0) from student;
    
    select `name` as 姓名,chinese as 语文成绩,math as 数学成绩,IFNULL(math,0)+IFNULL(chinese,0) as
    总分 from student;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    条件查询

    where子句后跟条件

    运算符

    ​ < 、 > 、 <= 、>= 、 = 、 <>

    ​ BETWEEN…AND

    ​ IN(集合)

    ​ LIKE 模糊查询

    ​ _ :单个任意字符

    ​ % :多个任意字符

    ​ IS NULL

    ​ && 或 and

    ​ or 或 ||

    ​ not 或 !

    -- 条件查询 
    
    -- 查询年龄大于等于20岁
    select * from student where age>=20;
    
    -- 查询年龄不等于20岁
    select * from student where age!=20;
    select * from student where age<>20;
    
    
    -- 查询年龄大于等于20 小于等于30的年龄
    select * from student where age>=20 && age<=30;	 
    select * from student where age>=20 and age<=30;	 
    select * from student where age BETWEEN 20 AND 30;	 
    
    -- 查询年龄21岁 19岁 18岁
    select * from student where age = 22 or age = 19 or age = 18;
    select * from student where age = 22 || age = 19 || age = 18;
    select * from student where age in (22,19,18);
    
    -- 查询数据缺考的学生
    select * from student where math = NULL; -- NULL值不能使用 = 运算符判断
    select * from student where math IS NULL;
    
    -- 查询数学成绩不为空的成绩
    select * from student where math IS NOT NULL;
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    模糊查询

    -- 模糊查询
    -- 查询姓张的有哪些
    select * from student where `name` LIKE '张%';
    
    -- 查询第二个字是小的人
    select * from student where `name` LIKE '_小%';
    
    -- 查询姓名是三个字的人
    select * from student where `name` LIKE '___';
    
    -- 查询姓名中包含张的人
    select * from student where `name` LIKE '%张%';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    排序查询

    ​ oder by 子句

    ​ order by 排序字段 排序方式

    ​ order by 排序字段1 排序方式1,排序字段2 排序方式2…

    ​ 排序方式

    ​ asc:升序,默认的

    ​ desc:降序

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

    -- 排序查询	
    select * from student order by math asc;
    select * from student order by math desc;
    
    -- 按照数据成绩排名,如果数据成绩一样,则按照语文成绩排名
    select * from student order by math asc,chinese asc;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    聚合函数

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

    ​ count:计算个数

    ​ 一般选择非空的列:主键

    ​ COUNT(*)

    ​ max:计算最大值

    ​ min:计算最小值

    ​ sum:计算和

    ​ avg:计算平均值

    注意:聚合函数的计算,排序null值

    ​ 解决方案:

    ​ 选择非空的列进行计算

    ​ IFNULL函数

    -- 聚合查询
    select COUNT(`name`) from student; -- 计算该表中有多少条记录
    
    select COUNT(IFNULL(math,0)) from student; 
    
    select COUNT(*) from student; 
    
    -- 查询数学成绩的最大值
    select MAX(math) from student;
    -- 查询数学成绩的最小值
    select MIN(math) from student;
    -- 查询数学成绩的和
    select SUM(math) from student;
    -- 查询数学成绩的平均值
    select AVG(math) from student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    分组查询

    语法:group by 分组字段

    注意:

    ​ 分组之后查询的字段:分组字段、聚合函数

    ​ where和having的区别?

    ​ 1.where 在分组之前进行限定,如果不满足这个限定的条件,则不参与分组,having 在分组之后进行限定,如果不满足这个限定的条件,则不会被查询出来

    ​ 2.where 后不可以跟聚合函数,having 可以进行聚合函数的判断,

    -- 分组查询
    -- 按照性别分组,分别查询男、女同学的math的平均分 
    select sex,AVG(math) from student group by sex;
    
    -- 按照性别分组,分别查询男、女同学的math的平均分 ,人数
    select sex,AVG(math),count(id) from student group by sex;
    
    -- 按照性别分组,分别查询男、女同学的math的平均分 ,人数。要求:分数低于70分的人不参与分组	
    select sex,AVG(math),count(id) from student where math >70 group by sex;
    
    -- 按照性别分组,分别查询男、女同学的math的平均分 ,人数。要求:分数低于70分的人不参与分组	,分组之后的人数要大于2个人
    select sex,AVG(math),count(id) 人数
    		from student 
    			where math >70 
    		group by sex 
    having count(id)>=2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    分页查询

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

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

    -- 分页查询
    -- 每页显示三条记录
    select * from student limit 0,3; -- 第一页
    select * from student limit 3,3; -- 第二页
    
    -- 公式:开始的索引 = (当前的页码-1)*每页显示的条数
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6.约束

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

    分类:

    ​ 主键约束:primary key

    ​ 非空约束:not null

    ​ 唯一约束:unique

    ​ 外键约束:foreign key

    主键约束:primary key

    含义:非空且唯一

    ​ 一张表只能有一个字段为主键

    ​ 主键就是表中记录的唯一标识

    -- 在创建表时添加主键约束
    create table stu(
    	id int(11) primary key, -- 给id添加主键约束
    	`name` VARCHAR(20)
    );
    
    -- 删除主键
    alter table stu drop primary key;
    
    
    
    
    
    -- 在创建表后添加主键约束
    create table stu(
    	id int(11), -- 给id添加主键约束
    	`name` VARCHAR(20)
    );
    
    -- 在创建表后添加主键约束
    alter table stu modify id int(11) primary key;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    主键约束_自动增长

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

    -- 主键约束_自动增长
    create table stu(
    	id int(11) primary key auto_increment, -- 给id添加主键约束,并且自动增长
    	`name` VARCHAR(20)
    );
    
    -- 删除自动增长	
    alter table stu modify id int(11);
    
    -- 添加自动增长
    alter table stu modify id int(11) auto_increment;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    非空约束:not null

    -- 创建表时添加约束
    create table stu(
    	id int(11),
    	`name` VARCHAR(20) NOT NULL -- name为非空
    );
    
    -- 删除name的非空约束
    alter table stu modify `name` VARCHAR(20);
    
    
    
    
    -- 创建表结束后添加非空约束
    create table stu(
    	id int(11),
    	`name` VARCHAR(20) -- name为非空
    );
    
    -- 创建表结束后添加非空约束
    alter table stu modify `name` VARCHAR(20) NOT NUL;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    唯一约束:unique

    某一列的值不能重复

    注意:

    ​ 唯一约束可以有null值,但是只能有一条记录为null

    -- 创建表添加唯一约束
    create table stu(
    	id int(11),
     	phone VARCHAR(20) UNIQUE -- phone为唯一约束
    );
    
    -- 删除phone的唯一约束
    alter table stu drop index phone;
    
    
    
    
    
    -- 创建表结束后添加唯一约束
    create table stu(
    	id int(11),
     	phone VARCHAR(20)
    );
    
    -- 创建表结束后添加唯一约束
    alter table stu modify phone VARCHAR(20) UNIQUE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    外键约束:foreign key

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

    -- 外键约束:foreign key
    -- 创建部门表(主表)
    create table department(
    	id int(11) primary key auto_increment, 
    	dep_name VARCHAR(20),
    	dep_location VARCHAR(20)
    );
    -- 创建员工表(从表)
    create table employee(
    	id int(11) primary key auto_increment, 
    	`name` VARCHAR(20),
    	age int(11),
    	dep_id int(11) -- 外键对应部门表的主键 
    );
    
    insert into department(dep_name,dep_location) VALUES('研发部','广州');
    insert into department(dep_name,dep_location) VALUES('销售部','深圳');
    
    insert into employee(`name`,age,dep_id) VALUES('张三',21,1);
    insert into employee(`name`,age,dep_id) VALUES('李四',23,1);
    insert into employee(`name`,age,dep_id) VALUES('王五',25,1);
    
    insert into employee(`name`,age,dep_id) VALUES('小二',21,2);
    insert into employee(`name`,age,dep_id) VALUES('赵六',24,2);
    insert into employee(`name`,age,dep_id) VALUES('大一',18,2);
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在创建表时,添加外键

    语法:

    ​ create table 表名(

    ​ …

    ​ constraint 外键名称 foreign key (外键列的名称) references 主表的名称(主表列名称)

    ​ );

    -- 添加外键	
    -- 创建部门表(主表)
    create table department(
    	id int(11) primary key auto_increment, 
    	dep_name VARCHAR(20),
    	dep_location VARCHAR(20)
    );
    -- 创建员工表(从表)
    create table employee(
    	id int(11) primary key auto_increment, 
    	`name` VARCHAR(20),
    	age int(11),
    	dep_id int(11), -- 外键对应部门表的主键 
    	constraint emp_dep_id foreign key (dep_id) references department(id)
    );
    
    
    insert into department(dep_name,dep_location) VALUES('研发部','广州');
    insert into department(dep_name,dep_location) VALUES('销售部','深圳');
    
    
    insert into employee(`name`,age,dep_id) VALUES('张三',21,1);
    insert into employee(`name`,age,dep_id) VALUES('李四',23,1);
    insert into employee(`name`,age,dep_id) VALUES('王五',25,1);
    
    insert into employee(`name`,age,dep_id) VALUES('小二',21,2);
    insert into employee(`name`,age,dep_id) VALUES('赵六',24,2);
    insert into employee(`name`,age,dep_id) VALUES('大一',18,2);
    
    
    
    SELECT * FROM employee;
    SELECT * FROM department;
    
    
    -- 删除外键
    alter table employee drop foreign key emp_dep_id;
    
    -- 创建表之后添加外键
    alter table employee add constraint emp_dep_id foreign key(dep_id) references department(id);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    外键约束_级联操作

    -- 外键约束_级联操作
    -- 删除外键
    alter table employee drop foreign key emp_dep_id;
    -- 添加外键,设置级联更新(当修改dep表中的id时会同时更新emp中的dep_id)
    alter table employee add constraint emp_dep_id foreign key(dep_id) references department(id) 
    on update cascade;
    
    
    -- 添加外键,设置级联更新、级联删除(当删除dep表中对应的id数据时会同时删除emp表中对应的dep_id数据)
    alter table employee add constraint emp_dep_id foreign key(dep_id) references department(id) 
    on update cascade on delete cascade;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7.多表之间的关系

    分类

    一对一

    ​ 如:人和身份证

    ​ 分析:一个人只有一个身份证,一个身份证只有一个人

    一对多(多对一)

    ​ 如:部门和员工

    ​ 分析:一个部门有多个员工,一个员工只能对应一个部门

    多对多

    ​ 如:学生和课程

    ​ 分析:一个学生可以选择多门课程,一门课程也可以被多个学生选择

    实现关系

    一对多(多对一)

    ​ 如:部门和员工

    ​ 分析:一个部门有多个员工,一个员工只能对应一个部门

    ​ 实现方式:在多的一方建立外键,指向一的一方的主键

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCpstufB-1659168214132)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729164659418.png)]

    多对多

    ​ 如:学生和课程

    ​ 分析:一个学生可以选择多门课程,一门课程也可以被多个学生选择

    ​ 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三表的外键,分别指向两张表的主键。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dX51vaYl-1659168214133)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729165155622.png)]

    一对一

    ​ 如:人和身份证

    ​ 分析:一个人只有一个身份证,一个身份证只有一个人

    ​ 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pnt3pEp8-1659168214133)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729165312435.png)]

    8.范式

    概念:设计数据库时,需要遵循的一些规范

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

    ​ 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和Boyce-Codd范式(BCNF)。

    分类:

    第一范式(1NF):每一列都是不可分割原子数据项

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zgxWbisv-1659168214133)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729173324384.png)]

    第二范式(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.码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。

    ​ 如:该表中码为(学号、课程名称)

    ​ 主属性:码属性组中的所有属性

    ​ 非主属性:除码属性组中的属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DV6EVQyW-1659168214134)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729202842706.png)]

    第三范式(3NF):在2NF的基础上,任何非主属性不依赖于其它非主属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yvx9iyFZ-1659168214134)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220729203057968.png)]

    9.数据库的备份和还原

    命令行

    语法:

    ​ 备份:mysqldump -u用户名 -p密码 要备份的数据库名称 > 保存的路径

    ​ 还原:

    ​ 登录数据库

    ​ 创建数据库

    ​ 使用数据库

    ​ 执行文件 source 文件路径

    图形化工具

    10.多表查询

    创建表

    CREATE TABLE `department` (
      `id` int NOT NULL AUTO_INCREMENT,
      `dep_name` varchar(20) DEFAULT NULL,
      `dep_location` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3;
    
    INSERT INTO `department` VALUES (1, '研发部', '广州');
    INSERT INTO `department` VALUES (2, '销售部', '广州');
    INSERT INTO `department` VALUES (3, '财务部', '广州');
    
    
    CREATE TABLE `employee` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(20) DEFAULT NULL,
      `age` int DEFAULT NULL,
      `gender` varchar(255) DEFAULT NULL,
      `salary` varchar(255) DEFAULT NULL,
      `join_date` timestamp(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6),
      `dep_id` int DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `emp_dep_id` (`dep_id`),
      CONSTRAINT `emp_dep_id` FOREIGN KEY (`dep_id`) REFERENCES `department` (`id`) ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3;
    
    
    INSERT INTO `employee` VALUES (1, '张三', 21, '男', '10000', '2022-07-29 20:41:49.280651',1);
    INSERT INTO `employee` VALUES (2, '李四', 23, '男', '9000', '2022-07-29 20:41:52.279826', 1);
    INSERT INTO `employee` VALUES (3, '王五', 25, '男', '12300', '2022-07-29 20:42:11.728213',1);
    INSERT INTO `employee` VALUES (4, '欧阳菲', 21, '女', '8500', '2022-07-29 20:42:05.337770',  2);
    INSERT INTO `employee` VALUES (5, '赵六', 24, '男', '9500', '2022-07-29 20:42:23.664280', 2);
    INSERT INTO `employee` VALUES (6, '张小小', 18, '女', '10000', '2022-07-29 20:43:58.530818', 3);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    笛卡尔积

    ​ 有两个集合A、B,取这两个集合的所有组成情况。

    ​ 要完成多表查询,需要消除无用的数据。

    SELECT * FROM employee,department
    
    -- 笛卡尔积 A,B   3*6=18
    
    -- 消除无用的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5

    内连接查询

    隐式内连接:使用where条件消除无用的数据

    -- 内连接查询
    -- 查询所有员工信息和对应的部门信息
    SELECT 
    		* 
    FROM 
    		employee,department 
    WHERE 
    		employee.dep_id = department.id;
    
    -- 查询员工表的名称,性别。部门表的名称
    SELECT 
    		employee.`name`,employee.gender,department.`dep_name` 
    FROM 
    		employee,department
    WHERE 
    		employee.dep_id = department.id;
    
    
    
    SELECT 
    		t1.`name`,t1.gender,t2.dep_name
    FROM
    		employee t1,department t2
    WHERE 
    		t1.dep_id = t2.id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    显式内连接

    ​ 语法:select 字段列表 from 表名1 [inner可省略] join 表名2 on 条件

    -- 显式内连接
    SELECT
    			*
    from 
    			employee 
    INNER JOIN
    			department
    ON
    		employee.dep_id = department.id
    
    -- --------------------------------------------------------------
    SELECT
    			*
    from 
    			employee 
    JOIN
    			department
    ON
    		employee.dep_id = department.id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    外连接查询

    左外连接

    ​ 语法:select 字段列表 from 表1 left [outer可省略] join 表2 on 条件;

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

    -- 左外连接
    -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
    SELECT 
    			t1.*,t2.dep_name	 
    FROM
    		  employee t1
    LEFT JOIN 
    					department t2
    ON
    		t1.dep_id = t2.id
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    右外连接

    ​ 语法:select 字段列表 from 表1 right [outer可省略] join 表2 on 条件;

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

    -- 右外连接
    -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示
    
    SELECT 
    			t1.*,t2.dep_name	 
    FROM
    		  employee t1
    RIGHT JOIN 
    					department t2
    ON
    		t1.dep_id = t2.id
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    子查询

    概念:查询中嵌套查询,称嵌套查询为子查询

    -- 子查询
    -- 查询工资最高的员工信息
    -- 1.查询最高的工资是多少 12300
    SELECT MAX(salary) FROM employee;
    -- 2.查询员工信息,并且工资等于12300的
    SELECT * FROM employee WHERE employee.salary = 12300;
    -- 一条sql就完成这个操作
    SELECT * FROM employee WHERE employee.salary = (SELECT MAX(salary) FROM employee)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    子查询的不同情况

    1.子查询的结果是单行单列的

    ​ 子查询可以作为条件,使用运算符去判断 > >= < <= =

    -- 查询员工工资小于平均工资的人
    SELECT * FROM employee WHERE employee.salary < (SELECT AVG(salary) FROM employee);
    
    • 1
    • 2

    2.子查询的结果是多行单列的,使用运算符in来判断

    ​ 子查询可以作为条件

    -- 查询财务部和研发部所有的员工信息
    SELECT id FROM department WHERE dep_name = '财务部' or dep_name = '研发部';
    SELECT * FROM employee WHERE dep_id  = 3 or dep_id = 1;
    
    -- 一条sql就完成这个操作
    SELECT * FROM employee WHERE dep_id in(3,1);
    SELECT * FROM employee WHERE dep_id in(SELECT id FROM department WHERE dep_name = '财务部' or dep_name = '研发部');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.子查询的结果是多行多列的

    ​ 子查询可以作为一张虚拟表。

    -- 查询员工入职日期是2021-7-28日之后的员工信息和部门信息
    SELECT 
    		* 
    FROM 
    		department t1,
    		(SELECT * FROM employee WHERE employee.join_date > '2022-07-28') t2
    WHERE 
    		t1.id = t2.dep_id;
    
    
    -- 普通连接
    SELECT 
    		* 
    FROM 
    		employee t1,department t2 
    WHERE 
    		t1.dep_id = t2.id 
    and 
    		t1.join_date > '2022-07-28';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    多表查询练习

    /*
     Navicat Premium Data Transfer
    
     Source Server         : localhost
     Source Server Type    : MySQL
     Source Server Version : 80027
     Source Host           : localhost:3306
     Source Schema         : db1
    
     Target Server Type    : MySQL
     Target Server Version : 80027
     File Encoding         : 65001
    
     Date: 30/07/2022 14:41:37
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for dept
    -- ----------------------------
    DROP TABLE IF EXISTS `dept`;
    CREATE TABLE `dept`  (
      `id` int NOT NULL,
      `dname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `loc` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of dept
    -- ----------------------------
    INSERT INTO `dept` VALUES (10, '研发部', '北京');
    INSERT INTO `dept` VALUES (20, '学工部', '上海');
    INSERT INTO `dept` VALUES (30, '销售部', '广州');
    INSERT INTO `dept` VALUES (40, '财务部', '深圳');
    
    -- ----------------------------
    -- Table structure for emp
    -- ----------------------------
    DROP TABLE IF EXISTS `emp`;
    CREATE TABLE `emp`  (
      `id` int NOT NULL,
      `ename` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `job_id` int NULL DEFAULT NULL,
      `mgr` int NULL DEFAULT NULL,
      `joindate` timestamp NULL DEFAULT NULL,
      `salary` decimal(7, 2) NULL DEFAULT NULL,
      `bonus` decimal(7, 2) NULL DEFAULT NULL,
      `dept_id` int NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE,
      INDEX `job_id`(`job_id`) USING BTREE,
      INDEX `dept_id`(`dept_id`) USING BTREE,
      CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`job_id`) REFERENCES `job` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
      CONSTRAINT `emp_ibfk_2` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of emp
    -- ----------------------------
    INSERT INTO `emp` VALUES (1001, '孙悟空', 4, 1004, '2000-12-17 00:00:00', 8000.00, NULL, 20);
    INSERT INTO `emp` VALUES (1002, '卢俊义', 3, 1006, '2001-02-20 00:00:00', 16000.00, 3000.00, 30);
    INSERT INTO `emp` VALUES (1003, '林冲', 3, 1006, '2001-02-22 00:00:00', 12500.00, 5000.00, 30);
    INSERT INTO `emp` VALUES (1004, '唐僧', 2, 1009, '2001-04-02 00:00:00', 29750.00, NULL, 20);
    INSERT INTO `emp` VALUES (1005, '李逵', 4, 1006, '2001-09-28 00:00:00', 12500.00, 14000.00, 30);
    INSERT INTO `emp` VALUES (1006, '宋江', 2, 1009, '2001-05-01 00:00:00', 28500.00, NULL, 30);
    INSERT INTO `emp` VALUES (1007, '刘备', 2, 1009, '2001-09-01 00:00:00', 24500.00, NULL, 10);
    INSERT INTO `emp` VALUES (1008, '猪八戒', 4, 1004, '2007-04-19 00:00:00', 30000.00, NULL, 20);
    INSERT INTO `emp` VALUES (1009, '罗贯中', 1, NULL, '2001-11-17 00:00:00', 50000.00, NULL, 10);
    INSERT INTO `emp` VALUES (1010, '吴用', 3, 1006, '2001-09-08 00:00:00', 15000.00, 0.00, 30);
    INSERT INTO `emp` VALUES (1011, '沙僧', 4, 1004, '2007-05-23 00:00:00', 11000.00, NULL, 20);
    INSERT INTO `emp` VALUES (1012, '李逵', 4, 1006, '2001-12-03 00:00:00', 9500.00, NULL, 30);
    INSERT INTO `emp` VALUES (1013, '小白龙', 4, 1004, '2001-12-03 00:00:00', 30000.00, NULL, 20);
    INSERT INTO `emp` VALUES (1014, '关羽', 4, 1007, '2002-01-23 00:00:00', 13000.00, NULL, 10);
    
    -- ----------------------------
    -- Table structure for job
    -- ----------------------------
    DROP TABLE IF EXISTS `job`;
    CREATE TABLE `job`  (
      `id` int NOT NULL,
      `jname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `description` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of job
    -- ----------------------------
    INSERT INTO `job` VALUES (1, '董事长', '管理整个公司,接单');
    INSERT INTO `job` VALUES (2, '经理', '管理部门员工');
    INSERT INTO `job` VALUES (3, '销售员', '向客人推销产品');
    INSERT INTO `job` VALUES (4, '文员', '使用办公软件');
    
    -- ----------------------------
    -- Table structure for salarygrade
    -- ----------------------------
    DROP TABLE IF EXISTS `salarygrade`;
    CREATE TABLE `salarygrade`  (
      `grade` int NOT NULL,
      `losalary` int NULL DEFAULT NULL,
      `hisalary` int NULL DEFAULT NULL,
      PRIMARY KEY (`grade`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of salarygrade
    -- ----------------------------
    INSERT INTO `salarygrade` VALUES (1, 7000, 12000);
    INSERT INTO `salarygrade` VALUES (2, 12000, 14000);
    INSERT INTO `salarygrade` VALUES (3, 14000, 20010);
    INSERT INTO `salarygrade` VALUES (4, 20010, 30010);
    INSERT INTO `salarygrade` VALUES (5, 30010, 99990);
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
    
    
    
    -- 1.查询所有员工信息。查询员工编号、员工姓名、工资、职位名称、职务描述
    /*
    	分析:
    			1.员工编号、员工姓名、工资、需要查询emp表	| 	职位名称、职务描述 需要查询job表
    			2.查询的条件 emp.jod_id = job.id
    */
    
    SELECT
    			e.id,e.ename,e.salary,j.jname,j.description  
    FROM
    		emp e,job j
    WHERE
    		e.job_id = j.id;
    		
    		
    -- 2.查询员工编号,员工姓名、工资、职务名称、职务描述、部门名称、部门位置
    /*
    	分析:
    			1.员工编号,员工姓名、工资 emp  | 职务名称、职务描述 job  |  部门名称、部门位置 dept
    			2.查询的条件 emp.job_id = job.id and emp.dept_id = dept.id
    */
    SELECT
    			e.id,e.ename,e.salary,j.jname,j.description,d.dname,d.loc
    FROM
    		emp e,job j,dept d
    WHERE
    		e.job_id = j.id and e.dept_id = d.id
    		
    		
    -- 3.查询员工姓名、工资、工资等级
    /*
    	分析:
    			1.员工姓名、工资 emp |  工资等级 salarygrade
    			2.条件 emp.salary >= salarygrade.losalary and emp.salary <=salarygrade.hisalary
    							emp.salary between salarygrade.losalary and salarygrade.hisalary
    */
    
    SELECT
    			e.ename,e.salary,s.grade
    FROM 
    			emp e,salarygrade s
    WHERE 
    			e.salary BETWEEN s.losalary AND s.hisalary
    
    
    -- 4.查询员工姓名、工资、职务名称、职务描述、部门名称、部门位置、工资等级
    /*
    	分析:
    			1.员工姓名、工资 emp  | 职务名称、职务描述 job| 部门名称、部门位置 dept | 工资等级 salarygrade
    			
    			2.条件 emp.job_id = job.id and emp.dept_id = dept.id and
    						 emp.salary between salarygrade.losalary and salarygrade.hisalary
    */
    
    SELECT
    			e.ename,e.salary,j.jname,j.description,d.dname,d.loc,s.grade
    FROM
    			emp e,job j,dept d,salarygrade s
    WHERE
    	    e.job_id = j.id AND e.dept_id = d.id AND
    			e.salary BETWEEN s.losalary AND s.hisalary
    			
    			
    -- 5.查询部门编号、部门名称、部门位置、部门人数
    /*
    	分析:
    			1.部门编号、部门名称、部门位置 dept  |  部门人数 emp
    			2.使用分组查询,按照emp.dept_id完成分组,查询count(id)
    			3.使用子查询将第二步的查询结果和dept表进行关联查询
    */
    SELECT	
    			t1.id,t1.dname,t1.loc,t2.total
    FROM 
    			dept t1,
    			(	SELECT	
    							dept_id,count(id) total
    				FROM
    							emp
    				GROUP BY dept_id
    			) t2
    WHERE t1.id = t2.dept_id;
    
    
    
    -- 6.查询所有员工姓名及其直接上级的姓名,没有领导的员工也需要查询
    
    /*
    	分析:
    			1.姓名 emp | 直接上级的姓名 emp	
    							* emp的id和mgr是自关联
    			2.条件 emp.id = emp.mgr
    			3.查询左表的所有数据,交集数据 (使用左连接)
    			
    */
    /*
    SELECT	
    			t1.ename,t1.mgr,t2.id,t2.ename
    FROM 
    		 emp t1,emp t2
     WHERE 
    			t1.mgr = t2.id
    */
    
    SELECT	
    			t1.ename,t1.mgr,t2.id,t2.ename
    FROM 
    		 emp t1
    LEFT JOIN
    		emp t2
    ON 
    			t1.mgr = t2.id
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233

    11.事务

    事务的基本介绍

    概念:

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

    操作:

    ​ 1.开启事务:start transaction;

    ​ 2.回滚:rollback;

    ​ 3.提交:commit;

    注意:MySql数据库中事务默认自动提交

    ​ 事务提交的两个方式:

    ​ 1.自动提交

    ​ mysql就是自动提交的

    ​ 一条MDL(增删改查)语句会自动提交一次事务

    ​ 2.手动提交

    ​ Oracle 数据库默认是手动提交

    ​ 需要先开启事务,再提交

    ​ 修改事务的默认提交方式

    ​ 查看事务的默认提交方式 SELECT @@autocommit; – 1 :代表自动提交 | 0 : 代表手动提交

    ​ 修改默认提交方式:set @@autocommit = 0;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNJoOjsn-1659168214135)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220730144519426.png)]

    CREATE TABLE account(
    	id INT PRIMARY KEY auto_increment,
    	`name` VARCHAR(20),
    	balance DOUBLE
    );
    
    INSERT INTO account(`name`,balance) VALUES('zhangsan',1000),('lisi',1000);
    
    
    SELECT * FROM account;
    
    UPDATE account SET balance = 1000;
    -- 张三给李四转账500元
    
    -- 0.开启事务
    START TRANSACTION;
    -- 1.张三账户 -500
    UPDATE account SET balance = balance - 500 WHERE `name` = 'zhangsan';
    -- 2.李四账户 +500
    UPDATE account SET balance = balance + 500 WHERE `name` = 'lisi';
    
    -- 发现执行没有问题,提交事务
    COMMIT;
    
    -- 发现出问题了,回滚事务
    ROLLBACK;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    事务的四大特征

    1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。

    2.持久性:如果事务一旦提交或回滚,数据库会持久化的保存数据。

    3.隔离性:多个事务之间,相互独立。

    4.一致性:事务操作前后,数据总量不变。

    事务的隔离级别

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

    ​ 1.脏读:一个事务读取到另一个事务中没有提交的数据。

    ​ 2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。

    ​ 3.幻读:一个事务操作(DML操作)数据表中所有记录,另一个事务添加了一条事务,则一个事务查询不到自己的修改。

    隔离级别:

    ​ 1.read uncommitted:读未提交

    ​ 产生问题:脏读、不可重复读(虚读)、幻读

    ​ 2.read committed:读已提交(Oracle默认)

    ​ 产生问题:不可重复读(虚读)、幻读

    ​ 3.repeatable read:可重复读(MySql默认)

    ​ 产生问题:幻读

    ​ 4.serializable:串行化

    ​ 可以解决所有的问题

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

    ​ 数据库查询隔离级别:

    ​ SELECT @@SESSION.transaction_isolation

    ​ 数据库设置隔离级别:

    ​ set global transaction isolation level 级别字符串;

    SELECT @@SESSION.transaction_isolation
    
    
    set global transaction isolation level serializable;
    set global transaction isolation level repeatable read;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.脏读:一个事务读取到另一个事务中没有提交的数据。

    set global transaction isolation level read committed;
    
    -- 0.开启事务
    START TRANSACTION;
    -- 1.张三账户 -500
    UPDATE account SET balance = balance - 500 WHERE `name` = 'zhangsan';
    -- 2.李四账户 +500
    UPDATE account SET balance = balance + 500 WHERE `name` = 'lisi';
    
    
    -- 注意:这里并未提交,但是在另一个打开的图形化界面进行下面查询语句的时候,可以读取到未提交的数据
    select * from account;
    
    -- 当使用了rollback进行回滚之后,数据又回到各自的账务中,这时候在使用查询语句查询各自的账户时均为1000,这便是不可重复读,因为第一次查询时各自的账户分别是500和1500,第二次使用了rollback之后在进行查询时各自的账户分别是1000和1000.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。

    set global transaction isolation level read uncommitted;
    
    -- 0.开启事务
    START TRANSACTION;
    -- 1.张三账户 -500
    UPDATE account SET balance = balance - 500 WHERE `name` = 'zhangsan';
    -- 2.李四账户 +500
    UPDATE account SET balance = balance + 500 WHERE `name` = 'lisi';
    
    -- 这时只有张三使用了rollback之后,金额才会进入李四的账户中,但是两次查询结果不一致,产生不可重复读
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDq4RNv1-1659168214136)(C:\Users\30666\AppData\Roaming\Typora\typora-user-images\image-20220730153024677.png)]

    12.DCL

    SQL分类:

    ​ 1.DDL:操作数据库和表

    ​ 2.DML:操作增删改表中的数据

    ​ 3.DQL:查询表中的数据

    ​ 4.DCL:管理用户、授权

    DCL

    ​ 1.管理用户

    ​ 1.添加用户

    ​ 2.删除用户

    ​ 3.修改用户密码

    ​ 4.查询用户

    
    
    
    
    -- 1.切换到mysql数据库
    USE mysql;
    -- 2.查询user表
    SELECT * FROM user;
    
    -- 创建用户
    -- CREATE `user` '用户名'@'主机名' IDENTIFIED 	BY '密码';
    CREATE user 'cmk'@'localhost' IDENTIFIED BY '123456';
    CREATE user 'qx'@'%' IDENTIFIED BY '123456';
    
    -- 删除用户
    -- DROP user '用户名'@'主机名';
    DROP user 'qx'@'%';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    mysql密码忘了怎么办?

    1.cmd --> net stop mysql 需要管理员运行cmd
    2.使用无验证方式启动mysql服务:mysqld --skip-grant-tables
    
    启动另外一个窗口直接输入mysql 回车即可登录
    登录成功后即可修改密码
    use mysql;
    update user set password = password('123456') where user='root';
    
    重新启动cmd
    net start mysql
    
    mysql -uroot -p123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ​ 2.权限管理

    ​ 1.查询授权

    ​ 2.授予权限

    ​ 3.撤销授权

    ` = ‘lisi’;

    – 注意:这里并未提交,但是在另一个打开的图形化界面进行下面查询语句的时候,可以读取到未提交的数据
    select * from account;

    – 当使用了rollback进行回滚之后,数据又回到各自的账务中,这时候在使用查询语句查询各自的账户时均为1000,这便是不可重复读,因为第一次查询时各自的账户分别是500和1500,第二次使用了rollback之后在进行查询时各自的账户分别是1000和1000.

    
    
    
    
    
    
    
    > 2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
    
    ```sql
    set global transaction isolation level read uncommitted;
    
    -- 0.开启事务
    START TRANSACTION;
    -- 1.张三账户 -500
    UPDATE account SET balance = balance - 500 WHERE `name` = 'zhangsan';
    -- 2.李四账户 +500
    UPDATE account SET balance = balance + 500 WHERE `name` = 'lisi';
    
    -- 这时只有张三使用了rollback之后,金额才会进入李四的账户中,但是两次查询结果不一致,产生不可重复读
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    [外链图片转存中…(img-hDq4RNv1-1659168214136)]

    12.DCL

    SQL分类:

    ​ 1.DDL:操作数据库和表

    ​ 2.DML:操作增删改表中的数据

    ​ 3.DQL:查询表中的数据

    ​ 4.DCL:管理用户、授权

    DCL

    ​ 1.管理用户

    ​ 1.添加用户

    ​ 2.删除用户

    ​ 3.修改用户密码

    ​ 4.查询用户

    
    
    
    
    -- 1.切换到mysql数据库
    USE mysql;
    -- 2.查询user表
    SELECT * FROM user;
    
    -- 创建用户
    -- CREATE `user` '用户名'@'主机名' IDENTIFIED 	BY '密码';
    CREATE user 'cmk'@'localhost' IDENTIFIED BY '123456';
    CREATE user 'qx'@'%' IDENTIFIED BY '123456';
    
    -- 删除用户
    -- DROP user '用户名'@'主机名';
    DROP user 'qx'@'%';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    mysql密码忘了怎么办?

    1.cmd --> net stop mysql 需要管理员运行cmd
    2.使用无验证方式启动mysql服务:mysqld --skip-grant-tables
    
    启动另外一个窗口直接输入mysql 回车即可登录
    登录成功后即可修改密码
    use mysql;
    update user set password = password('123456') where user='root';
    
    重新启动cmd
    net start mysql
    
    mysql -uroot -p123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ​ 2.权限管理

    ​ 1.查询授权

    ​ 2.授予权限

    ​ 3.撤销授权

  • 相关阅读:
    Adv. Intell. Syst. | 青岛大学发表基于深度学习和宿主信息嵌入的微生物组多标签疾病检测研究...
    OSPF笔记(一):OSPF基本特点、自治系统、区域、RID冲突
    简单的咖啡文化静态HTML网页设计作品 DIV布局咖啡馆文化网页模板代码 DW咖啡网站制作成品
    【图像分割】基于神经气体网络 (NGN)实现图像分割附matlab代码
    除了SD Web UI 或comfyUI,还有更简单的运行SDXL的方法吗?
    Python技能树练习——统计词频
    【PAT甲级】1115 Counting Nodes in a Binary Search Tree
    javascript案例35——&&
    兑换码设计
    二叉搜索树
  • 原文地址:https://blog.csdn.net/weixin_50569789/article/details/126073587