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服务的登录和退出
-
通过mysql自带的客户端
只限于root用户
-
通过windows自带的客户端
登录:
mysql [-h主机名 -P端口号] -u用户名 -p密码
注意上方的大小写,以及方括号框中的为在本地用户下可以省略的部分。
退出:
exit 或 ctrl + C
Mysql的常见命令
-
查看当前所有的数据库
show databases;
-
打开指定的库
use 【库名】
-
查看当前库的所有表
show tables;
-
查看其他库的所有表
show tables from 【库名】;
-
创建表
create table 【表名】( 列名 列类型, 列名 列类型, ··· );
-
查看表结构
desc 【表名】
-
查看服务器版本
-
登录到mysql服务器
select version();
-
没有登录到mysql服务器
mysql --version 或 mysql --V
-
Mysql的语法规范
-
不区分大小写,建议关键字大写,表名,列名大写
-
每行命令最好用分号结尾
-
每行命令根据需要,可以进行换行,或缩进
-
注释
单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/* 注释文字 */
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标准 【推荐】支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
- 多表等值连接的结果为多表的交集部分
- n表连接,至少需要n-1个连接条件
- 多表的顺序没有要求
- 一般需要为表起别名
- 可以搭配前面介绍的所有查询子句,比如排序,分组,筛选
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
连接查询时,一般会为表起别名,避免有歧义产生。如果表起了别名,则查询的字段就不能使用原来的表名去限定。
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中没有的
子查询
含义:出现在其他语句中select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
分类:
按子查询出现的位置:
select后面
仅仅支持标量子查询
from后面
支持表子查询
将子查询结果充当一张表,要去必须起别名
where或having后面 (重要)
`标量子查询(单行)
`列子查询(多行)
行子查询
exists后面(相关子查询)
表子查询
按结果集的行列数不同
标量子查询(结果只有一行一列)
列子查询(结果集只有一行多列)
in、any/some、all
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
特点
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配着单行操作符使用
- 子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果
多行子查询:
返回多行
操作符 | 含义 |
---|---|
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 联合 合并
将多条查询语句的结果合并成一个结果
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
- 要求多条查询语句的查询列数是一致的;
- 要求多条查询语句的查询的每一列的类型和顺序最好一致
- 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 | 特点 | 空间耗费 | 效率 | |
---|---|---|---|---|---|
char | char(M) | 最大的字符数 可省略 | 固定长度的字符 | 比较耗费 | 高 |
varchar | varchar(M) | 最大的字符数 不能省 | 可变长度的字符 | 比较节省 | 低 |
其他:
binary 和 varbinary 用于保存较短的二进制
enum 用于保存枚举
set 用于保存集合
日期型:
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-12-21 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
timestmp | 4 | 19700101080001 | 2038年的某个时刻 |
time | 3 | -838.59:59 | 838:59:59 |
year | 1 | 1901 | 2155 |
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: 该参数可以作为输出,也就是该参数可以作为返回值
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)$
流程控制结构
顺序结构:程序从上往下依次执行;
分支结构:程序从两条或多条路径中选择一条去执行;
循环结构:程序在满足一定条件的基础上,重复执行一段代码
一、分支结构
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;
特点:
- 可以作为表达式:
此时可嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中或 BEGIN END 的外面
可以作为独立的语句去使用:
只能放在 BEGIN END 中
-
如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE。如果都不满足,则执行ELSE中的语句或值
-
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 【标签】;