SQL分组

SQL分组建立分组: vend_id是Vendor_id的缩写:供应商id,products是一个存储商品信息的表。 通过GROUP BY语句,我们可以按照供应商分组,然后组内计数。 SELECT a.prod_id,a.prod_name,a.prod_price,a.prod_desc,b.num_pro

建立分组:

vend_id是Vendor_id的缩写:供应商id,products是一个存储商品信息的表。

通过GROUP BY语句,我们可以按照供应商分组,然后组内计数

SELECT a.prod_id,a.prod_name,a.prod_price,a.prod_desc,b.num_prods
FROM products a
join 
(
SELECT vend_id,count(*) as num_prods
FROM products
group by vend_id
) b
on a.vend_id=b.vend_id
where num_prods>2

查询提供2个以上产品的供应商的产品。

 GROUP BY的一些重要规定:

1,GROUP BY子句可以包含任意数目的列,如果在GROUP BY子句中嵌套了分组,数据将GROUP BY会在最后指定的分组上进行行汇总。

SELECT vend_id,prod_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id,prod_id;

结果:

SQL分组

2,GROUP BY中的每一列必须是检索列或者表达式。

相似问题可以查看,https://blog.csdn.net/weixin_43495390/article/details/103372662

GROUPBY不能使用别名的原因是它在select语句前执行。所以这就引出第3点

3,GROUP BY子句必须出现在WHERE子句后,ORDER BY子句之前。

4,如果分组列中包含NULL值的行,那么NULL也会作为一个分组返回。

 过滤分组:

你可能想要列出至少有两个订单的所有顾客。为此必须要基于组过滤,而不是个别的行进行过滤。

尽管有WHERE子句,但这个任务中WHERE不能完成任务,因为WHERE过滤的是行不是组。

那么怎么过滤分组呢?请看以下例子:

SQL分组

这段代码在最后一行增加了HAVING,它的作用就是过滤掉COUNT(*)>=2的那些分组。

SELECT order_date,cust_id,count(*) as orders from orders
where date_format(order_date,'%Y%m')<=201202
group by cust_id
having count(*)>=1

进一步练习,如果想要返回在2012年2月之前的,具有两个以上订单的顾客。就要增加一条WHERE子句

分组和排序


Order By 和 GROUP BY的差别

差别在于GROUPBY分组的数据并不总是以分组顺序输出,因为这不是sql规范要求的。

即便DBMS总是按分组顺序输出,用户可能会要求以不同的顺序排序。

所以使用group by子句时,应该给出order by子句。不要仅依赖GROUP BY 排序数据。

举例:输入

SELECT order_num,count(*) as items from orderitems
GROUP BY order_num
HAVING count(*)>=3

输出:

SQL分组

没经过order by排序后。

加入items后

SELECT order_num,count(*) as items from orderitems
GROUP BY order_num
HAVING count(*)>=3
order by items;

输出:

SQL分组

 

 加入order_num后:

SQL分组

 行按order_num排序

 

今天的文章SQL分组分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/56696.html

(0)
编程小号编程小号
上一篇 2023-08-26 14:11
下一篇 2023-08-26 14:30

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注