查询之order by,group by和having的使用

转载 2007年09月20日 11:04:00

(1)order by

 ORDER BY子句的语法为:

SELECT column1, SUM(column2) FROM "list-of-tables"

ORDER BY "column-list" [ASC | DESC];

[ ] = optional

ORDER BY是一个可选的子句,它允许你根据指定要order by的列来以上升或者下降的顺序来显示查询的结果。例如:

ASC = Ascending Order – 这个是缺省的

DESC = Descending Order

下面举个例子:

SELECT employee_id, dept, name, age, salary

FROM employee_info

WHERE dept = 'Sales'

ORDER BY salary;

这条SQL语句将从employee_info表中列dept等于'Sales'选择employee_id,、dept、 name、 age和 salary,并且根据他们的salary按升序的顺序来列出检索结果。

如果你想对多列排序的话,那么在列与列之间要加上逗号,比如 :

SELECT employee_id, dept, name, age, salary

FROM employee_info

WHERE dept = 'Sales'

ORDER BY salary, age DESC;

(2)group by

一、首先讲讲GROUP BY 子句语法:

SELECT column1, SUM(column2) FROM "list-of-tables"

GROUP BY "column-list";

这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦:

假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句:

SELECT max(salary), dept

FROM employee

GROUP BY dept;

这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。

二、group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
 
什么是“聚合函数”?
  像sum()、count()、avg()等都是“聚合函数”
  使用group by 的目的就是要将数据分类汇总。

  一般如:
    select 单位名称,count(职工id),sum(职工工资) form [某表]
    group by 单位名称
    这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。

  在sql命令格式使用的先后顺序上,group by 先于 order by。
 
  select 命令的标准格式如下:
 
   SELECT select_list
   [ INTO new_table ]
   FROM table_source
   [ WHERE search_condition ]
   [ GROUP BY group_by_expression ]
   [ HAVING search_condition ]
   [ ORDER BY order_expression [ ASC | DESC ] ]

三、理解group by:

表1:

 type

 udate

 mp3

 2006-3-2

 flash

 2006-1-2

 mp3

 2006-2-2

 
在表1中,假设要取出最后更新的某一类型(type)产品的日期
那么就要使用group by type的方式
select type from 表1 group by type
但这样就无法读到udate
 
再来
select type,udate from 表1 group by type
这种写法是错误的。
原因是type和udate 不是一对一的关系。就是说一种type有几个udate
所以
selct ** group by ** 之后没办法组织形成新的表,不知道要取哪个udate
 
再来
select type,max(udate) from 表1 group by type
这样就正确了。
取的是最大的udate ,一对一成立。

四、GROUP BY... 被附加于SQL 是因为聚会函数 (如 SUM) 每次都返回所有列值的合计,没有GROUP BY函数是不可能找到列值的单个分组的合计数。

语法

SELECT column,SUM(column) FROM table GROUP BY column

-----------------------------------------------

GROUP BY 示例

这个 "Sales" 表:

Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100

和这个SQL语句:

SELECT Company, SUM(Amount) FROM Sales

返回这个结果:

Company SUM(Amount)
W3Schools 17100
IBM 17100
W3Schools 17100

上面的代码是不正确的,因为被返回的列不是部分合计。GROUP BY 子句将解决这个问题。

SELECT Company,SUM(Amount) FROM Sales            GROUP BY Company

返回结果:

Company SUM(Amount)
W3Schools 12600
IBM 4500

五、

SQL Group by 学习 及相关应注意的地方
 
    在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。

   在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数

   select max(sal),job emp group by job;
   (注意max(sal),job的job并非一定要出现,但有意义)

   查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。

  select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

  当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件
 
  where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
  having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

  查询每个部门的每种职位的雇员数
  select deptno,job,count(*) from emp group by deptno,job;

注意:

        group by 不能对别名进行分组排序.举例如下:

错误SQL:

SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

   DEPTDICT.CNNAME DEPTNAME,
    COUNT(BASICROLL.ID) AS PROJCOUNT

FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

WHERE DEPTDICT.CNNAME <> '无'

GROUP BY YEARDATE, DEPTDICT.CNNAME                      1
ORDER BY YEARDATE DESC                                                  2

 作者原意是将记录按年月,部门进行分组.并倒序排序.但上面的GROUP BY因为用了别名,所以会提示SQL语法错误.如果将上面1,2二句改成:
   

GROUP BY BASICROLL.ROLLDATE, DEPTDICT.CNNAME                      3

ORDER BY BASICROLL.ROLLDATE  DESC                                                4

如上3,4二句,又会不合原意,因为BASICROLL.ROLLDATE  包括了年月日.这样分组得出的是按年月日来分组,而不是单纯的年月了.所以正确的SQL应该是这样的.

正确的SQL

SELECT to_char(BASICROLL.ROLLDATE,'yyyy-mm') AS YEARDATE,

   DEPTDICT.CNNAME DEPTNAME,
    COUNT(BASICROLL.ID) AS PROJCOUNT

FROM BASICROLL LEFT JOIN DEPTDICT ON BASICROLL.ARRDEPTDICTID=DEPTDICT.ID

WHERE DEPTDICT.CNNAME <> '无'

GROUP BY to_char(BASICROLL.ROLLDATE,'yyyy-mm'), DEPTDICT.CNNAME                     

ORDER BY to_char(BASICROLL.ROLLDATE,'yyyy-mm') DESC                                                 
以上的注意部分为本人在项目开发过程中经验所得.

来自:http://gyapollo.yculblog.com/post.1116750.html

六、例子

1> select * from bank_info
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        


 

(2 rows affected)
1> select * from bank_info where acctround='1' group by bankno order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        


 

