SQL存储过程和函数

news2024/11/27 12:54:08

SQL存储过程和函数

    • 变量
      • 系统变量
      • 用户定义变量
      • 局部变量
    • 存储过程
    • 存储函数

变量

在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。

系统变量

系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。

  • 全局变量(GLOBAL): 全局变量针对于所有的会话。

  • 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口不生效。

查看系统变量:

SHOW [ SESSION | GLOBAL ] VARIABLES ; -- 查看所有系统变量
SHOW [ SESSION | GLOBAL ] VARIABLES LIKE '......'; -- 可以通过LIKE模糊匹配方
式查找变量
SELECT @@[SESSION | GLOBAL] 系统变量名; -- 查看指定变量的值

设置系统变量:

SET [ SESSION | GLOBAL ] 系统变量名 =;
SET @@[SESSION | GLOBAL]系统变量名 =;

用户定义变量

用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。

-- 赋值
set @myname = 'XXX';
set @myage := 10;
set @mygender := '男', @myhobby := 'sleep';
select @mycolor := 'blue';
select count(*) into @mycount from tb_user;

-- 使用
select @myname,@myage,@mygender,@myhobby;
select @mycolor , @mycount;

局部变量

局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。

可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。

-- 声明局部变量 - declare
-- 赋值
create procedure p2()
begin
	declare ecount int default 0;  --声明
	select count(*) into ecount from employee;  //赋值
	select ecount;
end;
call p2();

存储过程

存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
在这里插入图片描述
特点:

  • 封装,复用
  • 可以接收参数,也可以返回数据
  • 减少网络交互,效率提升

建表语句:

CREATE TABLE employee(
	employee_ID int not null,
	employee_name varchar(20) not null,
	street varchar(20) not null,
	city varchar(20) not null,
	PRIMARY KEY(employee_ID)
);

CREATE TABLE company(
	company_name varchar(30) not null,
	city varchar(20) not null,
	PRIMARY KEY(company_name)
);

create table manages(
	employee_ID int not null,
	manager_ID int,
	primary key(employee_ID),
  foreign key(employee_ID) references employee(employee_ID) on delete cascade,
	foreign key(manager_ID) references employee(employee_ID) on delete set null			
);

create table works(
	employee_ID int not null,
	company_name varchar(30),
	salary numeric(8,2) check (salary>3000),  
	primary key(employee_ID),
	foreign key(employee_ID) references employee(employee_ID) on delete cascade,
	foreign key(company_name) references company(company_name) on delete set null									
);

1.创建一个存储过程CountEmp,其作用是获取employee表中记录的条数。

CREATE PROCEDURE CountEmp()
BEGIN
	SELECT COUNT(*) as 'employee表记录数' FROM employee;
END;

CALL CountEmp();

2.创建一个存储过程AvgSal,其作用是获取所有员工的平均工资。

CREATE PROCEDURE AvgSal()
BEGIN
	SELECT AVG(salary) '员工的平均工资' from works;
END;

CALL AvgSal();

3.创建一个存储过程CountCom1,输入变量为公司的名字(company_name),输出为该公司中员工的个数。

CREATE PROCEDURE CountCom1(IN com_name VARCHAR(30))
BEGIN
	SELECT COUNT(*) '该公司中员工的个数' FROM works WHERE company_name=com_name;
END;

CALL CountCom1('Alibaba');

4.分别查看存储过程CountCom1的状态和定义。

SHOW PROCEDURE STATUS LIKE 'CountCom1';
SHOW CREATE PROCEDURE CountCom1;

5.删除存储过程CountEmp。

DROP PROCEDURE CountEmp;

存储函数

存储函数是有返回值的存储过程。

1.创建一个函数CityByName, 其作用是返回姓名为‘Shelby’的员工所居住的城市city。

CREATE FUNCTION CityByName(ename VARCHAR(20))
RETURNS VARCHAR(20) DETERMINISTIC
BEGIN
	DECLARE temp_city VARCHAR(20) DEFAULT NULL;
	SELECT city INTO temp_city FROM employee WHERE employee_name=ename;
	RETURN temp_city;
END;

SELECT CityByName('Shelby') '居住城市';

2.创建一个函数CountCom2,输入变量为公司的名字(company_name),输出为该公司中员工的个数。

CREATE FUNCTION CountCom2(com_name VARCHAR(30))
RETURNS INT DETERMINISTIC
BEGIN
	DECLARE ecount INT DEFAULT 0; 
	SELECT COUNT(*) INTO ecount FROM works WHERE company_name=com_name;
	RETURN ecount;
END;

SELECT CountCom2('Alibaba') '该公司中员工的个数';

3.分别查看函数CountCom2的状态和定义。

SHOW FUNCTION STATUS LIKE 'CountCom2';
SHOW CREATE FUNCTION CountCom2;

4.删除存储函数。

DROP FUNCTION CountCom2;

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

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

相关文章

软件开发和软件测试,到底学哪个好呢?

写在前面:买车没有最好,只有最适合。 类似这类“很难选择”的问题,在知乎上其实有很多。 比如:“该去年薪10w的国家电网,还是去年薪40w的互联网大厂”; 比如:“城里有房,剩下的100…

营业执照识别

目录 1、制作文本检测数据集 2、导出文本检测推理模型 3、制作语义实体识别数据集 4、训练模型 5、模型预测 6、模型导出 7、模型推理 1、制作文本检测数据集 文本检测数据集格式如下: dataset_dir # 数据集根目录,目录名称可以改变 ├── im…

一招告别百度广告烦恼,同时效率提高100倍的几个常用搜索技巧!

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…

软件测试面试-如何定位线上出现bug

