MariaDB COUNT...DISTINCT 函数的基础用法与实例

本文将介绍一个常用的聚合函数,即 COUNT...DISTINCT 函数,它用于统计某个列或表达式的不同值的个数。

发布于

MariaDB 是一个开源的关系型数据库管理系统,它是 MySQL 的一个分支。MariaDB 提供了许多 SQL 函数,用于对数据进行各种操作和计算。本文将介绍一个常用的聚合函数,即 COUNT...DISTINCT 函数,它用于统计某个列或表达式的不同值的个数。

语法

COUNT...DISTINCT 函数的语法如下:

COUNT(DISTINCT expr)

其中,expr 可以是一个列名,也可以是一个表达式,比如 col1 + col2COUNT...DISTINCT 函数会忽略 NULL 值,只计算非空的不同值的个数。如果 expr 是一个常量,或者没有匹配的行,那么 COUNT...DISTINCT 函数的返回值为 0。

实例

下面我们来看一些 COUNT...DISTINCT 函数的实例,以便更好地理解它的用法。我们将使用一个名为 students 的表,它包含了学生的姓名、性别、年龄、班级和成绩等信息。表的结构和部分数据如下:

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(20),
  gender CHAR(1),
  age INT,
  class VARCHAR(10),
  score INT
);

INSERT INTO students VALUES
(1, 'Alice', 'F', 18, 'A1', 85),
(2, 'Bob', 'M', 19, 'A2', 90),
(3, 'Charlie', 'M', 18, 'A1', 80),
(4, 'David', 'M', 20, 'A3', 95),
(5, 'Eve', 'F', 19, 'A2', 88),
(6, 'Frank', 'M', 18, 'A1', 82),
(7, 'Grace', 'F', 20, 'A3', 92),
(8, 'Helen', 'F', 19, 'A2', 86),
(9, 'Iris', 'F', 18, 'A1', 84),
(10, 'Jack', 'M', 20, 'A3', 94);

Example 1: 统计学生表中不同性别的个数

我们可以使用 COUNT...DISTINCT 函数,对 gender 列进行统计,得到学生表中不同性别的个数。SQL 语句如下:

SELECT COUNT(DISTINCT gender) AS gender_count FROM students;

运行结果如下:

+--------------+
| gender_count |
+--------------+
|            2 |
+--------------+

这说明学生表中有两种性别,分别是男性和女性。

Example 2: 统计学生表中不同年龄的个数

我们也可以使用 COUNT...DISTINCT 函数,对 age 列进行统计,得到学生表中不同年龄的个数。SQL 语句如下:

SELECT COUNT(DISTINCT age) AS age_count FROM students;

运行结果如下:

+-----------+
| age_count |
+-----------+
|         3 |
+-----------+

这说明学生表中有三种年龄,分别是 18 岁,19 岁和 20 岁。

Example 3: 统计学生表中不同班级的个数

我们还可以使用 COUNT...DISTINCT 函数,对 class 列进行统计,得到学生表中不同班级的个数。SQL 语句如下:

SELECT COUNT(DISTINCT class) AS class_count FROM students;

运行结果如下:

+-------------+
| class_count |
+-------------+
|           3 |
+-------------+

这说明学生表中有三个班级,分别是 A1,A2 和 A3。

Example 4: 统计学生表中不同成绩的个数

我们也可以使用 COUNT...DISTINCT 函数,对 score 列进行统计,得到学生表中不同成绩的个数。SQL 语句如下:

SELECT COUNT(DISTINCT score) AS score_count FROM students;

运行结果如下:

+-------------+
| score_count |
+-------------+
|           9 |
+-------------+

这说明学生表中有九种成绩,分别是 80,82,84,85,86,88,90,92,94 和 95。

Example 5: 统计学生表中不同性别和年龄组合的个数

我们还可以使用 COUNT...DISTINCT 函数,对 genderage 的组合进行统计,得到学生表中不同性别和年龄组合的个数。SQL 语句如下:

SELECT COUNT(DISTINCT gender, age) AS gender_age_count FROM students;

运行结果如下:

+------------------+
| gender_age_count |
+------------------+
|                6 |
+------------------+

这说明学生表中有六种性别和年龄的组合,分别是男性 18 岁,男性 19 岁,男性 20 岁,女性 18 岁,女性 19 岁和女性 20 岁。

相关函数

除了 COUNT...DISTINCT 函数,MariaDB 还提供了一些其他的聚合函数,用于对数据进行不同的统计和计算。下面我们简单介绍一些常用的聚合函数,并给出一些例子。

  • COUNT 函数:用于统计某个列或表达式的非空值的个数。如果使用 * 作为参数,那么会统计所有的行数,包括 NULL 值。例如:

    -- 统计学生表中的总行数
    SELECT COUNT(*) AS total_count FROM students;
    
    -- 统计学生表中非空姓名的个数
    SELECT COUNT(name) AS name_count FROM students;
    
  • SUM 函数:用于计算某个列或表达式的非空值的总和。如果没有匹配的行,或者所有的值都是 NULL,那么返回值为 NULL。例如:

    -- 计算学生表中所有学生的成绩总和
    SELECT SUM(score) AS score_sum FROM students;
    
    -- 计算学生表中每个班级的成绩总和
    SELECT class, SUM(score) AS score_sum FROM students GROUP BY class;
    
  • AVG 函数:用于计算某个列或表达式的非空值的平均值。如果没有匹配的行,或者所有的值都是 NULL,那么返回值为 NULL。例如:

    -- 计算学生表中所有学生的成绩平均值
    SELECT AVG(score) AS score_avg FROM students;
    
    -- 计算学生表中每个班级的成绩平均值
    SELECT class, AVG(score) AS score_avg FROM students GROUP BY class;
    
  • MIN 函数:用于找出某个列或表达式的非空值的最小值。如果没有匹配的行,或者所有的值都是 NULL,那么返回值为 NULL。例如:

    -- 找出学生表中所有学生的成绩最低值
    SELECT MIN(score) AS score_min FROM students;
    
    -- 找出学生表中每个班级的成绩最低值
    SELECT class, MIN(score) AS score_min FROM students GROUP BY class;
    
  • MAX 函数:用于找出某个列或表达式的非空值的最大值。如果没有匹配的行,或者所有的值都是 NULL,那么返回值为 NULL。例如:

    -- 找出学生表中所有学生的成绩最高值
    SELECT MAX(score) AS score_max FROM students;
    
    -- 找出学生表中每个班级的成绩最高值
    SELECT class, MAX(score) AS score_max FROM students GROUP BY class;
    

结论

本文介绍了 MariaDB 的一个常用的聚合函数,即 COUNT...DISTINCT 函数,它用于统计某个列或表达式的不同值的个数。我们还介绍了一些其他的聚合函数,如 COUNTSUMAVGMINMAX,它们用于对数据进行不同的统计和计算。这些函数在数据分析和报表中非常有用,可以帮助我们快速地获取数据的概况和特征。