SQLSERVER⼊门进阶教程——数据分组(GROUPBY和
HAVING)
数据分组
提⽰:接下来学习数据分组,这样是便于汇总表的内容,分组功能涉及的两个关键字,那就是GROUP BY和HAVING。
groupby分组1.1 数据分组介绍
使⽤SQL聚集函数可以汇总数据,这样我们就可以对其进⾏计数、计算和平均数,不检索所有数据就可以获得最⼤值和最⼩值。
⽬前为⽌所有的计算都是在表的所有数据或匹配特定的WHERE字句的数据上进⾏的,⽐如我们看下⾯的语句:
SELECT COUNT(*) AS num_prods FROM Products WHERE vend_id = 'DLL01';
输出结果
1.2 创建分组
提⽰:分组是使⽤SELECT语句中的GROUP BY字句建⽴的。
SQL语句:
SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;
输出结果:
SQL语句分析:
上⾯的SELECT语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段(⽤COUNT(*)函数建⽴)。GROUP BY⼦句指⽰ DBMS按vend_id排序并分组数据。这就会对每个vend_id⽽不是整个表计算num_prods⼀次。从输出中可以看到,供应商BRS01有3个产品,供 应商DLL01有4个产品,⽽供应商FNG01有2个产品。
说明:
因为使⽤了GROUP BY,就不必指定要计算和估值的每个组了。系统会⾃动完成。GROUP BY⼦句指⽰DBMS分组数据,然后对每个组⽽不是整 个结果集进⾏聚集。
在使⽤GROUP BY⼦句前,需要知道⼀些重要的规定。
GROUP BY⼦句可以包含任意数⽬的列,因⽽可以对分组进⾏嵌套,更细致地进⾏数据分组。
如果在GROUP BY⼦句中嵌套了分组,数据将在最后指定的分组上进⾏汇总。换句话说,在建⽴分组时,指定的所有列都⼀起计算(所以 不能从个别的列取回数据)。
GROUP BY后⾯的⼦句中列出的每⼀列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使⽤表达式,则必须在GROUP BY⼦句中指定相同的表达式。不能使⽤别名。
在SELECT后⾯的字句中除GROUP BY分组指定的列名外,都必须使⽤聚集函数,否则会报错,这是新⼿很容易犯得错误。
⼤多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如⽂本或备注型字段)。
在GROUP BY后⾯的分组条件,必须在SELECT后⾯列出,不⽤添加聚集函数。
如果分组列中包含具有NULL值的⾏,则NULL将作为⼀个分组返回。如果列中有多⾏NULL值,它们将分为⼀组。
GROUP BY⼦句必须出现在WHERE⼦句之后,ORDER BY⼦句之前。
提⽰:GROUP BY语句相对初学者来说⽐较难理解,我就在这上⾯吃了好些亏,当掌握了以后其实也很容易理解,关键就是多使⽤,在使⽤中去理解语句的含义。
1.3 分组过滤
GROUP BY是进⾏数据分组,当然分组后也可以根据分组信息进⾏过滤,这就需要HAVING了,HAVING和WHERE⾮常类似,接着我们介绍⼀下WHERE和HAVING的区别:
WHERE过滤指定的⾏⽽不是组,HAVING过滤的是组,这是他们的本质区别
HAVING⽀持所有WHERE的操作符,我们前⾯所学的所有有关WHERE技术和选项都是⽤与HAVING,他们的语句是相同的,只是关键字有差别。
WHERE是在数据分组前进⾏过滤,HAVING是在数据分组后进⾏过滤,也就意味这当WHERE和HAVING在同⼀条语句中
时,WHERE应在HAVING语句前⾯。
SQL语句:
SELECT cust_id, COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*) >= 2;
SQL语句分析:
这条SELECT语句的前三⾏类似于上⾯的语句。最后⼀⾏增加了HAVING⼦句,它过滤COUNT(*) >= 2(两个以上订单)的那些分组。我们将此条语句分开来说,HAVING语句之前是根据列cust_id进⾏分组来统计数量,HAVING语句是根据分组后的数据在进⾏过滤。
输出结果:
下⾯我们将WHERE和HAVING放到统⼀语句中使⽤
SQL语句:
SELECT vend_id, COUNT(*) AS num_prods FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
SQL语句分析:
这条语句中,第⼀⾏是使⽤了聚集函数的基本SELECT语句,很像前⾯的例⼦。WHERE⼦句过滤所有prod_price⾄少为4的⾏,然后按vend_id分 组数据,HAVING⼦句过滤计数为2或2以上的分组
输出结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。