本章论述了用于一组数值操作的 group (
集合)
函数。除非另作说明,
group
函数会忽略 NULL
值。
假如你在一个不包含 ROUP BY
子句的语句中使用一个 group
函数
,它相当于对所有行进行分组。
返回expr
的平均值。 DISTINCT
选项可用于返回 expr
的不同值的平均值。
若找不到匹配的行,则AVG()
返回 NULL
。
mysql> SELECT student_name, AVG(test_score)
-> FROM student
-> GROUP BY student_name;
返回expr
中所有比特的 bitwise AND
。计算执行的精确度为64
比特(BIGINT)
。
若找不到匹配的行,则这个函数返回 18446744073709551615
。(
这是无符号 BIGINT
值,所有比特被设置为
1
)。
返回expr
中所有比特的bitwise
OR
。计算执行的精确度为64
比特(BIGINT)
。
若找不到匹配的行,则函数返回 0
。
返回expr
中所有比特的bitwise
XOR
。计算执行的精确度为64
比特(BIGINT)
。
若找不到匹配的行,则函数返回 0
。
返回SELECT
语句检索到的行中非NULL
值的数目。
若找不到匹配的行,则COUNT()
返回 0
。
mysql> SELECT student.student_name,COUNT(*)
-> FROM student,course
-> WHERE
student.student_id=course.student_id
-> GROUP BY student_name;
COUNT(*)
的稍微不同之处在于,它返回检索行的数目, 不论其是否包含
NULL
值。
SELECT
从一个表中检索,而不检索其它的列,并且没有 WHERE
子句时,
COUNT(*)
被优化到最快的返回速度。例如:
mysql> SELECT COUNT(*) FROM student;
这个优化仅适用于 MyISAM
表,
原因是这些表类型会储存一个函数返回记录的精确数量,而且非常容易访问。
对于
事务型的存储引擎
(InnoDB,
BDB),
存储一个精确行数的问题比较多,原因是可能会发生多重事物处理,
而每个都可能会对行数产生影响。
- COUNT(DISTINCT expr
,[expr
...])
返回不同的非NULL
值数目。
若找不到匹配的项,则COUNT(DISTINCT)
返回 0
。
mysql> SELECT COUNT(DISTINCT results) FROM
student;
在MySQL
中,
你通过给定一个表达式列表而获取不包含NULL
不同表达式组合的数目。在标准 SQL
中,
你将必须在COUNT(DISTINCT
...)
中连接所有表达式。
该函数返回带有来自一个组的连接的非NULL
值的字符串结果。其完整的语法如下所示:
GROUP_CONCAT([DISTINCT] expr
[,expr
...]
[ORDER BY {unsigned_integer
| col_name
|
expr
}
[ASC | DESC] [,col_name
...]]
[SEPARATOR str_val
])
mysql> SELECT student_name,
-> GROUP_CONCAT(test_score)
-> FROM student
-> GROUP BY student_name;
Or:
mysql> SELECT student_name,
-> GROUP_CONCAT(DISTINCT test_score
-> ORDER BY test_score DESC SEPARATOR '
')
-> FROM student
-> GROUP BY student_name;
在MySQL
中,
你可以获取表达式组合的连接值。你可以使用DISTINCT
删去重复值。假若你希望多结果值进行排序,则应该使用
ORDER BY
子句。若要按相反顺序排列,将 DESC (
递减)
关键词添加到你要用ORDER BY
子句进行排序的列名称中。默认顺序为升序;可使用ASC
将其明确指定。 SEPARATOR
后面跟随应该被插入结果的值中间的字符串值。默认为逗号
(
‘,
’)
。通过指定SEPARATOR ''
,你可以删除所有分隔符。
使用group_concat_max_len
系统变量,你可以设置允许的最大长度。
程序中进行这项操作的语法如下,其中 val
是一个无符号整数:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。
- MIN([DISTINCT] expr
), MAX([DISTINCT] expr
)
返回
expr
的最小值和最大值。
MIN()
和
MAX()
的取值可以是一个字符串参数;在这些情况下, 它们返回最小或最大字符串值。请参见
7.4.5节,“MySQL如何使用索引”
。
DISTINCT
关键词可以被用来查找expr
的不同值的最小或最大值,然而,这产生的结果与省略DISTINCT
的结果相同。
若找不到匹配的行,MIN()
和MAX()
返回 NULL
。
mysql> SELECT student_name, MIN(test_score),
MAX(test_score)
-> FROM student
-> GROUP BY student_name;
对于MIN()
、 MAX()
和其它集合函数,
MySQL
当前按照它们的字符串值而非字符串在集合中的相关位置比较 ENUM
和 SET
列。这同ORDER
BY
比较二者的方式有所不同。这一点应该在MySQL
的未来版本中得到改善。
返回expr
的总体标准偏差。这是标准 SQL
的延伸。这个函数的STDDEV()
形式用来提供和Oracle
的兼容性。可使用标准SQL
函数 STDDEV_POP()
进行代替。
若找不到匹配的行,则这些函数返回 NULL
。
返回expr
的总体标准偏差(VAR_POP()
的平方根)
。你也可以使用 STD()
或STDDEV(),
它们具有相同的意义,然而不是标准的 SQL
。
若找不到匹配的行,则STDDEV_POP()
返回 NULL
。
返回expr
的样本标准差 (
VAR_SAMP()
的平方根)
。
若找不到匹配的行,则STDDEV_SAMP()
返回 NULL
。
返回expr
的总数。 若返回集合中无任何行,则 SUM()
返回NULL
。DISTINCT
关键词可用于 MySQL 5.1
中,求得expr
不同值的总和。
若找不到匹配的行,则SUM()
返回 NULL
。
返回expr
总体标准方差。它将行视为总体,而不是一个样本,
所以它将行数作为分母。你也可以使用 VARIANCE(),
它具有相同的意义然而不是 标准的
SQL
。
若找不到匹配的项,则VAR_POP()
返回NULL
。
返回expr
的样本方差。更确切的说,分母的数字是行数减去1
。
若找不到匹配的行,则VAR_SAMP()
返回NULL
。
返回expr
的总体标准方差。这是标准SQL
的延伸。可使用标准SQL
函数 VAR_POP()
进行代替。
若找不到匹配的项,则VARIANCE()
返回NULL
。
相关推荐
MySQL 虽然没有内置的行转列和列转行函数,但通过 CASE、GROUP_CONCAT、UNION ALL 和 JOIN 等 SQL 语句,我们可以灵活地对数据进行转换,满足不同的数据分析需求。在实际应用中,应根据数据的特性和业务需求选择合适...
总结来说,MySQL的`MAX(CASE WHEN THEN END)`和`GROUP_CONCAT()`是处理数据列转换和字段合并的强大工具,它们能够帮助我们更有效地组织和展示数据库中的信息。理解并熟练运用这些函数,将有助于提高数据处理的效率和...
在本例中,我们将探讨如何使用GROUP_CONCAT函数来实现这个目标。 GROUP_CONCAT函数是MySQL提供的一种聚合函数,它允许我们合并分组后的某个列的值,将它们连接成一个字符串。这个函数在处理多对一或者一对多关系时...
前言 有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值。如下表 pk value ...select distinct(substring_index(substring_index(a.col,',',b.help_topic_id+1),',',-1... (select group_concat
列转行通常可以通过SQL的聚合函数和子查询来实现,比如在MySQL中可以使用`GROUP_CONCAT`,在SQL Server中可以使用`STRING_AGG`,在PostgreSQL中可以使用`STRING_AGG`或`ARRAY_AGG`等。此外,Pandas库在Python中是一...
在MySQL中,主要使用`CONCAT()`函数;而在PostgreSQL中,则有`||`操作符。然而,当涉及到多行数据时,简单的拼接操作可能不足以满足需求,因为我们需要将来自不同行的数据合并到同一行的某个字段中。 ### 使用`...