问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

group by 能用as 后面的身子短吗

发布网友 发布时间:2023-04-02 02:19

我来回答

1个回答

热心网友 时间:2023-05-11 05:15

having是分组(group by)后的筛选条件,分组后的数据组内再筛选
where则是在分组前筛选

通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.

HAVING子句可以让我们筛选成组后的各组数据.
WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。

让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。

SQL实例:

一、显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc# ` e4 k' X* n1 v% ?+ |
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。# B* i' z `, }* S, E5 i

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过的地区。
SELECT region, SUM(population), SUM(area)7 ]; Z I! t% i
FROM bbc8 F4 w2 v( P- f
GROUP BY region
HAVING SUM(area)># y" P z. O7 D9 `# X
在这里,我们不能用where来筛选超过的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据

三、查询CUSTOMER 和ORDER表中用户的订单数
select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id;
+--------+-------+
| name | count |
+--------+-------+
| d | 9 |
| cc | 6 |
| 菩提子 | 1 |
| cccccc | 2 |
+--------+-------+
增加HAVING过滤
select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id having count(order_number)>5;
+------+-------+
| name | count |
+------+-------+
| d | 9 |
| cc | 6 |
+------+-------+

四、我在多举一些例子
SQL> select * from sc;
SNO PNO GRADE
---------- ----- ----------
1 YW 95
1 SX 98
1 YY 90
2 YW 89
2 SX 91
2 YY 92
3 YW 85
3 SX 88
3 YY 96
4 YW 95
4 SX 89
SNO PNO GRADE
---------- ----- ----------
4 YY 88
这个表所描述的是4个学生对应每科学习成绩的记录,其中SNO(学生号)、PNO(课程名)、GRADE(成绩)。
1、显示90分以上学生的课程名和成绩
//这是一个简单的查询,并没有使用分组查询
SQL> select sno,pno,grade from sc where grade>=90;
SNO PNO GRADE
---------- ----- ----------
1 YW 95
1 SX 98
1 YY 90
2 SX 91
2 YY 92
3 YY 96
4 YW 95
已选择7行。
2、显示每个学生的成绩在90分以上的各有多少门
//进行分组显示,并且按照where条件之后计数
SQL> select sno,count(*) from sc where grade>=90 group by sno;
SNO COUNT(*)
---------- ----------
1 3
2 2
4 1
3 1
3、这里我们并没有使用having语句,接下来如果我们要评选三好学生,条件是至少有两门课程在90分以上才能有资格,列出有资格的学生号及90分以上的课程数。
//进行分组显示,并且按照where条件之后计数,在根据having子句筛选分组
SQL> select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2;
SNO COUNT(*)
---------- ----------
1 3
2 2
这个结果是我们想要的,它列出了具有评选三好学生资格的学生号,跟上一个例子比较之后,发现这是在分组后进行的子查询。
4、学校评选先进学生,要求平均成绩大于90分的学生都有资格,并且语文课必须在95分以上,请列出有资格的学生
//实际上,这个查询先把语文大于95分的学生号提取出来,之后求平均值,分组显示后根据having语句选出平均成绩大于90的
SQL> select sno,avg(grade) from sc where SNO IN (SELECT SNO FROM SC WHERE GRADE>=95 AND PNO='YW') group by sno having avg(grade)>=90;
SNO AVG(GRADE)
---------- ----------
1 94.
4 90.
5、查询比平均成绩至少比学号是3的平均成绩高的学生学号以及平均分数
//having子句中可进行比较和子查询
SQL> select sno,avg(grade) from sc
group by sno
having avg(grade) > (select avg(grade) from sc where sno=3)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
胶原蛋白线双眼皮是不是永久性 双眼皮埋线是蛋白质还是尼龙绳-双眼皮埋线蛋白线多久能吸收 人体输液的“港口”完全植入式输液港 双眼皮宽变窄修复的方法 同心保家庭重疾险靠不靠谱?便宜吗? 做完双眼皮一宽一窄怎么办 喝全脂奶粉对长高有没有什么好处? redmine中“选择一个项目..."下拉列表框中为什么只列出一个项目,我建... 南充市龙门中学实力现在怎样?他的奥赛班是重点班么? 感情中为什么总是不知足呢? pascal题目!!急!!! 佳能扫描仪快捷方式 美国留学问题的calvary baptist school 这个学校怎么样啊? 在哪里可以买到grade923 普通大学(不是独立院校哦)的二表和三表毕业证有什么区别 考大学什么叫2表3表的,不懂,请给本人详细解释 140元能买到奥特曼卡片荣耀版第10弹5包吗? 梦见买破鸡蛋的预兆 梦见梦买破鸡蛋的预兆 梦见跟几个男人在一起吃饭的预兆 梦见和几个陌生人吃饭的预兆 达美乐 打了没 5252 梦见了从高处坠落的预兆 梦见我从高处坠落的预兆 梦见梦里自己从高处坠落的预兆 梦见和别人一起坠落的预兆 梦见挤黑头挤出鱼干的预兆 梦见爸爸笑我帮妈妈挤黑头的预兆 梦见帮妈妈挤黑头的预兆 梦见挤黑头挤出白色长长的东西的预兆 什么是过去诸罪业和无始贪嗔痴身语意? 吉林省律师收费标准2022 梦见捡到裤子 梦见自己的手被鱼钩破了的预兆 梦见被鱼钩扎了手 梦见自已小孩被车撞死的预兆 梦见白色浴巾的预兆 脱5小佳第几期 脱口秀放映室 脱口秀大会第五季在线观看 梦见一手好牌的预兆 梦见爷爷奶奶牌位的预兆 梦见自己抓一手好牌的预兆 梦见家里搜到金条的预兆 梦见被别人追怕被别人找到的预兆 国家奖学金每学年评审一次需坚持的原则有 国家励志奖学金每学年评选一次? 梦见自己穿袜子踩在鸡粪上的预兆 梦见鸡屎堆旁洗衣服的预兆 物流工程与管理专硕什么时候开设的 干豆腐串怎么泡软的快