A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在SQL查询中可能同时要用到条件,分组,排序,和筛选等操作,这时候where,group by,order by和 having的使用顺序应该是怎么排的?以及排序前后的根据是什么?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
顺序:where,group by,having,order by
说明:where是筛选的条件
         group by是用于分组的,可以对查询结果进行分组或对制定表的制定列进行分组。
         having是对分组进行筛选,必须放在group by 之后
         order by 用于对查询结果进行排序,自然要放在查询语句的后面,若不是对查询结果进行排序,而是直接对表中的某些列分组,则可以直接order by 后面跟要排序的列即可。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 安超 于 2012-2-25 14:30 编辑

select age,count(*) from persons
where age>10
group by age
having count(*)>3
order by age desc

对年龄大于10岁的人员进行分组,并把组人数大于3的分组结果按年龄段从大到小的顺序显示出来。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
where子句是基于指定的条件对记录行进行筛选;
group by子句将数据划分为多个分组;
having子句是筛选分组;
order by 按字段对结果集进行排序;
having是和 group by 连用为了分组后进行条件查询
按逻辑思维去理解,先按照指定的条件对记录行进行筛选使用where,再对筛选的结果划分为多个分组使用group by,再对分组进行筛选使用having,最后对整个结果进行排序输出使用order by 。
因此顺序应为where.....group by....having.....order by

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
给你一个我程序里的例子:
select empid,YEAR(orderdate) as orderyear,Count(*) as numorders
from Sales.orders
where custid=71
group by empid,YEAR(orderdate)
having Count(*)>1
order by empid,orderyear
这就是他们的顺序,
where是查询条件
group by 是用来对查询进行分组的
having是对查询进行筛选的,
以上所有进行完之后才开始执行select的,而order by是在查询完数据后进行的,order by之后的结果就是最终显示的结果
所以你还可以看到 Group by和having之后是不能用select中起的别名(orderyear和numorder),而order by就可以使用orderyear

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马