MySQL基础总结

文章目录


前言

随着大数据的热门和不断发展,mysql等成了必备工具,本文就介绍一些黑马课程中讲到的mysql的基础内容,后续随缘更新,内容其他博主也有介绍,主要是为了方便自己复习。本人0基础转行,希望帮助到更多小白学习者们。


一、MySQL是什么?

要了解MySQL,首先要先了解数据库相关概念,用一张浅显易懂的表告诉大家吧:

数据库相关概念
名称全称简称
数据库储存数据的仓库,有组织地存储数据DB
数据库管理系统操作和管理数据库的大型软件DBMS 
SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准SQL

接下来了解MySQL,继续用一张表介绍:

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更好,不知道大家怎么看?以下是几个的区别,仅供参考

MySQL中 DECIMAL FLOAT DOUBLE的区别


 二进制数据:视频,音频,软件安装包等,可储存在数据库中,用文件服务器储存比较高效

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可省略

#关于字段别名和表别名的一些疑问在以下博客中有所解答:

https://blog.csdn.net/digitalkee/article/details/113826941

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 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种开源的关系型数据库管理系统,广泛应用于各种Web应用程序中。它具有可扩展性、高性能、稳定性和安全性等优点。 下面是MySQL数据库基础教程: 1. 安装MySQL:首先需要下载并安装MySQL数据库软件。可以从MySQL官方网站下载适合你操作系统的安装包,然后按照安装向导进行安装。 2. 连接到MySQL:安装完成后,可以使用命令行工具或者图形化工具连接到MySQL数据库。可以使用以下命令连接到MySQL数据库: `mysql -h主机名 -u用户名 -p密码` 3. 创建数据库:使用`CREATE DATABASE`语句创建一个新的数据库。例如,要创建一个名为`mydatabase`的数据库,可以使用以下命令: `CREATE DATABASE mydatabase;` 4. 创建数据表:在数据库中创建数据表用于存储数据。使用`CREATE TABLE`语句创建一个新的数据表。例如,要创建一个名为`users`的数据表,可以使用以下命令: ``` CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(50) ); ``` 5. 插入数据:使用`INSERT INTO`语句向数据表中插入数据。例如,要向`users`表中插入一条记录,可以使用以下命令: `INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');` 6. 查询数据:使用`SELECT`语句从数据表中查询数据。例如,要查询`users`表中的所有记录,可以使用以下命令: `SELECT * FROM users;` 7. 更新数据:使用`UPDATE`语句更新数据表中的记录。例如,要将`users`表中`id`为1的记录的`name`字段更新为`Jane Doe`,可以使用以下命令: `UPDATE users SET name = 'Jane Doe' WHERE id = 1;` 8. 删除数据:使用`DELETE`语句删除数据表中的记录。例如,要删除`users`表中`id`为1的记录,可以使用以下命令: `DELETE FROM users WHERE id = 1;` 9. 数据备份和恢复:可以使用`mysqldump`命令备份MySQL数据库,以及使用`mysql`命令恢复备份的数据。根据你的需求选择适当的备份和恢复方法。例如,要使用`mysqldump`命令备份数据库,并将备份数据存储到`backup.sql`文件中,可以使用以下命令: `mysqldump -u用户名 -p密码 数据库名 > backup.sql` 以上是MySQL数据库基础教程的一些主要内容。希望对你有所帮助。 提供了一份个人学习MySQL时结合网络资源所作的总结,如果你需要更详细的教程或参考资料,建议查阅MySQL官方文档或其他权威资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值