SQL操作指南二(聚合查询GROUP BY、HAVING、ORD

2018-11-04  本文已影响0人  了不起的树懒

聚合查询

对表进行分组(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的值以空行进行展示。

+-----------+----------+
| 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)

 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
 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
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;,使用编号可能会使代码阅读变得复杂以及在列数较多的情况下容易出错,所以不建议使用。

上一篇 下一篇

猜你喜欢

热点阅读