SQL——存储过程与函数

环境

  DBMS:MySQL 8.0.17

  工具:Navicat Premium 11.2.16

存储过程

  存储过程是由过程化SQL语言书写的过程,这个过程经编译和优化后存储在数据库服务器中,使用时调用即可。

  优点:

  • 运行效率高。提供了在服务器端快速执行SQL语句的有效途径。
  • 降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出调用存储过程的名字和参数,就可以执行其中的多条SQL语句并进行数据处理。只有最终的处理结果才返回客户端。
  • 方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,既有利于集中控制,又能够方便地进行维护。当企业规则发生变化时只要修改存储过程即可,无须修改其他应用程序。

创建

CREATE PROCEDURE <存储过程名>([<参数模式> <参数名> <参数类型>])
BEGIN
    <SQL块>
END;

  存储过程的参数模式有3种:

  • in:参数需要传入值。
  • out:参数可以作为返回值。
  • inout:参数既需要传入值,又可以作为返回值。

调用

CALL <存储过程名>([<参数>]);

  若存储过程定义了参数,则在调用前需要先声明变量,然后在调用存储过程时传入变量。



  定义一个可以根据学号查询学生信息的存储过程getStudentBySno,如果传入的sno为空,则取学号为201215121的学生信息:

  

  声明用户变量sno:

  

  调用存储过程getStudentBySno:

  

  

  

  可以看到,传入的sno为空值,所以查询的是学号为201215121的学生信息。

  也就是说,模式为in的参数能获取传入变量的值。

  查看用户变量sno:

  

  可以看到,虽然存储过程中改变参数sno的值,但并不影响传入的用户变量sno的值。

  也就是说,作为模式为in的参数传入存储过程的变量,在调用存储过程后不会改变变量的值。



  定义一个可以获取学生人数的存储过程getCount:

  

  定义用户变量count:

  

  调用存储过程getCount:

  

  

  可以看到,用户变量的值并没有传入存储过程中。

  也就是说,模式为out的参数不能获取传入变量的值。

  查看用户变量count:

  

  可以看到,count的值发生了改变。

  也就是说,作为模式为out的参数传入存储过程的变量,在调用存储过程后会改变变量的值。



  定义一个可以用于求传入值的平方的存储过程:

  

  设置用户变量n:

  

  调用存储过程getPower:

  

  

  可以看到,用户变量的值传入了存储过程中。

  也就是说,模式为inout的参数能获取传入变量的值。

  查看用户变量n:

  

  可以看到,n的值发生了改变。

  也就是说,作为模式inout的参数传入存储过程的变量,在调用存储过程后会改变变量的值。

删除

DROP PROCEDURE <存储过程名>;

函数

  函数与存储过程类似,都是由过程化SQL语言书写的过程,这个过程经编译和优化后存储在数据库服务器中。

  与存储过程不同的是:

  • 函数有1个返回值,存储过程没有返回值。
  • 函数是通过select调用,存储过程是通过call调用。

  函数可以分为两种:

  • 单行函数:对应一个记录就会有一个返回值。
  • 统计函数:对应多个记录有一个返回值。

内置函数

  MySQL中有许多内置函数,可以在每个数据库中直接使用。

单行函数

数值相关

  ceil(X):返回数值X上取整的结果。

  floor(X):返回数值X下取整的结果。

  round(X):返回数值X四舍五入后的整数结果。

  round(X, D):返回数值X保留D位小数四舍五入后的结果。

字符串相关

  concat(str1, str2, ...):返回拼接后的字符串。

  instr(str, substr):返回substr在str中第一次出现的位置,如果没有出现则返回0。

  length(str):返回str的字节个数。

  lower(str):将str中的大写字母变为小写字母并返回。

  lpad(str, len, padstr):若str的长度大于len,则截断后面的字符,保留前面len个字符并返回;若str的长度小于len,则在str前使用padstr填充直到长度为len并返回。

  replace(str, from_str, to_str):将str中的from_str全部替换成to_str并返回。

  rpad(str, len, padstr):若str的长度大于len,则截断前面的字符,保留后面len个字符并返回;若str的长度小于len,则在str后使用padstr填充直到长度为len并返回。

  substr(str, pos, len):从第pos个字符开始截取str中之后的至多len个字符并返回。

  trim(str):去掉str前后“ ”。

  trim(remstr from str):去掉str前后的remstr。

  upper(str):将str中的小写字母变为大写字母并返回。

日期时间相关

  curdate():返回系统日期。

  curtime():返回系统时间。

  date_format(date, format):将日期按format进行格式化并返回。

  datediff(expr1, expr2):返回expr1和expr2相差的天数。

  now():返回系统日期时间。

  str_to_date(str, format):将日期字符串按format进行解析并返回。

常用日期格式符号
格式 描述
%Y 年份(4位)
%y 年份(2位)
%m 月份(01-12)
%d 天数(01-31)
%H 时(00-23)
%i 分(00-59)
%s 秒(00-59)
%M 月名
%a 缩写月名
%W 星期名
%b 缩写星期名
%p 上午、下午
%h 小时(01-12)
%T 24小时制—hh:mm:ss
%r 12小时制—hh:mm:ss AM|PM

