这几天用MySQL做了一些非常复杂的数据操作,毕竟不是DBA,其中碰到了很多问题,幸好有众多网友大方地共享了他们的知识,在网上查到不少资料,加上自己的各种尝试,问题最终得以顺利解决。
1、关于count的使用
count是用于统计某一个符合条件的数据的条数的。比如StudentInfo有如下数据:
ID | ClassID | StudentID |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 1 |
5 | 2 | 2 |
6 | 3 | 1 |
要查找统计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);
最后 ,必须感谢每一位肯共享自己知识经验的人,这让我们得以收集到不少有用的信息,加快了解决问题的速度。不过,每个人对于问题的理解可能不一样,甚至出现偏差,所以建议在实际应用的时候查阅有关文档或亲自尝试一下。