mysql procedure使用笔记

本文介绍了MySQL中count函数的多种使用场景,包括统计特定条件下的记录数、不同值的数量及每组内的记录数;定义变量的不同方法及其作用域的区别;在存储过程中如何使用变量配合limit;以及如何对查询结果进行进一步的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天用MySQL做了一些非常复杂的数据操作,毕竟不是DBA,其中碰到了很多问题,幸好有众多网友大方地共享了他们的知识,在网上查到不少资料,加上自己的各种尝试,问题最终得以顺利解决。

1、关于count的使用

count是用于统计某一个符合条件的数据的条数的。比如StudentInfo有如下数据:

IDClassIDStudentID
111
212
313
421
522
631

要查找统计ClassID=1的学生数量显然是 

SELECT COUNT(*) FROM StudentInfo WHERE ClassID=1;

那么我要统计总共有多少个班级呢,对于这种有许多重复的数据,要统计不同值的个数,就需要用到distinct

SELECT COUNT(DISTINCT(ClassID)) FROM StudentInfo;

表示要查询多条不同值的个数

如果需要统计每个班级的人数则

SELECT COUNT(StudentID) FROM StudentInfo GROUP BY ClassID;

表示按ClassID进行分组再统计


2、定义变量与变量赋值

定义变量有两种方式:用declare和set,如:

DECLARE ClassNum INT DEFAULT 0;		##定义ClassNum为初始值为0的int型变量
SET @StudentNum = 0;					##将值0保存到变量@StudentNum中

初看比较相似,但是还是有区别:

DECLARE varname type [default value]declare定义变量只有局部作用域,也就是在存储过程的begin到end之间有效,之外就无效了,而且还需要在存储过程的首部定义,如下提供默认值,可以用default指定。

SET @varname = exprset定义的变量具有全局作用域,也就是该用户在该连接上出了存储过程也可以引用到该变量,用set定义变量没有位置限制,可以赋予值或表达式。

对于该两种变量的赋值,有以下方式:

SELECT COUNT(*) INTO @StudentNum FROM StudentInfo;
SELECT COUNT(DISTINCT(ClassID)) INTO ClassNum FROM StudentInfo;
set @StudentNum = @StudentNum + 1;

3、存储过程中limit使用变量

在一般的数据库执行语句中 limit 要求提供一个常量值,而不是变量。但是,很多时候我们需要用到变量,比如一个表中已经有n条数据,我们需要将该表填充到至多m条数据(m >= n),我们就要从另一张表中选择m-n条数据插入该表,这明显需要使用变量,这里要用到prepare:

declare StudentNum int default 0;
set @MaxStudentNum = 20;
prepare sqlstr from 'insert into StudentInfo(ClassID,StudentID) select AllStudent.ClassID,AllStudent.StudentID from AllStudent order by AllStudent.Score DESC limit ?';
select count(*) into StudentNum from StudentInfo;
set  @RemainNum = @MaxStudentNum - StudentNum;
execute sqlstr using @RemainNum;
deallocate prepare sqlstr;
prepare将这里的变量sqlstr定义为后面的字符串,limit后的变量用?代替,使用execute执行该语句时指定要用哪个变量之代替之前的?,有点类似C++的格式化输出sprintf。deallocate表示删除之前的sqlstr。我们可以这样理解,prepare将申请一部分内存保存字符串,调用execute时格式化该字符串并执行,deallocate将申请的内存释放。


4、对结果集进行操作

比如,我们要将AllStudent表中StudentID出现在StudentInfo表中的学生的Score设置为90分,则就需要查询StudentInfo中的所有StudentID,并对该结果集进行操作,这里就要用到in:

update AllStudent set AllStudent.Score=90 where StudentID in (select StudentID from StudentInfo);


最后 ,必须感谢每一位肯共享自己知识经验的人,这让我们得以收集到不少有用的信息,加快了解决问题的速度。不过,每个人对于问题的理解可能不一样,甚至出现偏差,所以建议在实际应用的时候查阅有关文档或亲自尝试一下。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值