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传入参数

相关推荐
李白客9 小时前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
ClouGence11 小时前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
飞将13 小时前
从零实现数据库(2)——HashIndex + IndexManager
数据库
Nturmoils1 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波2 天前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
Jim6002 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL3 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
倔强的石头_3 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库