MySQL总结

本文详细介绍了MySQL的基础概念,包括数据库的好处、常见术语、数据存储特性、服务器启动与停止、登录与退出、SQL语法、Mysql服务管理、查询操作、数据类型、SQLyog快捷键、DQL与DML、事务控制、隔离级别、视图与变量、存储过程与函数,以及流程控制结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL基础

数据库的相关概念

一、好处

1.可以持久化数据到本地

2.结构查询

二、常见概念

1.DB:数据库,存储数据的容器

2.DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB

3.SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流的数据库语言

三、数据库存储数据的特点

1.数据存放到表中,然后表再放到库中

2.一库可以有多张表,每张表具有唯一的表名来表示自己

3.表中有一个或多个列,列又称为“字段”,相当于“属性”

4.表中的每一行数据,相当于“对象”。

服务器的启动与停止

  • 启动:
net start mysql(名称)--如mysql80
  • 停止
net stop mysql(名称)--如mysql80

mysql初始密码(好像没啥用先放着把)

A temporary password is generated for root@localhost: M)avUlt+k9%3

Mysql服务的登录和退出

  1. 通过mysql自带的客户端

    只限于root用户

  2. 通过windows自带的客户端

    登录:

    mysql [-h主机名 -P端口号] -u用户名 -p密码
    

    注意上方的大小写,以及方括号框中的为在本地用户下可以省略的部分。

    退出:

    exit 或 ctrl + C

Mysql的常见命令

  1. 查看当前所有的数据库

    show databases;
    
  2. 打开指定的库

    use 【库名】
    
  3. 查看当前库的所有表

    show tables;
    
  4. 查看其他库的所有表

    show tables from 【库名】;
    
  5. 创建表

    create table 【表名】(
    	列名 列类型,
    	列名 列类型,
    	···
    );
    
  6. 查看表结构

    desc 【表名】
    
  7. 查看服务器版本

    1. 登录到mysql服务器

      select version();
      
    2. 没有登录到mysql服务器

      mysql --version
      或
      mysql --V
      

Mysql的语法规范

  1. 不区分大小写,建议关键字大写,表名,列名大写

  2. 每行命令最好用分号结尾

  3. 每行命令根据需要,可以进行换行,或缩进

  4. 注释

    单行注释:#注释文字

    单行注释:-- 注释文字

    多行注释:/* 注释文字 */

SQLyog快捷键

F9 运行

F12 格式化代码

‘ ’ 为着重号,强调在其中的表示为字段,

DQL

(Data QueryLanguage 数据查询语言)

基础查询

	语法:
	select 查询列表 from 表名

	类似于:System.out.println(打印东西)

	特点:
1、查询列表可以是:表中的字段、常量值、表达式、函数
2、查询的结果是一个虚拟的表格

方法:
1、查询表中的单个字段
	SELECT 【查询字段】 FROM 【表名】
2、查询表中的多个字段
	SELECT 【查询字段1,查询字段2,···】 FROM 【表名】
3、查询表中所有字段
	SELECT * FROM 【表名】
4、拼接字段
SELECT CONCAT (字段1,字段2,···)  AS  【定义名称】 FROM 【表名】
5、判断是否为空
SELECT IFNULL(【查询字段】,‘为空时输出0’) 
6、select null + 0; 只要其中一方为null,则结果肯定为null。

条件查询

语法:
	select
		查询列表 ③
	from
		表名 ①
	where
		筛选条件 ②

模糊查询

like
between and
in
is null

常见函数

概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1.隐藏了实现细节,2.提高代码的重用性。
调用:select 函数名(实参列表) 【from 表】;
特点:
	1、叫什么(函数名)
	2、干什么(函数功能)
单行函数
一、字符函数

concat:连接

substr:截取子串

upper:变大写

loewer:变小写

replace:替换

length:获取参数值的字节个数

trim:去前后空格

lpad:左填充

rpad:右填充

instr:获取子串第一次出现的索引

二、数学函数

ceil:向上取整

floor:向下取整

