语法顺序
1.select 分组函数,分组后的字段
2.from 表
3.where 筛选条件
4.group by 分组的字段
5.having 分组后的筛选
6.order by 排序列表
7.limit 索引,索引多少
(mysql处理顺序为2,3,4,5,1,6,7)
特点
分组前筛选:where 筛选的表:原始表 位置:group by的前面
分组后筛选:having 筛选的表:分组后的结果 位置:group by的后面
常见语法
1.起别名
select 字段名 as 别名 or select 字段名 别名(就是加空格)
2.去重
select distinct 字段名 from 表名;
3.判断某字段或表达式是否为null
select isnull(字段名)
(如果为null就是1,反之为0)
[补充]
select ifnull(字段,0) from 表名;
(判断是否为null,如果是返回指定值,反之)
4.模糊查询 in(参数,参数) is null/is not null:用于判断null值 5.升序和降序 6.limit 索引 7.union联合 8.if函数 字符函数 数学函数 日期函数 流程控制函数 case的2种用法 分组函数 特点 sql99语法 1.等值连接 案例2.查询员工名,部门名,工种名,并按部门名降序(添加三表连接) 2.非等值连接 3.自连接 4.外连接 什么是主什么是从 5.左外连接和右外连接 如果有编程一定基础的应该能明白,子查询的意思相当于包装起一个函数返回的return的值然后给where或having判断,比较灵活(比作把一些事情拆出来) 案例1:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资 1.拆分为先查询141号员工的job_id 2.再拆分salary比143号员工多的员工 3.最后合并 子查询的常用语法 案例 ANY:和子查询返回的某一个值比较 案例1:返回其它部门中比job_id为’IT_PROG’部门任意工资低的员工的:工号,姓名,job_id以及salary ALL:和子查询返回所有值比较 (相当于比较完一个后继续比较下一个直到全部) 案例2 案例2:返回其它部门中比job_id为’IT_PROG’部门所有工资都低的员工的:工号,姓名,job_id以及salary 子查询练习 案例一:查询平均工资最低的部门信息 1.先查询部门平均工资最低的部门id 2.获取了平均工资最低的部门id,去查找信息 案例二:各个部门中的最高工资中最低的部门的最低工资 1.先查询各个部门中的最高工资最低部门的id 2.获取了最低部门id后,再获取该部门的最低工资 创建语句: create (trucate可以理解全部删除没有返回值) 复制表结构操作 创建一个books表 删除一个库 创建books库的book表 修改book表的pubData 增删改案例 案例1.将departments中的数据插入新表dept2中 案例2.创建多表连接的数据库 1.整型 特点: 2. 浮点型 特点: 3.字符型 char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1 4.日期型 一.列级约束语法即案例 语法:直接在字段名和类型后面追加 约束类型即可。 二.表级约束语法即案例 语法:在各个字段的最下面 三.通用的写法 四.标识列语法即案例 五.五大约束 NOT NULL:非空,用于保证该字段的值不能为空(比如姓名,学号等) ▲UNIQUE:唯一,用于保证该字段的值具有唯一性,并且能有空,不过只能有一个空,(比如座位表)注:一个表中能有多个,也可以用组合不过不推荐 添加与删除约束 添加列级约束:ALTER TABLE 表名 MODIFY COLUMN 列名 类型 新约束; 事务:事务由单独单元的一个或多个sql语句组成,再这个单元中,每个mysql语句是相互依赖的,而整个单独单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有sql语句均执行成功,则事物被顺利执行。 事务的特性: 查看事务是否打开(默认是开启):show varlables like’autocommit’ read uncommitted: √ √ √ 查看存储引擎:show engines; commit;提交事务 事务的语法步骤 视图是什么? 创建视图的语法:create view 视图名 as 查询语句; 具备以下特点的视图不允许更新: 视图和表的对比 系统变量 3.查看指定的某个系统变量的值 4.为某个系统变量赋值 set global | 可选(session) 系统变量名=值 或 set@@ global | 可选(session) .系统变量名=值 自定义变量 3.案例 (2)局部变量 含义:一组预先编译好的sql语句的集合,理解成批处理语句 空参列表 带参列表 (1)创建带in模式参数的存储过程 (2)创建带out模式的存储过程 (3)创建带inout模式参数的存储过程 函数的语法 流程控制结构分为3种:
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
betwenn 0 an 100
(比如0
(查找指定字符串或数字)
order by 排序列表 (默认升序)
1.asc:升序
2.desc:降序
(排序列表支持单个字段,多个字段,函数,表达式,别名)
用于查询列表里的指定索引字段,或分页查询
注:索引是从0开始
比如:limit 1,表示查找第一个(第一个不行默认为从第0开始)和limit 10,15表示从第10个开始查找到第25个
用于合并多条查询语句
举例:比如我想查询中国和美国表中男生的名字select id,cname,csex from t_ca where csex='男'
union
select t_id,tname,tgender from t_ua where tgender='male'
功能:实现双分支
语法:select if(表达式1,表达式2,表达式3)#如果表达式1成立就返回2,反之3
1.拼接字符
select concat(字符1,字符2,字符3,…);
2.截取子串
substr(‘str’,‘从哪里开始’,‘到哪里结束’)
注:(索引是从1开始的)
3.替换
replace(‘要被替换的名字’,‘替换成的名字’)
4.获取字节长度
length(‘str’)
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截断
rand:获取随机数,返回0-1之间的小数
now:返回当前日期+时间
date_format:将字符转换成日期
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间
if(条件表达式,表达式1,表达式2):如果条件成立,返回表达式1,否则返回表达式2
1.case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
…**
2.case
when 条件1 then 值1
when 条件2 then 值2
1.max 最大值
2.min最小值
3.sum 和
4.avg 平均值
5.count 计算个数
(count(*):统计结果集的行数)(2)多表连接
1.一般为表起别名
2.多表的顺序可以调换
3.n表连接至少需要n-1个连接条件
4.等值连接的结果是多表的交集部分
案例1.查询员工名,部门名select last_name,department_name
from employees e
inner join departments d
on e.'department_id'=d.'department_id';
select last_name,department_name,job_title
from employees e
inner join departents d
on e.'department_id'=d.'dppartment_id'
inner join jobs j on e.'job_id'=j.'job_id'
order by department_name desc;
案例1.查询员工的工资级别select salary,grade_level
from employees e
#inner 可以省略不写
join job_grades g
on e.'salary' between g.'lowest_sal'and g.'highest_sal';
案例1.查询员工的名字,上级的名字select e.last_name,m.last_name
from employess e
join employess m
#在同表的情况下通过员工的id和上级的id来寻找
on e.'manager_id'=m.'employee_id';
特点:
1.外连接的查询结果为主表最后的所有记录
如果从表中有和它匹配的,则显示出匹配的值,反之为null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
利用主的关键连接id来查找对应从的字段名,最终结果一定是主
两者区别在于谁是主谁是从的关系,左外连接即from的字段名为主,而又外连接即from的字段名为从
左外连接语法:left join
右外连接语法;right join(3)子查询
select job_id
from employees
where employees_id =141
select salary
from employees
where employee_id=143
select last_name,job_id,salary
from employees
where job_id=(
select job_id
from employees
where employees_id =141
)and salary>(
select salary
from employees
where employee_id=143
);
in和not in:配合where或having使用,通常是等于列表中任意一个参数即可反之not in
案例:查询员工姓名,要求部门号是1400或1700的部门编号select last_name
from employees
#也可以写成=ANY相当于等于里面任意一个,如果是not in的话即不是里面的列表,也可以用<>ALL因为是比较多个
where department_id in(
#这里有个去重
select distinct departmen_id
from departments
where location_id in(1400,1700)
)
(比如说有很多返回值,返回的值和一个值比较,条件成立就打印出来)
案例1#首先我们要先拆分,先算出IT_PROG部门的工资
select salary
from employees
where job_id = 'IT_PROG'
SELECT last_name,job_id,salary,employee_id
FROM employees
#或是
SELECT last_name,job_id,salary,department_id
FROM employees
#或是<工资的ALL
WHERE salary < (
SELECT min(salary)
FROM employees
WHERE job_id = 'IT_PROG'
)
AND job_id<>'IT_PROG'
select department_id
from departments
group by department_id
order by avg(salary)
limit 1
select *
from departments
where department_id=(
select department_id
from departments
group by department_id
order by avg(salary)
limit 1;
);
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1
select min(salary)
from employees
where department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1
)
(4)增删改语句
修改语句:alter,update
插入语句:insert
删除语句:drop和trucate还有delete和turncate
use:转到哪个库
desc:查询表结构
show:查看有那些表
(show index from 表)
是查看表中所有的索引,包括主键,外键,唯一
delete用法:delete from 删除表
updata用法:update 表1 别名,表2 别名 set 列=值
insert用法:insert into 表() values()或set 列=值
(也可以用很多前面学的语句来灵活删除)#复制book表的结构,命名为copy
create table copy like book;
#如果想复制数据和结构的操作,可以搭配很操作
create table copy
select * from book
#可以加一个判断来判断是否有此表
create database if not exists books;
#可以加一个判断来判断是否有此表
drop database if exists books;
#如果想删除一个库
drop table 表名 or truncate table 表名;
create table book(
id INT ,#编号
name_book VARCHAR(20),#图书名
price DOUBLE,#价格
author_id INT,#作者编号
pubData DATETIME #出版时间
)
#如果是修改类型就用modify,添加用all
alte table book modify column 表里的类型
#修改列名字
alter table book change column pubData pubDatae DATETIME;
#alter 也可以添加新列
alter table book add column annual double;
#也可以进行删除操作
alter table book drop column annual;
#还可以修改表名
alter table book rename to book_s
create table dept2
select department_id,department_name
#可以直接的使用其他库的表
from myemployees.departments;
CREATE DATABASE IF NOT EXISTS s4db65;
USE s4db65;
CREATE TABLE class(
#设置标识列,用于连接外键
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR (20)
);
INSERT INTO class SET title='全栈1班';
INSERT INTO class SET title='全栈2班'; CREATE TABLE class_student(
student_id INT UNIQUE NOT NULL,
student_name VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES class(id)
);
INSERT INTO class_student VALUE(1,'张英杰',1);
INSERT INTO class_student VALUE(2,'马飞飞',1);
INSERT INTO class_student VALUE(3,'卢本伟',2);CREATE TABLE class_teacher(
techer_id INT UNIQUE NOT NULL,
techerid_name VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES class(id)
);
INSERT INTO class_teacher VALUE(1,'林海峰',1);
INSERT INTO class_teacher VALUE(2,'林狗',1);
INSERT INTO class_teacher VALUE(3,'苑日天',2);
SELECT title,techerid_name,student_name,student_id
FROM class c
INNER JOIN class_teacher t
ON t.`class_id`=c.`id`
INNER JOIN class_student s
ON s.`class_id`=c.`id`;
#insert还可以使用此操作来添加,这样用title来指定,id是自增就可以不用写了
insert into class(title) value('全栈3班')
(5)数据类型
tinyint(占1字节),smallint(占2字节),mediumint(占3字节),int(占4字节),bigint(占8字节)
1.都可以设置无符号和有符号,通过unsigned设置无符号
2.如果超出了范围,会报out or range异常,插入临界值(指定3位整数写成4位则临界值为999)
3.长度可以不指定,默认会有一个长度,长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型
定点数:decimal(M,D)
浮点数:float(M,D),double(M,D)
1.M代表整数部位+小数部位的个数,D代表小数部位
2.如果超出范围,则同整型一致,并且插入临界值
3.M和N都可以省略,但对于定点数,M默认为10,D默认为0
4.如果精度要求较高,则优先考虑使用定点数
char,varchar,binary,varbinary,enum,set,text,blob
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略
year 年
date 日期
time 时间
datetime 日期+时间 (占8个字节)
timestamp 日期+时间(占4个字节)
(注:timestamp容易受时区,语法模式,版本的影响,能反应当前时区时间)(6)常见约束介绍
只支持:默认,非空,主键,唯一
案例:#转到哪个库中
use students
#添加列级约束
create table stuinfo(
#一般列级和表级约束在语句后面添加空格就能继续写多个约束条件
id int PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),#检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默认约束
#只是举个例子,让大家明白外键是啥,实际中用表级约束即可
majorID INT REFERENCES major(id)#外键
);
create table major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
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)#外键
)
CREATE TABLE IF not EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20) NOT NULL,
set CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
#外键类的类型要求一致不过名字无要求
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
)
标识列又称为自增长列,可以不用手动插入值,系统默认的序列值,一个表中只有一个标识列,而且设置的标识列必须是一个key,只能是数值型#创建时设置自增长列
create table tab_identity(
字段名 字段类型 约束 auto_increment
);
#修改表时添加设置自增长列
alter table 表 modify column 字段名 类型 约束 auto_increment
#删除自增长列
alter table 表 modify column 字段名 类型 约束
#或者直接insert into tab_identity(name) values('卢本伟')
insert into tab_identity values(null,'卢本伟')
#查看自增长,自增长的起始不能改变,不过每一次插入加多少可以改变,不过改变就是全改变
show VARIABLES LIKE '%auto_increment%';
#改变步长为3
set auto_increment_increment=3;
#如果不想从1开始索引可以把初始值直接打上索引的位置
insert into tab_identity(id,name) values(10,'卢本伟')
#先执行10,再执行null就可以实现
insert into tab_identity(id,name) values(NULL,'卢本伟')
#修改表时设置标识列
insert into tab_identity modify column id int primary key auto_increment;
#修改表时删除标识列
insert into tab_identity modify column id int
DEFAULT:默认,用于保证该字段有默认值(比如性别)
▲PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空(比如学号,员工编号)注:一个表中只能有一个,不过可以用组合主键不过不推荐
▲FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
添加表级约束:ALTER TABLE 表名 ADD 约束类型(列名);
删除非空约束:ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NULL
(也可以直接空格不写)或
ALTER TABLE 表名 DROP 删除的约束 约束名(有一些可以不用加约束名)
级联删除:在约束后面添加 on delete cascade
(一般可以在修改表时删除一些指定的外键)
级联置空:在约束后面添加 on delete set null
(一般用于删除的外键值赋null)
举例#在创建表的时候添加外键
create table book(
bid int primary key,#主键
bname varchar(20) unique not null,#唯一键非空
price float default 10,#默认值
btypeId int,#外键key
foreign key(btypeId) references major(id)#在创建表添加外键
)
#在修改时添加非空和删除非空
alter table 表名 modify column 字段名 字段类型 not null
alter table 表名 modify column 字段名 字段类型
#在修改时添加主键和删除主键
alter table 表名 add primary key(字段名);
alter table 表名 drop primary key;
#在修改时添加唯一和删除唯一键
alter table 表名 add unique 字段名;
alter table 表名 drop index 字段名;
#在修改的时候添加外键
ALTER TABLE book add foreign KEY(btypeId) REFERENCES major(id);
#修改时删除外键
alter table book drop foreign key(btypeId)
(7)事务控制语句
ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受到其他事务的干扰
数据库的隔离级别:
脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新提交了该字段。之后T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
持久性:一个事务一旦提交,则会永久的改变数据库的数据
查看事务隔离级别:select @@tx_isolation;
设置隔离级别:set session | global transaction isolation level 隔离级别;
事务的隔离级别:脏读 不可重复读 幻读
read committed: × √ √
repeatable read: × × √
serializable × × ×
mysql默认第三个
oracle默认第二个
rollback;回滚事务
savepoint 节点名; 设置保存点set autocommit=0;
start transaction;#可选的
#步骤2:编写事务中的sql语句(select insert update delete)
delete from account where id=25;
#保存点命名为a
savepoint a;
delete from account where id=28;
#回滚到保存点出
rollback to a;
#最后的结果就是删除了id为25的保存了id为28的了
#truncate和delete的区别
set autocommit=0;
start transaction
#这一种是回滚查找后能得到之前没删除的结果
delete from account
#这个就算回滚也不能回到之前没删除的结果
truncate table account
rollback;
(8)视图的介绍
视图是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图的动态生成的,只保存了sql逻辑,不保存查询结果。(类似封装)
修改视图语法:create or replace view as 查询语句; 视图名
或者alter view as 查询语句;
删除视图语句:drop view 视图
视图的常见使用语法:insert,update,delete,select
举个例子:查询平均工资最低的部门名和工资#创建视图
CREATE or replace VIEW myv1
AS
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
#可以包装2层使用
CREATE OR REPLACE VIEW myv2
AS
SELECT d.*,myv1.`avg(salary)`
FROM myv1
INNER JOIN departments d
ON myv1.`department_id`=d.`department_id`
#修改视图
create or replace view myv2
as
select * from employees;
#或者
alter view myv2
as
select * from employees;
#删除视图
drop view myv2
1.包含以下关键字的sql语句:分组函数,distinct,group by,having,union或者union all
常量视图:
select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表
所以视图一般是用来查询的,而不是更新的
视图相对于表有更好的封装,能让多条语句直接执行,面向对象,且占用较小,视图一般用于查询,而表一般用于增删改查(9)变量的介绍
说明:变量由系统提供,不是用户定义,属于服务器层面
(系统变量分为全局变量和会话变量)
使用的语法:
1.查看所有的系统变量
show global | session variables;
(注意:global代表全局变量session或不写默认代表会话,会话即在当前用户操作,全局是在多个领域操作,不过全局不能跨重启)
2.查看满足条件部分的系统变量
show global | session variables like ‘%包含什么字符%’;
select @@global.系统变量名 或者 select session.系统变量名==(session也可以默认不写)==;
说明:变量是用户自定义的,不是由系统的
使用步骤:
声明
赋值
使用(查看,比较,运算等)
(自定义变量分为用户变量和局部变量)
(1)用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域
1.声明并初始化
set @用户变量名=值;或 set @用户变量名:=值; 或 select @用户变量名:=值;
(如果用select就只能用上面那种方法,因为编译器会分辨不出)
2.赋值
select 字段 into 变量名
from 表;(没有查看的表可以不写) 或#声明初始化
set @name='john';
set @name=100;
set @count=1;
#赋值
select count(*) into @count
from employees;
#查看
select @count
作用域:仅仅在定义begin end中才有效
(而且是只能在begin end的中的第一句在奏效)1.声明
declare 变量名 类型;
declare 变量名 类型 default 值;
set 局部变量名= or := 值;
select @局部变量名:=值;
2.赋值
select 字段 into 局部变量名
from 表;#没有用表可以不写
(10)存储过程和函数
1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
(存储过程为2种分别为空参列表和带参列表)
存储过程与函数的区别
函数的返回只能有一次,而存储过程可以有多次1.创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end
注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
举例:
in stuname varchar(20)
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:结合以上2中参数,可输出输入,需要传入值,又可以返回值
delimiter 结束标记 比如 delimiter $ 停止标记为$
(注:存储过程体中每条sql语句的结尾需要分号
如果只有一条,可以省略begin end
结尾可以使用delimiter重新设置)
2.调用语法
call 存储过程名(实参列表);
3.删除语法
drop procedure 存储过程名(一次只能删除一个)
4.查看存储过程的信息
show create procedure 存储过程名
案例:插入到admin表中五条记录
select *from admin;
#设置结束为$
delimiter $
#创建一个空参存储
create procedure myp1()
begin
insert into admin(username,'password')
values('卢本伟','29'),('马飞','13'),('pdd','1')
end $
#调用
call myp1() $
案例1:创建存储过程实现 根据女神名,查询对应的男神信息
#创建带参列表
create procedure myp2(in beautyName varchar(20))
begin
select bo.*
from boys bo
right join beauty b on bo.id=b.boyfriend_id
where b.name=beautyName;
end $
#如果字符集有问题就输入
set names gbk$
#调用
call myp2('uu')$
案例2:创建存储过程实现,用户是否登录成功
create procedure myp3(in username varchar(20),in password varchar(20))
begin
declare result int default 0;#声明并初始化
#这里用个数去查找,因为账号和密码对了就会出现值就有个数1
select count(*) into result#赋值
from admin
where admin.username=username
and admin.passwoid=password;
select if(result>0,'成功','失败')#使用
end $
#调用账号密码
call myp3('112233','123456')$
案例1:根据女神名,返回对应的男神名
create procedure myp4(in beautyName varchar(20),out boyName varchar(20))
begin
#给boyName赋值,因为是out所以参数不需要指定值
select bo.boyName into boyNamef#赋值
from boys bo
#连接
inner join beauty b on bo.id = b.boyfriend_id
where b.name=beautyName;
end $
#调用
call myp4('uu',@bName)$
select @bName$
案例1:传入a和b两个值,最终a和b都翻倍并返回
create procedure myp5(inout a int,inout b int)
begin
set a=a*2;
set b=b*2;
end $
set @n=20;
set @m=10;
#调用
call myp5(@n,@m)$
select @n,@m$
1.创建语法
delimiter $
create function 函数名(参数列表) returns 返回类型
begin
declare 变量 类型 约束(default 0)#默认为0 ;
函数体
最后要加return 返回值
end $
2.调用语法
select 函数名(参数列表)
3.查看函数
show create function 函数;
4.删除函数
drop function 函数;
(终)流程控制结构
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码一.分支结构
1.if函数与elseif(只能应用与begin end中)
create function 函数名(变量名 类型) returns char
begin
if 条件1 and 条件2 then return 'A';
elseif 条件1 then return 'B';
else return 'D';
end if;
二.循环结构
分类:
while,loop,repeat#类似与编程中的while 简单死循环 do while
循环控制:
iterate 类似于 continue
leave 类似于 break 跳出
1.while 语法
a:while 循环条件 do
循环体;
end while a;
2.lopp语法(模拟死循环)
a:loop
循环体;
end loop a;
3.repeat语法
a:repeat
循环体;
until 结束循环条件
end repeat a
4.leave 和iterate 用法
create procedure test(in insertCount int)
begin
declare i int default 1;
a:while i<insertCount DO
if i>=20 then leave a;
end if;
set i=i+1;
end while a;
end $
案例:向该表插入指定个数的,随机的字符串
drop table if exists string
create table string(
id int primary key auto_increment,
content varchar(20)
);
delimiter $
#创建索引
create procedure test(in insertCount int)
begin
declare i int default 1;
declare str varchar(26) default 'abcdefghijklmnopqrstuvwxyz'
while i <= insertCount DO
set startIndex=floor(rand()*26+1);#1到26个随机
set len=floor(rand()*(20-startIndex+1)+1)#1到(20-前面索引的值+1)
set i=i+1;
insert into string(content) values(substr(str,starIndex,len));
end while;
end $