SQL | 分组数据

news2024/12/30 2:29:16

10-分组数据

两个新的select子句:group by子句和having子句。

10.1-数据分组

上面我们学到了,使用SQL中的聚集函数可以汇总数据,这样,我们就能够对行进行计数,计算和,计算平均数。

目前为止,所有的计算都是在表的所有数据或者匹配特定的where子句的数据上进行的。

select count(*) as num_prods
from products
where vend_id = 'DLL01';

如上述SQL语句,返回供应商为DLL01的所有产品数目。

但是,现在有一个功能,就是想要返回每个供应商的产品数目;或者返回只提供一种商品的供应商数目。

这个时候就需要用到这次要写的分组的内容了。

使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

10.2-创建分组

分组是使用select语句和group by子句进行创建的。

select vend_id,count(*) as num_prods
from products
group by vend_id;

上述SQL语句执行后,会分别查出来供应商为BRS01的产品数目,供应商为DLL01的产品数目,供应商为FNG01的产品数目。

group by子句指示DBMS按照vend_id排序并分组数据。这么做就会对每个不同的vend_id进行分别查询。

因为使用了group by子句,就不必指定要计算和估值的每个组了,系统会自动完成。group by子句提示DBMS对数据按照vend_id进行分组,然后对每个组而不是整个结果集进行聚集。根据上述的SQL语句,DBMS按照我们的指示,分为三组,然后每组进行分别计算。

使用group by之前,需要知道下面内容:

  • gruop by子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行分组。

  • 如果group by 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。在建立分组时,所有列都一起计算,所以不能从个别列取数据。

  • group by 子句中累出的每一列都必须是检索列或者有效的表达式,但是不能为聚集函数如果在select中使用表达式,则必须在gruop by子句中指定相同的表达式,不能使用别名

  • 大多数SQL实现不允许group by 列带有长度可变的数据类型(如文本字段,备注型字段)。

  • 除聚集计算语句外,select语句中的每一列都必须在group by子句中给出。

  • 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。如果列中有多行NULL值,他们将分为一组。

  • group by子句必须出现在where子句之后,order by子句之前。

10.3-过滤分组

除了使用group by分组数据外,SQL还能过滤分组,可以规定包括哪些分组,排除哪些分组。例如,我们查找至少有两个订单的顾客;商品数量大于100的供应商等。必须基于完整的分组而不是个别的行进行过滤。

看到过滤,就想起了where子句,但是过滤分组这个功能可能不能使用where,因为where过滤的是某些不符合条件的行,而不是组。

SQL提供的另一个子句:having子句,是专门用来过滤分组的。having类似于where。

目前为止,所有where子句都可以使用having进行替换。只不过having用户过滤组,where用于过滤行。

having支持所有where操作符:where子句的条件,包括通配符条件和带多个操作符的子句,学过的这些有关where的所有技术和选项都使用having。句法是相同的,只是关键字不同而已。

select cust_id,count(*) as orders
from orders
group by cust_id
having count(*) >= 2;

上述SQL语句通过分组查询订单量大于等于2的顾客id和订单数量。可以看到,我们是通过having过滤组数据的。

having和where的差别:where在数据分组前进行过滤,having在数据分组后进行过滤。经过where过滤后的数据,就不包含在组中了。

select vend_id,count(*) as num_prods
from products
where prod_price >= 4
group by vend_id
having count(*) >= 2;

 

 

上述SQL语句用于查询产品列表中,某个供应商供应的产品数量大于等于2,并且产品价格大于等于4的供应商的数量。

第一行正常使用selec子句,使用聚集函数count(*)。第三行过滤产品价格大于等于4的行;第四行按照vend_id进行分组;然后第五行过滤计数大于等于2的组。

如果没有where子句,会怎么样呢?

select vend_id,count(*) as num_prods
from products
group by vend_id
having count(*) >= 2;

上述SQL语句除去了where子句,可以看到数据比上面多了一条。

关于使用where和having:如果没有group by子句,大多数DBMS会同等对待这两个子句。但是实际开发过程中应该知道,只用having时,后面要跟group by子句。

10.4-分组和排序

group by 和 order by

