week06 day04 (数据库高级函数 procedure 、sql写函数)

news2024/10/5 16:20:49

一. ER模型

  • 矩形: 代表实体
  • 椭圆:代表实体的属性
  • 菱形:relation 代表实体之间的关系

二. 存储过程(procedure)

1. 语法

语法:
create procedure 存储过程名(参数,…)
begin
	//代码
end//
 注意:

       因为在存储时需要写sql语句,所以sql语句结尾会需要加 ' ; ' , 如果在存储的过程中添加 " ; ", 会导致存储过程结束,导致存储过程中的语法有缺失,所以要解决 "结束符" 的问题, 

     1.1 修改当前窗口中的结束符
delimiter //

2.存储(procedure的使用)

    2.1 简单的sql(只有一条sql语句的)
# create procedure 函数名称(in是写入  参数名称  参数的类型)
begin
create procedure pro1(in params int)
#注意 最终输出的只有一个sql
select * from stuinfo WHERE sid = params;
end //

# 调用函数pro1(填的是参数)
call pro1(32)

#简单的
create procedure pro_1()
select * from stuinfo;
//

#如果存储过程中就一条SQL语句,begin…end两个关键字可以省略。

#调用存储过程
call pro_1()//

    2.2  多条sql

#包涵多条sql语句的
-- in代表输入参数,可以省略
-- return
-- procedure方便大型语句的查询;在创建成功以后,直接进行了语法的检查;
create procedure pro_2(in param int)
begin
	select * from stuinfo where sid=param;
	select * from score where sid=param;
end//

#调用
call pro_2(5)// 

3. 参数的类别

  • 在存储过程中,没有return,如果需要返回值,通过输出参数来实现
  • 在MySQL中,参数分为3类,输入参数(in),输出参数(out),输入输出参数(inout),默认情况下是是输入参数(in)
  • 存储过程中没有return,这里用out (输出参数),输出参数不用传递参数,输出参数要放在参数的最后

4. 局部变量

     declare 是声明局部变量

create procedure pro2(in id int)
begin
# declare 在sql中代表创建局部变量
	declare `name` varchar(10) default "Tom";
	select * from stuinfo where `sid` = `id` or `sname` = `name`;
end 

# 这里defalut name 是 tom, 所以结果一定会有tom 这个数据,如果选中sid也是tom的话,结果就
#只有一条,否则结果是两条

call pro2(31)

5. 全局变量

  • 全局变量前面必须有一个@,全局变量的数据类型取决于变量的值。如果一个全局变量没有赋值,他的数据类型为null,且全局变量只能接受单个值
 into与 全局变量 
create procedure pro3(in limit_skip int,in limit_number int ,out result int)
begin
	# into是相当于赋值,不会打印结果,只是把结果放在变量中国,如果想要打印结果,就select 变量
	
	select sum(sid)+limit_skip+limit_number into result from `stuinfo`;
end

/*首先 先解释(in limit_skip int,in limit_number int ,out result int) 
有两个输入参数 分别是limit_skip和limit_number, 输出参数是result。
其次,sql语句的解释, 首先对sid求和,其结果是122,然后 加上 两个我们传进去的两个参数,
这三个数字的求和 通过 into 传给 输出函数 result
*/

# 设置一个全局变量
# sum(sid)= 122
# set @res=null;

-- 调用pro函数, 2是limit_skip,4是limit_number,@res是传出参数
call pro3(2,4,@res) ;

# 打印 传出参数的结果,因为 sid求和 与 另外两个参数 的值传给了 res,打印res即可
select @res

# 结果是122 + 2+ 4 =128
inout参数与全局变量

        inout: 既可以传入也可以传出


create procedure pro4(inout result int)
begin
 # result 通过 inout参数 既可以传入 又可以传出 
	select sum(sid)+result into result from `stuinfo`;

end

