MySQL8
2022-12-12 11:05:49 29 举报
AI智能生成
MySQL是一个开源的关系型数据库管理系统,由瑞典公司MySQL AB开发,现在属于甲骨文公司。它使用结构化查询语言(SQL)作为访问和管理数据的主要方式。MySQL被广泛应用于各种类型的应用中,包括网站、网络应用、嵌入式设备等。 MySQL具有高性能、稳定性强、易于使用和扩展等优点。它支持多种操作系统,如Windows、Linux、MacOS等,并且提供了丰富的客户端工具和API,方便开发者进行数据库操作和管理。此外,MySQL还支持多种存储引擎,如InnoDB、MyISAM等,可以根据不同的应用场景选择合适的存储引擎。
作者其他创作
大纲/内容
数组、集合等存储在内存:断电即丢;文件:不方便查询
数据库:1、持久化数据到本地2、可以实现结构化查询,方便管理
数据库的好处
程序员使用数据库管理系统通过结构化查询语言操作数据库
DB、DBMS、SQL的区别
找到mysql安装路径下的my.ini配置文件,可以修改port(端口)、basedir(安装目录)、datadir(建库目录)、character-set-server(字符集)、default-storage-engine=INNODB(数据库引擎)
Mysql的配置文件(注:配置修改后需要重启服务)
删除软件删除Program Files(x86)下的mysql文件夹删除ProgramData下的文件夹清理注册表:HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\Eventlog\\Application\\MySQL 目录HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet002\\Services\\Eventlog\\Application\\MySQL 目录HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\MySQL 目录HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControl001\\Services\\MySQL 目录HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControl002\\Services\\MySQL 目录HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\MySQL 目录
Mysql卸载
net start|stop MySQL80(这里是数据库服务名称)
Mysql服务的启动和停止
MySQL的卸载和安装
mysql 【-h localhost -P 3306】 -u root -p
数据库的登录和退出
MySQL常见命令
认识MySQL
select 查询列表《3》from 表《1》【where 筛选条件】《2》order by 排序列表【asc|desc】《4》(注:排序列表支持单个字段、多个字段、函数、表达式、别名)【limit】
MySQL的执行顺序
按表达式排序
按别名排序
按函数排序
排序查询
类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
概念
1、隐藏了实现细节 2、提高代码的重用性
好处
select 函数名(实参列表) 【from 表】;
调用
SELECT LENGTH('john')
length 获取参数值的字节个数
concat 拼接字符串
upper/lower
substr/substring 截取从指定索引处开始的字符(注:MySQL数据库索引从1开始)
instr 返回字符串第一次出现的索引,如果找不到返回0
SELECT TRIM(' a b c ');SELECT TRIM('a' FROM 'aaaaaaaaaa雪aaaaa丽aaaaaaaaa');SELECT TRIM('aa' FROM 'aaaaaaaaaa雪aaaaa丽aaaaaaaaa');
trim 截取去除两边的空格或指定的字符后的字符串
lpad/rpad 指定的字符实现左/右填充指定长度
replace 替换所有
字符函数
round 四舍五入(可以先求绝对值再标正负)
SELECT CEIL(-1.02);SELECT FLOOR(-9.12);
ceil/floor 向上/下取整
truncate 截断
mod 取余
rand 获取随机数,返回0——1之间的小数
数学函数
SELECT NOW();
now 返回当前系统日期+时间
SELECT CURDATE();
curdate 返回当前系统日期
SELECT CURTIME();
curtime 返回当前系统时间
SELECT YEAR(NOW()) 年;SELECT YEAR(hiredate) 年 FROM employees;SELECT MONTHNAME(hiredate) 月 FROM employees;
可以获取指定的部分,年、月、日、时、分、秒
str_to_date 将日期格式的字符串转换成指定格式的日期
date_format 将日期转换成字符
datediff 返回两个日期相差的天数
SELECT MONTHNAME('2022-11-1');
monthname 以英文形式返回月
举例
日期函数
SELECT VERSION();————数据库版本
SELECT DATABASE();————查看当前数据库
结果:root@localhost
SELECT USER();————查看当前登录用户
结果:1b1e9c25a408bcea606a3513da3b7807
SELECT MD5('贵雪丽');————MySQL8 MD5加密,MySQL5 使用PASSWORD()函数加密
其他函数
if函数 (if else的效果)
JAVA中switch(变量或表达式){ case 常量1:语句1;break; ... default:语句n;break;}
MySQL中case 要判断的字段或表达式when 常量1 then 要显示的值1或语句1;when 常量2 then 要显示的值2或语句2;...else 要显示的值n或语句n;end
案例:查询员工的工资,要求部门号=30,显示的工资为1.1倍部门号=40,显示的工资为1.2倍部门号=50,显示的工资为1.3倍
case函数的使用一:switch case的效果
JAVA中if(条件1){ 语句1;}else if(条件2){ 语句2;}...else{ 语句n;}
MySQL中casewhen 条件1 then 要显示的值1或语句1when 条件2 then 要显示的值2或语句2...else 要显示的值n或语句n;end
案例:查询员工工资的情况工资大于20000,A级别工资大于15000,B级别工资大于10000,C级别否则,D级别
case函数的使用二:类似于 多重if
流程控制函数
单行函数:concat、length、ifnull等
做统计使用,又称为统计函数、聚合函数、组函数。
功能
sum求和、avg平均值、max最大值、min最小值、count计算非空个数
分类
sum/avg处理数值型,max/min/count处理任何类型
特点
SELECT SUM(salary) FROM employees;
简单使用
参数支持哪些类型
以上分组函数都忽略null值
和distinct搭配
SELECT COUNT(salary) FROM employees;SELECT COUNT(*) FROM employees;————效率高SELECT COUNT(1) FROM employees;
count函数的详细介绍
和分组函数一同查询的字段要求是group by后的字段
分组函数
常见函数
语法
分组函数做条件肯定放在having子句中
考虑性能,能用分组前筛选的,就优先使用分组前筛选
分组查询中的筛选条件分为两类
group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数()
也可以添加排序(排序放在整个分组查询的最后)
按单个字段分组
按多个字段分组
分组查询
又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
含义
表1 有m行,表2有n行,结果=m*n行
笛卡尔乘积现象
按年代分类: sql92标准:仅支持内连接 sql99【推荐】:支持内连接(等值、非等值、自连接)+外连接(左外、右外)+交叉连接
按功能分类: 内连接:等值连接、非等值连接、自连接 外连接:左外连接、右外连接、全外连接(mysql不支持) 交叉连接
①多表等值连接的结果为多表的交集部分②n表连接,至少需要n-1个连接条件③多表的顺序无要求④一般需要为表起别名
等值连接
非等值连接
自连接
注:mysql不支持外连接,oracle、sqlserver支持
sql92标准
select 查询列表from 表1 别名join 表2 别名on 连接条件【where 筛选条件】【group by 分组字段】【having 分组后的筛选条件】【order by 排序列表】分类: 内连接:【inner】 join 外连接: 左外:left 【outer】 右外:right 【outer】 全外:full 【outer】 交叉连接:cross
on后面放连接条件,where后面放筛选条件,提高分离性,便于阅读
用于查询一个表中有,另一个表没有的记录
应用场景
外连接的查询结果为主表中的所有记录 如果从表中有和它匹配的,则显示匹配的值 如果从表中没有和它匹配的,则显示null 外连接查询结果=内连接查询结果+主表中有而从表中没有的记录
左外连接,left join左边的是主表右外连接,right join右边的是主表
左外和右外交换两个表的顺序,可以实现同样的效果
外连接
select <select_list> FROM A FULL JOIN B ON A.key=B.key;
全外连接
CROSS JOIN
出现在其他语句中的select语句,称为子查询或内查询;外部的其他查询,成为主查询或外查询
按子查询出现的位置: select后面: 仅仅支持标量子查询 from后面: 支持表子查询 where或having后面(*): 标量子查询(*)、列子查询(*)、行子查询 exists后面(相关子查询): 表子查询
按结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集有一行多列) 表子查询(结果集一般为多行多列)
①子查询放在小括号内②子查询一般放在条件的右侧③标量子查询,一般搭配着单行操作符使用:> < >= <= = <> 列子查询,一般搭配着多行操作符使用:in any/some/all
#案例1:谁的工资比Abe1高?SELECT *FROM employeesWHERE salary>(SELECT salary FROM employees WHERE last_name='Abel');
标量子查询(单行子查询)
注:“in”等价于“=ANY”, “not in”等价于“<>ALL”
列子查询(多行子查询)
行子查询(多行多列)
where或having后面
#案例2:查询员工号=102的部门名SELECT (SELECT department_name FROM departments d INNER JOIN employees e ON d.department_id=e.employee_id WHERE e.employee_id=102) 部门名;
select后面
from后面(将子查询结果充当一张表,要求必须起别名)
#案例:查询有员工的部门名SELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.department_id=e.department_id);
exists后面
SELECT department_name FROM departments d WHERE department_id IN (SELECT DISTINCT department_id FROM employees);
in后面
子查询
sql99标准
连接查询
一页显示不全,需要分页提交sql请求
1、limit语句放在查询语句的最后2、公式:要显示的页数page,每页的条目数size
#案例1:查询前五条的员工信息 span style=\
#案例2:有奖金的员工信心,并且工资高的前10名显示出来 SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 10;
分页查询
方式一
方式二
查询平均工资最低的部门信息
经典例子
union 联合 合并:将多条查询语句的结果合并成一个结果应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致
1、要求多条查询语句的查询列数是一致的2、要求多条查询语句的每一列的类型和顺序最好一致3、union关键字默认去重,如果使用union all可以包含重复项
方式一:select * from employees where email like '%a%' or department_id>90;
方式二:select * from employees where email like '%a%' union select * from employees where department_id>90
#案例:查询部门编号>90或邮箱包含a的员工信息
联合查询
DQL
插入
修改单表的记录
修改多表的记录
修改
delete from table 【where 筛选条件】
删除单表的记录
删除多表的记录
delete
truncate table 表名
truncate
1.trumcate删除后,如果再插入,标识列从1开始delete删除后,如果再插入,标识列从断点开始2delete可以添加筛选条件truncate不可以添加筛选条件3.trumcate效率较高4trucate没有返回值delete可以返回受影响的行数5.truncate不可以回滚delete可以回滚
两种方式的区别
删除
DML
create database 【if not exists】库名 【chartacter set 字符集名】
创建库
alter database 库名 【chartacter set 字符集名】
修改库
drop database 【if exists】数据库名
删除库
库的管理
创建表
alter table 表名 add column 列名 类型[first/after 字段名]
添加列
alter table 表名 modify column 列名 新类型【新约束】
修改列的类型或约束
alter table 表名 change column 日列名 新列名类型
修改列名
alter table 表名 drop column 列名;
删除列
alter table 表名 renane [to] 新表名
修改表名
修改表
drop table 【if exists】 表名
删除表
create table emp2 like emp;
表结构复制
只复制部分结构
create table emp30 【as】 select * from emp;
表结构+数据复制
create table emp1 as select *from emp where id=101;
只复制部分结构+数据
复制表
表的管理
1
tinyint
2
smallint
3
mediumint
4
int/integer
8
bigint
1、都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号2、如果超出了范围,会报out or range异常,插入临界值3、长度可以不指定,默认会有一个长度长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofi11,并且默认变为无符号整型
整型
定点数
浮点数
1、M代表整数部位+小数部位的个数,D代表小数部位2、如果超出范围,则报out or range异常,并且插入临界值3、M和D都可以省略,但对于定点数,M默认为10,D默认为04、如果精度要求较高,则优先考虑使用定点数
浮点型
数值型
char、varchar、binary、varbinary、enun、 set、text、blob
固定长度的字符,写法为char (m,最大长度不能超过,其中M可以省略,默认为1
char
可变长度的字符,写法为varchar(M),最大长度不能超过M,其中不可以省略
varchar
字符型
year
date
time
日期+时间
datetime
比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间
timestamp
日期型
数据类型
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
NOT NULL
DEFAULT
PRIMARY KEY
唯一可为空,但是为空也只能一个空
可以组合唯一键
UNIQUE
MySQL中不支持
CHECK
外键,用于限制两个表的关系,保证该字段的值必须来自于主表的关联列的值
1、要求在从表设置外键关系2、从表的外键列的类型和主表的关系列的类型要求一致或兼容,名称无要求3、主表的关联列必须是一个key(一般是主键或唯一)4、插入数据时,先插入主表,再插入从表5、删除数据时,先删除从表,再删除主表
FOREIGN KEY
六大约束
创建表时
修改表时
添加约束的时机
六大约束语法上都支持,但外键约束无效
alter table 表名 modify column 字段名 字段类型 新约束;
列级约束
除了非空、默认其它都支持
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
表级约束
约束的添加分类
只支持:默认、非空、主键、唯一
注:此处外键列级约束不生效
show index from stu
注:查询stu所有的索引,包括主键、外键、唯一
添加列级约束
在各个字段的最下面【constraint 约束名】 约束类型(字段名)
添加表级约束
通用写法
创建表时添加约束
#1.添加非室约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL
#2.添加默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3.添加主键1、列级约束ALTER TABLE stu MODIFY COLUMN Id INT PRIMARY KEY:2、表级约束ALTER TABLE stu ADD PRIMARY KFY(id):
#4.添加唯一1、列级约束ALTER TABLE stu MODIFY COLUMN seat INT UNIQUE2、表级约束ALTER TABLE stu ADD UNIQUE (seat) :
#5.添加外键alter table stu add constraint fk_stu_major foreign key(majorId) references major(id);
修改表时添加约束
#1.删除非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL
#2.删除默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT 18;
#3.删除主键alter table stu drop primary key;
#4.删除唯一alter table stu drop index seat;
#5.删除外键alter table stu drop foreign key majorId;
修改表时删除约束
常见约束
又称自增长列
auto_increment
show variables like '%auto_increment%'
set auto_increment_increment=3
设置步长
1、标识列必须为key2、一个表中最多只有一个标识列3、标识列的类型只能是数值型4、标识列可通过set auto_increment_increment=3设置步长
alter table tab_identity modify colomn id int primary key auto increment;
修改表时设置标识列
alter table tab_identity modify colomn id int;
修改表时删除标识列
标识列
DDL
事务控制语言
就是多条DML语句同时成功,或者同时失败。单元中一条sql失败,整个单元回滚
原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么同成功,要么同失败一致性(Consistency):事务前后的数据完整性要保证一致,1000隔离性(Isolation):多用户不相互影响(脏读:一个事务读取了另一个事务未提交的数据)持久性(Durability):事务一旦提交就不可逆,事务未提交恢复到原装。
在mysql中的数据用各种不同的技术存储在文件(或内存)中
mysql中innodb支持事务,myisam和memory不支持
show engines
存储引擎
拓展
事务
隐式事务:事务没有明显的开启和结束的标记比如insert、update、delete语句
显式事务:事务具有明显的开启和结束的标记前提:必须先设置自动提交功能为禁用
set autocommit=0(关闭事务自动提交)
start transaction;(可选)
步骤1:开启事务
步骤2:编写事务中的sql语句(select insert update delete)语句1;语句2;
步骤3:结束事务commit;提交事务rollback【to savepoint】;回滚事务
事务的创建
1、读未提交:read uncommitted(最低的隔离级别)(很少用这么低的隔离级别)例:事务A读取到事务B未提交的数据。存在的问题:脏读。
2、读已提交:read committed例:事务A只能读取到事务B提交后的数据。存在的问题:不可重复读取数据。什么是不可重复读数据?在事务开启之后,第一次读到的数据是3条,当前事务还未结束,可能第二次再读取时,读到的数据是4条。注:第一次读到的数据绝对的真实。是Oracle默认的隔离级别!!!
3、可重复读:repeatable read(提交之后也读不到)(默认)什么是可重复读数据?事务A开启后,每一次在事务A中读取到的数据都一致,即使事务B将数据修改,并且提交了,事务A读取到的数据还是没有发生改变。可重复读解决了什么问题?解决了不可重复读取数据的问题。可重复读存在的问题?可能会出现幻影读(虚读)。注:可重复读是MySQL默认的隔离级别!!!
4、序列化/串行化:serializable(最高的隔离级别,效率最低,解决了所有问题)这种隔离级别表示事务排队,不能并发!类似于synchronize,线程同步(事务同步)每次读取到的数据都是最真实的,并且效率是最低的。
事务间的4个隔离级别
select @@tx_isolation
MySQL5
select @@transaction_isolation
set session transaction isolation level read uncommitted;
MySQL8
select @@transaction_isolation
set autocommit=0;
update test.park set name='123' where value=1;
rollback;
设置最低隔离级别
set session transaction isolation level read committed;
update test.park set name='234' where value=2;
重新设置读已提交隔离级别
set session transaction isolation level repeatable read;
select * from test.park;
update test.park set pk='D';
重新设置可重复读隔离级别
set session transaction isolation level serializable;
重新设置序列化/串行化隔离级别
其一
对应其一中的隔离级别rollback前后进行查看
对应其一中的读已提交隔离级别进行查看
commit;
对应其一中的可重复读隔离级别进行查看
set session transaction isolation level serializable;
对应其一中的序列化隔离级别进行查看
其二
同时打开两个cmd命令
语句
set global transaction level read committed;
最好重启下MySQL服务
设置全局隔离级别
savepoint a;
delete from emp where id=1;
rollback to a;
设置保存点
TCL
虚拟表,和普通表一样使用,是通过表动态生成的数据
重用sql语句
简化复杂的sql操作,不必知道它的查询细节
保护数据,提高安全性
查询姓张的学生名和专业名
引入
create view 视图名as查询语句;
方式一:SELECT d.* FROM v2JOIN departments d ON v2.department_id=d.department_idWHERE ag = (SELECT MIN(ag) FROM v2);
方式二:SELECT * FROM departments dWHERE d.department_id=(SELECT department_idFROM v2ORDER BY agLIMIT 1);
#3.查询平均工资最低的部门信息
案例
创建视图
方式一:create or replace view 视图名as查询语句;
方式二:alter view 视图名as查询语句;
修改视图
删除视图
desc v1;
show create view v1;
查看视图
经过测试,视图的增删改会影响原表的数据,所以会对角色做更新权限设置
1、包含以下关键字的sql语句:分组函数、distinct、group by、having、union或union all
CREATE OR REPLACE VIEW v1ASSELECT 'jonn' name;SELECT * FROM v1;UPDATE v1 SET NAME='kx';
2、常量视图
3、select中包含子查询
可更新,不能增删
4、join
具备以下条件的视图不允许更新
视图的更新
create view
create table
创建语法的关键字
视图只保存了sql逻辑
表保存了数据,占物理空间
是否实际占用物理空间
视图一般不做增删改
视图和表的区别
视图
变量由系统提供,不是用户定义,属于服务器层面
说明
服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启
如果希望每次重启都保存原来的配置,需要调整mysql的配置文件
作用域
show global variables;
查看所有的全局变量
show global variables like '%char%';
查看部分全局变量
select @@global.autocommit;
select @@global.transaction_isolation;
查看指定的某个全局变量的值
set @@global.autocommit=0;
为某个指定的全局变量赋值
全局变量
仅针对于当前会话(连接)有效
show variables;show session variables;
查看所有的会话变量
show variables like '%char%';show session variables like '%char%';
查看部分会话变量
select @@autocommit;
select @@session.transaction_isolation;
查看指定的某个会话变量的值
set @@transaction_isolation='read-committed';
set session transaction_isolation='read-committed'
会话变量
注:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,默认session
show global|session variables;
查看所有的系统变量
show global|session variables like '%char%';
查看部分系统变量
select @@global|session.系统变量名;
查看某个系统变量的值
方式一:set global|session 系统变量名=值
方式二:set @@global!session.系统变量名=值
为某个系统变量赋值
使用
系统变量
变量是用户自定义的,不是由系统的
作用域:针对于当前会话(连接)有效,同于会话变量的作用域应用在任何地方,也就是begin end或begin end外面
set @用户变量名=值;set @用户变量名:=值;select @用户变量名:=值;
声明并初始化
赋值的操作符:\"=\"或\":=\"
方式一:通过set或selectset @用户变量名=值;set @用户变量名:=值;select @用户变量名:=值;
select count(*) into @count from employees;
方式二:通过select intoselect 字段 into 变量名 from 表;
赋值
select @用户变量名;
查看用户变量的值
使用(查看、比较、运算等)
set @m=1;set @n=2;set @sum=@m+@n;select @sum;
用户变量
作用域:仅定义在它的begin end中有效应用在begin end中,且为第一句话
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;
声明
方式一:通过set或selectset 局部变量名=值;set 局部变量名:=值;select @局部变量名:=值;
方式二:通过select intoselect 字段 into 局部变量名 from 表;
select 局部变量名;
declare m int default 1;declare n int default 2;declare sum int;set sum=m+n;select sum;
局部变量
自定义变量
变量
类似于java中的方法
提高代码的重用性
简化操作
可以有0个返回,也可以有多个返回,适合批量插入,批量更新
存储过程
有且仅有1个返回,适合做处理数据后返回的一个结果
函数
存储过程和函数的区别
一组预先编译好的SQL语句的集合,理解成批处理语句
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
delimiter $create procedure 存储过程名(参数列表)BEGIN 存储过程体(一组合法的SQL语句)END $
IN:该参数可作为输入,即该参数需调用方传入值
OUT:该参数可作为输出,即该参数可作为返回值
INOUT:该参数即可作为输入又可作为输出,即该参数既需要传入值,又可以返回值
参数模式
参数名
参数类型
参数列表包含三部分
如果存储过程仅仅只有一句话,BEGIN END可省略
存储过程体中的每条SQL语句的结尾要求必须加分号
DELIMITER 结束标记
DELIMITER $
存储过程的结尾可使用DELIMITER重新设置
创建存储过程
CALL 存储过程名(实参列表)$
调用存储过程
创建空参存储过程
#案例:创建存储过程实现根据女神名,查询对应的男神信息create procedure p2(in beautyName varchar(50))beginselect bo.* from boys bo right join beauty b on bo.id=b.boyfriend_id where b.name=beautyName;end $调用:call p2('小昭')$
创建带in模式参数的存储过程
创建带out模式参数的存储过程
创建带inout模式参数的存储过程
drop procedure 存储过程名(一次只能删除一个)
删除存储过程
show create procedure p2;
查看存储过程的信息
减少编译次数并减少了和数据库服务器的连接次数,提高了效率
create function 函数名(参数列表) returns 返回类型begin 函数体end
参数列表包含两部分
会有return语句,如果没有会报错,如果return语句没有放在函数体的最后也不报错,但不建议
...return 值;
函数体中仅有一句话可省略begin end
使用delimiter语句设置结束标记
函数体
创建函数
select 函数名(参数列表)
调用函数
SET GLOBAL log_bin_trust_function_creators = 1;
要放松函数创建的前述条件,全局系统变量需要设置为1
#案例:返回公司的员工个数CREATE FUNCTION f1() RETURNS INTBEGINDECLARE c INT DEFAULT 0; #定义局部变量SELECT COUNT(*) INTO c FROM employees;RETURN c;END $#调用select f1()$
无参有返回
#案例:根据员工名,返回他的工资CREATE FUNCTION f2(empName VARCHAR(20)) RETURNS INTBEGINSET @sal=0; #定义用户变量SELECT salary INTO @sal FROM employees WHERE last_name=empName;RETURN @sal;END $#调用SELECT f2('Ande')$
有参有返回
select create function f3;
查看函数
drop function f3;
删除函数
存储过程和函数
程序从上往下依次执行
顺序结构
程序从两条或多条路径中选择一条去执行
实现简单的双分支
if函数
类似于java中switch,一般用于实现等值判断
case 变量|表达式|字段when 要判断的值 then 返回值1或语句1when 要判断的值 then 返回值2或语句2...else 要返回的值nend
情况一
类似于java中的多重if语句,一般用于实现区间判断
casewhen 要判断的条件1 then 返回值1或语句1when 要判断的条件2 then 返回值2或语句2..else 要返回的值n或语句nend
情况二
可作为表达式,嵌套在其他语句中使用,可放在任何地方,begin end中或者begin end 外
可作为独立的语句去使用,只能放在begin end中
如果when中的值或条件成立,则执行对应的then后面的语句,并结束case;如果都不满足,则执行else中的语句或值
else可省略,如果else省略了,并且所有when条件都不满足,则返回null
#案例#创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩:90-100,显示A,80-90,显示B,60-80,显示c,否则,显示Dcreate procedure p1(in score int)begincasewhen score>=90 and score<=100 then select 'A';when score>=80 then select 'B';when score>=60 then select 'C';else select 'D';end case;end $
case结构
实现多重分支
功能:买现多重分支语法:if 条件1 then 语句1;elseif 条件2 then 语句2;【else 语句n;】end if;应用在begin end中
if结构
分支结构
程序在满足一定条件的基础上,重复执行一段代码,都在begin end中
【标签:】while 循环条件 do循环体end while【标签】;
先判断后执行
while
【标签:】loop循环体;end loop【标签】;可以用来模拟简单的死循环
没有条件的死循环
loop
【标签:】repeat循环体;until结刺循环的条件end repeat【标签】;
先执行后判断
repeat
iterate类似于continue,继续,结束本次循环,继续下一次
leave类似于break,跳出,结束当前所在的循环
循环控制
#案例:批量插入,根据次数插入到admin表中多条记录
1、没有添加循环控制语句
#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20就停止
2、添加leave语句
#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
3、添加iterate语句
循环结构
流程控制结构
0 条评论
回复 删除
下一页