1 MySQL常见命令
1.1 查看当前所有的数据库
show databases;
1.2 打开指定的库
use 库名;
1.3 查看当前库的所有表
show tables;
1.4 查看其他库的所有表
show tables from 库名;
1.5 创建数据库
# utf-8
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# gbk
CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
1.6 创建表
create tables 表名(
列名 列类型,
。。。
列名 列类型
);
1.7 查看表结构
desc 表名;
1.8 查看MySQL的版本
select version():
2 Data Query Languege
2.1 基础查询
2.1.1 概述
select 查询列表 from 表名;
# 1.查询列表可以是:表中的字段、常量值、表达式、函数
# 2.查询的结果是一个虚拟的表格
2.1.2 查询表中的单个字段
select last_name from employees;
2.1.3 查询表中的多个字段
select last_name,salary,email from employees;
2.1.4 查询表中的所有字段
select * from employees;
2.1.5 查询常量值
select 100;
select "pakhm";
2.1.6 查询表达式
select 100*90;
2.1.7 查询函数
select version();
2.1.8 起别名
# 1.方式一:
select 100*90 as 结果;
select last_name as 姓,first_name as 名 from employees;
# 2.方式二:
select 100*90 结果;
select last_name 姓,first_name 名 from employees;
2.1.9 几个字段值拼接在一起
--案例:查询员工名和姓连接成一个字段,并显示为'姓名'
select concat(last_name,first_name) as 姓名 from employees;
2.1.10 去重
select distinct department_id from employees;
2.2 条件查询
2.2.1 概述
select 查询列表 from 表名 where 筛选条件;
# 1.按条件表达式筛选,条件运算符:>,<,=,!=,>=,<=
# 2.按逻辑表达式筛选,逻辑运算符:&&,||,!
# 3.模糊查询:like,between and,in,is (not) null
2.2.2 按条件表达式筛选
#案例:查询工资>12000的员工信息
select * from employees where salary>12000;
2.2.3 按逻辑表达式筛选
#案例:查询工资在10000到20000之间的员工名、工资以及奖金
select last_name,salary,commission_pct from employees where salary>=10000 && salary<=20000;
2.2.4 模糊查询[like]
# '包含'的意思:
# 一般和通配符搭配使用:
# %,任意多个字符,包含0个字符
# _,任意单个(一个)字符
#案例一:查询员工名中包含字符a的员工信息
select * from employees where last_name like '%a%';
#案例二:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
select last_name,salary from employees where last_name like '__e_a%';
#案列三:查询员工名中第二个字符为'_'的员工名
select last_name from employees where last_name lke '_$_%' escape '$';
2.2.5 模糊查询[between and]
# '在.。。。之间'的意思:
# 临界值是'包含'
# 两个临界值是应是'从小到大'
#案列:查询员工编号在100到120之间的员工信息
select * from employees where employee_id between 100 and 120;
2.2.6 模糊查询[in]
#判断某字段的值是否属于in列表中的某一项:
# in列表的值类型必须统一
# in列表的值不能使用通配符
#案例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
select last_name,job_id from employees where job_id in ('IT_PROG','AD_VP','AD_PRES');
2.2.7 模糊查询[is not null]
#判断某字段的值是否为空:
#案例:查询有奖金的员工名和奖金率
select last_name,commission_pct from employees where commission_pct is null;
2.3 排序查询
2.3.1 概述
select 查询列表 from 表名 (where 筛选条件) order by 字段(别名,表达式,函数) asc(desc);
2.3.2 特点
# 1.asc是升序,desc是降序,如果不写,默认是升序
# 2.order by子句一般是放在查询语句的最后面,limit子句除外
2.3.3 按表达式排序
#案例:按年薪的高低显示员工的信息和年薪
select *,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by salary*12*(1+ifnull(commission_pct,0)) desc;
2.3.4 按别名排序
#案例:按年薪的高低显示员工的信息和年薪
select *,salary*12*(1+ifnull(commission_pct,0)) 年薪 from employees order by 年薪 desc;
2.3.5 按函数排序
#案列:按姓名的长度显示员工的姓名和工资
select length(last_name) 字节长度,last_name,salary from employees order by length(last_name) asc;
2.3.6 按多个字段(别名,表达式,函数)排序
#案列:查询员工信息,要求先按工资麦序,再按员工编号排序
select * from employees order by salary asc,employee_id desc;
2.4 字符函数
2.4.1 获取字节个数
select length('john');
select length('张三丰haha')
2.4.2 拼接字符串
select concat(last_name,'_',first_name) 姓名 from employees;
2.4.3 变大小写
select upper('john');
select lower('joHn');
#实例:将姓名变大写,名变小写,然后拼接
select concat(upper(last_name),lower(first_name)) 姓名 from employees;
2.4.4 字符串截取
#注意:mysql索引从1开始
#截取从指定索引处后面所有字符
select substr('超级帅哥爱上了超级美女',7) out_put;
#截取从指定索引处指定字符长度的字符
select substr('超级帅哥爱上了超级美女',1,3) out_put;
2.4.5 返回字符串第一次出现的索引
select insert('超级超级帅哥爱上了超级美女','帅哥 ') as out_put;
2.4.6 去除头尾的指定字符
#去除头尾空字符
select length(trim(' 超级帅哥 ')) as out_put;
#去除头尾字符'aa'
select trim('aa' from 'aaaa超级aa帅哥aaa') as out_put;
2.4.7 用指定的字符实现左(右)填充指定长度
select lpad('超级帅哥',2,'a') as out_put;
#结果为'超级帅哥'
select rpad('超级帅哥',7,'a') as out_put;
#结果为'超级帅哥aaa'
2.4.8 替换字符串
select replace('超级帅哥超级美女','超级','super') as out_put;
#结果为'super帅哥super美女'
2.5 数学函数
2.5.1 四舍五入
select round(1.23);
#结果是1
select round(1.567,2);
#小数点后保留两位
2.5.2 返回>=该参数的最小整数
select cell(1.02);
2.5.3 返回<=该参数的最大整数
select floor(-9.99);
2.5.4 截断
//小数点后保留1位,直接阶段
select truncate(1.62,1);
select truncate(1.66,1);
2.5.5 取余
select mod(10,3);
select 10%3;
2.6 日期函数
2.6.1 当前系统日期+时间
select now();
2.6.2 当前系统日期
select curdate();
2.6.3 当前系统时间
select curtime();
2.6.4 获取指定的部分
#可以指定获取 年、月、日、小时、分钟、秒
select year(now()) 年;
select year('1998-1-1') 年;
select year(hiredate) from employees;
select month(now()) 月;
select monthname(now()) 月的英文名字;
2.6.5 字符串转日期类型
select str_to_date('1998-3-2','%Y-%c-%d') as out_put;
select * from employees where hiredate='1992-4-3';
select * from employees where hiredate=str_to_date('4-3 1992','%c-%d %Y');
格式符 |
功能 |
%Y |
4位的年份 |
%y |
2位的年份 |
%m |
月份(01,02...11,12) |
%c |
月份(1,2...11,12) |
%d |
日(01,02...) |
%H |
小时(24小时制) |
%h |
小时(12小时制) |
%i |
分钟(00,,01...59) |
%s |
秒(00,,01...59) |
2.6.6 日期类型转字符串
select date_formate(now(),'%y年%m月%d日') as out_put;
2.7 流程控制函数
2.7.1 if,if else
select if(条件,'满足条件时返回','不满足条件时返回');
select last_name,commission_pct,if(commission_pct is null,'没奖金','有奖金') 备注 from employees;
2.7.2 case
case 要判断的字段或表达式
when 常量1 then 要显示的值1(语句1;)
when 常量2 then 要显示的值2(语句2;)
...
else 要显示的值n或(语句n;)
end
case
when 条件1 then 要显示的值1或(语句1;)
when 条件2 then 要显示的值2或(语句2;)
...
when 条件n then 要显示的值n或(语句n;)
end
#案例1:查询员工的工资,要求
#部门号=30,显示的工资为1.1倍
#部门号=40,显示的工资为1.2倍
#部门号=50,显示的工资为1.3倍
#其他部门,显示的工资为原工资
select salary 原始工资,department_id,
case department_id
when 30 then salary*1.1
when 40 then salary*1.2
when 50 then salary*1.3
else salary
end as 新工资
from employees;
#案例2:查询员工的工资情况
#如果工资>20000,显示A级别
#如果工资>15000,显示B级别
#如果工资>10000,显示C级别
#否则,显示D级别
select salary,
case
when salary>20000 then 'A'
when salary>15000 then 'B'
when salary>10000 then 'C'
else 'D'
end as 工资级别
from employees;
2.8 分组函数
2.8.1 概述
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum,avg,max,min,count
支持的参数:
sum:数值
avg:数值
max:数值,字符串,日期类型
min:数值,字符串,日期类型
count:任何类型(计数不为null的值)
关于null:sum,avg,max,min,count进行计算的时候会先忽略掉有null的行
和分组函数异同查询的字段要求:group by后的字段
2.8.2 简单使用
select sum(salary) from employees;
select avg(salary) from employees;
select max(salary) from employees;
select min(salary) from employees;
select count(salary) from employees;
select sum(salary) 和,round(avg(salary),2) 平均 from employees;
2.8.3 去重之后再操作
#sum,avg,max,min,count都支持
select sum(distinct salary),sum(salary) from employees;
2.8.4 count的详细介绍
select count(salary) from employees;
#统计个数,包括null
select count(*) from employees;
select count(1) from employees;
效率:count(*)>count(1)>count(字段)
2.9 分组查询
2.9.1 概述
可以使用group by子句将表中的数据分成若干组
select 分组函数,列
from 表
[where 筛选条件]//筛选条件字段如果存在于上面的表中
group by 表中的字段(表达式、函数)
[having 筛选条件]//筛选条件字段如果不存在于上面的表中
[order by 子句]
2.9.2 简单的分组查询
#案列1:查询每个工种的最高工资
select max(salary),job_id
from employees
group by job_id;
#案例2:查询每个位置上的部门个数
select count(*),location_id
from departments
group by location_id;
2.9.3 添加分组后的筛选
#案例:查询哪个部门的员工个数>2
select count(*),department_id
from employees
group by department_id
having count(*)>2;
2.9.4 按多个字段分组
#案例:查询每个部门每个工种的员工的平均工资
select avg(salary),department_id,job_id
from employees
group by department_id,job_id;
2.10 连接查询
2.10.1 概述
又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
2.10.2 分类
按年代分类:
sql92标准:仅仅支持内连接
sql99标准:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
右外连接
左外连接
全外连接
交叉连接
2.10.3 等值连接[sql92]
多表等值连接的结果为多表的交集部分
n表连接,至少需要n-1个连接条件
多表的顺序没有要求
一般需要为表起别名
可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
#案例1:查询女神名和对应的男神名
select name,boyname from boys,beauty
where beauty.boyfriend_id=boys.id;
#案列2:查询员工名和对应的部门名
select last_name,department_name
from employees,departments
where employees.department_id=departments.department_id;
2.10.4 为表名起别名
#查询员工名、工种号、工种名
select e.last_name,e.job_id,j.job_title
from employees e,jobs j
where e.job_id=j.job_id;
2.10.5 非等值连接[sql92]
#案列:查询员工的工资和工资级别
select salary,grade_level
from employees e,job_grades g
where salary between g.lowest_sal and g.highest_sal;
2.10.6 自连接[sql92]
#案例:查询员工名和上级的名称
select e.employee_id,e.last_name,m.employee_id,m.last_name
from employees e,employees m
where e.manager_id=m.employee_id;
2.10.7 sql99标准
语法:
select 查询列表
from 表1 别名 连接类型
join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[ order by 排序列表]
连接类型:
inner,left [outer],right [outer],full [outer],cross
内连接的时候inner可以省略
2.10.8 等值连接
#案列1:查询员工名,部门名
select last_name,department_name
from employees e
inner join departments d
on e.department_id=d.department_id;
#案例2:查询员工名,部门名,工种名,并按部门名降序(添加三表连接)
select last_name,department_name,job_title
from employees e
inner join departments d on e.department_id=d.department_id
inner join jobs j on e.job_id=j.job_id
order by department_name desc;
2.10.9 非等值连接
#案例:查询员工的工资级别
select salary,grade_level
from employees e
join job_grades g
on e.salary between g.lowest_sal and g.highest_sal
2.10.10 自连接
#案例:查询员工的名字以及对应的上级的名字
select e.last_name,m.last_name
from employees e
join employees m
on e.manager_id=m.employee_id;
2.10.11 外连接
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的
左外连接,左边的是主表
右外连接,右边的是主表
左外和右外交换两个表的顺序,可以实现同样的效果
全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表1中没有的
#案例:查询男朋友不在男神表的女神名
select b.name
from beauty b
left outer join boys bo
on b.boyfriend_id=bo.id
where bo.id is null;
2.10.12 交叉连接
#表1是n行,表2是m行,那么cross的结果是n*m行
select b.*,bo.*
from beauty b
cross join boys bo;
2.11 子查询
2.11.1 概述
含义:
出现在其他语句内部的select语句,称为子查询或内查询
分类:
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
按子查询出现的位置:
select后面:
标量子查询
from后面:
表子查询
where或having后面:
标量子查询(单行)
列子查询(多行)
行子查询
exists后面(相关子查询):
标量子查询
2.11.2 where或having后面
标量子查询(单行子查询)
列子查询(多行子查询)
行子查询(多列多行)
特点:
子查询放在小括号内
子查询一般放在条件的右侧
标量子查询,一般搭配着单行操作符使用,>,<,>=,<=,=,<>
列子查询,一般搭配着多行操作符使用,in,any/some,all
in/not in:等于列表中的任意一个
any|some:和子查询返回的某一个值比较
all:和子查询返回的所有值比较
子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果
#标量子查询
#案列:谁的工资比abel高?
select *
from employees
where salary>(
select salary
from employees
where last_name='abel'
);
#列子查询
#案列:返回location_id是1400或1700的部门中的所有员工姓名
select last_name
from employees
where department_id in(
select distinct department_id
from departments
where location_id in(1400,1700)
);
#行子查询
#案例:查询员工编号是最小并员工工资最高的员工信息
select *
from employees
where (employee_id,salary)=(
select min(employee_id),max(salary)
from employees
)
2.11.3 select后面
#案例:查询每个部门的员工个数
select d.*,(
select count(*)
from employees e
where e.department_id=d.department_id
) 个数
from departments d;
2.11.4 from后面
将子查询结果充当一张表,要求必须起别名
#案例:查询每个部门的平均工资的工资等级
select ag_dep.*,g.grade_level
from (
select avg(salary) ag,department_id
from employees
group by department_id
) ag_dep
inner join job_grades g
on ag_dep.ag between lowest_sal and highest_sal;
2.11.5 exists后面
语法:
exists(完整的查询语句)
结果:
1或0
#案例:查询员工名和部门名
select department_name
from departments d
where exists(
select *
from employees e
where d.department_id=e.department_id
);
2.12 分页查询
2.12.1 概述
语法:
select 查询列表
from 表
limit offset,size;
offset:要显示条目的起始索引(这里索引从0开始)
size:要显示的条目个数
2.12.2 查询第11条--第25条
select * from employees limit 10,15;
2.13 联合查询
2.13.1 概述
将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
...
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
要求多条查询语句的查询列数是一致的
要求多条查询语句的查询的每一列的类型和顺序最好一直
union关键字默认去重,如果使用union all可以包含重复项
3 Data Manipulation Language
3.1 插入语句
3.1.1 方式一
insert into 表明(列明,。。。) values(值1,。。。)/子查询:
values支持插入多行
后面支持子查询
3.1.2 方式二
insert into 表明
set 列明=值,。。。
3.2 修改语句
3.2.1 修改单表的记录
语法:
update 表名
set 列=新值,。。。
where 筛选条件;
3.2.2 修改多表的记录
语法:
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,。。。
where 筛选条件;
3.3 删除语句
方式一:delete
语法:
1.单表的删除
delete from 表名 where 筛选条件
2.多表的删除
delete 表1的别名,表2的别名
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件;
方式二:truncate
语法:
truncate table 表名;
4 Data Definition Language
4.1 库的管理
4.1.1 库的创建
create database [if not exists] 库名;
4.1.2 库的修改
alter database 库名 character set 字符集; //更改字符集
4.1.3 库的删除
drop database [if exists] 库名;
4.2 表的管理
4.2.1 表的创建
create table 表名(
列名 列的类型[(长度) 约束],
列名 列的类型[(长度) 约束],
。。。
列名 列的类型[(长度) 约束]
);
4.2.2 表的修改
修改列名:
alter table 表名 change [column] 旧名 新名 新名的列的数据类型;
修改列的类型或约束:
alter table 表名 modify column 列名 列的新的数据类型;
添加新列:
alter table 表名 add column 列名 列的数据类型;
删除列:
alter table 表名 drop column 列名;
修改表名:
alter table 旧的表名 rename to 新的表名;
4.2.3 表的删除
drop table 表名;
4.2.4 表的复制
仅仅复制表的结构:
create table 新的表 like 被复制的表;
复制表的结构+数据:
create table 新的表
select 列名 from author
[where 筛选条件];
4.3 字段类型
4.3.1 概述
数值型:
整型:
小数:
浮点数:
定点数:
字符型:
较短的文本:char、varchar
较长的文本:text、blob(较长的二进制数据)
日期型:
4.3.2 整型
整数类型 |
字节 |
范围 |
tinyint |
1 |
有符号:-128~127 无符号:0~255 |
smallint |
2 |
有符号:-32768~32767 无符号:0~65535 |
mediumint |
3 |
很大 |
int、integer |
4 |
更很大 |
bigint |
8 |
更很大大 |
create table tab_int(
t1 int, //有符号
t2 int unsigned //无符号
);
4.3.3 浮点数类型
浮点数类型 |
字节 |
范围 |
float[(M,D)] |
4+ |
很大 |
double[(M,D)] |
8 |
很大 |
4.3.4 定点数类型
定点数类型 |
字节 |
范围 |
DEC[(M,D)] DECIMAL[(M,D)] |
M+2 |
最大取值范围与double相同,给定decimal的有效取值范围由M和D决定 |
4.3.5 字符串
类型 |
最多字符数 |
描述及存储需求 |
char(M) |
M |
M为0~255之间的整数 |
vachar(M) |
M |
M为0~65535之间的整数 |
4.3.6 枚举
要求插入的值必须属于列表中指定的值之一。
create table tab_char(
c1 enum('a','b','c')
);
4.3.7 集合
跟枚举相似,但是可以同时插入列表中的多个值
create table tab_set(
s1 set('a','b','c','d')
);
insert into tab_set values('a');
insert into tab_set values('a,b,c');
4.3.8 日期型
日期和时间类型 |
字节 |
格式 |
date |
4 |
1000-01-01 |
datetime(不受时区影响) |
8 |
1000-01-01 00:00:00 |
timestamp(受时区影响) |
4 |
19700101080001 |
time |
3 |
[-]838:59:59 |
year |
1 |
1901 |
4.4 约束类型
4.4.1 分类
not null
default
primary key
unique
check:检查约束[mysql中不支持]
foreign key
4.4.2 foreign key
要求在从表设置外键关系
从表的外键的类型和主表的关联列的类型要求一致或兼容
主表的关联列必须是一个key(主键或唯一)
插入数据时,先插入主表、再插入从表,删除数据时,先删除从表、再删除主表
alter table stuinfo
add [constraint fk_stuinfo_major] foreign key(majorid) references major(id);
create table stuinfo(
id int,
gender char(1),
seat int,
age int,
majorid int,
[constraint fk_stuinfo_major] foreign key(majorid) references major(id)
);
4.4.3 修改表时删除约束
#删除费控约束
alter table stuinfo modify column stuname varchar(20) null;
#删除默认约束
alter table stuinfo modify column age int;
#删除主键
alter table stuinfo drop primary key;
#删除唯一
alter table stuinfo drop index seat;
#删除外键
alter table stuinfo drop foreign key fk_stuinfo_major;
4.5 标识列(自增长列)
4.5.1 创建表时设置标识列
create table tab_identity(
id int primary key auto_increment,
name varchar(20)
);
4.5.2 修改表时设置标识列
alter table tab_identity modify column id int primary key auto_increment;
4.5.3 修改表时删除标识列
alter table tab_identity modify column id int primary key ;
4.5.4 设置步长
每次增长3
set auto_increment_increment=3;
4.5.5 注意点
一张表里标识列只能有一列,且必须跟主键或者唯一搭配使用
5 Transaction Control Language
5.1 视图
5.1.1 创建视图
语法:
create view 视图名
as
查询语句;
5.1.2 修改视图
create or replace view 视图名
as
查询语句;
alter view 视图名
as
查询语句
5.1.3 删除视图
drop view 视图名,视图名;
5.1.4 查看视图
desc 视图名;
show create view 视图名;
5.1.5 修改视图
修改视图表跟修改普通表一样,但是
视图的更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
1.包含以下关键字的sql语句:分组函数、distinct、group by、having、union、union all
2.常量视图
3.select中包含子查询
4.join
5.from一个不能更新的图
6.where子句的子查询引用了from子句中的表
5.2 变量
5.2.1 系统变量
查看所有的全局变量
show global variables;
查看满足条件的部分系统变量
show global|[session] variables like '%char%';
查看指定的某个系统变量的值
select @@global.系统变量名;
为某个系统变量赋值
set @@global.系统变量名=值;
5.2.2 会话变量
查看所有的会话变量
show [session] variables;
查看满足条件的部分会话变量
show [session] variables like '%char%';
查看指定的某个会话变量的值
select @@[session.]会话变量名;
为某个会话变量赋值
set @@[session.]系统变量名=值;
5.2.3 用户变量[自定义变量]
作用域:针对于当前会话(连接)有效,同于会话变量的作用域。
赋值的操作符:=或:=
步骤:
一:声明并初始化
set @用户变量名=值;
或
select @用户变量名=值;
二:赋值(更新用户变量的值)
set @用户变量名=值;
或
select @用户变量名=值;
或
select 字段 into @用户变量名 from 表;(查询结果必须是一个值)
三:使用(查看用户变量的值)
select @用户变量名
5.2.4 局部变量[自定义变量]
作用域:仅仅在定义它的begin end中有效,只能放在第一句
步骤:
一:声明
declare 变量名 类型;
declare 变量名 类型 default 值;
二:赋值(更新局部变量的值)
set 局部变量名=值;
或
select @局部变量名=值;
或
select 字段 into 局部变量名 from 表;(查询结果必须是一个值)
三:使用(查看局部变量的值)
select @局部变量名
5.3 存储过程和函数
5.3.1 创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的SQL语句)
end
注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
参数模式:in,out,inout
in:该参数需要调用方传入值
out:该参数可以作为返回值
inout:该参数需要调用方传入值,又可以作为返回值
2.如果存储过程体仅仅只有一句话,begin end可以省略
3.存储过程可以有0个返回值,也可以有多个返回值
5.3.2 调用语法
call 存储过程名(实参列表);
5.3.3 无参实例
插入到admin表中五条记录
创建:
delimiter $
create procedure myp1()
begin
insert into admin(username,password)
values('a1','aa'),('a2','aa'),('a3','aa');
end $
调用:
call myp1()$
5.3.4 创建带in模式参数的存储过程
案例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 $
调用
call myp2('炯文')$
===================================================
案例2:用户是否登录成功
创建
create procedure myp4(in username varchar(20),in password varchar(20))
begin
declare result int default 0;
select count(*) into result
from admin
where admin.username=username
and admin.password=password;
select if(result>0,'成功','失败');
end $
调用
call myp4('炯文','aaa')$
5.3.5 创建带out模式参数的存储过程
案列1:根据女神名,返回对应的男神名
创建
create procedure myp5(in beautyName varchar(20),out boyName varchar(20))
begin
select bo.boyName into boyName
from boys bo
inner join beauty b on bo.id=b.boyfriend_id
where b.name=beautyName;
end $
调用
call myp5('炯文',@bName)$
select @bName$
=======================================
案列2:根据女神名,返回对应的男神名和男神魅力值
create procedure myp6(in beautyName varchar(20),out boyName varchar(20),out userCP int)
begin
select bo.boyName,bo.userCP into boyName,userCP
from boys bo
inner join beauty b on bo.id=b.boyfriend_id
where b.name=beautyName;
end
调用
call myp6('炯文',@bName,@usercp)$
5.3.6 创建带inout模式参数的存储过程
案列:传入a和b两个值,最终a和b都翻倍并返回
创建
create procedure myp8(inout a int,inout b int)
begin
set a=a*2;
set b=b*2;
end $
调用
set @m=10$
set @n=20$
call myp8(@m,@n)$
select @m,@n$
5.3.7 删除存储过程
drop procedure p1;
5.3.8 查看存储过程的信息
show create procedure myp2;
5.4 函数
5.4.1 概述
函数只能且只有一个返回值
5.4.2 创建语法
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
注意:
参数列表 包含两部分:
参数名 参数类型
函数体:
肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议
return值:
函数体中仅有一句话,则可以省略begin end
使用delimiter语句设置结束标记
5.4.3 调用语法
select 函数名(参数列表)
5.4.4 查看函数
show create function myf3;
5.4.5 删除函数
drop function myf3;
5.5 分支结构
5.5.1 if函数
select if(表达式1,表达式2,表达式3);
如果表达式1成立,则IF函数返回表达式2的值,否则返回表达式3的值
5.5.2 case结构
情况1:类似于java中的switch语句,一般用于实现等值判断
case 变量|表达式|字段
when 要判断的值 then 返回的值1或语句1;
when 要判断的值 then 返回的值2或语句2;
...
else 要返回的值n或语句n;
end case;
情况2:类似于java中的多重if语句,一般用于实现区间判断
case
when 要判断的条件1 then 返回的值1或语句1;
when 要判断的条件2 then 返回的值2或语句2;
...
else 要返回的值n或语句n;
end case;
5.5.3 if结构
if 条件1 then 语句1:
elseif 条件2 then 语句2;
...
[else 语句n;]
end if;
场景:应用在begin end中
5.6 循环控制
5.6.1 while
[标签:]while 循环条件 do
循环体;
end while [标签];
5.6.2 loop
[标签:] loop
循环体;
end loop [标签];
5.6.3 repeat
[标签:] repeat
循环体;
until 结束循环的条件
end repeat [标签];