# 将全局参数 res 设置默认值 10
set @res = 10;
# 因为函数pro4 只有一个 inout参数 result,传一个就行
call pro4(@res);
select @res

6.procedure的使用 

     在orderinfo表中,使用二八定律,也就是计算前20%的人群会消费80%的消费总额。

所以你需要计算有效消费(已支付)的。再按照 会员号进行group by,再依据消费金额大小,筛选出前20%的人,并求其消费总额,(金额从大到小,计算20%的人),再用相同方法计算出后80%的消费。

create procedure pro_ac()
begin
   # 定义一个局部表量 用于存储数据
	declare top20 int ;
	declare last80 int;
  # 这个是计算出已支付的 20%的人 与80%的人各有多少,
  #并且通过into传入的参数top20和last80中,不进行输出
	select round(count(DISTINCT uid)*0.2),
					round(count(DISTINCT uid)*0.8)
	into top20,last80
	from orderinfo
	where `ispaid`="已支付";
	
     # 这里是计算 20%人 的消费总和 
	select sum(amt) into top20
	FROM
	(
	select uid,sum(amount) as amt
	from orderinfo
	where `ispaid` = "已支付"
	GROUP BY uid
	order by amt desc
	limit top20
	)as tmp;

      # 计算80%人的消费总和
	select sum(amt)into last80
	FROM
	(
	select uid,sum(amount) as amt
	from orderinfo
	where `ispaid` = "已支付"
	GROUP BY uid
	order by amt asc
	limit last80
	)as tmp1;
	
 # 这里才是输出
	select top20 ,last80 from dual;
END

call pro_ac();

7. 添加索引

索引:是一种记录会消耗存储空间

最左前缀法:建立的索引当中最左边的字段一定要出现在sql语句之中。也就是说(`uid`,`ispaid`,`amount`) 像这样的联合索引当你 只使用 uid时,也可以进行查询。不然

只能`uid`,`ispaid`,`amount`三者同时出现才能进行搜索。

添加索引语法: alter table `表名称` add index `索引名字`(字段) 
alter table orderinfo add index `union1`(`uid`,`ispaid`,`amount`)

alter table orderinfo add index `union2`(`ispaid`,`amount`,`uid`)

alter table orderinfo add index `unioin3`(`amount`,`uid`,`ispaid`)


select `amount` from table where `ispad` = "已支付" order by uid 
查看是否使用索引:explain select
explain select * from orderinfo where ispaid="已支付"

三. sql 编程

1. case-when语句(可以写在sql语句中) (生成透视表)
create procedure pro_9(in num int)
begin
	#需要做判断的变量
     case num
          when 1 then select '杀马特' as '气质';
          when 2 then select '屌丝' as '气质';
          when 3 then select '正常人' as '气质';
          when 4 then select '贵族' as '气质';
          else select '输入不正确' as '气质';
     end case;
end //

call pro_9(2)//

 case when 条件1 then 结果

 case when 条件2 then 结果

select 
		year(Sage),
		case when ssex = "男" then count(*) end as 男,
		case when ssex = "女" then count(*) end as 女
		from student
		group by  ssex,year(Sage);

2. if-else  只能用在函数中,不可以直接使用在sql语句中
if 条件 then
  //代码1
	
elseif 条件 then
  // 代码2

else
  // 代码3
	
end if;




create procedure pro_8(in grade int)
begin
     if grade=1 then
        select '金牌会员' as '等级';
     elseif grade=2 then
        select '普通会员' as '等级';
     else
         select '游客' as '等级';
     end if;
end 
#调用
call pro_8(3)

3. loop循环

#loop遇到leave退出
create procedure proc(in num int)
begin
     declare total int default 0;
     declare i int default 0;
     sign:loop          #循环标志
         set total=total+i;
         set i=i+1; 
         if i>=num then
            leave sign;# leave=break
         end if;
     end loop;
     select total from dual;
end //