(2 rows affected)
1> select * from bank_info where acctround='1' order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        


 

(1 row affected)
1> select * from bank_info
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2        


 

(2 rows affected)
1> select * from bank_info where acctround='1' group by bankno,acctround order by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        


 

(1 row affected)

group by bankno,acctround的意思是找出bankno,acctround两列完全相同的不同行作为一组.那上面的数据就分成两组了,因为acctround不同,而结果需要acctround='1'的组.所以只有一行结果.如果是group by bankno,那么两行会合成一行.它并没有先通过where分析出只有一行符合结果集,再group就只有一行结果了.这里的问题是where和group谁先谁后分析的问题?在这个问题的上下文中,本来的group by bankno就没有任何意义.其实是这样的: 

或者是: 

select bankno,sum(money) from bankdiff group by bankno; 

又或者是: 

select bankno,acctround,sum(money) from bankdiff where acctround='1' group by bankno,acctround;
 

不可能指定acctround又不把它放在groub by中的.

 

1> select * from bank_info group by bankno
2> go
 bankno acctround
 ------ ---------
 123456 1        
 123456 2 


 

可见这个group by没有意义.因为它有select *,而acctround不一样,就不能只显示一行出来.把select * 改成 select bankno就只有一行结果了.


 

总结:使用group by必需明确你分组的意义,是否有必要这一个列或几个列来确定一个有意义的组,而需要显示的结果行的列是否和group by子句中的列名相冲突.一般不在group by子句中的列名都不会直接在select中显示出来.因为它们要分成一组来或者做些运算再显示.如sum(money)等.

(3)having

一、下面先给出HAVING子句的语法:

SELECT column1, SUM(column2) FROM "list-of-tables"

GROUP BY "column-list"

HAVING "condition";

这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。

下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句:

SELECT dept, avg(salary)

FROM employee

GROUP BY dept;

当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句:

SELECT dept, avg(salary)

FROM employee

GROUP BY dept

HAVING avg(salary) > 20000;

二、HAVING... 被附加到SQL语句是因为WHER关键字不能被用于聚会函数 (如 SUM),并且没有HAVING...它将不可能测试结果条件。

语法:

SELECT column,SUM(column) FROM table            GROUP BY column            HAVING SUM(column) condition value

这个 "Sales" 表:

Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100

和这个SQL语句:

SELECT Company,SUM(Amount) FROM Sales            GROUP BY Company            HAVING SUM(Amount)>10000

返回这个结果

Company SUM(Amount)
W3Schools 12600

 

Group By 和 Having, Where ,Order by语句的执行顺序:

一. group by  1.GROUP BY子句主要用于对WHERE中得到的结果进行分组,也就是说它是在WHERE子句之后执行,对经过WHERE筛选后的结果按照某些列进行分组,之后进行相应的处理工...
  • zhangyuehuan
  • zhangyuehuan
  • 2014年04月10日 22:24
  • 1146

SQL中的Where,Group By,Order By和Having

数据库,每个程序或多或少都会有所接触。 说到SQL语句,大家最开始想到的就是他的查询语句: select * from tableName; 这是最简单的一种查询方式,不带有任何的条件。...
  • qitian0008
  • qitian0008
  • 2012年08月07日 22:37
  • 7976

关于oracle中的group by、having以及order by

1.顺序 如果在select语句中同时包含group by、having、order by,那么他们的顺序是group by——having——order by。    2.关于聚合函数(分组函数...
  • wuseyukui
  • wuseyukui
  • 2013年10月30日 22:06
  • 3729

MySQL数据库操作---group by、having、where、order by的使用

SUM函数用来求和、group by用来分组查询。一、建表、插入数据1、创建一个student表2、查看student表结构3、插入6条数据4、插入了6条数据后,我们可以发现自增数据(auto_inc...
  • will130
  • will130
  • 2015年11月12日 11:55
  • 3140

关于mysql中 group by , order by , where, having 语句的区别与运用

最近一直在忙着和数据库有关的一些工作,这几天在写存储过程的时候,一些mysql的语句突然感觉有些不太明白,就是group   by   ,  order   by  ,where   ,  havin...
  • qq_22642239
  • qq_22642239
  • 2016年11月23日 16:20
  • 2536

Oracle数据库-where, group by, having, order by语句的执行顺序

select xxx_name, count(*) as counter from table_y where where_condition group by xxx_name having hav...
  • m53931422
  • m53931422
  • 2014年11月27日 16:25
  • 7952

SQL语句where,Group By,having order by 的详细使用方法

 1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小...
  • happystarcat
  • happystarcat
  • 2014年04月21日 15:55
  • 15939

hive的strict模式;where,group by,having,order by同时使用的执行顺序

主要限制三种情况 (1) 有partition的表查询需要加上where子句,筛选部分数据实现分区裁剪,即不允许全表全分区扫描,防止数据过大 (2) order by 执行时只产生一个reduce...
  • longshenlmj
  • longshenlmj
  • 2015年11月02日 18:00
  • 1968

[mysql] select的子句 where,group by, having, order by, limit的使用顺序及实例

-- 语法: 1 2 3 4 5 6 7 SELECT select_list    FROM table_name   [ WHERE search_con...
  • wfh6732
  • wfh6732
  • 2017年02月23日 21:13
  • 450

SQL语句 where,group by,having,order by执行顺序

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序  2010-06-06 15:34  使用count(列名)当某列出现null值的时...
  • rj532029887
  • rj532029887
  • 2014年09月14日 01:03
  • 8637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查询之order by,group by和having的使用
举报原因:
原因补充:

(最多只允许输入30个字)