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

相关推荐
努力努力再努力wz1 小时前
【C++高阶数据结构系列】:跳表 SkipList 详解:多层索引、随机晋升与C++ 完整实现(附跳表实现的源码)
开发语言·数据结构·数据库·c++·redis·缓存·skiplist
暗夜猎手-大魔王1 小时前
转载--Hermes Agent 09 | 技能安全:静态扫描 + 信任级别策略如何防止“技能投毒“
网络·数据库·安全
Surpass-HC1 小时前
gsoap搭建网络像机onvif服务器
linux·服务器·数据库
smzyydwwb1 小时前
BW数据库链接信息包DEBUG
数据库·sap·bw
muddjsv1 小时前
HBase与Hadoop:基于什么开发?深度剖析与架构图
数据库·hadoop·hbase
muddjsv1 小时前
HBase 与 Hadoop 安装与上手使用全指导
数据库·hadoop·hbase
学计算机的计算基1 小时前
MySQL 锁体系全解:从 MDL 到间隙锁,一次讲透
java·数据库·笔记·python·mysql
Trouvaille ~1 小时前
【Redis篇】Redis 事务:原子性与脚本执行机制
数据库·redis·后端·算法·junit·lua·原子性
努力攻坚操作系统1 小时前
Elasticsearch 完全教学指南:从入门到精通
大数据·数据库·elasticsearch·搜索引擎·全文检索