round:四舍五入

mod:取模

truncate:截断

rand:获得随机数,返回0-1之间的小数

三、日期函数

now:返回当前日期+时间

year:返回年

month:返回月

day:返回日

date_format:将日期转换成字符

curdate:返回当前日期

str_to_date:将字符转换成日期

curtime:返回当前时间

hour:小时

minute:分钟

second:秒

datediff:返回两个日期相差的天数

monthname:以英文形式返回月

四、其他函数

version:当前数据库服务器的版本

database:当前打开的数据库

user:当前用户

password(‘字符’):返回该字符的密码形式

MD5(‘字符’):返回该字符的md5加密形式

五、流程控制函数

1、if(条件表达式,表达式1,表达式2);如果条件表达式成立,返回表达式1,否则返回表达式2

2、case情况1

case 变量或表达式或字段

when 常量1 then 值1

when 常量2 then 值2

else 值n

end

case情况2

case

when 条件1 then 值1

when 条件2 then 值2

else 值n

end

分组函数
	其功能:做统计使用,又称为统计函数,聚合函数,组函数。
	sum 求和
	avg 平均值
	max 最大值
	min 最小值
	count 计算个数
特点:
1.sum、avg一般用于处理数值型
  max、min、count可以处理任何类型
2.以上分组函数都忽略null值

分组查询

语法:
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】

特点:

一、

1、分组查询中的筛选条件分为两类

2、分组函数做条件肯定放在having子句中

3、能优先考虑分组前筛选的,就优先考虑使用分组前(性能)

二、

1、group by 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用的较少)

2、也可以添加排序(排序放在整个分组查询的最后)

数据源位置关键字
分组前筛选原始表group by子句的前面where
分组后筛选分组后的结果集group by子句的后面having

连接查询

含义:

也叫多表查询,当查询的字段来自多个表示,就会用到连接查询

若不加任何条件,而直接查多个表,则会发生笛卡尔乘积现象

表一:m行,表二:n行,结果 = m*n行 

分类:

​ 按年代分类:

​ sql92标准 仅仅支持内连接

​ sql99标准 【推荐】支持内连接+外连接(左外和右外)+交叉连接

​ 按功能分类:
​ 内连接:

​ 等值连接

  1. 多表等值连接的结果为多表的交集部分
  2. n表连接,至少需要n-1个连接条件
  3. 多表的顺序没有要求
  4. 一般需要为表起别名
  5. 可以搭配前面介绍的所有查询子句,比如排序,分组,筛选

​ 非等值连接

​ 自连接

​ 外连接:

​ 左外连接

​ 右外连接

​ 全外连接

​ 交叉连接

连接查询时,一般会为表起别名,避免有歧义产生。如果表起了别名,则查询的字段就不能使用原来的表名去限定。

sql99语法
	select 查询列表
	from 把表1 别名 【连接类型】
	join 表2 别名
	on 连接条件
	【where 筛选条件】
	【group by 分组】
	【having 筛选条件】
	【order by 排序列表】
分类
内连接:inner
外连接
	左外:left 【outer】
	右外:right【outer】
	全外:full【outer】
交叉连接:cross
	
内连接:
语法:
	select 查询列表
	from 表1 别名
	inner join 表2 别名
	on 连接条件;
外连接:
应用场景:用于查询一个表中有,另一个表没有的记录

特点:
1、外连接的查询结果为主表中的所有记录
	如果从表中有和它匹配的,则显示匹配的值
	如果从表中没有和它匹配的,则显示null
	外连接查询结果=内连接查询结果+主表中有而从表中没有的记录
2、左外连接,left	左边的是主表
   右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序可以实现同样的效果
	
全外连接:
=内连接的结果+表1中有但表2没有的+表2中有但表1中没有的

image-20211227235050074

子查询

含义:出现在其他语句中select语句,称为子查询或内查询

外部的查询语句,称为主查询或外查询

分类

按子查询出现的位置:

select后面
		仅仅支持标量子查询
from后面
		支持表子查询
		将子查询结果充当一张表,要去必须起别名
