SQL之四

来源:互联网 发布:黑河学院教务网络管理 编辑:程序博客网 时间:2024/06/18 06:04
                 SQL之四

1. 组合聚集函数
举例:select语句可根据需要包含多个聚集函数。
Select count(*) as num_items,
min(prod_price) as price_min,
max(prod_price) as price_max,
avg(prod_price) as price_avg
from Products;
注:distinct不能用于count(*),只能用于指定列名,不能用于计算或者表达式。
2. 分组函数
涉及两个新select语句子句:group by子句和having子句。
(1) 分组是使用select语句的group by子句建立的。
理解分组下面举个列子:
Select vend_id,count(*) as num_prods from Products group by vend_id;
上面的select语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段。group by子句指示DBMS按vend_id排序并分组数据。这就会对每个vend_id而不是整个表计算num_prods一次。
因为使用了group by,就不必指定要计算和估值每个组了,系统会自动完成。group by子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。
(2) group by子句需要注意的点?
Group by子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
如果在group by子句中嵌套了分组数据将在最后指定的分组上进行汇总换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
Group by子句中列出的每一列都必须是检索列或有效的表达式。如果select中使用表达式。不能使用别名。
大多数sql实现不允许group by列带有长度可变的数据类型(如文本或备注字段)
除聚集计算语句外,select语句中的每一列都必须在group by子句中给出。
如果分组列中具有null值的行,则null将作为一个分组返回。如果列中有多行的null值,他们将分为一组。
Group by子句必须出现在where子句之后,order by子句之前。
3. 过滤分组
除了能用group by分组数据外,sql还允许过滤分组,规定包括哪些分组,排除哪些分组。这时候不能用where进行过滤,而应该用having过滤。
(1) 为什么不能用where?
这是因为where过滤指定的是行而不是分组,where没有分组的概念。
举例说明:
Select cust_id,count() as orders from Orders group by cust_id having count() >= 2;(这里本来count里面有星号,但是网站显示不出来,在此说明下)
这条select语句的前三行类似于上面的语句。最后一行增加了having子句,它过滤count(*)>= 2 (两个以上订单)的那些分组。
(2) where和having可以同时在一起么?
Select vend_id,count(*) as num_prods from Products where prod_price >= 4 group by
vend_id having count(*) >= 2;
where子句过滤所有prod_price至少为4的行,然后按vend_id分组数据,having子句过滤计数为2或2以上的分组。

0 0
原创粉丝点击