数学函数参考
CV大法
ABS() 函数
MySQLABS()函数返回指定数字的绝对值。ABS()语法这里是MySQLABS()函数的语法:ABS(number)参数number必需的。一个用于计算绝对值的数字。返回值MySQLABS()函数返回数字的绝对(正)值。如果参数number为字符串,ABS()将按照如下规则尝试转为数字:如果以数
MySQL ABS()
函数返回指定数字的绝对值。
ABS()
语法
这里是 MySQL ABS()
函数的语法:
ABS(number)
参数
-
number
必需的。 一个用于计算绝对值的数字。
返回值
MySQL ABS()
函数返回数字的绝对(正)值。
-
如果参数
number
为字符串,
ABS()
将按照如下规则尝试转为数字:
- 如果以数字开头,则将开头的数字部分转为数字。
- 如果不能转为数字,则按照
0
处理。
-
如果参数
number
为NULL
,ABS()
函数将会返回NULL
。
ABS()
示例
SELECT
ABS(100),
ABS(-100),
ABS('100'),
ABS('-100'),
ABS('-100A'),
ABS('A100'),
ABS(NULL)\G
*************************** 1. row ***************************
ABS(100): 100
ABS(-100): 100
ABS('100'): 100
ABS('-100'): 100
ABS('-100A'): 100
ABS('A100'): 0
ABS(NULL): NULL
CEIL() 函数
MySQLCEIL()函数返回大于或等于指定数字的最小整数值。CEIL()函数等同于CEILING()函数。如果您想要返回小于或等于指定数字的最小整数值,请使用FLOOR()。如果您想要将数字四舍五入到指定的小数位数,请使用ROUND()函数。如果您想要按位数截取小数位,请使用TRUNCATE()函
MySQL CEIL()
函数返回大于或等于指定数字的最小整数值。CEIL()
函数等同于 CEILING()
函数。
如果您想要返回小于或等于指定数字的最小整数值,请使用 FLOOR()
。
如果您想要将数字四舍五入到指定的小数位数,请使用 ROUND()
函数。
如果您想要按位数截取小数位,请使用 TRUNCATE()
函数。
CEIL()
语法
这里是 MySQL CEIL()
函数的语法:
CEIL(number)
参数
-
number
必需的。 一个数字。
返回值
MySQL CEIL()
函数返回大于或等于指定数字的最小整数值。
如果参数 number
为 NULL
,CEIL()
函数将会返回 NULL
。
CEIL()
示例
SELECT
CEIL(123.123),
CEIL(123.789),
CEIL(123),
CEIL(-123.123),
CEIL(-123.789),
CEIL(-123),
CEIL(-100),
CEIL(NULL)\G
*************************** 1. row ***************************
CEIL(123.123): 124
CEIL(123.789): 124
CEIL(123): 123
CEIL(-123.123): -123
CEIL(-123.789): -123
CEIL(-123): -123
CEIL(-100): -100
CEIL(NULL): NULL
CEILING() 函数
MySQLCEILING()函数返回大于或等于指定数字的最小整数值。CEILING()函数等同于CEIL()函数。如果您想要返回小于或等于指定数字的最大整数值,请使用FLOOR()。如果您想要将数字四舍五入到指定的小数位数,请使用ROUND()函数。如果您想要按位数截取小数位,请使用TRUNCATE
MySQL CEILING()
函数返回大于或等于指定数字的最小整数值。CEILING()
函数等同于 CEIL()
函数。
如果您想要返回小于或等于指定数字的最大整数值,请使用 FLOOR()
。
如果您想要将数字四舍五入到指定的小数位数,请使用 ROUND()
函数。
如果您想要按位数截取小数位,请使用 TRUNCATE()
函数。
CEILING()
语法
这里是 MySQL CEILING()
函数的语法:
CEILING(number)
参数
-
number
必需的。 一个数字。
返回值
MySQL CEILING()
函数返回大于或等于指定数字的最小整数值。
如果参数 number
为 NULL
,CEILING()
函数将会返回 NULL
。
CEILING()
示例
SELECT
CEILING(123.123),
CEILING(123.789),
CEILING(123),
CEILING(-123.123),
CEILING(-123.789),
CEILING(-123),
CEILING(-100),
CEILING(NULL)\G
*************************** 1. row ***************************
CEILING(123.123): 124
CEILING(123.789): 124
CEILING(123): 123
CEILING(-123.123): -123
CEILING(-123.789): -123
CEILING(-123): -123
CEILING(-100): -100
CEILING(NULL): NULL
CONV() 函数
MySQLCONV()函数将数字从一个进制转为另一个进制,比如从10进制转为2进制。CONV()语法这里是MySQLCONV()函数的语法:CONV(num,from_base,to_base)参数num必需的。一个数字。from_base必需的。数字当前使用的进制。从2到36。to_base必需的
MySQL CONV()
函数将数字从一个进制转为另一个进制,比如从 10 进制转为 2 进制。
CONV()
语法
这里是 MySQL CONV()
函数的语法:
CONV(num, from_base, to_base)
参数
-
num
必需的。一个数字。
-
from_base
必需的。 数字当前使用的进制。从 2 到 36。
-
to_base
必需的。 将数字转为的进制。从 2 到 36。
返回值
MySQL CONV()
函数将数字从一个进制转为另一个进制。
如果任意参数为 NULL
, CONV()
函数将返回 NULL
。
CONV()
示例
这里有几个 CONV()
的常用示例。
本示例将 16 进制的几个字符转为 10 进制的数字:
SELECT
CONV('A', 16, 10),
CONV('B', 16, 10),
CONV('C', 16, 10),
CONV('D', 16, 10),
CONV('E', 16, 10),
CONV('F', 16, 10)\G
*************************** 1. row ***************************
CONV('A', 16, 10): 10
CONV('B', 16, 10): 11
CONV('C', 16, 10): 12
CONV('D', 16, 10): 13
CONV('E', 16, 10): 14
CONV('F', 16, 10): 15
本示例将 10 进制的几个数字转为 2 进制的数字:
SELECT
CONV(16, 10, 2),
CONV(32, 10, 2),
CONV(64, 10, 2)\G
*************************** 1. row ***************************
CONV(16, 10, 2): 10000
CONV(32, 10, 2): 100000
CONV(64, 10, 2): 1000000
DIV 操作符
参数
-
x
必需的。 被除数。
-
y
必需的。 除数。
返回值
x DIV y
返回 x
除以 y
的结果的整数部分。
如果参数 x
或者 y
不是整数,则会先将他们转为 DECIMAL
类型后再计算。
DIV
示例
SELECT
10 DIV 3,
10 / 3,
FLOOR(10/3),
9.8 DIV 2.6,
9.8 / 2.6,
FLOOR(9.8/2.6)\G
*************************** 1. row ***************************
10 DIV 3: 3
10 / 3: 3.3333
FLOOR(10/3): 3
9.8 DIV 2.6: 3
9.8 / 2.6: 3.76923
FLOOR(9.8/2.6): 3
注意:这里使用了 FLOOR()
函数,以便于比较运算结果。
EXP() 函数
MySQLEXP()函数返回自然常数e的指定数值的次方,例如EXP(2)返回结果是e2。e是自然对数的底数,也称为自然底数,请参考LN()函数和LOG()函数获取更多的内容。EXP()语法这里是MySQLEXP()函数的语法:EXP(number)参数number必需的。次方值。返回值MySQLEX
MySQL EXP()
函数返回自然常数 e
的指定数值的次方,例如 EXP(2)
返回结果是 e2
。
e
是自然对数的底数,也称为自然底数,请参考 LN()
函数和 LOG()
函数获取更多的内容。
EXP()
语法
这里是 MySQL EXP()
函数的语法:
EXP(number)
参数
-
number
必需的。 次方值。
返回值
MySQL EXP()
函数返回自然常数 e
的指定数值的次方。
如果参数 number
为 NULL
,EXP()
函数将会返回 NULL
。
EXP()
示例
SELECT
EXP(0),
EXP(1),
EXP(2),
EXP(-1),
EXP(-2),
EXP(NULL)\G
*************************** 1. row ***************************
EXP(0): 1
EXP(1): 2.718281828459045
EXP(2): 7.38905609893065
EXP(-1): 0.36787944117144233
EXP(-2): 0.1353352832366127
EXP(NULL): NULL
FLOOR() 函数
MySQLFLOOR()函数返回小于或等于指定数字的最大整数值。如果您想要返回大于或等于指定数字的最小整数值,请使用CEIL()或者CEILING()函数。如果您想要将数字四舍五入到指定的小数位数,请使用ROUND()函数。如果您想要按位数截取小数位,请使用TRUNCATE()函数。FLOOR()语
MySQL FLOOR()
函数返回小于或等于指定数字的最大整数值。
如果您想要返回大于或等于指定数字的最小整数值,请使用 CEIL()
或者 CEILING()
函数。
如果您想要将数字四舍五入到指定的小数位数,请使用 ROUND()
函数。
如果您想要按位数截取小数位,请使用 TRUNCATE()
函数。
FLOOR()
语法
这里是 MySQL FLOOR()
函数的语法:
FLOOR(number)
参数
-
number
必需的。 一个数字。
返回值
MySQL FLOOR()
函数返回小于或等于指定数字的最大整数值。
如果参数 number
为 NULL
,FLOOR()
函数将会返回 NULL
。
FLOOR()
示例
SELECT
FLOOR(123.123),
FLOOR(123.789),
FLOOR(123),
FLOOR(-123.123),
FLOOR(-123.789),
FLOOR(-123),
FLOOR(-100),
FLOOR(NULL)\G
*************************** 1. row ***************************
FLOOR(123.123): 123
FLOOR(123.789): 123
FLOOR(123): 123
FLOOR(-123.123): -124
FLOOR(-123.789): -124
FLOOR(-123): -123
FLOOR(-100): -100
FLOOR(NULL): NULL
GREATEST() 函数
MySQLGREATEST()函数返回参数列表中的最大值。如果想查找列表中的最小值,请使用LEAST()函数。GREATEST()语法这里是MySQLGREATEST()函数的语法:GREATEST(param1,param2,…,paramN)参数param1,param2,…,param
MySQL GREATEST()
函数返回参数列表中的最大值。如果想查找列表中的最小值,请使用 LEAST()
函数。
GREATEST()
语法
这里是 MySQL GREATEST()
函数的语法:
GREATEST(param1, param2, ..., paramN)
参数
-
param1, param2, …, paramN
必需的。用于比较的参数列表。所有的参数都参与比较。参数可以是任意的数据类型,或者表达式。
返回值
MySQL GREATEST()
函数返回参数列表中的最大值。
如果任意一个参数为 NULL
,GREATEST()
函数将返回 NULL
。
GREATEST()
示例
SELECT
GREATEST(2, 1, 5),
GREATEST(2, 1, 5, '0'),
GREATEST('a', 'b', 'c'),
GREATEST('Hello', 'World'),
GREATEST('a', 'b', NULL)\G
*************************** 1. row ***************************
GREATEST(2, 1, 5): 5
GREATEST(2, 1, 5, '0'): 5
GREATEST('a', 'b', 'c'): c
GREATEST('Hello', 'World'): World
GREATEST('a', 'b', NULL): NULL
LEAST() 函数
MySQLLEAST()函数返回参数列表中的最小值。如果想查找列表中的最大值,请使用GREATEST()函数。LEAST()语法这里是MySQLLEAST()函数的语法:LEAST(param1,param2,…,paramN)参数param1,param2,…,paramN必需的。用于比较
MySQL LEAST()
函数返回参数列表中的最小值。如果想查找列表中的最大值,请使用 GREATEST()
函数。
LEAST()
语法
这里是 MySQL LEAST()
函数的语法:
LEAST(param1, param2, ..., paramN)
参数
-
param1, param2, …, paramN
必需的。用于比较的参数列表。所有的参数都参与比较。参数可以是任意的数据类型,或者表达式。
返回值
MySQL LEAST()
函数返回参数列表中的最小值。
如果任意一个参数为 NULL
,LEAST()
函数将返回 NULL
。
LEAST()
示例
SELECT
LEAST(2, 1, 5),
LEAST(2, 1, 5, '0'),
LEAST('a', 'b', 'c'),
LEAST('Hello', 'World'),
LEAST('a', 'b', NULL)\G
*************************** 1. row ***************************
LEAST(2, 1, 5): 1
LEAST(2, 1, 5, '0'): 0
LEAST('a', 'b', 'c'): a
LEAST('Hello', 'World'): Hello
LEAST('a', 'b', NULL): NULL
ROUND() 函数
MySQLROUND()函数将数字四舍五入到指定的小数位数。如果您只需要按位数截取小数位,请使用TRUNCATE()函数。如果需要返回数字的整数部分,请使用FLOOR(),CEIL(),CEILING()函数。ROUND()语法这里是MySQLROUND()函数的语法:ROUND(x,d)参数x必需
MySQL ROUND()
函数将数字四舍五入到指定的小数位数。如果您只需要按位数截取小数位,请使用 TRUNCATE()
函数。如果需要返回数字的整数部分,请使用 FLOOR()
, CEIL()
, CEILING()
函数。
ROUND()
语法
这里是 MySQL ROUND()
函数的语法:
ROUND(x, d)
参数
-
x
必需的。 被处理的数字。
-
d
必需的。 需要保留的小数位数。
返回值
MySQL ROUND()
函数将数字四舍五入到指定的小数位数。
- 如果
d
大于等于x
的小数位数,则返回原数字。 - 如果
d
小于x
的小数位数,则将x
的小数位四舍五入到d
位后返回。 - 如果
d
为负数,ROUND()
函数将会从小数点开始向整数部分的d
位数字替换为0
。 - 如果任意一个参数为
NULL
,ROUND()
函数将会返回NULL
。
ROUND()
示例
SELECT
ROUND(123.179, 1),
ROUND(123.179, 2),
ROUND(123.179, 4),
ROUND(123.179, 0),
ROUND(123.179, -1),
ROUND(123.179, -2),
ROUND(123.179, NULL)\G
*************************** 1. row ***************************
ROUND(123.179, 1): 123.2
ROUND(123.179, 2): 123.18
ROUND(123.179, 4): 123.179
ROUND(123.179, 0): 123
ROUND(123.179, -1): 120
ROUND(123.179, -2): 100
ROUND(123.179, NULL): NULL
TRUNCATE() 函数
MySQLTRUNCATE()函数截取数字为指定的小数位数。TRUNCATE()函数只是按指定的位数截断小数,而不进行四舍五入。如果您需要对小数进行四舍五入,请使用ROUND()函数。如果需要返回数字的整数部分,请使用FLOOR(),CEIL(),CEILING()函数。TRUNCATE()语法这里
MySQL TRUNCATE()
函数截取数字为指定的小数位数。 TRUNCATE()
函数只是按指定的位数截断小数,而不进行四舍五入。如果您需要对小数进行四舍五入,请使用 ROUND()
函数。如果需要返回数字的整数部分,请使用 FLOOR()
, CEIL()
, CEILING()
函数。
TRUNCATE()
语法
这里是 MySQL TRUNCATE()
函数的语法:
TRUNCATE(x, d)
参数
-
x
必需的。 被处理的数字。
-
d
必需的。 需要保留的小数位数。
返回值
MySQL TRUNCATE()
函数返回保留了指定小数位的数字。
- 如果
d
大于等于x
的小数位数,则返回原数字。 - 如果
d
小于x
的小数位数,则将x
的小数位数截断为d
位后返回。 - 如果
d
为负数,TRUNCATE()
函数将会从小数点开始向整数部分的d
位数字替换为0
。 - 如果任意一个参数为
NULL
,TRUNCATE()
函数将会返回NULL
。
TRUNCATE()
示例
SELECT
TRUNCATE(123.179, 1),
TRUNCATE(123.179, 2),
TRUNCATE(123.179, 4),
TRUNCATE(123.179, 0),
TRUNCATE(123.179, -1),
TRUNCATE(123.179, -2),
TRUNCATE(123.179, NULL)\G
*************************** 1. row ***************************
TRUNCATE(123.179, 1): 123.1
TRUNCATE(123.179, 2): 123.17
TRUNCATE(123.179, 4): 123.179
TRUNCATE(123.179, 0): 123
TRUNCATE(123.179, -1): 120
TRUNCATE(123.179, -2): 100
TRUNCATE(123.179, NULL): NULL
聚合函数参考
AVG() 函数
MySQLAVG()函数计算并返回表达式的平均值。AVG()语法这里是MySQLAVG()函数的语法:AVG(expr)AVG(DISTINCTexpr)我们通常在SQL中按如下方式使用AVG()函数:SELECTAVG(expr),…FROMtable_name[WHERE…];或者按如下
MySQL AVG()
函数计算并返回表达式的平均值。
AVG()
语法
这里是 MySQL AVG()
函数的语法:
AVG(expr)
AVG(DISTINCT expr)
我们通常在 SQL 中按如下方式使用 AVG()
函数:
SELECT AVG(expr), ...
FROM table_name
[WHERE ...];
或者按如下方式结合 GROUP BY
子句使用 AVG()
函数:
SELECT AVG(expr), group_expr1, group_expr2, ...
FROM table_name
[WHERE ...]
GROUP BY group_expr1, group_expr2, ...;
参数
-
expr
expr
一个用于聚合运算的表达式。它可以是一个列名,也可以是一个表达式。 -
group_expr1, group_expr2, …
用于分组的表达式或者列名。
返回值
AVG(expr)
函数返回表达式的平均值。 AVG(DISTINCT expr)
函数返回 expr
中唯一值的平均值。
AVG()
函数会忽略NULL
值。- 如果没有匹配的行,
AVG()
函数返回NULL
。
AVG()
示例
我们将通过 student_score
表进行演示。让我们先创建演示表并插入测试数据。
CREATE TABLE `student_score` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`subject` VARCHAR(255) NOT NULL,
`score` INT NOT NULL
);
INSERT INTO `student_score` (`name`, `subject`, `score`)
VALUES ('Tom', 'Math', 80),
('Tom', 'English', 90),
('Jim', 'Math', 84),
('Jim', 'English', 96),
('Tim', 'Math', 80),
('Tim', 'English', 98);
以下是表中的数据:
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
| 1 | Tom | Math | 80 |
| 2 | Tom | English | 90 |
| 3 | Jim | Math | 84 |
| 4 | Jim | English | 96 |
| 5 | Tim | Math | 80 |
| 6 | Tim | English | 98 |
+----+------+---------+-------+
AVG()
简单例子
以下 SQL 语句返回所有成绩的平均成绩。
SELECT AVG(score) from student_score;
+------------+
| AVG(score) |
+------------+
| 88.0000 |
+------------+
AVG()
结合 GROUP BY
让我们使用 AVG()
结合 GROUP BY
来从更多的维度计算平均成绩。
-
按照科目计算平均成绩
SELECT subject, AVG(score) FROM student_score GROUP BY subject;
+---------+------------+ | subject | AVG(score) | +---------+------------+ | Math | 81.3333 | | English | 94.6667 | +---------+------------+
这里,MySQL 会根据
GROUP BY subject
首先按照subject
将结果集分组,然后在每个组内再执行AVG(score)
。 -
按照人计算平均成绩
SELECT name, AVG(score) FROM student_score GROUP BY name;
+------+------------+ | name | AVG(score) | +------+------------+ | Tom | 85.0000 | | Jim | 90.0000 | | Tim | 89.0000 | +------+------------+
这里,MySQL 会根据
GROUP BY name
首先按照name
将结果集分组,然后在每个组内再执行AVG(score)
。
AVG()
结合子查询
如果我们想要查询成绩在平均线以上的行,我们可以使用以下 SQL 语句:
SELECT *
FROM student_score
WHERE score > (
SELECT AVG(score)
FROM student_score
);
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
| 2 | Tom | English | 90 |
| 4 | Jim | English | 96 |
| 6 | Tim | English | 98 |
+----+------+---------+-------+
注意,我们这里通过以下子查询语句查询出平均成绩:
SELECT AVG(score)
FROM student_score
COUNT() 函数
MySQLCOUNT()函数用于统计表达式代表的所有值的中的非NULL值的数量。COUNT()语法这里是MySQLCOUNT()函数的语法:COUNT(expr)我们通常在SQL中按如下方式使用COUNT()函数:SELECTCOUNT(expr),…FROMtable_name[WHERE…
MySQL COUNT()
函数用于统计表达式代表的所有值的中的非 NULL 值的数量。
COUNT()
语法
这里是 MySQL COUNT()
函数的语法:
COUNT(expr)
我们通常在 SQL 中按如下方式使用 COUNT()
函数:
SELECT COUNT(expr), ...
FROM table_name
[WHERE ...];
或者按如下方式结合 GROUP BY
子句使用 COUNT()
函数:
SELECT COUNT(expr), group_expr1, group_expr2, ...
FROM table_name
[WHERE ...]
GROUP BY group_expr1, group_expr2, ...;
参数
-
expr
expr
一个需要统计数量的表达式。它可以是一个列名,也可以是一个表达式。 -
group_expr1, group_expr2, …
用于分组的表达式或者列名。
返回值
COUNT(expr)
函数返回 SELECT
语句返回的所有行中的表达式代表的所有值的中的非 NULL
值的数量。
注意: 如果您使用 COUNT(*)
或者类似于 COUNT(1)
之类的语句,则会统计 NULL
值。
COUNT()
示例
我们将通过 student_score
表进行演示。让我们先创建演示表并插入测试数据。
DROP TABLE IF EXISTS `student_score`;
CREATE TABLE `student_score` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`subject` VARCHAR(255) NOT NULL,
`score` INT
);
INSERT INTO `student_score` (`name`, `subject`, `score`)
VALUES ('Tom', 'Math', 80),
('Tom', 'English', 90),
('Jim', 'Math', 84),
('Jim', 'English', 96),
('Tim', 'Math', NULl),
('Tim', 'English', 98);
以下是表中的数据:
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
| 1 | Tom | Math | 80 |
| 2 | Tom | English | 90 |
| 3 | Jim | Math | 84 |
| 4 | Jim | English | 96 |
| 5 | Tim | Math | NULL |
| 6 | Tim | English | 98 |
+----+------+---------+-------+
COUNT()
简单例子
以下 SQL 语句返回 student_score
表中的所有行数。
SELECT COUNT(id) from student_score;
+-----------+
| COUNT(id) |
+-----------+
| 6 |
+-----------+
让我们再看一下 student_score
表中的所有分数的数量。
SELECT COUNT(score) from student_score;
+--------------+
| COUNT(score) |
+--------------+
| 5 |
+--------------+
这里,由于 score
列中有一个 NULL
值,因此 COUNT(score)
的结果为 5
.
COUNT()
结合 GROUP BY
让我们使用 COUNT()
结合 GROUP BY
来从更多的维度统计数量。
-
按科目统计成绩的数量
SELECT subject, COUNT(score) FROM student_score GROUP BY subject;
+---------+-----------+ | subject | COUNT(id) | +---------+-----------+ | Math | 2 | | English | 3 | +---------+-----------+
这里,MySQL 会根据
GROUP BY subject
首先按照subject
将结果集分组,然后在每个组内再执行COUNT(score)
。 -
按名称统计成绩的数量
SELECT name, COUNT(score) FROM student_score GROUP BY name;
+------+--------------+ | name | COUNT(score) | +------+--------------+ | Tom | 2 | | Jim | 2 | | Tim | 1 | +------+--------------+
这里,MySQL 会根据
GROUP BY name
首先按照name
将结果集分组,然后在每个组内再执行COUNT(score)
。由于 Tim 的数学分数为
NULL
,因此 Tim 的COUNT(score)
的结果为1
。COUNT()
MySQLCOUNT()函数用于统计表达式代表的所有值的中的非NULL值的数量。COUNT()语法这里是MySQLCOUNT()函数的语法:COUNT(expr)我们通常在SQL中按如下方式使用COUNT()函数:SELECTCOUNT(expr),…FROMtable_name[WHERE…
MySQL
COUNT()
函数用于统计表达式代表的所有值的中的非 NULL 值的数量。COUNT()
语法这里是 MySQL
COUNT()
函数的语法:COUNT(expr)
我们通常在 SQL 中按如下方式使用
COUNT()
函数:SELECT COUNT(expr), ... FROM table_name [WHERE ...];
或者按如下方式结合
GROUP BY
子句使用COUNT()
函数:SELECT COUNT(expr), group_expr1, group_expr2, ... FROM table_name [WHERE ...] GROUP BY group_expr1, group_expr2, ...;
参数
-
expr
expr
一个需要统计数量的表达式。它可以是一个列名,也可以是一个表达式。 -
group_expr1, group_expr2, …
用于分组的表达式或者列名。
返回值
COUNT(expr)
函数返回SELECT
语句返回的所有行中的表达式代表的所有值的中的非NULL
值的数量。注意: 如果您使用
COUNT(*)
或者类似于COUNT(1)
之类的语句,则会统计NULL
值。COUNT()
示例我们将通过
student_score
表进行演示。让我们先创建演示表并插入测试数据。DROP TABLE IF EXISTS `student_score`; CREATE TABLE `student_score` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `subject` VARCHAR(255) NOT NULL, `score` INT ); INSERT INTO `student_score` (`name`, `subject`, `score`) VALUES ('Tom', 'Math', 80), ('Tom', 'English', 90), ('Jim', 'Math', 84), ('Jim', 'English', 96), ('Tim', 'Math', NULl), ('Tim', 'English', 98);
以下是表中的数据:
+----+------+---------+-------+ | id | name | subject | score | +----+------+---------+-------+ | 1 | Tom | Math | 80 | | 2 | Tom | English | 90 | | 3 | Jim | Math | 84 | | 4 | Jim | English | 96 | | 5 | Tim | Math | NULL | | 6 | Tim | English | 98 | +----+------+---------+-------+
COUNT()
简单例子以下 SQL 语句返回
student_score
表中的所有行数。SELECT COUNT(id) from student_score; +-----------+ | COUNT(id) | +-----------+ | 6 | +-----------+
让我们再看一下
student_score
表中的所有分数的数量。SELECT COUNT(score) from student_score; +--------------+ | COUNT(score) | +--------------+ | 5 | +--------------+
这里,由于
score
列中有一个NULL
值,因此COUNT(score)
的结果为5
.COUNT()
结合GROUP BY
让我们使用
COUNT()
结合GROUP BY
来从更多的维度统计数量。-
按科目统计成绩的数量
SELECT subject, COUNT(score) FROM student_score GROUP BY subject;
+---------+-----------+ | subject | COUNT(id) | +---------+-----------+ | Math | 2 | | English | 3 | +---------+-----------+
这里,MySQL 会根据
GROUP BY subject
首先按照subject
将结果集分组,然后在每个组内再执行COUNT(score)
。 -
按名称统计成绩的数量
SELECT name, COUNT(score) FROM student_score GROUP BY name;
+------+--------------+ | name | COUNT(score) | +------+--------------+ | Tom | 2 | | Jim | 2 | | Tim | 1 | +------+--------------+
这里,MySQL 会根据
GROUP BY name
首先按照name
将结果集分组,然后在每个组内再执行COUNT(score)
。由于 Tim 的数学分数为
NULL
,因此 Tim 的COUNT(score)
的结果为1
。GROUP_CONCAT() 函数
MySQLGROUP_CONCAT()函数将一个分组中指定的列或表达式的值连接成一个字符串并返回。GROUP_CONCAT()语法这里是MySQLGROUP_CONCAT()函数的语法:GROUP_CONCAT([DISTINCT]expr[,expr2…][ORDERBY…][SEPARA
MySQL
GROUP_CONCAT()
函数将一个分组中指定的列或表达式的值连接成一个字符串并返回。GROUP_CONCAT()
语法这里是 MySQL
GROUP_CONCAT()
函数的语法:GROUP_CONCAT( [DISTINCT] expr [, expr2 ...] [ORDER BY ...] [SEPARATOR separator] )
我们通常在 MySQL 中按如下方式使用
GROUP_CONCAT()
函数:SELECT GROUP_CONCAT(expr), ... FROM table_name [WHERE ...] [GROUP BY group_expr1, group_expr2, ...];
参数
-
expr [, expr2 …]
必须的。它指定了要连接的一个或者多个列或表达式。
-
ORDER BY
可选的。它用于对要连接的内容排序。
-
SEPARATOR separator
可选的。
separator
连接符。默认是,
。
返回值
MySQL
GROUP_CONCAT(expr)
函数返回一个字符串,它将通过列或者表达式指定的内容连接起来。如果结果集没有任何行,此函数将返回
NULL
。GROUP_CONCAT()
示例我们将通过
student_score
表进行演示。首先,让我们使用如下语句创建表
student_score
:DROP TABLE IF EXISTS `student_score`; CREATE TABLE `student_score` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `subject` VARCHAR(255) NOT NULL, `score` INT NOT NULL );
这里我们创建了表用于存储学生的成绩,这个表有 4 个列组成:
id
是主键name
是学生的名字subject
是学生的科目score
是学生的成绩
其次,让我们插入一些数据用于演示:
INSERT INTO `student_score` (`name`, `subject`, `score`) VALUES ('Tom', 'Math', 80), ('Tom', 'English', 90), ('Tim', 'English', 98);
以下是表中的数据:
+----+------+---------+-------+ | id | name | subject | score | +----+------+---------+-------+ | 1 | Tom | Math | 80 | | 2 | Tom | English | 90 | | 3 | Tim | English | 98 | +----+------+---------+-------+
现在,我们可以使用
GROUP_CONCAT()
函数获取每个人参加的考试科目的列表,如下:SELECT name AS `Name`, GROUP_CONCAT(subject) AS `Subjects` FROM student_score GROUP BY name; +------+--------------+ | Name | Subjects | +------+--------------+ | Tim | English | | Tom | Math,English | +------+--------------+
这里,我们按照
name
分组,并使用GROUP_CONCAT()
函数将每组中的subject
列的内容连接起来。上面的语句中,由于未指定分隔符,因此使用了逗号
,
进行连接。如果我们想要使用其他的分隔符(比如:/
),可是使用SEPARATOR
指定:SELECT name AS `Name`, GROUP_CONCAT(subject SEPARATOR '/') AS `Subjects` FROM student_score GROUP BY name; +------+--------------+ | Name | Subjects | +------+--------------+ | Tim | English | | Tom | Math/English | +------+--------------+
如果我们想要每个组中连接的科目按照科目的名称排序,可以使用
ORDER BY
,如下:SELECT name AS `Name`, GROUP_CONCAT(subject ORDER BY subject SEPARATOR '/') AS `Subjects` FROM student_score GROUP BY name; +------+--------------+ | Name | Subjects | +------+--------------+ | Tim | English | | Tom | English/Math | +------+--------------+
这里,由于设定了
ORDER BY subject
,那么对于 Tom 而言, English 排到了 Math 的前面。如果我们想要同时拼接科目和成绩,请使用如下语句:
SELECT name AS `Name`, GROUP_CONCAT( subject, score ORDER BY subject SEPARATOR '/' ) AS `Scores` FROM student_score GROUP BY name; +------+------------------+ | Name | Scores | +------+------------------+ | Tim | English98 | | Tom | English90/Math80 | +------+------------------+
这里,我们在
GROUP_CONCAT()
函数中传入了多个列,subject
和score
。 注意输出,科目和成绩直接拼接在了一起,中间没有连接符。如果我们想要在科目和成绩之间使用一个连接符
-
, 请使用如下语句:SELECT name AS `Name`, GROUP_CONCAT( CONCAT(subject, '-'), score ORDER BY subject SEPARATOR '/' ) AS `Scores` FROM student_score GROUP BY name; +------+--------------------+ | Name | Scores | +------+--------------------+ | Tim | English-98 | | Tom | English-90/Math-80 | +------+--------------------+
注意,我们在这里使用了表达式
CONCAT(subject, '-')
作为GROUP_CONCAT()
函数的一个输入参数,它的目的是在科目的后面连接一个 ‘-’。或者我们使用
CONCAT_WS()
函数来达到相同的目的:SELECT name AS `Name`, GROUP_CONCAT( CONCAT_WS('-', subject, score) ORDER BY subject SEPARATOR '/' ) AS `Scores` FROM student_score GROUP BY name; +------+--------------------+ | Name | Scores | +------+--------------------+ | Tim | English-98 | | Tom | English-90/Math-80 | +------+--------------------+
-
-