对于第一条区别,有时我们使用group by,大部分情况是按照分组顺序进行排序的,但并不是总是这样。如果想要指定输出的数据为某种指定的排序,那么还是要指定order by子句,即使它的效果等同于group by子句。

select order_num,count(*) as items
from orderitems
group by order_num
having count(*) >=3;

 

但是,如果我们按照订购物品的数目进行排序输出。

select order_num,count(*) as items
from orderitems
group by order_num
having count(*)  >= 3
order by items,order_num;

 

 

上述SQL语句按照order_num分组数据,查询符合大于等于3的数据,然后按照数量进行排序。

10.5-select子句顺序

练习

  1. OrderItems表包含每个订单的每个产品。编写SQL语句,返回每个订单号(order_num)各有多少行数(order_lines),并 按order_lines对结果进行排序。

    select order_num,count(*) as order_lines
    from orderitems
    group by order_num
    order by order_lines;

     

  2. 编写SQL语句,返回名为cheapest_item的字段,该字段包含每个供应商成本最低的产品(使用Products表中的prod_price), 然后从最低成本到最高成本对结果进行排序。

    select vend_id,min(prod_price) as cheapest_item
    from products
    group by vend_id
    order by cheapest_item;

     

  3. 确定最佳顾客非常重要,请编写SQL语句,返回至少含100项的所有订单的订单号(OrderItems表中的order_num)。

    select order_num,count(*) as orders
    from orderitems
    where quantity >= 100
    group by order_num;

     

  4. 确定最佳顾客的另一种方式是看他们花了多少钱。编写SQL语句,返回总价至少为1000的所有订单的订单号(OrderItems表中的order_num)。提示:需要计算总和(item_price乘以quantity)。按订单号对结果进行排序。

    select order_num
    from orderitems
    where (item_price * quantity) >= 1000
    group by order_num;

     

     

  5. 下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)

    SELECT order_num, COUNT(*) AS items 
    FROM OrderItems
    GROUP BY items
    HAVING COUNT(*) >= 3
    ORDER BY items, order_num;

    group by 子句应当时候表中的字段名,而不是别名,正确:group by order_num;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一个ArkTS项目实践-鸿蒙ArkTS

第一个ArkTS项目实践-ArkTS 第一个ArkTS项目实践-ArkTS自定义组件的组成配置属性与布局配置属性布局 改变组件状态循环渲染列表数据代码ToDoItem组件ToDoList页面 效果参考资料 第一个ArkTS项目实践-ArkTS 本篇文章是官网上视频对ArkTS开发实践的第一个视频,主要是引…

Docker中部署redis

1.部署redis要求 2.部署教程 连接容器中的redis redis部署完毕

项目:基于UDP的TFTP文件传输

1)tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输特点: 是应用层协议 基于UDP协议实现 数据传输模式 octet:二进制模式(常用) mail:已经不再…

22、touchGFX学习Model-View-Presenter设计模式

touchGFX采用MVP架构,如下所示: 本文界面如下所示: 本文将实现两个操作: 1、触摸屏点击开关按键实现打印开关显示信息,模拟开关灯效果 2、板载案按键控制触摸屏LED灯的显示和隐藏 一、触摸屏点击开关按键实现打印开…

Mirror网络库 | 实战

此篇为下文,上篇:Mirror网络库 | 说明 一、官方实例说明 场景名说明AdditiveLevels场景为“关卡”,附加形式加载AdditiveScenes加载卸载附加场景Basic基础的连接/断开,消息发送Benchmark服务器1000“怪物”生成性能测试Benchmark…

Jenkins-CICD-python/Java包升级与回退

Jenkins- CICD流水线 python/Java代码升级与回退 1、执行思路 1.1、代码升级 jenkins上点击 upgrade和 代码版本号 --${tag} jenkins 推送 代码 和 执行脚本 到目标服务器/opt目录下 执行命令 sh run.sh 代码名称 版本号 upgrade 版本号 来自jenkins的 构建参数中的 标签…

自然语言处理: 第八章chatGPT的搭建

理论基础 Transformer 大模型家族可以分成三类, 至于三者的区别可以参考上一章: Encoder-only,Decoder-only, 只需要Pre_trainEncoder-decoder , 可以在一些任务上无需进行fine_tune 必须要在下游任务进行微调比如Bert , Bart 。 T5 这种无需要微调就能完成一些任…

