表的查询(二)

1.汇总数据

1.AVG()函数

返回平均数:

如下,计算:

mysql> SELECT AVG(score) AS avg_score FROM students;
+-----------+
| avg_score |
+-----------+
|   41.2500 |
+-----------+
1 row in set (0.00 sec)

2.COUNT()函数

COUNT()函数进行计数,可以利用该函数确定表中行的数目或符合特定条件的行的数目。

两种使用方式:

  • COUNT(*)对表中行的数目进行计数。
  • COUNT(列名)对特定列中具有值的行进行计数,忽略NULL值

如下查询以M开头的记录数目:

mysql> select COUNT(*) AS COUNTS from students where name REGEXP '^M';
+--------+
| COUNTS |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)

3.MAX()和MIN()函数

如其字面意思,取最大值和最小值的意思。

4.SUM()

计算总和:
如下,我们计算分数总和:

mysql> select SUM(score) AS he from students;
+------+
| he   |
+------+
|  330 |
+------+
1 row in set (0.00 sec)

5.聚集不同值

上面我们检索统计的都可能包含相同值(比如可能同时存在2个90分),
如果我们想检索不同的值的记录的个数呢?

如下,原表:

mysql> select * from students;
+-------------+-----+-------+
| name        | sex | score |
+-------------+-----+-------+
| xiaoming    | m   |   100 |
| a           | m   |    20 |
| b           | m   |    50 |
| b           | m   |    80 |
| fishab      | m   |    20 |
| fishcd      | m   |    20 |
| Michle      | m   |    20 |
| MichleJason | m   |    20 |
+-------------+-----+-------+
8 rows in set (0.00 sec)

之前我们可以看到总和为:

mysql> select SUM(score) AS he from students;
+------+
| he   |
+------+
|  330 |
+------+
1 row in set (0.00 sec)

我们可以看到有很多20分,现在我们将20分只是计算一次:

mysql> select SUM(DISTINCT score) AS another_sum from students;
+-------------+
| another_sum |
+-------------+
|         250 |
+-------------+
1 row in set (0.06 sec)

上面用到了DISTINCT参数,这里我们也可以体会到,之前我们所有的检索其实是使用的ALL参数,只是我们将其省略,而系统默认采用ALL参数而已。

2.分组数据

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算

例如,对于下表:

mysql> select * from students;
+-------------+-----+-------+
| name        | sex | score |
+-------------+-----+-------+
| xiaoming    | m   |   100 |
| a           | m   |    20 |
| b           | m   |    50 |
| b           | m   |    80 |
| fishab      | m   |    20 |
| fishcd      | m   |    20 |
| Michle      | m   |    20 |
| MichleJason | m   |    20 |
| xbox        | f   |   100 |
| tbox        | f   |   100 |
+-------------+-----+-------+
10 rows in set (0.00 sec)

我们按照男女分组统计人数:(男:m,女:f)

mysql> select sex,COUNT(*) from students GROUP BY sex;
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| f   |        2 |
| m   |        8 |
+-----+----------+
2 rows in set (0.00 sec)

我们需要注意的是,NULL值也可以作为一个单独的分组返回。
另外,GROUP BY 语句必须出现在WHERE 子句之后,ORDER BY子句之前。
如下,统计非满分学生个数:

mysql> select sex,COUNT(*) from students WHERE score<100 GROUP BY sex;
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| m   |        7 |
+-----+----------+
1 row in set (0.04 sec)

下面我们来讲一下分组过滤问题。

前面我们讲数据过滤的时候,都是用的WHERE子句,然而,WHERE子句只是用来过滤列,对于分组,我们需要使用HAVING。

mysql> select * from students;
+-------------+-----+-------+
| name        | sex | score |
+-------------+-----+-------+
| xiaoming    | m   |   100 |
| a           | m   |    20 |
| b           | m   |    50 |
| b           | m   |    80 |
| fishab      | m   |    20 |
| fishcd      | m   |    20 |
| Michle      | m   |    20 |
| MichleJason | m   |    20 |
| xbox        | f   |   100 |
| tbox        | f   |   100 |
| animal      | a   |   100 |
| atbox       | a   |   100 |
+-------------+-----+-------+
12 rows in set (0.00 sec)

对于上表,我们假定a代表动物,下面我们来检索个数:

mysql> select sex,COUNT(*)  from students GROUP BY sex;
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| a   |        2 |
| f   |        2 |
| m   |        8 |
+-----+----------+
3 rows in set (0.00 sec)

如果将动物分组去除:

mysql> select sex,COUNT(*)  from students GROUP BY sex HAVING sex<>'a';
+-----+----------+
| sex | COUNT(*) |
+-----+----------+
| f   |        2 |
| m   |        8 |
+-----+----------+
2 rows in set (0.00 sec)

WHERE和HAVING的区别

  • WHERE是用来过滤列,而HAVING 是用来过滤分组。

最后我们来总结一下SELECT子句顺序:

子句说明是否必须使用
select要返回的列或者表达式
from后面跟要检索数据的表仅在从表选择数据时使用
where行级过滤
group by分组说明仅在按组计算聚集时使用
Having组级过滤
Order By输出排序顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值