9.数据分组 ---SQL

一、创建分组



分组是使用SELECT语句的GROUP BY子句建立的。理解分组的最好办法是看一个例子:

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
输出▼
vend_id num_prods
------- ---------
BRS01 3
DLL01 4
FNG01 2

分析▼
上面的SELECT语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段(用COUNT(*)函数建立)。GROUP BY子句指示
DBMS按vend_id排序并分组数据。这就会对每个vend_id而不是整个表计算num_prods一次。从输出中可以看到,供应商BRS01有3个产品,供
应商DLL01有4个产品,而供应商FNG01有2个产品。

因为使用了GROUP BY,就不必指定要计算和估值的每个组了。系统会自动完成。GROUP BY子句指示DBMS分组数据,然后对每个组而不是整
个结果集进行聚集。

在使用GROUP BY子句前,需要知道一些重要的规定。

  • GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以
  • 不能从个别的列取回数据)。
  • GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP
  • BY子句中指定相同的表达式。不能使用别名。
  • 大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。
  • 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
  • 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

提示:ALL子句
Microsoft SQL Server等有些SQL实现在GROUP BY中支持可选的A LL子句。这个子句可用来返回所有分组,即使是没有匹配行的分组也返回
(在此情况下,聚集将返回NULL)。具体的DBMS是否支持A LL,请参阅相应的文档。
警告:通过相对位置指定列
有的SQL实现允许根据SELECT列表中的位置指定GROUP BY的列。例如,GROUP BY 2, 1可表示按选择的第二个列分组,然后再按第一个列
分组。虽然这种速记语法很方便,但并非所有SQL实现都支持,并且使用它容易在编辑SQL语句时出错。

二、过滤分组



HAVING

SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
输出▼
cust_id orders
---------- -----------
1000000001 2

分析▼
这条SELECT语句的前三行类似于上面的语句。最后一行增加了HA VING子句,它过滤COUNT(*) >= 2(两个以上订单)的那些分组。
可以看到,WHERE子句在这里不起作用,因为过滤是基于分组聚集值,而不是特定行的值。

说明:HAVING和WHERE的差别
这里有另一种理解方法,WHERE在数据分组前进行过滤,HA VING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括
在分组中。这可能会改变计算值,从而影响HA VING子句中基于这些值过滤掉的分组。

说明:使用HAVING和WHERE
HA VING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。不过,你自己要能区分这一点。使用HA VING时应
该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。

三、分组和排序



我们经常发现,用GROUP BY分组的数据确实是以分组顺序输出的。但并不总是这样,这不是SQL规范
所要求的。此外,即使特定的DBMS总是按给出的GROUP BY子句排序数据,用户也可能会要求以不同的顺序排序。就因为你以某种方式分组
数据(获得特定的分组聚集值),并不表示你需要以相同的方式排序输出。应该提供明确的ORDER BY子句,即使其效果等同于GROUP BY子
句。

提示:不要忘记ORDER BY
一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。

四、ELECT子句顺序



时间: 2024-10-14 06:41:28

9.数据分组 ---SQL的相关文章

SQL数据分组后取最大值或者取前几个值(按照某一列排序)

今日做项目的时候,项目中遇到需要将数据分组后,分组中的最大值,想了想,不知道怎么做,于是网上查了查,终于找到了思路,经过比较这个查询时目前用时最快的,其实还有别的方法,但是我觉得我们只掌握最快的方法就行 ,好了,不说废话了! 直接上内容吧:以下数据是通过 SELECT [CustomerCaseNo],[PaymentsTime] FROM [BOMSDatabase].[dbo].[BAL_paymentsSwiftInfo] where StoresNo='zq00000034' group

SQL数据分组后取最大值或者取前几个值(依照某一列排序)

今日做项目的时候,项目中遇到须要将数据分组后,分组中的最大值,想了想,不知道怎么做.于是网上查了查,最终找到了思路,经过比較这个查询时眼下用时最快的,事实上还有别的方法,可是我认为我们仅仅掌握最快的方法即可 .好了,不说废话了! 直接上内容吧:下面数据是通过 SELECT [CustomerCaseNo],[PaymentsTime] FROM [BOMSDatabase].[dbo].[BAL_paymentsSwiftInfo] where StoresNo='zq00000034' gro

每天一点数据库之-----Day 6 数据分组与数据分页

每天一点数据库之-----Day 6 数据分组与数据分页 ----转载请注明出处:coder-pig 本节引言: 本节继续来学习SQL中的数据查询中的数据分组~ 先建个表,录几条数据,顺道复习下之前学的内容~ 之前建立的T_Worker都用了几天了,今天就来弄个新的表吧T_Product商品表: 建表SQL: CREATE TABLE T_Product ( PId INTEGER, PName VARCHAR(20), PKind VARCHAR(20), PCity VARCHAR(10),

Mysql 数据分组取某字段值所有最大的记录行

需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+--------------+---------------------+ | uid | level | role | time | +------+-------+--------------+---------------------+ | 7 | 1 | 摇滚圣魔 | 2014-06-12 15:01:0

小白学 Python 数据分析(11):Pandas (十)数据分组

人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):Pandas (二)数据结构 Series 小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择 小白学

高性能的数据分组引擎Essential Grouping

Essential Grouping控件是一款高性能的数据分组引擎,可以对任何列表数据进行分组,实时数据分组,可以处理大量动态数据,存取过滤结果,显示统计信息,可进行数据添加.删除.修改等操作. 具体功能: 支持多列分类.过滤.分组统计和嵌套表 该控件和界面独立,可以使用任何UI控件 支持对任何IList数据源进行分类 强大的统计计算 可以存取列的最大值.对每个分组进行求和,统计.平均值等 内嵌多种统计函数 支持多层数据表和嵌套表进行分组 支持编辑.新增.删除记录 内置多种过滤条件 支持插入计算

mysql 删除重复数据的sql语句

CREATE TABLE tmp AS SELECT id FROM get_review_url WHERE (no,title,name,content) IN (SELECT no,title,name,content FROM get_review_url GROUP BY no,title,name,content HAVING COUNT(*) > 1) AND id NOT IN (SELECT MIN(id) FROM get_review_url GROUP BY no,tit

Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据,我们希望把这些数据导入到MySQL数据库中.phpMyadmin可以把MySQL数据库中的数据导出为JSON格式文件,但却不能把JSON格式文件导入到MySQL数据库.为了实现这个目标,可以编写Python脚本将JSON格式数据转换为SQL语句以便导入MySQL数据库. JSON文件tencent.json部分内容: {"recruitNumber": "1", "name&qu

MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码

MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查询本周.上周.本月.上个月份的数据,如果您对MySQL查询方面感兴趣的话,不妨一看 今天sql and TO_DAYS( now() ) - TO_DAYS(subscribeTime) = 0 昨天sql and TO_DAYS( now() ) - TO_DAYS(subscribeTime)