where或having后面  (重要)
		`标量子查询(单行)
		`列子查询(多行)
		行子查询
exists后面(相关子查询)
		表子查询
		

按结果集的行列数不同

标量子查询(结果只有一行一列)
列子查询(结果集只有一行多列)
in、any/some、all
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)

特点

  1. 子查询放在小括号内
  2. 子查询一般放在条件的右侧
  3. 标量子查询,一般搭配着单行操作符使用
  4. 子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果
多行子查询:

返回多行

操作符含义
IN/NOT IN等于列表中任意一个
ANY|SOME和子查询返回的某一个值比较
ALL和子查询返回的所有值比较
相关子查询:

语法:

exists(完整的查询语句)

结果:

1或0

分页查询

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求

语法:

select 查询列表
from 表
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit 【offset,】size;

offset 要显示条目的起始索引(起始索引从0开始)
size 要显示的条目个数

特点:

limit语句放在查询语句的最后,执行顺序也是最后
公式:
	要显示的页数page,每页的条目数size
	select 查询列表
	from 表
	limit (page-1)*size,size
	size=10
	page
	1	0
	2	10
	3	20
select 查询列表
from 表
连接类型 join 表2
on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 偏移,条目数

联合查询

union 联合 合并

将多条查询语句的结果合并成一个结果

应用场景:

要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

特点:

  1. 要求多条查询语句的查询列数是一致的;
  2. 要求多条查询语句的查询的每一列的类型和顺序最好一致
  3. union关键字默认去重,如果使用union all可以包含重复项

DML

数据操作语言

插入:insert

修改:update

删除:delete

插入语句

语法:

方式一:

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

支持插入多行
支持子查询

方式二:

insert into 表名
set 列名=值,列名=值,...

不支持插入多行
不支持子查询

1.插入的值的类型要与列的类型兼容

2.不可以为null的列必须插入值,可以为null的列如何插入值?

方法一:对不想插入值的位置以null代替
方法二:对不想插入值的列名,直接不写列名,值也不写

3.列的顺序可以调换

4.列数和值的个数必须一致

5.可以省略列名,默认所有列,而且列的顺序和表中的顺序一致

表名

列名

新值

修改语句

1.修改单表的记录(!)

语法:
update	表名
set		列=新值,列=新值,...
where	筛选条件;

2.修改多表的记录

sql92语法:
update 表1 别名,表2 别名
set	列=值,...
where 连接条件
and 筛选条件
sql99语法:
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,...
where 筛选条件

删除语句

方式一:delete

语法:

delete from 表名 where 筛选条件

1、单表的删除【掌握】

delete from 表名 where 筛选条件

2、多表的删除【补充】

sql92语法:
delete 表1的别名,表2的别名
from   表1 别名,表2 别名
where  连接条件
and    筛选条件;
sql99语法:
delete 表1的别名,表2的别名
from   表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件

方式二:truncate

语法:

删除表中全部数据

truncate table 表名;

不能加where条件

对比:

1.如果delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始;
2.truncate删除没有返回值,delete删除有返回值;
3.truncate删除不能回滚,delete删除可以回滚。

DDL

数据定义语言

库和表的管理

一、库的管理

创建、修改、删除

1.库的创建

语法:

create database	库名;

CREATE DATABASE IF NOT EXISTS 库名;
#表示如果没有则创建 没有则不创建

2.库的修改

更改字符集

ALTER DATABASE 库名 CHARACTER SET gbk...

3.库的删除

DROP DATABASE 库名;

二、表的管理

1.表的创建

语法:

create table 表名(
		列名 列的类型【(长度) 约束】,
		列名 列的类型【(长度) 约束】,
		列名 列的类型【(长度) 约束】,
		...
		列名 列的类型【(长度) 约束】,
	) 
创建、修改、删除

关键字:

创建:create
修改:alter
删除:drop

2.表的修改

1.修改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
2.修改列的类型或约束
3.添加新列
4.删除列
5.修改表名
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;

3.表的复制

