表的查询(二)

来源:互联网 发布:淘宝扣分12分会怎么样 编辑:程序博客网 时间:2024/04/30 10:28

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 输出排序顺序 否
0 0
原创粉丝点击