26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX),第1张

MySQL 的常见的聚合函数有 AVG、COUNT、SUM、MIN、MAX,上一小节介绍了 AVG、COUNT、SUM 三种聚合函数,本小节介绍如何使用 MIN、MAX 两种聚合函数,另外再介绍一下如何在 GROUP BY 中使用聚合函数。

以 teacher 表为例,先查所有 teacher 信息:

查询结果如下图:

可以使用 MIN() 函数对结果集取年龄最小值的数据:

执行结果如下图:

以 student 表为例,先查看所有 student 信息:

查询结果如下图:

可以使用 MAX() 函数对结果集取年龄最大值的数据:

执行结果如下图:

以 student_course、course、student 表内连接查询为例:

查询结果如下图:

使用 AVG 函数取分组数据平均年龄:

执行结果如下图 :

可以使用 HAVING 对上述结果筛选,例如选出选课学生平均年龄大于 20 的课程数据:

执行结果如下图:

本小节介绍了如何使用 MIN、MAX 两种聚合函数对查询结果集进行筛选,还介绍了如何在 GROUP BY中分组使用聚合函数,并且使用 HAVING 后面的条件对分组数据进行筛选,需要注意的是聚合函数产生的数据列最好重命名,这是因为后端程序语言在处理这些数据时需要规范的字段名,例如:

查询结果如下图:

SELECT category_Sn,isnull(count,0) FROM category left join (SELECT count(*) as count,category_Sn FROM [article] group by category_Sn) AS [article] on category.[category_Sn]=article.[category_Sn]

一、COUNT()函数

COUNT()函数进行计数。可利用COUNT()函数确定表中行的数目或者符合特定条件的行的数目。

COUNT()有两种使用方式:

1.使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。

2.使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

例如 SELECT COUNT(*) AS num_test FROM test

此语句对表test所有行进行计数,返回表的总行数,不管行中各列有什么值。

例如 SELECT COUNT(school) FROM test

此语句只对school列中有值的行进行计数,忽略null行。

二、MAX()函数

MAX()函数返回指定列中的最大值。MAX()要求指定列名。

例如SELECT MAX(age) FROM test

此语句返回表test中age的最大值。

注:MAX()函数忽略值为NULL的行。

在数据库中当然是可以对001和005使用聚合函数max()进行大小比较的,但是我们必须要留意文本型数值和数字型数值在比较数值大小时,数据库引擎对不同的字段数据类型其比较的结果可能会有所不同!下面举例说明一下:

比如 10和9,按数字比较大小则 10>9,但是如果按文本比较大小则 '10'<'9',因为两个字串比较大小时是从左边第一个字符开始逐个字符进行比较的,一旦分出高低,比较将立即结束不再进行余下比较。'10'开头为1,'9'开头为9首尾字符即可分出大小,这样文本数字'10'就会小于文本数字'9'。我们再来看看001和005,则不论是按数字类型还是按文本类型比较均为前者小于后者,按数字比较的话自然1小于5,若按字串比较,前两位打成平手到第三个字符时就分出了大小。

数据库中字符和字串比较大小的排序规则基本上与我们日常使用的字词典里的排序规则相互吻合,两个字符或字串根据它们在字典中的排序位置我们通常不必依赖电脑运算就可以判断出谁大谁小。

现在我们实测一下使用聚合函数Max()对比文本数据类型字段和数字类型字段的比较结果,以下是SQL实验代码:

drop table if exists t2

-- 创建测试表t2含文本数据型“数字”字段和数字类型字段

create table t2(id int auto_increment primary key,

charNum varchar(10),digitNum int)

-- 插入测试数据

insert into t2(charNum,digitNum) values

('001',1),('005',5),('0010',10)

-- 查看待测数据

select * from t2

-- 直接选出文本“数字”字段中的最大值和数字字段中的最大值

select max(charNum) as maxCharNum,

max(digitNum) as maxDigitNum from t2

-- 将文本“数字”字段转换为数字类型后再选出其最大值,以及直接选出数字字段最大值

select max(convert(charNum,signed)) as maxConvertCharNum,

max(digitNum) as maxDigitNum from t2

测试截图:

待测数据:

直接对文本和数字两种数据类型字段使用Max()函数的返回结果对比:

我们可以看到直接对文本数据类型字段使用Max函数选出的最大值是“005”而非“0010”

下面是将文本数据类型数字转换为数字数据类型后才使用Max函数的对比结果:

我们可以看到对文本类型字段使用Max函数的最大值已经跟数字数据类型字段的最大值一样了,都是10。

总结:

直接对字符型数据类型字段使用聚合函数Max()、Min()所返回的极值将遵循一般字(词)典对字(词)里设定的排序规则,所选出的最大(小)值不一定是数字意义上的极值,如果需要得出严格数字意义上的极值就必须先进行类型转换,否则得出的结果可能会与期望值有出入。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6160502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存