使用Edge和chrom扩展工具(GoFullPage)实现整页面截图或生成PDF文件

插件GoFullPage下载:点击免费下载 如果在浏览网页时,有需要整个页面截图或导出PDF文件的需求,这里分享一个Edge浏览器的扩展插件:GoFullPage。 这个工具可以一键实现页面从上到下滚动并截取。 一、打开“管理扩展”(…

分类过程中的一种短程相互作用

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让A,B中各有3个点,且不重合,统计迭代次数并排序。 其中有10组数据 差值结构 迭代次数 构造平均列A 构造平均列AB…

JavaFx基础学习【四】:UI控件的通用属性

一、介绍 Node,就是节点,在整体结构中,就是黄色那一块,红色也算 个人理解,在实际中,Node可以说是我们的UI页面上的每一个节点了,比如按钮、标签之类的控件,而这些控件,大…

解决电脑声音正常但就是某些游戏没声音问题

电脑声音正常,玩普遍游戏也正常,就有游戏不出声音 详细介绍经过,不喜欢的请直接跳 第三部分。 一、先说下起因现象。 1 大富翁11 没声音。 前段时间无聊怀旧就买了个大富翁11玩玩,近二十年前的老台式机正常无问题。后来想在性能…

网络安全 Day31-运维安全项目-容器架构下

容器架构下 6. Dockerfile6.1 Docker自动化DIY镜像之Dockerfile1) 环境准备2) 书写Dockerfile内容3) 运行Dockerfile生成镜像4) 运行容器5) 小结 6.2 案例14:Dockerfile-RUN指令1) 书写Dockerfile2) 构建镜像3) 启动容器4) 测试结果 6.3 Dockerfile指令 …

CMake教程6:调用lib、dll

之前我们学到了如何编写一个可执行程序和Library,在继续学习之前,需要解释下target,在cmake中我们可以给executable和library设置一个target名字,这样可以方便我们在后续对target进行更加详细的属性设置。 本节我们将学习如何在项…

Python学习笔记_基础篇_数据类型之字符串

一.基本数据类型 整数:int 字符串:str(注:\t等于一个tab键) 布尔值: bool 列表:list 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存在想对应…

jar包的解压缩和压缩后重新运行,报错:xxx.jar中没有主清单属性

同学们可以私信我加入学习群! 正文开始 前言一、手动模拟过程定位问题二、jdk提供的jar包压缩工具总结 前言 我使用插件yauzl把jar包解压缩、修改properties、压缩后,发现新的jar包无法运行,提示:xxx.jar中没有主清单属性 然后通…

安装Linux操作系统CentOS 6详细图文步骤

为满足业务对Linux操作系统部署的要求,本文档主要提供CentOS 6操作系统的最小化安装和基本配置, 安装本系统建议最少1GB内存和2GB磁盘空间。 1、 使用光盘或者挂载ISO镜像,在出现如下图形界面时选择【Install or upgrade an existing system】并按Ent…

互联网发展历程:探究主机连接与网线的重要角色

互联网,这个如今贯穿我们日常生活的巨大网络,已经从最初的萌芽发展成为信息交流、商务、娱乐等多个领域的核心。它的发展历程却是一个漫长而精彩的故事。本文将带您回顾互联网的发展,深入探讨最基础的部分:如何将两台主机连接起来…

【Linux命令详解 | chown命令】 chown命令用于修改文件或目录的所有者,常与chmod一起使用

文章标题 简介一,参数列表二,使用介绍1. 更改文件的所有者2. 递归地更改目录及其内容的所有者3. 使用--from参数改变所有者4. 使用--reference参数参考其他文件或目录的所有者5. 获取帮助信息和版本信息 总结 简介 在Linux系统中,chown命令被…

算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向

注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有; 本文是两年前发的 动态规划答疑篇open in new window 的修订版,根据我的不断学习总结以及读者的评论反馈,我给扩展了更多…

企业数字化转型:无形资产占比测算(2007-2021年)

在本次数据中,参考张永珅老师的做法,利用无形资产占比测算数字化转型程度。 一、数据介绍 数据名称:企业数字化转型:无形资产占比 数据年份:2007-2021年 样本数量:32960条 数据说明:包括数…