1.仅仅复制表的结构
CREATE TABLE 复制表名 LIKE 原表名;
2.复制表的结构+数据
CREATE TABLE 复制表名
SELECT * FROM 原表;
3.只复制部分数据
CREATE TABLE 复制表名
SELECT 部分列
FROM 原表
WHERE 筛选条件;
4.仅仅复制某些字段
CREATE TABLE 复制表名
SELECT 部分列
FROM 原表
WHERE 0;

数据类型

数值型:
	整型:
		分类:
			tinyint、		1
			smallint、		2
			mediumint、		3
			int/integer、	4
			bigint			8
		特点:1.如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,
			 2.如果插入的数值超出了整型的范围,会报out of range 异常,并且插入临界值,
			 3.如果不设置长度,会有默认的长度,长度代表了显示的最大宽度,如果不够用0在左边填充,但必须搭配zerofill使用
	小数:	
​			定点型
			float(M,D)
			double(M,D)
​			浮点型
			dec(M,D)
			decimal(M,D)
	特点:
	1.M 整数部位+小数部位
	  D 小数部位
	如果超过范围,则插入临界值
	2.M,D都可以省略
	如果是decimal,则 M 默认为 10,D 默认为 0
	如果是float和double,则会根据插入的数值的精度来决定精度
	
原则:所选择的类型越简单越好,能保存数值的类型越小越好
字符型:
​		较短的文本:char、varchar
​		较长的文本:text、blob(较长的二进制数据)
写法M特点空间耗费效率
charchar(M)最大的字符数 可省略固定长度的字符比较耗费
varcharvarchar(M)最大的字符数 不能省可变长度的字符比较节省

其他:

binary 和 varbinary 用于保存较短的二进制

enum 用于保存枚举

set 用于保存集合

日期型:
日期和时间类型字节最小值最大值
date41000-01-019999-12-21
datetime81000-01-01 00:00:009999-12-31 23:59:59
timestmp4197001010800012038年的某个时刻
time3-838.59:59838:59:59
year119012155

datetime 不受时区的影响

timestamp 受时区的影响

常见约束

含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

分类: 
	NOT NULL: 	  非空,用于保证该字段的值不能为空,比如姓名、学号等
	DEFAULT:	  默认,用于保证该字段有默认值,比如性别
	PRIMARY KEY:  主键,用于保证该字段的值具有唯一性,并且非空,比如学号、员工编号等
	UNIQUE:	      唯一,用于保证该字段的值具有唯一性,可以为空,如座位号,
	CHECK:		  检查约束【mysql不支持,不报错,但无效果】,比如年龄,性别
	FOREIGN KEY:  外键,用于限制两个表的关系,用于保证该字段的值必须来自与主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值,比如学生表的专业编号、员工表的工种编号。

语法:

CREATE TABLE 表名(
	字段名 字段类型 约束
)

添加约束的时机:

1.创建表时
2.修改表时

约束的添加分类:

列级约束:
	六大约束语法上都支持,但外键约束没有效果
表级约束:
	除了非空、默认,其他都支持
	语法:
		在各个字段的最下面
		【CONSTRAINT 约束名】 约束类型(字段名)

主键和唯一的对比

保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键至多一个是,不推荐
唯一可以有多个是,不推荐

外键:

1.要求在从表设置外键关系
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一)
4.插入数据时,先插入主表,再插入从表,
  删除数据时,先删除从表,再删除主表

可以通过以下两种方式来删除主表的记录

方法一:级联删除
alter table 表名 add constraint 【fk_stu_major 命名】 foreign key(字段) references 表2(id) on delete cascade;
方法二:级联置空
alter table 表名 add constraint 【fk_stu_major 命名】 foreign key(字段) references 表2(id) on delete set null;
修改表时添加约束

1.添加列级约束

alter table 表名 modify column 字段名 字段类型 新约束;

2.添加表级约束

alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
修改表时删除约束

约束若为空即为删除

alter table 表名 modify column 字段名 字段类型 【null】

