聚合查询
- 聚合函数
COUNT:计算表中的记录数(行数);
SELECT COUNT (<列名>)
FROM <表名>;
SUM:计算表中数值列的数据合计值;
SELECT SUM(<列名>)
FROM <表名>;
AVG:计算表中数值列的数据平均值;
SELECT AVG(<列名>)
FROM <表名>;
MAX:求出表中任意列中数据的最大值;
SELECT MAX(<列名>)
FROM <表名>;
MIN:求出表中任意列中数据的最小值;
SELECT MIN(<列名>)
FROM <表名>;
*使用聚合函数删除重复值(DISTINCT)
SELECT COUNT/SUM/AVG/MAX/MIN (DISTINCT <列名>)
FROM <表名>;
对表进行分组(GROUP BY)
示例:将shop_typle的进行分组计数
SELECT shop_typle,COUNT(shop_typle)
FROM shop_list
GROUP BY shop_list;
输出结果:
+------------+-------------------+
| shop_typle | count(shop_typle) |
+------------+-------------------+
| 衣服 | 2 |
| 工具 | 1 |
| 厨房用具 | 1 |
+------------+-------------------+
子句的顺序:1.SELECT → 2.FROM → 3.WHERE → 4.GROUP BY
NULL的值以空行进行展示。
- 使用WHERE进行限定分组
示例:限定在”衣服“类别中将商品名进行分类
select shop_name,count(*)
from shop_list
where shop_typle='衣服'
group by shop_name;
输出结果:
+-----------+----------+
| shop_name | count(*) |
+-----------+----------+
| T恤衫 | 1 |
| 运动T恤 | 1 |
+-----------+----------+
2 rows in set
注意:
1.SELECT的列名必须包含在GROUP BY的列名中,或者必须在聚合键中使用;
2.在GROUP BY 子句中不能使用SELECT子句中定义的别名;
3.GROUP BY 子句显示的结果是无序的;
4.WHERE子句不能使用聚合函数(只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数;
为聚合结果指定条件(HAVING)
与WHERE不同,WHERE只能指定记录行的条件,而不能指定组的条件(例如,”数据行数为两行“,”平均值为500“等),HAVING子句可以办到为聚合结果指定条件。
HAVING子句语法:
SELECT <列1>,<列2>,<列3>,……
FROM <表名>
GROUP BY <列1>,<列2>,<列3>
HAVING <分组结果对应的条件>;
HAVING子句示例(筛选出shop_typle计数为2的结果):
select shop_typle,count(*)
from shop_list
group by shop_typle
having count(*)=2;
输出结果:
+------------+----------+
| shop_typle | count(*) |
+------------+----------+
| 衣服 | 2 |
+------------+----------+
1 row in set
HAVING子句的构成要素 :
1.常数;
2.聚合函数;
3.GROUP BY 子句指定的列名(即聚合键);
对查询结果进行排序(ORDER BY)
- ORDED BY 子句
使用SELECT抽取数据时,数据的显示是无序的,想要得到有序的数据,那么我们就需要使用ORDER BY子句进行排序。
ORDED BY 子句语法:
SELECT <列1>,<列2>,<列3>,......
FROM <表名>
ORDER BY <排序基准1>,<排序基准2>,.....
ORDED BY 子句(商品的销售单价升序排列):
SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
FROM shop_list
ORDER BY sell_price;
输出结果:
+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0002 | 打孔器 | 工具 | 600 | 100 | 2009-10-20 |
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set
- 指定升序或者降序
ORDER BY 子句默认是进行升序的,如果要进行降序排列,可以在子句结尾加上DESC。
ORDER BY子句降序示例(按照销售单价降序排列):
SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
FROM shop_list
ORDER BY sell_price DESC;
输出结果:
+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0002 | 打孔器 | 工具 | 600 | 100 | 2009-10-20 |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set
- 指定多个排序键
如果某列的两个数值相同,相同的数值没有特定的指定,则这两个数值相对是无序的,如果想要将这两个值再排序的话,就需要再添加一个排序键。
示例(将购买价格(buy_price)相同的商品通过商品ID(shop_id)进行再排序):
SELECT shop_id,shop_name,shop_typle,sell_price,buy_price,register_date
FROM shop_list
ORDED BY buy_price,shop_id;
输出结果:
+---------+-----------+------------+------------+-----------+---------------+
| shop_id | shop_name | shop_typle | sell_price | buy_price | register_date |
+---------+-----------+------------+------------+-----------+---------------+
| 0002 | 打孔器 | 工具 | 600 | 100 | 2009-10-20 |
| 0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
| 0003 | 运动T恤 | 衣服 | 4000 | 2800 | NULL |
| 0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-20 |
+---------+-----------+------------+------------+-----------+---------------+
4 rows in set
注意:
1.ORDER BY子句中会优先使用左侧的键,如果存在相同的值,则接着参考右边的键;
2.排序键中包含NULL时,会在开头或者结尾汇总;
3.ORDER BY子句中可以使用别名;
4.ORDER BY子句可以使用SELECT子句中未使用的列和聚合函数;
5.ORDER BY子句可以使用列编号排序(列编号指SELECT子句中的列从左到右的顺序进行排序所对应的编号(1,2,3,4....))如:ORDER BY 3 DESC,1;
,使用编号可能会使代码阅读变得复杂以及在列数较多的情况下容易出错,所以不建议使用。
网友评论