SQL总结(四)

分组数据

之前我们的处理都是针对表的所有数据或者通过WHERE限定的数据,现在我们需要只针对一部分数据(具有某一共同特征)进行处理。
使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。GROUP BY子句 和HAVING子句。

创建分组

GROUP BY子句。
SELECT vend_id,COUNT(*) AS num_prods FROM Products GROUP BY vend_id; 按照vend_id分组,然后在每个组中查找id和num_prods,具体输出每个供应商的产品数。
注意:
GROUP BY 可以包含任意数目的列,因此可以嵌套;更细致的分组,即组内组
如果嵌套了分组,数据将在最后指定的分组上进行汇总,即在最后的组内进行SELECT;
GROUP BY子句中列出的每一列都必须是检索列或者有效的表达式,如果SELECT使用表达式,那么GROUP BY 子句中必须使用相同的表达式;
大多数SQL不允许GROUP BY使用长度可变的数据类型,如文本或者备注型字段;
除聚集计算语句外,SELECT语句中的每一列必须都在GROUP BY子句中列出,见之前例子中的vend_id,但是COUNT(*)没有在GROUP BY中列出;
如果分组列中含有NULL值的行,那么NULL将作为一个分组列出;
GROUP BY必须出现在WHERE字句之后,ORDER BY之前。

过滤分组

HAVING子句,注意WHERE不能实现类似功能,因为WHERE过滤指定的是行而不是分组。
目前所有WHERE都可以使用HAVING来替代。
SELECT vend_id,COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*)>=2;先分组,然后取每个组中计数大于等于2的相关数据。
SELECT vend_id,COUNT(*) AS orders FROM Orders WHERE prod_price >=4 GROUP BY cust_id HAVING COUNT(*)>=2;列出具有两个以上产品且其价格大于等于4的供应商。在这里先进行WHERE过滤,然后HAVING过滤计数为2及以上的分组。
使用HAVING应结合使用GROUP BY。

分组和排序

一般在使用GROUP BY子句时,应该也给出ORDER BY子句,这时保证数据正确排序的唯一方法,千万不要仅依赖于GROUP BY排序数据。

使用子查询

解释:就是将前一个查询的结果作为第二个查询的输入
SELECT cust_id FROM Orders WHERE order_nums IN (SELECT order_num FROM OrderItems WHERE prod_id='RGAN01');将括号内的输出作为外层SELECT的输入(限定条件)。在SELECT语句中,子查询总是自内向外处理的。
作为子查询的SELECT语句只能查询单个列,企图检索多个列将返回错误。

原文地址:https://www.cnblogs.com/rayshaw/p/9029327.html