/*
分组数据
*/
select vend_id, count(*) as NUM_PRODS from products GROUP BY vend_id; --分组后 count函数会对每个组(GROUP BY 分出的每个组) 而不是整个结果进行聚集。
-- 有可能的执行顺序(但不一定正确) from select group by count
select prod_id prod_name from Products group by prod_name;--除聚集计算语句之外 select 的每一列都需要在 group by 中给出。 如此语句虽然编译时不报错,但是执行不会成功!
-- GROUP BY 必须出现在 WHERE 语句之后 ORDER BY 语句之前! tip: ORDER BY 必须在select 末尾。 因为 ORDER BY 是对最终结果进行排序 执行顺序也是最后一名。
select prod_id from Products GROUP BY ALL prod_id;
--有些筛选条件 WHERE 不能做到。 事实上 WHERE 没有分组概念。 WHERE 筛选的都是行!
-- WHERE 过滤行 ! HAVING 过滤分组 ! 如果要按照分组进行筛选过滤 可以使用 HAVING!
-- 使用having时应该结合group by 进行使用 而where 用于标准的行级过滤。
--如下 可以看出 where 在此并不起作用。 需要使用 having 因为 如下过滤是基于分组聚集值(分组后的数据进行过滤)进行过滤,而不是根据特定的行进行过滤。
select cust_id , COUNT(*) as num_order from Orders group by cust_id having COUNT(*)>=2; -- 得出: 按照cust_id(顾客编号)进行分组 得出每组所拥有的行,并且行数大于等于2
select vend_id ,avg(prod_price) as num_price from Products Group by vend_id having AVG(prod_price)>=5 ; --得出: 按照vend_id(出售编号)进行分组 得出每组的平均值,并且平均值大于等于5.
--如下 :这是一套可以一起执行进行对比一下 看规律
SELECT VEND_ID ,COUNT(*) FROM Products WHERE prod_price>4 GROUP BY vend_id HAVING COUNT(*)>=2; --先找到价格大于4的 之后再分组 在找行大于2 但是请注意 这个是按 vend_id进行分组的
SELECT VEND_ID, prod_price, COUNT(*) FROM Products GROUP BY vend_id , prod_price --按照 id和price 分组 之后显示出行 总共6组
SELECT VEND_ID, prod_price FROM Products --查找全部
SELECT VEND_ID, prod_price FROM Products where prod_price>4; -- 查找出价格大于4的 有6条
SELECT VEND_ID, prod_price, COUNT(*) FROM Products GROUP BY vend_id , prod_price HAVING prod_price>4 AND COUNT(*)>=2; --而这个是按照 prod_price进行分组的。 为什么? 因为(prod_id)A 可以有 多个(prod_price)B。 但是(prod_price)B 只能有一个 A(prod_id) 所以是按照prod_price进行分组。 按prod_price分组后 行数还需要高于2。
--如上 :这是一套可以一起执行进行对比一下 看规律
select COUNT(*) from Products order by COUNT(*); -- order by 非选择列也可以使用
-- GROUP BY 一般用于 在组计算聚集时使用 (按照分组去计算聚集时)