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

一. 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)
beginselect * 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,last80from orderinfowhere `ispaid`="已支付";# 这里是计算 20%人 的消费总和 select sum(amt) into top20FROM(select uid,sum(amount) as amtfrom orderinfowhere `ispaid` = "已支付"GROUP BY uidorder by amt desclimit top20)as tmp;# 计算80%人的消费总和select sum(amt)into last80FROM(select uid,sum(amount) as amtfrom orderinfowhere `ispaid` = "已支付"GROUP BY uidorder by amt asclimit last80)as tmp1;# 这里才是输出select top20 ,last80 from dual;
ENDcall 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 numwhen 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 studentgroup by  ssex,year(Sage);

2. if-else  只能用在函数中,不可以直接使用在sql语句中
if 条件 then//代码1elseif 条件 then// 代码2else// 代码3end if;create procedure pro_8(in grade int)
beginif grade=1 thenselect '金牌会员' as '等级';elseif grade=2 thenselect '普通会员' as '等级';elseselect '游客' as '等级';end if;
end 
#调用
call pro_8(3)

3. loop循环

#loop遇到leave退出
create procedure proc(in num int)
begindeclare total int default 0;declare i int default 0;sign:loop          #循环标志set total=total+i;set i=i+1; if i>=num thenleave sign;# leave=breakend if;end loop;select total from dual;
end //call proc(100)//
#如果没有设置标签名,leave loop
#sign是循环名,用于结束循环,可以自己随意取名字

4. while循环

#语法:
while 条件 do//代码
end whilecreate procedure pro_11(in num int)
begindeclare total int default 0;declare i int default 0;while num>=i doset total=total+i;set i=i+1;end while;select total from dual;
end //call pro_11(100)//

5.repeat循环

#语法
repeat代码until 条件    -- 直重复到条件为true才结束
end repeatcreate procedure pro_12(in num int)
begindeclare total int default 0;declare i int default 0;repeatset total=total+i;set i=i+1;until i>numend repeat;select total from dual;
end //call pro_12(100)//

6. leave和iterate

leave类似于break,iterate类似于continuecreate procedure pro_13()
begindeclare i int default 0;sign:while i<5 doset i=i+1;if(i=3) then#leave sign;   -- 类似于breakiterate sign;    -- 类似于continueend if;select i from dual;end while;
end //call pro_13()//

四. 自定义函数

    调用直接 select

#语法:
Create function 函数名(形参) returns 返回的数据类型
begin//函数体
end#第一步
delimiter //#不带参数的函数
create function myfun() returns varchar(32)
beginreturn 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
begindeclare 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)
beginreturn concat(ucase(substr(str,1,1)),substr(str,2));
end//


-- 封装一个首字母大写的自定义函数create function firstup(str varchar(32)) returns varchar(32)
begindeclare a varchar(1);declare b varchar(32);set a = upper(left(str,1));set b = lower(substr(str,2));return concat(a,b);
endselect firstup("word")

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

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

相关文章

Java中 常见的开源图库介绍

阅读本文之前请参阅------Java中 图的基础知识介绍 在 Java 中&#xff0c;有几种流行的开源图库&#xff0c;它们提供了丰富的图算法和高级操作&#xff0c;可以帮助开发者更高效地处理图相关的问题。以下是几种常见的 Java 图库及其特点和区别&#xff1a; JGraphT …

阳光保险MySQL数据库平稳迁移OceanBase,稳定运营超700天

作者简介&#xff1a; 车东兴&#xff1a;于阳光保险就职&#xff0c;深耕保险行业的 IT 领域长达12 年&#xff0c;对保险领域的基础架构实践有深刻的理解与掌握。熟悉多款数据库&#xff0c;具有丰富的数据库运维经验。 王华城&#xff1a;于阳光保险就职&#xff0c;10多年一…

红帽认证RHCE好考吗?多长时间能考下来?报名费多少一门?哪些人适合考红帽认证?

一、红帽认证等级 红帽认证考试有三个等级&#xff0c;分别是RHCSA&#xff08;红帽认证系统管理员&#xff09;&#xff0c;RHCE&#xff08;红帽认证工程师&#xff09;&#xff0c;RHCA&#xff08;红帽认证架构师&#xff09;。RHCA是最高级别的认证。 二、RHCE考试 1、考…

C语言数据结构之堆排序

青衿之志 履践致远 堆排序(Heapsort) 是指利用 堆 这种数据结构所设计的一种排序算法&#xff0c;它是 选择排序 的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆&#xff0c;排降序建小堆。 &#x1f3a5;二叉堆 &#x1f3a5;二叉树 &#x1f525;期待小伙伴们…

sql面试题21:营销带货销量分析

题目大概意思&#xff1a; 找出网红带来的订单号和销售额&#xff08;销售额是该订单的&#xff0c;比如凑单&#xff09;&#xff0c;满足是优惠码是1的&#xff0c;B类商品 数据表两个&#xff0c;分别是订单和品类 CREATE TABLE 订单 (订单号 VARCHAR(512),商品号 VARCH…

常用的gpt网站