其实无论是线上还是在测试出现bug,我们核心的还是要定位出bug出现的原因。 定位出bug的步骤: 1,如果是必现的bug,尽可能的复现出问题,找出引发问题的操作步骤。很多时候,一个bug的产生,很多时…

可以写进简历的软件测试项目实战经验(包含电商、银行、app等)

前言: 今天给大家带来几个软件测试项目的实战总结及经验,适合想自学、转行或者面试的朋友,可以写进简历里的那种哦。 1、项目名称: 家电购 项目描述: “家电购”商城系统是基于 web 浏览器的电子商务系统,通过互联网…

GBase8a-GDCA-第二次阶段测试

文章目录 主要内容在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1d552b9d6d204f4fb4280ccc52807ed5.png)在这里插入图片描述 总结 主要内容 GBase8a-GDCA-第二次阶段测试及答案 总结 以上是今天要讲的内容,GBase8a-GDCA-第二次阶段测试…

clion qt导出dll给别的项目用

clion 导出dll给别的项目用,并且引入matplotcpp dll生成一个mydll的dll文件 1.先做一个简单dll的测试下 cmake_minimum_required(VERSION 3.26) project(untitled) set(CMAKE_CXX_STANDARD 11) add_library(untitled SHARED main.cpp)main.h void hello();main.cp…

在windows下vs c++运行g2o的BA优化程序示例

目录 1、前言2、准备工作安装git安装vcpkg(1)下载(2)安装(3)集成至vs 安装cmake 3、安装g2o4、安装opencv(1)下载(2)双击安装(3)环境变…

Redis应用场景及常见的数据类型

目录 一、Redis应用场景 1.1 Redis作为缓存 1.2 Redis作为消息队列 1.3 实现计数器和排行榜 1.4 实现分布式锁及分布式会话管理 二、Redis常见的数据类型 2.1 String(字符串)类型 2.2 list类型 2.3 Hash类型 2.4 Set类型 2.5 Sorted Set 一、Redis应用场…

前端开发学习 (一) 搭建Vue基础环境

一、环境搭建 1、安装nodejs #下载地址 https://nodejs.org/dist/v20.9.0/node-v20.9.0-x64.msi 2、配置环境变量 上面下载完安装包后自行安装,安装完成后安装下图操作添加环境变量 #查看版本 node --version v20.9.0# npm --version 10.1.03、配置npm加速源 np…

机器学习的逻辑回归

Sigmoid函数 逻辑回归的预测函数 梯度下降法-逻辑回归 import matplotlib.pyplot as plt import numpy as np # 生成一个关于分类器性能的详细报告。 # 这个报告包含了每个类别的精度、召回率、F1分数,以及所有类别的平均精度、召回率和F1分数 from sklearn.metri…

leetcode:367. 有效的完全平方数(python3解法)

难度:简单 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。 不能使用任何内置的库函数&#xff0c…

科技云报道:Citrix正式退出中国市场!国产们谁能真正顶上?

科技云报道原创。 2023年12月3日, Citrix(思杰)发布的公告将全面生效,中国市场(包括香港地区和澳门地区)也会停止所有新的交易。 这个消息,无疑是引起了业界的热议,毕竟Citrix可以…

11.11作业题

1.不死兔子 def fib(n):if n < 4:return 1else:return fib(n-1) fib(n-2) print("一年后共繁殖{}对兔子".format(fib(12))) 2.输入字符串&#xff0c;判断该字符串是否是回文字符串 s input("请输入一个字符串&#xff1a;") if not s:print("…

el-select组件绑定change怎么获取label和value值

组件中change回调只能获取到value,但是有时候需求是要传两个参数&#xff08;elementui 封装的change只能获取到value,我们可以通过原生事件去获取option值&#xff09;。 如果要在element组件上触发原生事件&#xff0c;一律都得加.native修饰符&#xff0c;否则无法触发事件。…

6.1 集合概述

1. 集合概述 1.1. 引入 在前面的章节中我们学习了数组&#xff0c;数组可以存储多个对象&#xff0c;但是数组只能存储相同类型的对象&#xff0c;如果要存储一批不同类型的对象&#xff0c;数组便无法满足需求了。为此&#xff0c;Java提供了集合&#xff0c;集合可以存储不…

《011.SpringBoot之餐厅点餐系统》

《011.SpringBoot之餐厅点餐系统》【界面简洁功能简单】 项目简介 需要源码及数据库的私信… [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisPlus; 前台&#xff1a;Layuivue; …

现在做跨境电商还需要全球代理IP吗?全球代理IP哪家靠谱?

随着全球互联网的发展&#xff0c;电商平台的发展和跨境贸易的便利化&#xff0c;跨境电商在过去几年中也一直呈现增长趋势&#xff0c;吸引了越来越多的企业和个体创业者入行。 然而&#xff0c;行业竞争也在不断加剧&#xff0c;跨境电商面临更多的越来越多的挑战&#xff0…

3C品牌国际市场攻略:海外网红营销如何推动电子经济

随着全球信息技术的快速发展&#xff0c;3C电子产品市场变得愈发竞争激烈&#xff0c;各品牌需要不断寻求新的市场推广方法来吸引更多消费者。其中&#xff0c;海外网红营销成为了一个备受关注的趋势&#xff0c;融合了互联网、社交媒体和消费品牌的力量&#xff0c;为3C品牌在…

comfyui指北-1

https://colab.research.google.com/github/tieai/SDXL-ComfyUI-Colab/blob/main/SDXL_OneClick_ComfyUI.ipynb#scrollToSaAJk33ppFw1https://colab.research.google.com/github/tieai/SDXL-ComfyUI-Colab/blob/main/SDXL_OneClick_ComfyUI.ipynb#scrollToSaAJk33ppFw1 可以用上…