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)
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")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 —— 图形打印

题目1&#xff1a; 思路&#xff1a; 如果我们要打印一个实心正方形&#xff0c;其实就是一个二维数组&#xff0c;i控制行&#xff0c;j控制列&#xff0c;行列不需要控制&#xff0c;arr[i][j]直接打印星号即可。 对于空心正方形&#xff0c;我们只需要控制行和列的条件&…

MyBatis学习笔记|2024最新版Mybatis

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“aba…

应对电子邮件危害:垃圾邮件的特征、影响和预防策略

垃圾邮件是一种侵入性的未经请求的电子通信形式&#xff0c;主要通过电子邮件传播。它将大量无关、欺骗性或恶意内容发送给邮箱用户&#xff0c;内容涵盖令人讨厌的广告和欺诈行为、以及网络钓鱼链接。 截至 2022 年 12 月&#xff0c;垃圾邮件占电子邮件流量的 45% 以上。除了…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

Window部署Oracle并实现公网环境远程访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

掌握Redis,看完这篇文章就够了!

目录 1.Redis介绍 2.Redis服务器与客户端 3.Redis配置文件 4.Redis数据类型操作 4.1使用python连接数据库 4.2 字符串 4.3 哈希 4.4 键对应操作 4.5 列表 4.6 集合 4.7 有序集合 1.Redis介绍 Redis 是一个开源的内存数据库&#xff0c;它提供了一个高性能的 key-val…

基于PyTorch深度学习实战入门系列-Numpy基础全

Numpy的使用 导入Numpy模块 import numpy as np创建数组&#xff08;一维数组、小数数组、二维数组&#xff09; # 创建一个一维数组 n1 np.array([1, 2, 3]) # 创建一个含有小数的一维数组 n2 np.array([0.1, 0.2, 0.3]) # 创建一个简单的二维数组 n3 np.array([[1, 2], [3…

基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计

基于JavaSpringBootvueelement实现前后端分离牙科诊所管理系统详细设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

字节跳动也启动春季校园招聘了(含二面算法原题)

字节跳动 - 春招启动 随着各个大厂陆续打响春招的响头炮&#xff0c;字节跳动也官宣了春季校园招聘的正式开始。 还是那句话&#xff1a;连互联网大厂启动校招计划尚且争先恐后&#xff0c;你还有什么理由不马上行动&#xff1f;&#xff01; 先来扫一眼「春招流程」和「面向群…

怎么恢复删除的文件?三个实用数据恢复方法分享

在日常工作和生活中&#xff0c;我们经常会遇到误删文件的情况&#xff0c;这可能会带来不小的麻烦。幸运的是&#xff0c;随着科技的发展&#xff0c;现在有很多方法可以帮助我们恢复被删除的文件。下面让我来分享三种常用的文件恢复方法&#xff0c;一起来看看吧&#xff01;…

【Springboot】--如何将springboot+vue项目部署到云服务器?

目录 一、准备工作 1、购买云服务器 2、获取面板地址 二、jdk和数据库 1、安装环境 2、配置jdk环境变量 3、java版本的问题 4、添加数据库 三、前端部署 1、vue 2、创建站点 ​编辑 四、后端部署 1、application.yml 2、idea打包 3、运行jar包 4、开放端口 五、…

大模型时代下的 BI——智能问数

「智能问数」是 Sugar BI 基于文心大语言模型推出的对话式数据问答产品&#xff0c;让用户能够通过自然语言的方式进行对答形式的数据查询&#xff0c;系统自动使用可视化图表的方式呈现数据结果&#xff0c;并支持对数据做summary总结。 智能问数功能邀测中&#xff0c;欢迎CS…

Dgraph 入门教程四《开发环境的搭建》

在深入 了解Dgraph 之前&#xff0c;我们先了解下开发环境&#xff0c;毕竟让开发人员真正动起手来才是第一步。 Dgraph 支持很多种语言的开发&#xff0c;包括GO&#xff0c;Python&#xff0c;JS&#xff0c;C#和Java等等。出于项目需要&#xff0c;只了解下JS和Java。 1、…

基础小白快速入门web前端开发技术------->hbuilder的下载安装以及简易的网页最开始制作

工欲善其事&#xff0c;必先利其器&#xff0c; 在我们学习开发网页设计&#xff0c;我们首先需要一个良好的开发工具 这里我比较推荐hbuilder这个 只需要进入官网傻瓜下载&#xff0c;傻瓜安装 https://dcloud.io/ 点击hbuilder选择版本进行下载安装即可 hbuilder的新建文件…

深度强化学习(四)SARSA

深度强化学习&#xff08;四&#xff09;SARSA算法 一.SARSA 假设状态空间 S \mathcal{S} S 和动作空间 A \mathcal{A} A 都是有限集, 即集合中元素数量有限。比如, S \mathcal{S} S 中一共有 3 种状态, A \mathcal{A} A 中一共有 4 种动作。那么动作价值函数 Q π ( s …

ida pro 查看简易 Android .so 文件伪代码

参考&#xff1a; IDA Pro 反汇编器使用详解&#xff0c;适合逆向新人和老人的权威指南&#xff08;一&#xff09;-CSDN博客 注意&#xff0c;这篇只是我的简单记录&#xff0c;要学习详细使用&#xff0c;请参考其他大佬的。 让我们打开神器 IDA 直接把需要的文件拖到 IDA …

3.1_2 覆盖与交换

3.1_2 覆盖与交换 &#xff08;一&#xff09;覆盖技术 早期的计算机内存很小&#xff0c;比如IBM 推出的第一台PC机最大只支持1MB大小的内存。因此经常会出现内存大小不够的情况。 后来人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总和”的问题。 覆盖技术的…

工业智能网关的网关模式和交换机模式有哪些区别

工业智能网关主要用以实现工业物联网络中不同设备和系统之间的通信&#xff0c;工业智能网关常见的两种工作模式是网关模式和交换机模式&#xff0c;在功能和应用场景上存在显著差异&#xff0c;本篇就为大家简单介绍一下两者之间的主要区别&#xff1a; 1、网关模式 工业智能…

String 底层为什么使用 final 修饰?

1、典型回答 对于这个问题&#xff0c;Java之父詹姆斯 高斯林&#xff08;James Gosling&#xff09; 是这样回答的&#xff1a; I would use an immutable whenever I can 翻译为中文&#xff1a;只要允许&#xff0c;我就会使用不可变对象 而作为普通人的我们来说&#xff0…