MySQL数据库进阶-Java

一、存储过程

1、定义

存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字和参数来执行,并获得相应的结果。

应用程序通过存储过程操作表。

2、特点

(1)封装性:将业务逻辑封装在数据库内部,减少应用程序的复杂性

(2)可维护性:集中管理数据库操作,便于维护和更新。若表结构发生修改,不需要修改应用程序,而是修改存储过程。

(3)可重用性:可以多次被调用,提高代码的重用性。

3、优缺点

3.1优点

(1)性能优化:存储过程在创建时编译编译并存在数据库中,执行速度比单个SQL语句快。

(2)代码重用:存储过程可以重复调用,减少重复代码,提高代码的可维护性。

(3)安全性:可以限制用户直接访问数据库,通过存储过程间接访问,保证系统安全性。

(4)事务管理:可以在存储过程中实现复杂的事务逻辑。

(5)降低耦合:表结构发生变化,只需要修改存储过程,应用程序的修改较小。

3.2缺点

(1)可移植性差:不同数据库的实现可能有所不同,存储过程不能实现跨数据库移植,更换数据库需要重新编写。

(2)调试困难:只有少数数据库管理系统支持存储过程的调试和可视化界面,开发和维护困难。

(3)不适合高并发场景:在高并发场景下,存储过程可能会增加数据库的压力,难以维护。

4、环境准备

5、语法

5.1创建

复制代码
-- 修改SQL语句的结束标识符为//
delimiter //

create procedure 存储过程名 (参数列表)
begin
--sql 语句
end

-- 修改SQL语句的结束标识符为; (使用之后还原
delimiter ;

5.2调用

复制代码
call 存储过程名 (参数列表);

5.3查看

复制代码
-- 查看指定数据库中创建的存储过程
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA='表名';

-- 查看创建存储过程的sql
SHOW CREATE PROCEDURE 存储过程名;

-- 查看创建表的SQL
SHOW CREATE TABLE 表名;

5.4删除

复制代码
-- 删除存储过程名
DROP PROCEDURE IF EXISTS 存储过程名;

5.5示例

计算学生总分

6、变量

6.1系统变量

MySQL的配置变量,控制服务器的行为和性能,分为全局变量会话变量

(1)查看系统变量
复制代码
-- 查看所有系统变量,不指定则默认是session
show [global|session] variables;

-- 查看指定的系统变量,like模糊查询
show [global|session] variables like 'xxx';

-- 查看指定的系统变量,精确查询
show @@[global|session].系统变量名;
(2)设置系统变量

修改session级别的值不影响全局变量的值,开启下一个会话后还是读取全局变量的值

复制代码
set [global|session] 系统变量名 = 值;
set @@session.系统变量名 = 值;

6.2用户定义变量

在SQL中会话中定义的变量,作用域为当前会话。

(1)赋值
复制代码
-- 方式1:推荐
set @var_name:=expr [,@var_name]...;

-- 方式2
select 列名 into @var_name from 表名 where ...;

(2)使用

复制代码
SET @age=18;
SELECT @age;

SET @age:=19;
SELECT @19;

select @age:=20;

SELECT count(*) into @stu_count from student;
select @stu_count;

SET @age:=18;
SELECT * FROM student WHERE age=@age;

6.3局部变量

只在存储过程、函数或触发器的范围内有效,需要使用declare声明,作用域的范围在声明的begin...end代码块内

(1)声明
复制代码
declare 变量名 变量类型 [default 默认值] ...;
(2)赋值
复制代码
-- 方式1
set var_name=值;

-- 方式2
set var_name:=值;

-- 方式3
select 列名 into var_name from 表名 where ...;
(3)使用
复制代码
delimiter //
-- 创建存储过程
CREATE PROCEDURE p1()
BEGIN
  -- 定义局部变量
  DECLARE stu_count INT DEFAULT 0;
  -- 把查询结果赋值到局部变量
  SELECT count(*) INTO stu_count from student;
  -- 使用(查看)局部变量
  SELECT stu_count;
END//

delimiter ;

CALL p1();

7、SQL编程

7.1条件判断

复制代码
if 条件1 then
    ......
[elseif 条件2 then
    ......
else
    ......]
end if;

使用

复制代码
delimiter //

CREATE PROCEDURE p2()
BEGIN
  -- 定义初始分数变量
  DECLARE score int DEFAULT 0;
  -- 定义结果变量
  DECLARE result VARCHAR(10);
  
  if score>=90 THEN
    set result:='优秀';
  ELSEIF score>=80 and score<90 THEN
    set result:='良好';
  ELSEIF score>=60 and score<80 THEN
    set result:='及格';
  ELSE
    set result:='不及格';
  END IF;
  
  -- 查询结果
  SELECT result;
  
END//

delimiter ;

CALL p2();

7.2传入参数

相关推荐
AI-好学者6 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
其实防守也摸鱼7 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7257 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋8 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_8 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
IvorySQL9 小时前
PG 日报|社区讨论重构 pg_hba 配置文件格式
数据库·人工智能·postgresql·重构·ivorysql
逝水无殇10 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#