列级约束是不支持起名字的,标记约束是可以的

难度练习:

向表emp2中添加列dep_id,并在其中定义FOREIGN KEY约束,与之相关的列式dept2表中的id列

alter table emp2 add column dept_id int;
alter table emp2 add constraint fk_emp2_dept2 foreign key(dept_id) references dept2(id);
位置支持的约束类型是否可以起约束名
列级约束列的后面语法都支持,但外键没有效果不可以
表级约束所有列的下面默认和非空不支持,其他支持可以(主键没有)

标识列

又称为自增长列

含义:可以不用手动的插入值,系统提供默认的序列值

特点:

​ 1.标识列必须和主键搭配吗?不一定,但要求是一个key。

​ 2.一个表可以有几个标识列?至多一个

​ 3.标识列的类型 必须是数值型

​ 4.标识列可以通过set auto_increment_increment = ?

设置步长,可以通过 手动插入值,设置起始值

修改表时设置标识列

alter table 表名 modify column 字段名 int 约束 auto_increment;

修改表时删除标识列

alter table 表名 modify column 字段名 int 约束;

TCL

Transation Control Language 事务控制语言

事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句时相互依赖的,而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个执行单元将会回滚,所有受到影响的数据将返回到事物开始以前的状态;如果单元中所有SQL语句均执行成功,则事务被顺利执行

事务的ACID属性

