文章目录
前言
随着大数据的热门和不断发展,mysql等成了必备工具,本文就介绍一些黑马课程中讲到的mysql的基础内容,后续随缘更新,内容其他博主也有介绍,主要是为了方便自己复习。本人0基础转行,希望帮助到更多小白学习者们。
一、MySQL是什么?
要了解MySQL,首先要先了解数据库相关概念,用一张浅显易懂的表告诉大家吧:
名称 | 全称 | 简称 |
数据库 | 储存数据的仓库,有组织地存储数据 | DB |
数据库管理系统 | 操作和管理数据库的大型软件 | DBMS |
SQL | 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 | SQL |
接下来了解MySQL,继续用一张表介绍:
是什么 | 关系型数据库管理系统(RDBMS) |
特点 | 使用表存储数据,格式统一,便于维护 |
使用SQL语言操作,标准统一,使用方便 |
建立在关系模型基础上,是由多张相互连接的二维表(有表头、行、列,表之间能相互关联)组成的数据库。
单词助记:Mysql:关系型,二维表 relationchart
二、SQL
2.1 MySQL数据模型
客户端连接DBMS,使用SQL通过DBMS在数据库中创建二维表
2.2 SQL通用语法
1.SQL语句可以单行或多行书写,以分号结尾
u are a
student;
2.SQL语句可以使用空格/缩进来增强语句的可读性
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
U are a STUDENT; #u和student是关键字
4单行注释: -- or #
多行注释: /*注释内容*/
2.3 SQL分类
分类 | 助记 | 说明 |
DDL | 来自ddl的压迫yyds | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | 使用SQL语句的数据库大卖了 | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | 带钱了吗(买使用SQL语句的数据库hhh) | 数据查询语言,用来查询数据库中表的记录 |
DCL | 快为SQL大佬倒茶了!(倒完茶就删库跑路hhh) | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
把分类的简称扩充,然后翻译一下就知道各自的作用了,四个里面第三个查询用的最多
一. DDL
* DDL-数据库操作
查询所有数据库
SHOW DATABASES ;
查询当前处在哪个数据库
SELECT DATABASE();
创建
CREATE DATABASE[IF NOT EXISTS] 数据库名[UFAULT CHARSET 字符集][COLLATE 排序规则];
if not exists:如果不存在则创建
举例:create database itheima ufault charset utf8mb4;
删除
DROP DATABASE[IF EXISTS]数据库名;
使用
USE 数据库名
* DDL-表操作
查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询指定表的建表语句
SHOW CREATE TABLE [表名]
创建表
CREATE TABLE 表名(
字段1 字段1类型[COMMENT 字段1注释],
字段2 字段2类型[COMMENT 字段2注释],
字段3 字段3类型[COMMENT 字段3注释],……
字段n 字段n类型[COMMENT 字段n注释])[ COMMENT 表注释];
注:最后一个字段后没有逗号
举例:
create table tb_user(
id int comment'编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
)comment '用户表';
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释][约束];
举例:alter table emp add nickname verchar(20) comment'昵称';
修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释][约束]:
删除字段
ALTER TABLE 表名 DROP 字段名;
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
删除表
DROP TABLE[IF EXISTS] 表名;
删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
#其实就是清除表内容
https://www.cnblogs.com/zhoufangcheng0405/p/7991759.html
该博客详细记录了delete,drop和truncate的区别
在MySQL中,数据类型主要分为三类:数值类型、字符串类型、日期和时间类型。下面三张图为这三个类型的具体描述。如下:
(借黑马视频截图一用)
解释一下
1.有符号和没符号的区别:有无负数的取值范围
2.表格最后一行的精度和标度是指:长度和小数位 (123.45,精度5,标度 2)
3.还有字节是什么意思?度娘: 字节是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位,也在一些计算机编程语言中表示数据类型和语言字符。
#哦就是我的肚子能装八个男人,这里的个就相当于字节
想起了字节跳动这家公司,那我连夜注册一个公司?叫“数组蹦迪”?好生硬的名字,我再想想,丹丹说“比特蹦迪”,嗯1bit=0.125字节,妙啊,最关键的是比特(币)在你坟头蹦迪,非常nice.
4.MySQL支持所有标准SQL整数类型integer、int和smallint。 此外,MySQL提供tinyint, mediumint,bigint作为标准SQL的扩展。关于Bigint,可以看这篇博文:https://www.cnblogs.com/zgqys1980/archive/2012/07/09/2582489.html
用2个例子来加深对上面图片的印象吧:
1. age tinyint unsigned #年龄不出现负数所以用insigned,占用一个字节,考虑到int占4个字节,浪费储存空间,所以选择所以用tinyint。毕竟内存空间不足大家都很讨厌嘛~
2.score double(4,1) 分数一般就有小数了,黑马老师说用double比较合适,但是我觉得用decimal更好,不知道大家怎么看?以下是几个的区别,仅供参考
二进制数据:视频,音频,软件安装包等,可储存在数据库中,用文件服务器储存比较高效
char(a):a代表当前字符串储存的最大长度
定长字符串char表示,即使一个字符也会占用你a个空间,未占用的字符其他空间会用空格进行补位(解释一下就是你请客吃饭办酒席办了一张桌子,一共可以坐10个人,就来了6个人,其他空位必须得找人补上,规定了必须坐满)
varchar(a):a个字符占a个空间(来几个就吃几个)
varchar性能较差,得根据内容确定需要分配的空间
省空间用varchar,省性能用char
举例:性别用char(1),固定字符用char,不固定用varchar
timestamp只到2038年,可能2038年是世界末日吧hhh
二. DML(对表中的数据增删改)
1.给指定字段添加数据
INSERT INTO 表名(字段名1, 字段名2,...]) VALUES (值1, 值2...);
#插入数据时,指定的字段顺序需要与值的顺序是对应的;
2.给全部字段添加数据
INSERT INTO 表名 VALUES (值1, 值2,...);
#跟第一条相比就是没有具体的字段名了
3.批量添加数据
INSERTINTO 表名(字段名1, 字段名2, ...)VALUES (值1, 值2,..),(值1, 值2,..)(值1,2,...);
INSERTINTD 表名 VALUES (值1,值2,...),(值1,值2,..),(值1,值2,...);#批量插入多个值之间用逗号分隔
4.修改数据
UPDATE 表名 SET 字段名1= 值1,字段名2=值2,....[WHERE 条件];
#:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据
5.删除数据
DELETE FROM 表名 [WHERE 条件];
#DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
#DELETE 语句不能删除某一个字段的值(可以使用UPDATE]。
三. DQL(查询表中数据)
基础查询:SELECT+字段列表,FROM+表名列表
1.查询多个字段
SELECT 字段1字段2,字段3 ... FROM 表名;
SELECT*FROM 表名;
2.设置别名
SELECT 字段1[AS 别名1],字段2 [AS 别名2] .. FROM 表名;
#设置别名的时候as可省略
#关于字段别名和表别名的一些疑问在以下博客中有所解答:
3.去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
条件查询:WHERE+条件列表
1.语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
2.条件
比较/逻辑运算符 | 功能 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
><或!= | 不等于 |
BETWEEN...AND.. | 在某个范围内(含最小,最大值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
IS NULL | 是null |
AND 或&& | 并且(多个条件同时成立) |
OR或|| | 或者(多个条件任意一个成立) |
NOT或! | 非,不是 |
= | 等于 |
用in举例:select * from emp where age in(18,20,40);
用LIKE举例:select * from emp where name like '__';#两个下划线表示2个字符
查询身份证号最后一位是X的员工信息 :select * from emp where idcard like '%X'; #前面任意个字符,保证最后一个是X
聚合函数:count,max,min,avg,sum
1.介绍:将一列函数作为一个整体,进行纵向计算
2.常见聚合函数:count,max,min,avg,sum
3.语法:
SELECT 聚合函数 (字段列表) FROM 表名;
#NULL值不参与聚合函数计算
举例:
统计西安地区员工的年龄之和:select sum(age)from emp where workaddress = '西安';
select s.emp_no, max(s.salary),e.last_name,e.first_name from salaries s left join employees e on s.emp_no=e.emp_no where s.salary != (select max(salary) from salaries);做的有一道题的题目是找第二的薪水并规定不能用order by,然后这一条在sqlite中可以,mysql中不可以。因为mysqI的select字句中含有聚合函数时,规定只能返回一个字段(哭了 ,我一开始死活不知道哪里错了)
所以在mysql中还是这样比较好:
select s.emp_no, s.salary as salary, e.last_name, e.first_name from employees e left join salaries s on e.emp_no = s.emp_no where s.salary = (select max(salary) from salaries where salary < (select max(salary) from salaries));
分组查询:GROUP BY+分组字段列表,HAVING+分组后条件列表
SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件];
举例1:根据性别分组 ,统计男性员工 和 女性员工的数量:select gender,count(*) from emp group by gender
举例2:查询年龄小于45的员工并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) >=3;这里就是先分组,用where 判断出年龄小于45的人,将这类人根据地址分组:group by workaddress,然后再用having过滤数量大于等于3的工作地址
*代表全部表格,但是不够规范
where与having区别:
1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤.
2.判断条件不同: where不能对聚合函数进行判断,而having可以。*count统计出来结果之后再通过having对这个结果进行过滤
执行顺序是where>聚合函数 > having
where把数据过滤了,再用count (*)把过滤出来的所有数据再过滤
关于分组查询,我自己在做题的时候遇到了这样一个错误:
SQL_ERROR_INFO: "Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.emp_no' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
用GROUP BY函数时,只能查找分组依据的列,以及与分组依据一一对应的列,所以select中出现的非聚合字段必须出现在GROUP BY中,不然就会报错
【MySQL】聚合函数详解_mysql 聚合_ppppppatrick的博客-CSDN博客
上述的一些知识点推荐这篇博文
排序查询:ORDER BY+排序字段列表
1. 语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
举例:根据年龄对公司的员工进行升序排序 , 年龄相同 ,再按照入职时间进行降序排序
seLect * from emp order by age asc, entrydate desc;
2.排序方式
ASC:升序(默认值)
DESC:降序
*注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序;
分页查询:LIMIT+分页参数
1.语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意
1.起始索引从0开始,起始索引= (查询页码 -1)*每页显示记录数
2.每页显示记录数分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
3.如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
DQL练习:
1.查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工
select* from emp where gender ='男' and (age between 20 and 40) and name like'_ _ _';
2.统计员工表中,年龄小于60岁的 ,男性员工和女性员工的人数
select gender ,count(*) from emp where age<60 group by gender ;
#分组前判断年龄是否小于60
3.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select name,age from emp where age<=35 order by age asc ,entrydate desc;
4.查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对在询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from emp where gender='男' and age between 20 and 40 order by age asc ,entrydate desc limit 5;
#先排序再找前五个(如果先找前五个再排序,那么排序肯定就是在这五个里面排,所以肯定limit放在最后)
DQL执行顺序(非编写顺序):
DQL小结:
四. DCL(管理数据库的用户以及访问权限)
1.查询用户
USE mysql;
SELECT*FROM user;
host指的是主机,要去创建或删除一个用户需要通过用户名和host(主机地址)才能定位MySQL的用户
创建用户
CREATE USER'用户名 '@'主机名' IDENTIFIED BY'密码';
#用户名变成%代表任意主机都能访问该数据
3.修改用户密码
ALTER USER用户名@主机名’ IDENTIFIED WITH mysql native_password BY'新密码';
4.删除用户
DROP USER用户名 @'主机名'
DCL-权限控制
权限 | 说明 |
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
1.查询权限
SHOW GRANTS FOR'用户名' @'主机名';
举例:show grants for 'heima'@'%';
2.授予权限
GRANT 权限列表 ON 数据库名.表名 TO用户名@'主机名';
举例:grant all on incast.* to 'heima'@'%';
3.撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@'主机';
举例:evoke all on itcast .* from 'heima'@'%';
#*.*是全部数据库的所有表
多个权限之间用逗号分隔
三、函数
1.字符串函数
练习:
1.字符串拼接: select concat ('hello','MySQL');
2.大小写转换:select lower/upper ('Hello');返回的结果一个全是小写hello,一个全是大写HELLO
3.填充:select lpad('01',5,'-'); 返回结果是'- - -01',,长度5,最后两个为01,RPAD相反,就不演示了
4.返回字符串:select substring('Hello1MysQL',2,5); 返回'ello1'
5.由于业务需求变更,企业员工的工号,统一%5位数,目前不足5位数的全部在前面补0。比如: 1号员工的工号应该为00001:update emp set workno = lpad(workno, 5,'0'); #这里是需要改数据,前面的select是查询,不改数据
2.数值函数
向上取整:1.1→2,同理向下取整:1.9→1
mod模就是相除取余
select round (2.344,2)→2.34
通过数据库的函数,生成一个六位数的随机验证码:select lpad (round()*1000000,0),6,'0');
3.日期函数
1.select date_add(now(),INTERVAL 70 DAY);
#往前就写-70,不过往前的话还可以用date-sub
2.select datediff('2021-12-01',2021-11-01');
3.举例:所有员工的入职天数,并根据入职天数倒序排序
select name,datediff(curdate(),entrydate) as 'entrydays' from emp order by entrydays desc
4.流程函数
查询emp表的员工姓名和工作地址(北京/上海 ---->一线城市,其他 ---->二线城市)
select
name ,
(case workaddress when'北京' then '一线城市'When '上海'then '二线城市'else二线城市'end ) as'工作地址
from emp;
四、约束
1. 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
2. 目的:保证数据库中数据的正确、有效性和完整性
3. 分类:
注意: 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
创建表结构举例: create table user1( id int primary key auto_increment comment '主键', #主键自动增长,数据库自动维护,不需要插入数据 name varchar(10) not null unique comment '姓名', #姓名不为空且唯一 age int check (age > 0 && age <= 120) comment '年龄', #大于0,小于等于120 status char(1) default '1' comment '状态', #默认为1 gender char(1) comment '性别' ) comment '用户表'; #多个约束之间用空格即可
外键约束
1.概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性(因为有外键就不允许删除与子表有关联的父表数据)
有外键的是子表,有主键的是父表
注意:目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。所以删掉一张表另一张并没有什么影响。
2.语法:
添加外键(出现蓝色小钥匙)
CREATE TABLE 表名(
字段名 数据类型,……
[CONSTRAINT][外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
举例:alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
举例:alter table emp drop foreign key fk_emp_dept_id;
外键删除/更新行为
no action和restrict是默认行为,要删除与子表有关联的父表数据,则不支持删
ALTER TABLE 表名 ADDCONSTRAINT 外键名称 FOREIGN KEY 外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
举例:alter table emp add constraint fk.emp_deptid foreign key (dept_id) references dept(id) on update cascade on delete cascade;
#cascade形象点就是父子连坐
#set null就是父表删除的部分子表显示null
五、多表查询
多表关系
一对多(多对一)
案例: 部门与 员工的关系
关系: 一个部门对应多个员工,一个员工对应一个部门
实现: 在多的一方建立外键,指向一的一方的主键
多对多
案例:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
举例如下:
use itheima; create table student( id int auto_increment primary key comment '主键ID', name varchar(10) comment '姓名', no varchar(10) comment '学号' ) comment '学生表' ; insert into student values (null,'黛绮丝','200100101'),(null, '谢逊','200100101'),(null, '殷天正','200100103'),(null, '韦一笑','200100104'); create table course( id int auto_increment primary key comment '主键ID', name varchar(10) comment '课程名称' ) comment '课程表' ; insert into course values (null,'Java'),(null, 'PHP'),(null, 'MySQL'),(null, 'Hadoop'); create table student_course( id int auto_increment comment '主键ID' primary key, studentid int not null comment '学生ID', courseid int not null comment '课程ID', constraint fk_courseid foreign key (courseid) references course (id), constraint fk_studentid foreign key (studentid) references student (id) )comment '学生课程中间表'; insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);
一对一
案例: 用户 与 用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(user_id(外键)每个都不一样,保证外键唯一 )unique
多表查询
概述:指从多张表中查询数据
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合和 B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
select * from emp , dept ;
消除无效的笛卡尔积
select * from emp , dept where emp.dept_id = dept.id;
内连接:查询的是两张表交集部分
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件 ...;
举例:查询每一个员工的姓名 , 及关联的部门的名称
表结构: emp,dept
连接条件: emp.dept_id = dept.id
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;
显式内连接(可以方便地连接三张以上的表)
SELECT 字段列表 FROM 表1 [INNER]JOIN 表2 ON 连接条件 ...;
举例;select e.name, d.nane from emp e inner join dept d on e.dept_id = d.id;
#起别名,emp=e,dept=d,但是起别名后不能用表名了
#先执行的是from
外连接(查询内容包含null用外连接)
左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER]JOIN 表2 ON 条件 ...;
#相当于查询表1(左表)的所有数据 包 含 表1和表2交集部分的数据
举例: 查询emp表的所有数据 和对应的部门信息(左外连接)
select e.*, d.name from emp e left outer join dept d on e.dept_id =d.id;
#outer可有可无
右外连接
SELECT 字段列表 FROM 表1 RIGHT [ OUTER]JOIN 表2 ON 条件 ...;
#相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据
select d.*, e.* from emp e right outer join dept d on e.dept_ id = d.id;
自连接
自连接查询语法:
SFLECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
自连接查询,可以是内连接查询,也可以是外连接查询。
-- 1. 查询员工 及其 所属领导的名字
表结构: emp
select a.name , b.name from emp a , emp b where a.managerid = b.id;
#把emp看成两张表,不要看成一张表
-- 2. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
表结构: emp a ,emp b
select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid = b.id;
一定要给表起别名
联合查询-union,union-all
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
SELECT 字段列表 FROM 表A ...
UNION [ALL] #union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重
SELECT 字段列表 FROM 表B
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
子查询
概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个
根据子查询结果不同,分为:
1.标量子查询:子登询结果为单个值(数字、字符串、日期等最简单的形式,常用的操作符:= > >=
< <=
举例: 查询“销售” 的所有员工份息
a. 查询“销售部” 部门ID
select id from dept where name =“销售部';
b. 根据销售部部门ID, 查询员工信息select * from emp where dept_id = 4;
以上可省略为一句:
select * from emp where dept_id =(select id from dept where name =“销售部');
2.列子查询:子查询返回的结果是一列(可以是多行),常用的操作符:IN 、NOTIN 、ANY 、SOME、ALL
举例:select * from emp where dept _id in(select id from dept where name ='销售部' or name ='市场部');
3.行子查询:子查询结果为一行(也可以是多列),常用的操作符:=、<> 、IN 、NOT IN
查询与“张无忌” 的薪资及直属领导相同的员工信息
select * fron emp where (salary,managerid) = (select salary, managerid fron emp where name = '张无忌');
4.表子查询:子查询结果为多行多列,常用操作符:IN
查询与“鹿杖客”,"宋远桥”的职位和薪资相同的员工信息
select * from emp where (job,salary) in ( select job, salary from emp where name ='鹿杖客' or name = '宋远桥' );
根据子查询位置,分为:WHERE之后、FROM之后、SELECT 之后
六、事务
事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败.
默认MysQL的事务是自动提交的,也就是说,当执行一条DML(数据增删改)语句,MySQL会立即隐式的提交事务。
事务操作:
查看/设置事务提交方式
SELECT @@autocommit ;
SET @@autocommit = 0; #=0修改为手动,=1修改为自动#注意一旦设置为手动,下次想执行的时候必须commit提交到数据库
提交事务
COMMIT;
回滚事务
ROLLBACK;
开启事务
START TRANSACTION 或 BEGIN;
提交事务
COMMIT ;
回滚事务
ROLLBACK;#相当于撤回操作
#方式一是把自动提交改为手动提交来控制,方式二是通过开启事务操作开关,开启后就算是自动提交执行错误,数据库也不会改变
事务四大特性
原子性(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(#能量守恒)
隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题
幻读有点类似于登QQ,密码错误,修改密码时又说不可与最近密码重复
事务隔离级别
查看事务隔离级别:SELECT@@TRANSACTION_ISOLATION
SET[ SECTION|GLOBAL] TRANSACTION_ISOLATION
设置事务隔离级别:SET[ SECTION|GLOBAL] TRANSACTION_ISOLATION LEVEL{ READ UNCOMMTTED | READ COMMITED │ REPEATABLE EREAD | SERIALZABLE
补充一个知识点,是在牛客网刷题遇到的SQL SELECT DISTINCT语句
在表中,可能会包含重复值。关键词DISTINCT用于返回唯一 不同的值。
语法:SELECT DISTINCT列名称FROM 表名称.
基础部分到这里就结束啦,感谢大家的阅读~
最后再提供几本电子书网盘链接,希望大家食用愉快~
链接:https://pan.baidu.com/s/1LNasFLGxOZF55ODx9sj0ow?pwd=gl3l
提取码:gl3l