其他

  database():返回当前数据库。

  if(expr1, expr2, expr3):判断expr1,如果为真返回expr2,否则返回expr3。

  ifnull(expr1, expr2):判断expr1是否为空值,如果是空值就返回expr2。

  user():返回当前用户。

  version():返回版本号。

统计函数

  avg([DISTINCT ]expr):统计多个记录中指定字段的均值(不计空值)。只适用于数值类型的字段。distinct关键字用于去掉重复数据的记录。

  count(*):统计记录数。

  count([DISTINCT ]expr):统计多个记录中指定字段的值的个数(不计空值)。distinct关键字用于去掉重复数据的记录。

  max(expr):统计多个记录中指定字段的最大值(不计空值)。

  min(expr):统计多个记录中指定字段的最小值(不计空值)。

  sum([DISTINCT ]expr):统计多个记录中指定字段的总和(不计空值)。只适用于数值类型的字段。distinct关键字用于去掉重复数据的记录。

创建

CREATE FUNCTION <函数名>([<参数名> <数据类型>]) RETURNS <数据类型>
BEGIN
    <SQL块>
    RETURN <返回值>;
END;

  需要注意的有:

  • MySQL中有一些内置函数,所以自定义函数的函数名不能与内置函数的函数名一致。
  • SQL块中return后的返回值的数据类型必须与returns后定义的数据类型一致。

  如果创建时出现以下报错信息:

  

  解决方法是将全局变量log_bin_trust_function_creators置为ON:

SET @@global.log_bin_trust_function_creators=ON;

调用

SELECT <函数名>([<参数>]);

  定义一个可以计算传入值的平方的函数:

  

  调用函数p:

  

  

删除

DROP FUNCTION <函数名>;

原文地址:https://www.cnblogs.com/lqkStudy/p/11493343.html

时间: 2024-11-02 14:10:53

SQL——存储过程与函数的相关文章

SQL存储过程和函数

SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定义:存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.和函数的区别在于,函数有返回值,存储过程没有. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度.2.当对数据库进行复杂操作时,

转载 sql 存储过程与函数区别

SQL Server用户自定义函数和存储过程有类似的功能,都可以创建捆绑SQL语句,存储在server中供以后使用.这样能够极大地提高工作效率,通过以下的各种做法可以减少编程所需的时间: 重复使用编程代码,减少编程开发时间. 隐藏SQL细节,把SQL繁琐的工作留给数据库开发人员,而程序开发员则集中处理高级编程语言. 维修集中化,可以在一个地方做业务上的逻辑修改,然后让这些修改自动应用到所有相关程序中. 乍看之下,用户自定义函数和存储过程的功能似乎一摸一样.但是,其实这两者之间还有一些虽然细微但是

【SQL server基础】SQL存储过程和函数的区别

本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个.而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行.执行的本质都一样.      函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少       1.    一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.       2.    对于存储过程来说可以返回参数,而函数只能返回值或者表对象.       3.    存储过程

Oracle数据库--PL/SQL存储过程和函数的建立和调用

1.存储过程建立的格式: create or replace procedure My_Procedure is begin --执行部分(函数内容); end; / 例子:(以hr表为例) create or replace procedure insert_procedure isbegininsert into JOBS values('MY_JOB','My Job',5000,10000);end;/ 2.存储过程调用 begininsert_procedure();end/ 3.函数

sql 存储过程和函数

最近在学习数据库,上课过程中总是在许多知识点有或多或少的问题,对于这些问题的产生,大概是由于我听课习惯所造成的吧,好啦,废话不多说,开始今天到主题吧. 首先介绍SQL的存储过程,先来给它定义,存储过程是由过程化SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,因此称它为存储过程,使用是只需要调用即可 优点: 1.运行效率高,因为它不像解释执行的SQL语句那样在提出操作请求的时候,才开始进行语法分析和优化工作.它提供了在服务器端快速执行SQL语句的有效途径. 2.存储过程降低了客

PL/SQL&amp;存储过程||存储函数&amp;触发器

plsql 有点:交互式  非过程化   数据操纵能力强   自动导航语句简单   调试简单   想率高 声明类型的方式 1.基本类型 2.引用变量 3.记录型变量 基本格式 declare 声明 begin exception end 判断语句 if:..then... else end if: 循环 loop 退出条件   exit when ...; end loop: 光标 cursor ---resltSet 返回多行数据 格式 cursor 表明 oper 打开 fetch 去一行光

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

用sql语句导出oracle中的存储过程和函数

用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' replace SELECT CASE WHEN LINE = 1 THEN 'CREATE OR REPLACE ' || TEXT WHEN LINE = MAX_LINE THEN TEXT || CHR(10 ) || '/' ELSE TEXT END FROM USER_SOURCE A LEF

创建sql自定义的函数及商品分页sql存储过程

--商品筛选时判断品牌ID是否存在 --select dbo.isValite(94,94)create function isValite(@brandId int,@bId int)returns intas begin Declare @rNumber int if @brandId = @bId set @rNumber = 1 else set @rNumber = 0 if @bId = 0 set @rNumber = 1 return @rNumberendgo --判断商品筛选