数学函数参考(四)

数学函数参考

CV大法

ABS() 函数

MySQLABS()函数返回指定数字的绝对值。ABS()语法这里是MySQLABS()函数的语法:ABS(number)参数number必需的。一个用于计算绝对值的数字。返回值MySQLABS()函数返回数字的绝对(正)值。如果参数number为字符串,ABS()将按照如下规则尝试转为数字:如果以数

MySQL ABS() 函数返回指定数字的绝对值。

ABS() 语法

这里是 MySQL ABS() 函数的语法:

ABS(number)

参数

  • number

    必需的。 一个用于计算绝对值的数字。

返回值

MySQL ABS() 函数返回数字的绝对(正)值。

  • 如果参数

    number
    

    为字符串,

    ABS()
    

    将按照如下规则尝试转为数字:

    • 如果以数字开头,则将开头的数字部分转为数字。
    • 如果不能转为数字,则按照 0 处理。
  • 如果参数 numberNULLABS() 函数将会返回 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() 函数返回大于或等于指定数字的最小整数值。

如果参数 numberNULLCEIL() 函数将会返回 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() 函数返回大于或等于指定数字的最小整数值。

如果参数 numberNULLCEILING() 函数将会返回 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() 函数将数字从一个进制转为另一个进制。

如果任意参数为 NULLCONV() 函数将返回 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 的指定数值的次方。

如果参数 numberNULLEXP() 函数将会返回 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() 函数返回小于或等于指定数字的最大整数值。

如果参数 numberNULLFLOOR() 函数将会返回 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() 函数返回参数列表中的最大值。

如果任意一个参数为 NULLGREATEST() 函数将返回 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() 函数返回参数列表中的最小值。

如果任意一个参数为 NULLLEAST() 函数将返回 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
  • 如果任意一个参数为 NULLROUND() 函数将会返回 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
  • 如果任意一个参数为 NULLTRUNCATE() 函数将会返回 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 来从更多的维度计算平均成绩。

  1. 按照科目计算平均成绩

    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)

  2. 按照人计算平均成绩

    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 来从更多的维度统计数量。

  1. 按科目统计成绩的数量

    SELECT subject, COUNT(score)
    FROM student_score
    GROUP BY subject;
    
    +---------+-----------+
    | subject | COUNT(id) |
    +---------+-----------+
    | Math    |         2 |
    | English |         3 |
    +---------+-----------+
    

    这里,MySQL 会根据 GROUP BY subject 首先按照 subject 将结果集分组,然后在每个组内再执行 COUNT(score)

  2. 按名称统计成绩的数量

    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 来从更多的维度统计数量。

    1. 按科目统计成绩的数量

      SELECT subject, COUNT(score)
      FROM student_score
      GROUP BY subject;
      
      +---------+-----------+
      | subject | COUNT(id) |
      +---------+-----------+
      | Math    |         2 |
      | English |         3 |
      +---------+-----------+
      

      这里,MySQL 会根据 GROUP BY subject 首先按照 subject 将结果集分组,然后在每个组内再执行 COUNT(score)

    2. 按名称统计成绩的数量

      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() 函数中传入了多个列,subjectscore。 注意输出,科目和成绩直接拼接在了一起,中间没有连接符。

      如果我们想要在科目和成绩之间使用一个连接符 -, 请使用如下语句:

      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 |
      +------+--------------------+
      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员zhi路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值