ChatGPT是一款基于人工智能技术的对话型AI助手&#xff0c;能够进行自然语言交互并提供个性化的对话服务。通过先进的深度学习模型&#xff0c;ChatGPT能够理解用户输入的文本&#xff0c;并生成有逻辑、连贯性的回复。它可以回答各种问题、提供建议、分享知识&#xff0c;还能…

如何使用US Domain Center和WordPress搭建非营利组织网站的详细指南

在今天的数字化时代&#xff0c;拥有一个专业、易于管理和更新的网站对于非营利组织&#xff08;例如慈善机构、NGO等&#xff09;至关重要。WordPress是一个功能强大且易于使用的网站构建平台&#xff0c;而美国域名中心 US Domain Center&#xff1a;US Domain Center 则是一…

嵌入式学习37-TCP并发模型

TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来 资源开销 2.能够实现的 并发量 比较有限 2.IO模型: 1.阻塞IO: 没有…

群晖NAS使用Docker安装WPS Office并结合内网穿透实现公网远程办公

文章目录 推荐1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年&#xff0c;由马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;、埃迪华索伦&#xff08;Eduardo Saverin&#xff09;、安德鲁麦克卡拉姆&#xff08;Andrew McCollum&#xff09;、克里斯休斯&#xff08;Chris Hughes&#x…

如何保证消息的顺序性

先看看顺序会错乱的场景&#xff1a;RabbitMQ&#xff1a;一个 queue&#xff0c;多个 consumer&#xff0c;这不明显乱了&#xff1a; 解决方案&#xff1a;

Qt/QML编程之路:openglwidget和倒车影像的切换(43)

关于如何实现一个基于OpenGL的3d 图形,这个有很多专门的介绍,我在开发中遇到了这么一个问题: 如何实现一个倒车影像的video显示与一个3D物体显示的切换,因为开窗在同样的一个位置,如果车子倒车启动,则需要将原本显示3D的地方切换为视频图像的显示。 class testOpenGl : …

【办公类-22-13】周计划系列(5-5)“周计划-05 上传周计划png“ (2024年调整版本)

作品展示——将docx 转PDF转png&#xff0c;保留第一张图片 背景需求&#xff1a; 把周计划内容初步替换后&#xff0c;获得了19周的周计划教案的docx 需要把周计划第一页的反思内容删除&#xff0c;&#xff0c;然后把第一页横版截图上传班级主页。 需求&#xff1a;周计划do…

云桥通SDWAN企业组网的15大应用场景

云桥通SD-WAN企业组网技术在企业网络中有多样化的应用场景&#xff0c;在技术不断迭代升级中&#xff0c;已经越来越匹配现在的互联网环境&#xff0c;其中在这15中常见的应用场景中&#xff0c;使用云桥通SDWAN企业组网可以很好的帮到企业&#xff1a; 分支机构连接优化&#…

C#判断素数的方法:试除法 vs 优化的试除法 vs 米勒-拉宾素数检测算法

目录 1.素数也就质数 2. 试除法 3.优化的试除法_1 4.优化的试除法_2 5.优化的试除法_3 6.米勒-拉宾素数检测算法 1.素数也叫质数 一个质数是一个大于1的自然数&#xff0c;只有两个正因数&#xff1a;1和它自身。这意味着如果一个数只有两个正因数&#xff0c;那么它就是…

#QT(QSpinBox,QDoubleSpinBox)

1.IDE&#xff1a;QTCreator 2.实验:实现一个计价工具&#xff0c;进制转换工具。 教程来自&#xff1a;阿西拜编程 QT C 5.9 3.记录 设置进制的第二种方法 ui->hex_tx->setDisplayIntegerBase(16); //设置显示进制为16进制 4.代码 widget.cpp #include "wi…

做一下笔记 CXDB5CCAM-MK 与 CXDBCCAM-ML 的区别

1. CXDB5CCAM-MK 的简介 2. CXDBCCAM-ML 的简介 3. 这个两个器件的区别 最基本可见的区别是 &#xff1a; 传输速度的不同。 4. 资料在资源里面

智能计算的基本原理——智能计算原理与实践【文末送书-36】

文章目录 智能计算的基本原理基本原理技术智能计算在实践中的应用 智能计算&#xff1a;原理与实践【文末送书-36】 随着科技的不断发展&#xff0c;智能计算成为引领时代的前沿技术之一。从传统的计算机模型到如今的人工智能系统&#xff0c;智能计算不仅深刻地改变着我们的生…

Python学习:首选开发环境VScode

Visual Studio Code 打开官网 https://code.visualstudio.com/&#xff0c;下载软件包&#xff0c;一步步安装即可。 我认为Visual Studio Code最好的Web前端开发工具。 Visual Studio Code是什么 Visual Studio Code (简称 VS Code) 是一款由 Microsoft 开发的轻量级、免费和…

深入探究:AVL树的平衡之道

文章目录 一、AVL树的原理AVL树的定义和特性平衡因子的概念 二、AVL树的自平衡策略a. 单旋&#xff08;single rotation&#xff09;1. 左单旋&#xff08;Left Rotation&#xff09;&#xff1a;2. 右单旋&#xff08;Right Rotation&#xff09;&#xff1a; b. 双旋&#xf…