【MySQL】探索MySQL存储过程的魔力,初学者的数据库编程秘笈(内含实战SQL脚本)上

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】探索MySQL存储过程的魔力,初学者的数据库编程秘笈(内含实战SQL脚本)

🌟前言


MySQL存储过程作为一种服务器端的数据库编程方式,提供了高效、可重用的方法来执行相对复杂的数据库操作。本篇文章主要针对初学者,展开对MySQL存储过程的讲解,帮助MySQL初学者能够更好的学习。


🌟存储过程介绍


定义:


存储过程是一组预定义的SQL语句集合,被存储在数据库中,以便复用和调用。它们可以接收参数、执行逻辑判断、进行循环和异常处理,并返回结果。存储过程在数据库服务器上执行,减少了网络传输的开销,提升了性能。

MySQL存储过程支持常见的编程结构,如条件语句(IF-ELSE、CASE)、循环(WHILE、LOOP)和异常处理(TRY-CATCH)。除了基本的SQL语句,还可以通过使用变量、游标和临时表等特性,实现更复杂的操作和逻辑。


优势:


提高性能:存储过程在数据库服务器上执行,减少了与客户端的数据传输,降低了网络开销,从而提高了性能。此外,存储过程可以被编译和优化,减少了重复代码的冗余,进一步提升了查询执行效率。

简化复杂的查询:对于复杂的查询或需要按特定顺序执行的多个查询,存储过程提供了一种简洁、可重用的解决方案。通过将逻辑封装在存储过程中,可以减少应用程序中的SQL代码量,使数据库逻辑更清晰、易于维护。

增强安全性:存储过程可以设置为只能由特定用户或角色调用,从而增强了对数据库的安全性。

减轻客户端负担:将复杂的业务逻辑放在存储过程中,可以减轻客户端的负担。客户端只需调用相应的存储过程,而无需编写冗长的SQL语句和处理复杂的结果集,简化了应用程序的开发和维护。


劣势:


可移植性较差:存储过程在不同的数据库系统之间的语法和特性可能存在差异,这导致了存储过程的可移植性较差。如果需要将应用程序迁移到另一个数据库系统,可能需要对存储过程进行调整和修改。

难以调试和维护:存储过程的调试和维护相对复杂。由于存储过程在数据库服务器上执行,无法像客户端应用程序那样方便地进行调试。此外,存储过程的逻辑可能分散在多个存储过程中,增加了维护的难度。


🌟存储过程基本语法


创建:相当于Java中定义方法


CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE procedure_name ([parameter_list])
    [characteristic ...]
    BEGIN
        DECLARE variable_name data_type; -- 声明变量
        -- 存储过程的逻辑代码
    END;


DEFINER:可选项,创建存储过程的用户。可以指定具体的用户名,或使用CURRENT_USER表示当前用户。

procedure_name:指定存储过程的名称,遵循标识符命名规则。

parameter_list:可选项,用于指定存储过程的参数列表。参数由参数类型和参数名称组成,多个参数之间使用逗号分隔。参数类型可以是IN、OUT 或 INOUT,分别表示输入参数、输出参数和既是输入参数又是输出参数(赋值)。

characteristic:可选项,用于指定存储过程的特性。常用特性包括:


  • LANGUAGE SQL:表示存储过程使用 SQL 语言编写。
  • [NOT] DETERMINISTIC:指示存储过程是否是确定性的,即相同输入是否总是产生相同的结果。
  • CONTAINS SQL:表示存储过程包含 SQL 语句。
  • NO SQL:表示存储过程不包含 SQL 语句。
  • READS SQL DATA:表示存储过程只读取数据,不修改数据。
  • MODIFIES SQL DATA:表示存储过程修改数据。


BEGIN和END:定义存储过程的逻辑代码块的开始和结束位置。

DECLARE:用于声明变量。在存储过程的逻辑代码块中,可以使用DECLARE语句来声明变量,指定变量名称和数据类型。


调用:相当于Java中调用方法

CALL procedure_name([argument_list]);


CALL:关键字用于调用存储过程。

procedure_name:要调用的存储过程的名称。

argument_list:可选项,用于传递给存储过程的参数列表。参数与存储过程定义时指定的参数列表对应,多个参数之间使用逗号分隔。如果存储过程没有参数,可以省略该部分。


🌟存储过程实战


以下例子,均按下表进行操作


7d0ba1e9f0c4de78aec3e5e6d13e3058_7b07f05ba88942e0993b6cc0243b99cd.png


SQL语句:


--创建表
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    salary DECIMAL(10, 2)
);
--表中插入数据
INSERT INTO employees (id, name, age, salary)
VALUES
    (1, '张三', 25, 5000),
    (2, '李四', 30, 6000),
    (3, '王五', 35, 7000),
    (4, '赵六', 40, 8000),
    (5, '钱七', 45, 9000);


无参数列表存储过程


此存储过程名为getAllEmployees。它将从employees表中检索所有的员工记录并返回结果集。


CREATE PROCEDURE getAllEmployees()
BEGIN
    SELECT * FROM employees;
END;


调用存储过程进行检验

CALL getAllEmployees();


检验结果:


e5b11c47c89b09cbbca859c9deb0fde0_08b17ca4bc204a95803ff527c96376b3.png


带参数列表存储过程


此存储过程名为getEmployeeById,它接受一个输入参数empId,通过这个参数来查询与给定id相匹配的员工记录。


CREATE PROCEDURE getEmployeeById(IN empId INT)
BEGIN
    SELECT * FROM employees WHERE id = empId;
END;


调用存储过程进行检验

CALL getEmployeeById(2);


检验结果


f953f613c37935bb343fad071329d91c_5aae5155cb8f47e794d2ee4e5d4a4c53.png


带流程控制语句IF ELSE存储过程


此存储过程名为getEmployeeSalaryGrade,它接受一个输入参数empId,根据员工的薪水确定员工的薪资等级。根据不同的薪水范围,将员工的薪资等级分为"低级"、“中级"和"高级”。


CREATE PROCEDURE getEmployeeSalaryGrade(IN empId INT)
BEGIN
    DECLARE empSalary DECIMAL(10, 2);
    DECLARE empGrade VARCHAR(10);
    SELECT salary INTO empSalary FROM employees WHERE id = empId;
    IF empSalary < 5000 THEN
        SET empGrade = '低级';
    ELSEIF empSalary >= 5000 AND empSalary < 8000 THEN
        SET empGrade = '中级';
    ELSE
        SET empGrade = '高级';
    END IF;
    SELECT empGrade AS grade;
END;


调用存储过程进行检验

call getEmployeeSalaryGrade(3)


检验结果


53895831b761f982758be5d7f7c0b7a1_31fa6efffe0b4fd284ccd7c3377d0c0a.png


带条件控制语句CASE存储过程


此存储过程名为categorizeEmployee,它根据员工的姓名确定员工的职位。


CREATE PROCEDURE categorizeEmployee()
BEGIN
    SELECT id, name,
        CASE
            WHEN name = '张三' THEN '管理人员'
            WHEN name = '李四' THEN '管理人员'
            ELSE '普通员工'
        END AS category
    FROM employees;
END;


调用存储过程进行检验

call categorizeEmployee()


检验结果


62da806085a22e253142dd0241480b00_34b7aa622f7f4a4c9503bef802937ba1.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
|
存储 SQL NoSQL
|
8天前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
22 0
|
1月前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
47 1
|
18天前
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
1月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
202 1
|
26天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
36 0
|
27天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
1月前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
47 0
|
1月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
20 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
87 0
下一篇
无影云桌面