DQL
进阶1:基础查询
select 查询列表 from 表名;
mysql中的+号:
仅仅只有一个功能:运算符
select 100+90; 两个操作数都为数值型,则做加法运算
select ‘123’+90;只要其中一方为字符型,试图将字符型数值转换成数值型
如果转换成功,则继续做加法运算
select ‘john’+90;如果转换失败,则将字符型数值转换成0
select null+10; 只要其中一方为null,则结果肯定为null
- 解决:查询员工名和姓连接成一个字段,并显示为 姓名
SELECT CONCAT('a','b','c') AS 结果;//abc
进阶2:条件查询
语法:
select 查询列表 from 表名 where 筛选条件;
分类:
一、按条件表达式筛选
简单条件运算符:> < = != <> >= <=
二、按逻辑表达式筛选
逻辑运算符:
作用:用于连接条件表达式
&& || !
and or not
&&和and:两个条件都为true,结果为true,反之为false
||或or: 只要有一个条件为true,结果为true,反之为false
!或not: 如果连接的条件本身为false,结果为true,反之为false
三、模糊查询
like % _
between and
in
is null
特点:
1.like 一般和通配符搭配使用
% 任意多个字符,包含0个字符
_ 任意单个字符
2.between and
①使用between and 可以提高语句的简洁度
②包含临界值
③两个临界值不要调换顺序
3.in
含义:判断某字段的值是否属于in列表中的某一项
特点:
①使用in提高语句简洁度
②in列表的值类型必须一致或兼容
③in列表中不支持通配符
4、is null
=或<>不能用于判断null值
is null或is not null 可以判断null值
5.安全等于 <=>
- 既可以判断NULL值,又可以判断普通的数值,可读性较低
进阶3:排序查询
语法:select 查询列表from 表名 where 筛选条件 order by 排序的字段或表达式;
特点:
1、asc代表的是升序,可以省略,desc代表的是降序
2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
3、order by子句在查询语句的最后面,除了limit子句
进阶4:常见函数
概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1、隐藏了实现细节 2、提高代码的重用性
调用:select 函数名(实参列表) 【from 表】;
分类:
1、单行函数
如 concat、length、ifnull等
2、分组函数
功能:做统计使用,又称为统计函数、聚合函数、组函数
单行函数
字符函数:
length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
concat(str1,str2):拼接字符串str1,str2
substr()
instr()
trim()
upper(str)/lower(str):将字符串大写或小写
lpad/rpad
replace
数学函数:
round:四舍五入
ceil:向上取整,返回>=该参数的最小整数
floor: 向下取整,返回<=该参数的最大整数
truncate:截断,把小数点全部删掉 truncate(1.33232,1) 保留小数点后一位
mod(num1,num2): num1模于num2
日期函数:
now:返回当前系统日期+时间 //2020-02-23 19:14:26
curdate:返回当前系统日期,不包含时间 //2020-02-23
curtime:返回当前时间,不包含日期 //19:14:26
year
month
monthname
day
hour
minute
second
str_to_date
date_format
其他函数:
version 查看版本
database 查看当前数据库名字
user 查看当前用户
控制函数
if
case
1.substr、substring
注意:索引从1开始
截取从指定索引处后面所有字符
SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;
截取从指定索引处指定字符长度的字符
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) out_put;
2.instr 返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('杨不殷六侠悔爱上了殷六侠','殷八侠') AS out_put;
3.trim 删除空格,或者指定字符串
SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;
SELECT TRIM('a' FROM 'aaaa张aaaaaaaaaaaa翠山aaaaaaa');
4.lpad 用指定的字符实现左填充指定长度 rpad右填充
SELECT LPAD('殷素素',2,'*') AS out_put;
5.replace(str,oldStr,newStr) 替换 将str中的所有oldStr换成newStr
SELECT REPLACE('周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏') ;
日期函数
可以获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NOW()) 年; //2020
SELECT YEAR('1998-1-1') 年; //1998
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月; //2
SELECT MONTHNAME(NOW()) 月; //February
str_to_date 将字符通过指定的格式转换成日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d');//1998-03-02
查询入职日期为1992–4-3的员工信息
SELECT * FROM employees WHERE hiredate = '1992-4-3';
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
datediff(‘1999-1-1’,‘2000-1-1’) 结果小于0 //用于判断日期谁大谁小
流程控制函数
1.if函数:
- SELECT IF(10<5,‘大’,‘小’);//就像三目运算符
2.case函数的使用一: switch case 的效果
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
else 要显示的值n或语句n;
end
案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍,部门号=40,显示的工资为1.2倍
其他部门,显示的工资为原工资
SELECT salary,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
ELSE salary
END AS 新工资
FROM employees;
3.case函数的使用二:类似于 多重if
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
else 要显示的值n或语句n
end
案例:查询员工的工资的情况
如果工资>20000,显示A级别,如果工资>15000,显示B级别
否则,显示D级别
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
ELSE 'D'
END AS 工资级别
FROM employees;
分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
特点:
1、sum、avg一般用于处理数值型,max、min、count可以处理任何类型
2、以上分组函数都忽略null值
3、可以和distinct搭配实现去重的运算
4、count函数,一般使用count(*)用作统计行数
5、和分组函数一同查询的字段要求是group by后的字段
进阶5:分组查询
语法:select 查询列表 from 表【where 筛选条件】group by 分组的字段【order by 排序的字段】;
特点:
1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选
3、分组可以按单个字段也可以按多个字段
4、可以搭配着排序使用
进阶6:连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:
按年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
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 连接条件;
特点:
①添加排序、分组、筛选
②inner可以省略
③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
外连接
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
1.外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示null,外连接查询结果=内连接结果+主表中有而从表没有的记录
2.左外连接,left join左边的是主表,右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
- 左外连接 left join
- 右外连接 right join
- 全外连接 full outer join
- 交叉连接 cross join
进阶7:子查询
含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询
分类:
按子查询出现的位置:
select后面:
仅仅支持标量子查询
from后面:
支持表子查询
where或having后面:★
标量子查询(单行) √
列子查询 (多行) √
行子查询
exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
进阶8:分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:select 查询列表 from 表【join type join 表2 on 连接条件 where 筛选条件 group by 分组字段
having 分组后的筛选 order by 排序的字段】 limit 【offset,size】;
offset要显示条目的起始索引(起始索引从0开始)
size 要显示的条目个数
特点:
①limit语句放在查询语句的最后
②公式:要显示的页数 page,每页的条目数size
进阶9:联合查询
union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1 union 查询语句2 union
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
1、要求多条查询语句的查询列数是一致的!
2、要求多条查询语句的查询的每一列的类型和顺序最好一致
3、union关键字默认去重,如果使用union all 可以包含重复项
DDL
库和表的管理
1.库的管理
1.库的创建:create database [if not exists]库名;
2.库的修改:RENAME DATABASE books TO 新库名;
3.更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
4.库的删除
DROP DATABASE IF EXISTS books;
2.表的管理
表的创建
语法:
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】
)
表的修改
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
①修改列名
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
②修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
④删除列
ALTER TABLE book_author DROP COLUMN annual;
⑤修改表名
ALTER TABLE author RENAME TO book_author;
表的删除
DROP TABLE IF EXISTS book_author;
通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();
表的复制
1.仅仅复制表的结构
CREATE TABLE copyOne LIKE author;
2.复制表的结构+数据
CREATE TABLE copyTwo SELECT * FROM author;
3.只复制部分数据
CREATE TABLE copyThree SELECT id,au_name FROM author WHERE nation=‘中国’;
4.仅仅复制某些字段
CREATE TABLE copyFour SELECT id,au_name FROM author WHERE 0=1;
DML
插入语句
-
方式一:insert into 表名(列名,…) values(值1,…);
不可以为null的列必须插入值。可以为null的列如何插入值?
-
方式二:insert into 表名 set 列名=值,列名=值;
方式一支持子查询,方式二不支持
INSERT INTO beauty(id,NAME,phone) SELECT 26,‘宋茜’,‘11809866’;
修改语句
1.修改单表的记录
语法:update 表名 set 列=新值,列=新值,…where 筛选条件;
2.修改多表的记录
语法:update 表1 别名 inner|left|right join 表2 别名 on 连接条件 set 列=值,…
where 筛选条件;
删除语句
1.单表的删除:delete from 表名 where 筛选条件
2.多表的删除:delete 表1的别名,表2的别名 from 表1 别名 inner|left|right join 表2 别名 on 连接条件 where 筛选条件;
3.语法:truncate table 表名;
truncate和delete区别:
1.delete 可以加where 条件,truncate不能加
2.truncate删除,效率高一丢丢
3.假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始。
4.truncate删除没有返回值,delete删除有返回值
5.truncate删除不能回滚,delete删除可以回滚.
TCL
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的特性:ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据.
事务的创建
隐式事务:事务没有明显的开启和结束的标记:insert、update、delete语句
显式事务:事务具有明显的开启和结束的标记(必须先设置自动提交功能为禁用)
步骤1:开启事务
set autocommit=0;
start transaction;可选的步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;步骤3:结束事务
commit;提交事务rollback;回滚事务 //rollback to a
savepoint 节点名;设置保存点 //savepoint a
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
mysql中默认第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed
查看数据库隔离级别:select @@tx_isolation;
设置隔离级别:set session|global transaction isolation level +隔离级别;
脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
常见约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
六大约束
NOT NULL:非空,用于保证该字段的值不能为空 DEFAULT:默认,用于保证该字段有默认值
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值
CHECK:mysql不支持
约束的添加分类:
列级约束:六大约束语法上都支持,但外键约束没有效果
表级约束:除了非空、默认,其他的都支持
主键和唯一的大对比:
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 √ × 至多有1个 √,但不推荐
唯一 √ √ 可以有多个 √,但不推荐
外键:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表
一、创建表时添加约束
1.添加列级约束 只支持:默认、非空、主键、唯一
语法:直接在字段名和类型后面追加 约束类型即可。
CREATE TABLE stuinfo(
id INT PRIMARY KEY,//主键
stuName VARCHAR(20) NOT NULL UNIQUE,//非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'),//检查
seat INT UNIQUE,//唯一
age INT DEFAULT 18,//默认约束
majorId INT REFERENCES major(id)外键
);
查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;
2.添加表级约束
语法:在各个字段的最下面 【constraint 约束名】 约束类型(字段名)
CREATE TABLE stuinfo(
id INT,stuname VARCHAR(20),
gender CHAR(1),seat INT,
age INT,majorid INT,
CONSTRAINT pk PRIMARY KEY(id),//主键
CONSTRAINT uq UNIQUE(seat),//唯一键
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),//检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)//外键);
二、修改表时添加约束
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
3.添加主键
①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
3.添加唯一
①列级约束:ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
②表级约束:ALTER TABLE stuinfo ADD UNIQUE(seat);
4.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_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 ;
3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
标识列
又称为自增长列:可以不用手动的插入值,系统提供默认的序列值
特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表可以有几个标识列?至多一个!
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长,可以通过手动插入值,设置起始值
视图
含义:虚拟表,和普通表一样使用mysql5.1版本出现的新特性,是通过表动态生成的数据
一、创建视图
- create view 视图名 as 查询语句;
二、视图的修改
-
create or replace view 视图名 as 查询语句;
-
alter view 视图名 as 查询语句;
三、删除视图:
- drop view 视图名,视图名,…;
四、查看视图:
- SHOW CREATE VIEW myv3;
五、视图的更新
1.插入
INSERT INTO myv1 VALUES(‘张飞’,‘zf@qq.com’);
2.修改
UPDATE myv1 SET last_name = ‘张无忌’ WHERE last_name=‘张飞’;
3.删除
DELETE FROM myv1 WHERE last_name = ‘张无忌’;
具备以下特点的视图不允许更新
包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
变量
系统变量 | 全局变量 | 会话变量 |
---|---|---|
自定义变量 | 用户变量 | 局部变量 |
一、系统变量
说明:变量由系统定义,不是用户定义,属于服务器层面
注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
全局变量:针对于所有会话(连接)有效,但不能跨重启
会话变量:针对于当前会话(连接)有效
1、查看所有系统变量
show global|【session】variables;
2、查看满足条件的部分系统变量
show global|【session】 variables like '%char%';
3、查看指定的系统变量的值
select @@global|【session】.系统变量名;
4、为某个系统变量赋值
set global|【session】.系统变量名=值;
set @@global|【session】.系统变量名=值;
二、自定义变量
说明:变量由用户自定义,而不是系统提供的
使用步骤:
1、声明
2、赋值
3、使用(查看、比较、运算等)
用户变量
作用域:针对于当前会话(连接)有效,作用域同于会话变量
赋值操作符:=或:=
1.声明并初始化
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
2.赋值(更新变量的值)
方式一:
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
方式二:
SELECT 字段 INTO @变量名 FROM 表;
3.使用(查看变量的值)
SELECT @变量名;
局部变量
作用域:仅仅在定义它的begin end块中有效
应用在 begin end中的第一句话
①声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 【DEFAULT 值】;
②赋值(更新变量的值)
- 方式一:
SET 局部变量名=值;
SET 局部变量名:=值;
SELECT 局部变量名:=值;
- 方式二:
SELECT 字段 INTO 局部变量名 FROM 表;
③使用(查看变量的值)
SELECT 局部变量名;
案例:声明两个变量,求和并打印
用户变量
SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;局部变量
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 1;
DECLARE SUM INT;
SET SUM=m+n;
SELECT SUM;
用户变量和局部变量的对比:
作用域 | 定义位置 | 语法 | |
---|---|---|---|
用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一般不用加@,需要指定类型 |
存储过程
好处:
1、提高代码的重用性
2、简化操作
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
一、创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
/*
参数列表包含三部分:参数模式 参数名 参数类型
in stuname varchar(20)
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
*/
2、如果存储过程体仅仅只有一句话,begin end可以省略,存储过程体中的每条sql语句的结尾要求必须加分号。
存储过程的结尾可以使用 delimiter 重新设置.
delimiter+结束标记
二、调用语法
CALL 存储过程名(实参列表)
三、删除存储过程
drop procedure 存储过程名
四、查看存储过程的信息
SHOW CREATE PROCEDURE myp2;
函数
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
存储过程 | 可以有0个返回,也可以有多个返回,适合做批量插入、批量更新 |
---|---|
函数 | 有且仅有1 个返回,适合做处理数据后返回一个结果 |
一、创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
return 值
END
/*
1.参数列表 包含两部分:参数名 参数类型
2.函数体:必须有return语句,如果return语句没有放在函数体的最后也不报错,但不建议
3.函数体中仅有一句话,则可以省略begin end
4.使用 delimiter语句设置结束标记
*/
二、调用语法
SELECT 函数名(参数列表)
三、查看函数
SHOW CREATE FUNCTION myf3;
四、删除函数
DROP FUNCTION myf3;
流程控制结构
一、分支结构
1.if函数
if(条件,值1,值2)
功能:实现双分支,应用在begin end中或外面
2.case结构
情况1:类似于switch
case 变量或表达式
when 值1 then 语句1;
when 值2 then 语句2;
else 语句n;
end
情况2:应用在begin end 中或外面
case
when 条件1 then 语句1;
when 条件2 then 语句2;
else 语句n;
end
3.if结构
if 条件1 then 语句1;
elseif 条件2 then 语句2;
else 语句n;
end if;
功能:类似于多重if,只能应用在begin end 中
二、循环结构
循环控制:
iterate 类似于 continue,继续,结束本次循环,继续下一次
leave 类似于 break,跳出,结束当前所在的循环
1.while
【标签:】 while 循环条件 do
循环体;
end while 【标签】;
2.loop(可以用来模拟简单的死循环)
【标签:】loop
循环体;
end loop 【标签】;
3.repeat
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
1.没有添加循环控制语句
案例:批量插入,根据次数插入到admin表中多条记录
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
2.添加leave语句
案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
3.添加iterate语句
案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $