SQL

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 [标签];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352