表的查询(二)
来源:互联网 发布:淘宝扣分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子句顺序:
0 0
- 表的查询(二)
- 多表查询(二)
- 多表查询(二)-----表的连接类型
- oracle学习之二(数据类型和表的查询)
- Oracle表的常用查询实验(二)
- Mysql多表查询效率的研究(二)
- PostgreSQL的查询语句的连接方式与查询计划比较--多表连接(二)
- hibernate框架的查询方式hql的多表查询(二十二)
- Android SQLite的查询优化(二)
- MySQL数据的查询(二)
- oracle的查询数据表(二)
- Oracle 查询技巧与优化(二) 多表查询
- 【Oracle数据库】表查询(二)
- SQL总结(二)连表查询
- SQL总结(二)连表查询
- SQL总结(二)连表查询
- 数据库查询中的表连接(二)
- mybatis(二)---关联表查询
- 小程序
- 挪威石油基金将起诉大众汽车
- EventBus 学习笔记
- 深入理解HashMap(及hash函数的真正巧妙之处)
- GitHub 优秀的 Android 开源项目
- 表的查询(二)
- spring boot 使用FreeMarker模板
- Java以DOM方式解析生成xml文件或字符串
- 请问腾迅前端高级开发工程师
- android的自定义toolbar
- pool(一)——入门
- dot实现HuffmanTree动态可视化
- dubbo注册服务IP解析异常及IP解析源码分析
- 【BOM操作】JavaScript中的event对象之总结