sql group by 语句用法

php中文网
发布: 2016-06-07 17:48:07
原创
1892人浏览过

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
GROUP BY 语句
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SQL GROUP BY 实例
我们拥有下面这个 "Orders" 表:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

现在,我们希望查找每个客户的总金额(总订单)。

我们想要使用 GROUP BY 语句对客户进行组合。

我们使用下列 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:

Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000

很棒吧,对不对?

让我们看一下如果省略 GROUP BY 会出现什么情况:

迅易年度企业管理系统开源完整版
迅易年度企业管理系统开源完整版

系统功能强大、操作便捷并具有高度延续开发的内容与知识管理系统,并可集合系统强大的新闻、产品、下载、人才、留言、搜索引擎优化、等功能模块,为企业部门提供一个简单、易用、开放、可扩展的企业信息门户平台或电子商务运行平台。开发人员为脆弱页面专门设计了防刷新系统,自动阻止恶意访问和攻击;安全检查应用于每一处代码中,每个提交到系统查询语句中的变量都经过过滤,可自动屏蔽恶意攻击代码,从而全面防止SQL注入攻击

迅易年度企业管理系统开源完整版 0
查看详情 迅易年度企业管理系统开源完整版

SELECT Customer,SUM(OrderPrice) FROM Orders结果集类似这样:

Customer SUM(OrderPrice)
Bush 5700
Carter 5700
Bush 5700
Bush 5700
Adams 5700
Carter 5700

上面的结果集不是我们需要的。

那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
GROUP BY 一个以上的列
我们也可以对一个以上的列应用 GROUP BY 语句,就像这样:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

综合实例

> create table employee( 2>     ID          int, 3>     name        nvarchar (10), 4>     salary      int, 5>     start_date  datetime, 6>     city        nvarchar (10), 7>     region      char (1)) 8> GO 1> 2> insert into employee (ID, name,    salary, start_date, city,       region) 3>               values (1,  'Jason', 40420,  '02/01/94', 'New York', 'W') 4> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (2,  'Robert',14420,  '01/02/95', 'Vancouver','N') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (3,  'Celia', 24020,  '12/03/96', 'Toronto',  'W') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (4,  'Linda', 40620,  '11/04/97', 'New York', 'N') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (5,  'David', 80026,  '10/05/98', 'Vancouver','W') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (6,  'James', 70060,  '09/06/99', 'Toronto',  'N') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (7,  'Alison',90620,  '08/07/00', 'New York', 'W') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (8,  'Chris', 26020,  '07/08/01', 'Vancouver','N') 3> GO (1 rows affected) 1> insert into employee (ID, name,    salary, start_date, city,       region) 2>               values (9,  'Mary',  60020,  '06/09/02', 'Toronto',  'W') 3> GO (1 rows affected) 1> 2> * from employee 3> GO ID          name       salary      start_date              city       region ----------- ---------- ----------- ----------------------- ---------- ------           1 Jason            40420 1994-02-01 00:00:00.000 New York   W           2 Robert           14420 1995-01-02 00:00:00.000 Vancouver  N           3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W           4 Linda            40620 1997-11-04 00:00:00.000 New York   N           5 David            80026 1998-10-05 00:00:00.000 Vancouver  W           6 James            70060 1999-09-06 00:00:00.000 Toronto    N           7 Alison           90620 2000-08-07 00:00:00.000 New York   W           8 Chris            26020 2001-07-08 00:00:00.000 Vancouver  N           9 Mary             60020 2002-06-09 00:00:00.000 Toronto    W (9 rows affected) 1> 2> --GROUP BY clause with an aggregator 'SUM()'. 3> 4> SELECT region, SUM(Salary) 5> FROM Employee 6> WHERE ID BETWEEN 1 AND 10 7> GROUP BY Region 8> GO region ------ ----------- N           151120 W           295106 (2 rows affected) 1> 2> 3> drop table employee 4> GO 1>
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号