call proc(100)//
#如果没有设置标签名,leave loop
#sign是循环名,用于结束循环,可以自己随意取名字

4. while循环

#语法:
while 条件 do
	//代码
end while


create procedure pro_11(in num int)
begin
     declare total int default 0;
     declare i int default 0;
     while num>=i do
           set total=total+i;
           set i=i+1;
     end while;
     select total from dual;
end //

call pro_11(100)//

5.repeat循环

#语法
repeat
	代码
	until 条件    -- 直重复到条件为true才结束
end repeat

create procedure pro_12(in num int)
begin
     declare total int default 0;
     declare i int default 0;
     repeat
           set total=total+i;
           set i=i+1;
           until i>num
     end repeat;
     select total from dual;
end //

call pro_12(100)//

6. leave和iterate

leave类似于break,iterate类似于continue


create procedure pro_13()
begin
     declare i int default 0;
     sign:while i<5 do
           set i=i+1;
           if(i=3) then
                   #leave sign;   -- 类似于break
                   iterate sign;    -- 类似于continue
           end if;
           select i from dual;
     end while;
end //

call pro_13()//

四. 自定义函数

    调用直接 select

#语法:
Create function 函数名(形参) returns 返回的数据类型
begin
	//函数体
end


#第一步
delimiter //

#不带参数的函数
create function myfun() returns varchar(32)
begin
     return 123;
end//

#调用函数
select myfun()//

#Linux中的mysql不支持函数
#先查看是否支持
show variables like 'log_bin_trust_function_creators';
#进入/etc/my.cnf
#放在[mysqld]
log_bin_trust_function_creators=1
#写好以后重启mysql服务器
service mysqld restart


#带参数
create function myfun_1(num1 int,num2 int) returns int
begin
     declare num int default 0;
     set num=num1+num2;
     return num;
end //

select myfun_1(100,200)//


#删除函数
drop function myfun_1//


#自己封装 首字母大写
create function firstup(str varchar(1024)) returns varchar(1024)
begin
	return concat(ucase(substr(str,1,1)),substr(str,2));
end//


-- 封装一个首字母大写的自定义函数

create function firstup(str varchar(32)) returns varchar(32)
begin
	declare a varchar(1);
	declare b varchar(32);
	set a = upper(left(str,1));
	set b = lower(substr(str,2));
	return concat(a,b);
end

select firstup("word")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——堆的应用 堆排序详解

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

[Prob] Definition 3.7.5 (Function of two r.v.s)

定义3.7.5&#xff08;两个随机变量的函数&#xff09;&#xff1a;给定一个样本空间 \( S \) 的实验&#xff0c;如果 \( X \) 和 \( Y \) 是映射 到X(s) 和 Y(s) 的随机变量&#xff0c;那么 g(X, Y) 就是映射 s 到 g(X(s), Y(s)) 的随机变量。 请注意&#xff0c;我…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:DatePicker)

日期选择器组件&#xff0c;用于根据指定日期范围创建日期滑动选择器。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 DatePicker(options?: DatePickerOptions) 根据指定范…

SAP 批量删除工艺路线和主配方_简介

通常我们在创建工艺路线的时候或者在导入工艺路线的时候,会存在数据导入出错,或者你创建的工艺路线需要删除的情况,通常情况下我们第一个想到的就是使用CA02或者C202去删除工艺路线或者是主配方。但是这样会存在一个问题就是,首先我们知道工艺路线和主配方都是存在在组里面…

记一次项目所学(中间件等)-动态提醒功能(RocketMQ)

