sql必知必会10-分组数据

作者: liluchang 分类: 数据库 发布时间: 2018-04-14 11:22

分组是使用select语句的group by子句建立的。例如

group by子句

select vend_id,count(*) as prod_nums from products group by vend_id;

group by 指示DBMS按照vend_id分组。

  • group by子句可以包含任意数目的列,因此可以对分组进行嵌套,更细致的进行分组。
  • group by 子句中列出的每一列都必须是检索列或者有效表达式(但不能是聚集函数),如果在select 中使用表达式,则必须在group by中使用相同的表达式,而不能使用别名。(怀疑错误)。
  • 大多数sql实现不允许group by带有长度可变的数据类型。如文本或者备注型字段
  • 如果分组列中包含有null值的行,则null将作为一个分组返回。如果列中有多行null,则它们将分为一组。

having 子句(过滤分组)

where过滤行,而having过滤分组。事实上,大部分的where子句都可以用having来代替。例如

select cust_id,count(*) as orders from orders group by cust_id having count(*) >=2;

我们可以简单理解为,where在分组前进行过滤,having在分组后进行过滤,having过滤的是分组,而where过滤的是行。所以where不能用在group by里面。下面举例

select vend_id,count(*) as prod_nums from products where prod_price > 4 group by vend_id having count(*) >=2;

having和where十分相似,如果没有group by大部分的DBMS都会同等对待他们,但是我们自己要理解和注意区分他们,没有group by的时候,我们用where ,如果给分组进行过滤,用having。

分组和排序

虽然group by经常会帮我们进行了排序,但是这个并不一定在所有的DBMS里面都会同等支持。所以我们自己要记得加上order by。

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

标签云