1.原子性:(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2.一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3.隔离性(Isolation)

事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4.持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其由任何影响。

事务的创建

隐式事务:事务没有明显的开启和结束的标记

比如 insert、update、delete语句

delete from 表 where id = 1;

显示事务:事务具有明显的开启和结束标记

前提:必须先设置自动提交功能为禁用

步骤1:开启事务
set autocommit = 0;
start transaction;(可选的)
步骤2:编写事务中的sql语句 指(select、insert、update、delete)
语句1,
语句2,
...
步骤3:结束事务
commit;提交事务
rollback;回滚事务
savepoint 节点名; 设置保存点
update 表 set 

数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题

脏读:对两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。

不可重复读:对两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了。

幻读:对两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取同一个表,就会多出几行

数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会互相影响,避免各种并发问题。

数据库提供的4种事务隔离级别

隔离级别描述
READ UNCOMMITTED(读未提交数据)允许事务读取未被其他事务提交的变更,脏读,不可重复读和幻读的问题都会出现
READ COMMITED只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现
REPEATABLE READ确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在
SERIALIZABLE(串行化)确保事务从一个表中读取相同的行在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,,但性能十分低下

Mysql 支持4种事务隔离级别,Mysql默认的事务隔离级别为:REPEATABLE READ

脏读不可重复读幻读
read uncommitted
read committed
repeatable read
serializable

展示隔离级别

mysql中:
select @@transaction_isolation;

设置当前MySQL连接的隔离级别

set transaction isolation level read committed;

全局隔离级别:

set global transaction isolation level read committed;

视图

含义:5.0.1版本开始提供视图功能,一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果

应用场景

  • 多个地方用到同样的查询结果
  • 该查询结果使用的sql语句较复杂

创建视图

语法:

create view 视图名;
as
查询语句;

特点:

重用sql语句
简化复杂的sql操作,不必知道它的查询细节
保护户户,提高安全性

修改视图

方式一:

create or replace view 视图名
as
查询语句

方式二:

alter view 视图名
as
查询语句;

删除视图

drop view 视图名,视图名,...;

查看视图

desc 视图

show create view 视图

视图的更新

1.插入
create or replace view 视图   
2.修改
update 视图 set 修改内容 where 筛选
3.删除
delete from 视图 where 筛选
#5.视图的更新
CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;
SELECT * FROM myv1;
SELECT * FROM employees;
#1.插入,同时也会修改原始表
INSERT INTO myv1 VALUES('张飞','sa@qq.com');

#2.修改,同时也会修改原始表
UPDATE myv1 SET last_name = '张无忌' WHERE last_name ='张飞';

#3.删除,同时也会删除原始表对应的内容
DELETE FROM myv1 WHERE last_name = '张无忌';

具备以下特点的视图不允许更新

1.包含以下关键字的sql语句,分组函数,distinct、group by、having、union、或者union all
2.常量视图
3.select 中包含的子查询
4.join
5.from一个不能更新的视图
6.where子句的字查询引用了from子句中的表

变量

系统变量:
		全局变量
		会话变量
自定义变量:
		用户变量
		局部变量

一、系统变量

说明:变量由系统提供,不是用户定义,属于服务器层面

注意:
如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session。

语法:

1.查看所有的系统变量
show global|【session】 varibeles;

2.查看满足条件的部分系统变量
如:show global|【session】 varibeles like '%char%';

3.查看指定的某个系统变量的值
select @@global|【session】.系统变量名;

4.为某个具体的系统变量赋值
方式一:
set 系统变量名|【session】 系统变量名 = 值;
方式二:
set @@global|【session】.系统变量名=值;

global是全局,session是会话
全局变量

作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启。

会话变量

作用域:仅仅针对当前会话(连接)有效

为某个会话变量赋值
方式一:
set @@.transaction_isolation='read-uncommitted';
方式二:
set session transaction_isolation = 'read-committed';

查看指定的某个会话的变量
select @@transaction_isolation;

二、自定义变量

说明,变量是用户自定义的,不是由系统的

使用步骤
	声明
	赋值
	使用(查看、比较、运算等)

1、用户变量

作用域:针对于当前会话(连接)有效,同于会话变量的作用域,应用在任何地方,也就是begin end 里面或begin end

赋值的操作符:=或 :=

1.声明并初始化
set @用户变量名=值;或
set @用户变量名=值;或
select @用户变量名:=值;

2.赋值(更新用户变量的值)
方式一:通过 set 或 select
	set @用户变量名=值;或
	set @用户变量名=值;或
	select @用户变量名:=值;
方式二:通过select into
	select 字段 into 变量名
	from 表;
3.使用(查看用户变量的值)
	select @用户变量名;

2、局部变量

作用域:仅仅在定义它的begin end 有效

应用在 begin end 中的第一句话 !!!

1.声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;

2.赋值
方式一:通过set或select
	set 局部用户变量名=值;或
	set 局部用户变量名:=值;或
	select @用户变量名:=值;
方式二:通过SELECT INTO
	SELECT 字段 INTO 局部变量名
	FROM 表;
	
3.使用
select 局部变量名;

对比用户变量和局部变量:

作用域定义和使用的位置语法
用户变量当前会话会话中的任何地方必须加@符号,不用限定类型
局部变量BEGIN END中只能在BEGIN END中,且为第一句话一般不用加@符号,需要限定类型

存储过程和函数

存储过程和函数,类似于java中的方法

好处:

1.提高代码的重用性
2.简化操作

存储过程

含义:一组预先编译好的SQL语句的集合,理解成批处理语句

1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
一、创建语法
create procedure 存储过程名(参数列表)
BEGIN 
	存储过程体(一组合法的SQL语句)
END
注意:

1.参数列表包含三部分
参数模式	参数名		参数类型
IN	stuname	VARCHAR(20)

参数模式:
IN: 该参数可以作为输入,也就是该参数需要 调用方 传入值
OUT: 该参数可以作为输出,也就是该参数可以作为返回值
INOUT: 该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

2.如果存储过程体仅仅只有一句话,BEGIN END可以省略
存储过程中的每条SQL语句的结尾要求必须加分号,
存储过程的结尾可以使用 DELIMITER重新设置。

DELIMITER 结束标记

如:DELIMITER $
二、调用语法
CALL 存储过程名(实参列表);
三、执行操作

在命令行窗口:

1.创建空参模式的存储过程

USE girls;

DELIMITER $
CREATE PROCEDURE myp1()
BEGIN 
	INSERT INTO admin(username,`password`) 
	VALUES('join1','0000'),('join1','0000'),('in1','003'),('oin1','00130'),('jin1','004230');
	
END $

#调用
CALL myp1()$

2.创建带in模式参数的存储过程

IN: 该参数可以作为输入,也就是该参数需要 调用方 传入值

3.创建带out模式参数的存储过程

OUT: 该参数可以作为输出,也就是该参数可以作为返回值

image-20211229171940843

4.创建带inout模式的存储过程

#4.创建带inout模式的存储过程
#案例1:传入a和b两个值,最终a和b都翻倍并返回
CREATE PROCEDURE myp7(INOUT a INT, INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END $

SET @m=10$
SET @n=20$
CALL myp7(@m,@n)$

SELECT @m,@n$
四、删除存储过程
语法:
drop procedure 存储过程名;

注意:此语法不支持多个存储过程的删除

五、查看存储过程的信息
show create procedure 存储过程名

函数

含义

一组预先编译号的SQL语句的集合,理解成批处理语句

1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

与存储过程的区别

定义返回特点
存储过程可以有0个返回,也可以有多个返回,适合做批量的插入,批量更新
函数有且仅有1个返回适合做处理数据后返回一个结果

一、创建语法

create function 函数名(参数列表) returns 返回类型
begin
	函数体
end

注意: 
1.参数列表 包含两部分
参数名 参数类型

2.函数体,肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议

3.函数体中只有一句话,则可以省略begin and

4.设置delimiter语句设置结束标记

二、调用语法

select 函数名(参数列表)

执行函数时,若出现1418错误:

先查看

SHOW VARIABLES LIKE '%log_bin_trust_function_creators%';查看一下状态

若为 off 则;

SET GLOBAL log_bin_trust_function_creators = 1;

即可:意为:开启创建函数功能

三、查看函数

show create function 函数名

四、删除函数

drop function 函数名

案例

#1.创建函数,实现传入两个float,返回两者之和

CREATE FUNCTION test_fun1(num1 FLOAT, num2 FLOAT) RETURNS FLOAT
BEGIN 
	DECLARE SUM FLOAT DEFAULT 0;
	SET SUM = num1+num2;

	RETURN SUM;
END $

SELECT test_fun1(12,13)$

image-20211229210521860

流程控制结构

顺序结构:程序从上往下依次执行;
分支结构:程序从两条或多条路径中选择一条去执行;
循环结构:程序在满足一定条件的基础上,重复执行一段代码

一、分支结构

1. if 函数

功能:实现简单的双分支

语法:

if(表达式1,表达式2,表达式3)
如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值

应用:任何地方

2. case 结构
情况1:类似于java中的switch语句,一般用于实现等值判断
情况2:类似于java中多重if语句,一般用于实现区间判断
情况1:
语法:
	CASE 变量|表达式|字段
	WHEN 要判断的值 THEN 返回的值1或语句1;
	WHEN 要判断的值 THEN 返回的值2或语句2;
	...
	ELSE 要返回的值n或语句n;
	END CASE;
情况2:
语法:
	CASE
	WHEN 要判断的条件1 THEN 返回的值1或语句1;
	WHEN 要判断的条件2 THEN 返回的值2或语句2;
	...
	ELSE 要返回的值n或语句n;
	END CASE;

特点:

  1. 可以作为表达式:
此时可嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中或 BEGIN END 的外面

可以作为独立的语句去使用:

只能放在 BEGIN END 中
  1. 如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE。如果都不满足,则执行ELSE中的语句或值

  2. ELSE可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NULL

3. if 结构

功能:实现多重分支

语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
【else 语句n;】
end if;

应用在begin end 中

二、循环结构

分类

while、loop、repeat

循环控制:

iterate 
	类似于 continue 继续,结束本次循环,继续下一次
leave
	类似于 break 跳出 结束当前所在的循环

1.while

while 循环条件 do
	循环体;
end while【标签】;

2.loop

【标签:】loop
	循环体;
end loop 【标签】;

可以用来描述简单的死循环

3.repeat

【标签:】repeat
	循环体;
until 结束循环条件
end repeat 【标签】;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值