记一次项目所学(中间件等&#xff09;–动态提醒功能&#xff08;RocketMQ&#xff09; 订阅发布模式与观察者模式 RocketMQ&#xff1a;纯java编写的开源消息中间件 高性能低延迟分布式事务 Redis : 高性能缓存工具&#xff0c;数据存储在内存中&#xff0c;读写速度非常快 …

VBA_NZ系列工具NZ03:利用右键进行筛选操作

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

2024西安天文科技与探索装备展览会-相聚7月

2024西安天文科技与探索装备展览会-相聚7月 时间&#xff1a;2024年7月14-16日 地点&#xff1a;西安国际会展中心 首个面向全球天文产业的展览&#xff1b;中国唯一全面反映天文产业链的盛会&#xff1b; 定位于国际高端产业的展会&#xff1b;众多天文机构鼎力支持和重点培…

HTTPS网络请求失败WiFi请求成功

在xml的config文件中添加raw文件位置 raw文件是证书的pem文件去掉key文件 文件名称去掉多余的.cn

炫云客户端12载风华,最初界面竟长这样?满满都是回忆!

2013年&#xff0c;注定是一个意义非凡的节点 让我们将时间轴拨回到2013年 这一年&#xff0c;到底发生了什么呢&#xff1f; 这一年&#xff0c;嫦娥三号成功落月 中国探月工程开启新征程 这一年&#xff0c;工信部向三大运营商颁发4G牌照 标志着我国正式迈入4G时代 同…

51单片机基础篇系列-超声波测距

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HC-SR04产品特点 典型工作用电压&#xff1a;5V 超小静态工作电流&#xff1a;小于2mA 感应角度&#xff1a;不大于15度 探测距离&#xff1a;2cm-400cm 高精度&#…

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API&#xff0c;通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…

【C++】STL(四) deque容器

4、deque容器 4.1 简介 ① 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作&#xff0c;也可以对尾端进行插入和删除操作。 ② deque与vector区别&#xff1a; vector对于头部的插入效率低&#xff0c;数据量越大&#xff0c;效率越低&#xff0c;例如头部…

掘根宝典之C++迭代器简介

在C中&#xff0c;容器是一种用于存储和管理数据的数据结构。C标准库提供了多种容器&#xff0c;每种容器都有其独特的特点和适用场景。 我们知道啊&#xff0c;我们可以通过下标运算符来对容器内的元素进行访问&#xff0c;但是只有少数几种容器才同时支持下标运算符&#xf…

#车载诊断协议DoIP系列 —— 套接字处理 在线检查

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四海皆为家。人生的面吃一…

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…

【动态规划】C++算法312 戳气球

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode312 戳气球 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums…

基于springboot+vue实现教学改革项目管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现教学改革项目管理系统演示 摘要 教学改革行业的不断发展才能让更多的学生受益&#xff0c;那么教学改革的老师们对于教改可谓是花费了很大的心血。这种心血不仅仅在教学方式方法上&#xff0c;而且还是在于线下的流程审批和审核及教学改革的项目资料整理…

便携式隧道能见度仪的使用

TH-BN6随着交通基础设施的不断发展&#xff0c;隧道作为连接城市、山区等关键地段的交通要道&#xff0c;发挥着越来越重要的作用。然而&#xff0c;隧道内的能见度问题一直是困扰隧道运营者的难题。为了保障隧道通行安全&#xff0c;便携式隧道能见度仪应运而生。 二、便携式隧…

解忧杂货铺(①):必备网站资源

目录 在线工具 简单教程 程序员导航网 中国大学 青柠 廖雪峰的官方网站 在线工具 各类工具 https://tool.lu/ 简单教程 简单教程 https://www.twle.cn/ 程序员导航网 程序员导航网 https://hao.panziye.com/ 中国大学 中国大学MOOC网 https://www.icourse163.org/ 青…

Python 对Excel工作表中的数据进行排序

在Excel中&#xff0c;排序是整理数据的一种重要方式&#xff0c;它可以让你更好地理解数据&#xff0c;并为进一步的分析和报告做好准备。本文将介绍如何使用第三方库Spire.XLS for Python通过Python来对Excel中的数据进行排序。包含以下三种排序方法示例&#xff1a; 按数值…