mysql day07

关于分组函数/聚合函数/多行处理函数

count 取得记录数
avg 取平均
sum 求和
max 取最大数
min 取最小数

具体运用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
MariaDB [hello]> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
| 5000.00 |
+----------+
1 row in set (0.001 sec)
//最大值应用
MariaDB [hello]> select min(sal) from emp;
+----------+
| min(sal) |
+----------+
| 800.00 |
+----------+
1 row in set (0.000 sec)
//最小值应用
MariaDB [hello]> select sum(sal) from emp;
+----------+
| sum(sal) |
+----------+
| 29025.00 |
+----------+
1 row in set (0.000 sec)
//总和应用
MariaDB [hello]> select avg(sal) from emp;
+-------------+
| avg(sal) |
+-------------+
| 2073.214286 |
+-------------+
1 row in set (0.001 sec)
//平均值应用
MariaDB [hello]> select count(sal) from emp;
+------------+
| count(sal) |
+------------+
| 14 |
+------------+
1 row in set (0.001 sec)
//取得记录数应用

注意事项

第一点:分组函数自动忽略NULL,不需要提前对NULL进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
MariaDB [hello]> select ename,comm from emp;
+--------+---------+
| ename | comm |
+--------+---------+
| SMITH | NULL |
| ALLEN | 300.00 |
| WARD | 500.00 |
| JONES | NULL |
| MARTIN | 1400.00 |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| TURNER | 0.00 |
| ADAMS | NULL |
| JAMES | NULL |
| FORD | NULL |
| MILLER | NULL |
+--------+---------+
14 rows in set (0.001 sec)
MariaDB [hello]> select sum(comm) from emp;
+-----------+
| sum(comm) |
+-----------+
| 2200.00 |
+-----------+
1 row in set (0.001 sec)
//可见对NULL自动忽略。

第二点:分组函数中count(*)和count(具体字段)有什么区别?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MariaDB [hello]> select count(*) from emp;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
1 row in set (0.001 sec)

MariaDB [hello]> select count(comm) from emp;
+-------------+
| count(comm) |
+-------------+
| 4 |
+-------------+
1 row in set (0.000 sec)

count(具体字段):表示统计该字段下所有不为NULL的元素的总数

count(*):统计表当中的总行数(只要有一行数据,count++)。

第三点:分组函数不能直接使用在where子句中。

1
2
MariaDB [hello]> select ename,sal from emp where sal >min(sal);
ERROR 1111 (HY000): Invalid use of group function

为什么会报错呢?(讲完分组查询group by之后会讲)

因为分组函数在使用的时候必须先分组才能使用,当where执行的时候还没有分组,因此where后面不能出现分组函数。

疑问追加:

select sum(sal) from emp;

这个没有进行分组,为什么sum()函数又可以使用啦?

因为select在group by之后执行(详情见day08)。

第四点:所有的分组函数可以组合起来一起用

1
2
3
4
5
6
7
MariaDB [hello]> select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
+----------+----------+----------+-------------+----------+
| sum(sal) | min(sal) | max(sal) | avg(sal) | count(*) |
+----------+----------+----------+-------------+----------+
| 29025.00 | 800.00 | 5000.00 | 2073.214286 | 14 |
+----------+----------+----------+-------------+----------+
1 row in set (0.001 sec)

mysql day07
https://gaster44.github.io/2023/11/02/mysql-day07/
作者
huangjinhong
发布于
2023年11月2日
许可协议