您的位置:首页 > 数据库

sql语句中group by 与order by的区别

2013-03-16 14:12 363 查看
sql 里的 order by 和 group by 的区别:

order by  是按字段排序

group by  是按字段分类

order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

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 ] ]

这两个是很像.

order by是按指定的列的升序或降序来给查询结果排序,

它不需要查询结果中出现order by的栏位.

更改Order by里的栏位只会影响查询结果的顺序,而不影响查询出的记录总数,和每条记录的内容.

group by是按指定的列对满足Where条件的所有记录分组,并对组内的一些数值型栏位计算出每组的一个统计指标,如求和、求个数、求平均值、求最大值、求最小值、、、、、、、

它对查询结果有个要求:查询结果中的出现的栏位必须是Group by中栏位的子集。

更改Group by里栏位的顺序不会对查询结果有任何影响;

但是更改Group by的栏位,会对查询得到的记录数量,以及各个汇总函数的结果造成影响。 sql语句Group By用法一则

如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于 store_name 及 Sales 这两个栏位都要选出。第二,我们需要确认所有的 sales 都要依照各个 store_name 来分开算。这个语法为:

SELECT "栏位1", SUM("栏位2") FROM "表格名" GROUP BY "栏位1"

在我们的示范上,

Store_Information 表格

store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 我们就打入, SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name

结果:

[b]store_name SUM(Sales)
Los Angeles $1800 San Diego $250 Boston $700
[/b]
当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就需要用到 GROUP BY 这个指令。在这个情况下,我们需要确定我们有 GROUP BY 所有其他的栏位。换句话说,除了有包括函数的栏位外,我 们都需要将其放在 GROUP BY 的子句中

SUM
返回表达式中所有值的和,或只返回 DISTINCT 值。SUM 只能用于数字列。空值将被忽略。

A. 在聚合和行聚合中使用 SUM
下列示例显示聚合函数和行聚合函数之间的区别。第一个示例显示只提供汇总数据的聚合函数,第二个示例显示提供详尽数据和汇总数据的行聚合函数。

USE pubsGO-- Aggregate functionsSELECT type, SUM(price), SUM(advance)FROM titlesWHERE type LIKE '%cook'GROUP BY typeORDER BY typeGO

下面是结果集:

type ------------ -------------------------- -------------------------- mod_cook 22.98 15,000.00 trad_cook 47.89 19,000.00 (2 row(s) affected)USE pubsGO-- Row aggregatesSELECT type, price, advanceFROM titlesWHERE type LIKE '%cook'ORDER BY typeCOMPUTE
SUM(price), SUM(advance) BY type

下面是结果集:

type price advance ------------ -------------------------- -------------------------- mod_cook 19.99 0.00 mod_cook 2.99 15,000.00 sum ========================== 22.98 sum ========================== 15,000.00 type price advance ------------ --------------------------
-------------------------- trad_cook 20.95 7,000.00 trad_cook 11.95 4,000.00 trad_cook 14.99 8,000.00 sum ========================== 47.89 sum ========================== 19,000.00 (7 row(s) affected)
B. 计算多列的组合计
下例计算每类书籍的价格和预付款总和。

USE pubsGOSELECT type, SUM(price), SUM(advance)FROM titlesGROUP BY typeORDER BY typeGO

下面是结果集:

type ------------ -------------------------- -------------------------- business 54.92 25,125.00 mod_cook 22.98 15,000.00 popular_comp 42.95 15,000.00 psychology 67.52 21,275.00 trad_cook 47.89 19,000.00 UNDECIDED (null) (null) (6 row(s) affected)COUNT

返回组中项目的数量。

COUNT(*) 返回组中项目的数量,这些项目包括 NULL 值和副本。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

示例A. 使用 COUNT 和 DISTINCT
下面的示例查找作者所居住的不同城市的数量。

USE pubsGOSELECT COUNT(DISTINCT city)FROM authorsGO

下面是结果集:

----------- 16 (1 row(s) affected)
B. 使用 COUNT(*)
下面的查询查找图书和书名的总数:

USE pubsGOSELECT COUNT(*)FROM titlesGO

下面是结果集:

----------- 18 (1 row(s) affected)
C. 与其它聚合函数一起使用 COUNT(*)
下面的示例显示可以与选择列表中的其它聚合函数结合使用的 COUNT(*)。

USE pubsGOSELECT COUNT(*), AVG(price)FROM titlesWHERE advance > $1000GO

下面是结果集:

----------- -------------------------- 15 14.42 (1 row(s) affected)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: