【postgresql 基础入门】分组查询 group by 子句的写法,分组条件过滤having子句的写法,多列的分组以及与join联合的多表分组

这篇具有很好参考价值的文章主要介绍了【postgresql 基础入门】分组查询 group by 子句的写法,分组条件过滤having子句的写法,多列的分组以及与join联合的多表分组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分组查询与分组条件过滤

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

一、前言


本文主要分享在postgresql 数据库中对查询结果进行分组group by,以及对分组进行条件过滤having,同时对它们的使用场景进行案例分享。

二、概述


在数据查询中,我们经常对数据进行分类,往往不止一种分类,分类的好处是将大的数据集能划分成更小的数据集,方便我们进行递归的分析,更精确的查找想要的数据。
那么如何进行分组,以及分组中的过滤查找呢?

  • 对结果集进行分组,是在前面介绍的基本查询 select ... from ... where ... 后面再使用 group by 关键字;

  • 在分组上进行按条件筛选过滤就不能使用where子句中的条件了,而是使用having关键字来指定条件;

下面我们来详细介绍。

三、分组group by 介绍


对查询结果数据进行按某个字段或某几个字段进行分组,使用关键字group by ,它的SQL语法如下:

SELECT column1, column2, ..., aggregate_function(column3)
FROM tablename1 group by column1,column2,...;

一般分组是配合聚合函数使用的,常用的聚合函数如sum求合、max/min求最大/小值、avg求平均值。

  • select 子句中要列出来要分组的列,同时可以增加聚合函数,计算分组中某个值;
  • 在group by子句中指定分组的列名,这样结果就会按指定列进行分组,并分别在每个分组中应用聚合函数计算;
  • 当然还可以增加where子句,对结果集进行过滤;而group by 子句是在where子句之后进行,也就是它应用于where过滤之后的结果集;

下面我们来看几个例子吧。

基本分组使用

在这里我们还是使用产品表与订单表,表的定义与数据准备如下:

-- 创建产品表  
CREATE TABLE products (  
    product_id INT PRIMARY KEY,  
    product_name VARCHAR(255) NOT NULL,  
    price DECIMAL(10, 2) NOT NULL,  
    category VARCHAR(255)  
);  
  
-- 创建订单表  
CREATE TABLE orders (  
    order_id INT PRIMARY KEY,  
    product_id INT,  
    quantity INT NOT NULL,  
    region VARCHAR(255) NOT NULL,  
    order_date DATE NOT NULL,  
    FOREIGN KEY (product_id) REFERENCES Products(product_id)  
);

表中也准备了一些数据,查询如下:

postgres=# select * from products ;
 product_id | product_name |  price  | category
------------+--------------+---------+----------
          2 | shirt        |  202.40 | type2
          3 | cake         |   37.80 | type4
          5 | hat          |   88.40 | type2
          6 | milk         |   19.80 | type4
          1 | iphone       | 8999.01 | type5
          7 | keyboard     |   92.01 | type5
          4 | pencil       |    8.20 | type1
(7 rows)

postgres=# select * from orders ;
 order_id | product_id | quantity | region  | order_date
----------+------------+----------+---------+------------
        1 |          1 |        8 | region1 | 2022-04-01
        2 |          1 |      102 | region2 | 2022-06-01
        3 |          2 |       19 | region1 | 2022-05-01
        4 |          3 |        3 | region1 | 2022-04-01
        5 |          4 |       58 | region2 | 2022-06-01
        6 |          5 |        1 | region1 | 2022-05-01
        7 |          6 |      106 | region1 | 2022-04-01
        8 |          6 |       99 | region2 | 2022-06-01
        9 |          4 |       32 | region1 | 2022-05-01
(9 rows)

下面我们执行一条最简单的分组查询

postgres=# select category  from products group by category;
 category
----------
 type1
 type2
 type5
 type4
(4 rows)

按产品类型进行分组,可以看到结果中列出了分组类型,等价于查询产品类型,并且使用distinct进行去重的结果。

分组中使用聚合函数

分组的常见用法,都是配合函合函数来进行统计分析。

postgres=# select min(quantity),max(quantity),avg(quantity), region as b from orders group by b;
 min | max |         avg         |    b
-----+-----+---------------------+---------
   1 | 106 | 28.1666666666666667 | region1
  58 | 102 | 86.3333333333333333 | region2
(2 rows)

统计出各区域的订单中商品数量的最高水平、最低水平、还有平均水平,这里按区域进行分组,然后使用聚合函数进行统计;

在SQL中我们给区域字段region使用别名b,在group by中是可以引用别名。

多表join中使用分组

还可以在多表join时使用分组统计。

postgres=# select category, sum(price*quantity) from products p inner join orders o using(product_id) group by category;
 category |    sum
----------+-----------
 type1    |    738.00
 type2    |   3934.00
 type5    | 989891.10
 type4    |   4172.40
(4 rows)

统计商品大类的销售额,这里需要将products表与orders表进行内联接,才能将价格与销售数量结合起来。

多列的分组

当然也可以按几个列进行依次分组,在现实生活中也常常用到。

postgres=# select region, category, sum(price*quantity) amount from products p inner join orders o using(product_id) group by region,category order by region, amount;
 region  | category |  amount
---------+----------+-----------
 region1 | type1    |    262.40
 region1 | type4    |   2212.20
 region1 | type2    |   3934.00
 region1 | type5    |  71992.08
 region2 | type1    |    475.60
 region2 | type4    |   1960.20
 region2 | type5    | 917899.02
(7 rows)

按区域进行统计每种大类商品的销售额,这是在上个案例基础上再增加区域region列的分组,然后按区域进行排序,再按销售额升序排列。

四、分组条件having介绍


使用where子句对结果集进行条件过滤,那么对于按分组统计的结果可以使用条件进行过滤吗?

答案是肯定的,可以使用having子句对分组的统计结果进行条件过滤。

带有having子句的SQL语法格式如下:

SELECT column1, column2, ..., aggregate_function(column3)
FROM tablename1 group by column1,column2,... HAVING conditions;

group by 后面追加having关键字来指定条件;

这里不要搞混了,wherehaving的作用,虽然它们俩个都是带有条件的,where是对from子句中的原始表数据时行条件筛选,得到结果集,它是先于group by来执行;而having是对group by的分组结果进行条件过滤,是在group by之后执行。

下面我们来看一下如何使用。

postgres=# select min(quantity) as num, region from orders group by region having min(quantity) > 10;
 num | region
-----+---------
  58 | region2
(1 row)

对上面的分组聚合结果再过滤一下,只显示大于销售数量大于10的分组。

注意, having子句中不能使用select子句中的别名,也就是不能用num > 10这样的写法。

五、总结


本文分享了一个很有用的SQL语法,对结果集按类分组group by子句,它一般与聚合函数一起使用,分组之后对各个分组再进行统计分析,当然也可以对分组统计的结果再进行有条件的筛选,这就用到了having 子句,它是一个条件表达式,只是针对分组进行条件过滤。

同时在编写SQL时要注意,有了group by子句后,在select子句中要包括分组的列和对应的聚合函数。

六、结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!文章来源地址https://www.toymoban.com/news/detail-847800.html

到了这里,关于【postgresql 基础入门】分组查询 group by 子句的写法,分组条件过滤having子句的写法,多列的分组以及与join联合的多表分组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PostgreSQL数据库以任意时间间隔聚合查询group by

    我们做的是智慧交通信控平台,需要将实时采集到的交通大数据(信号机灯态、卡口过车、雷达数据等)全部入库,按照时间顺序存储 然后根据原始数据,再计算出一些交通评价指标,存储到数据库,供后续聚合查询和分析统计 前端设备(信号机、雷达、卡口等)上报原始

    2024年02月02日
    浏览(59)
  • SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选

    HAVING 子句被添加到SQL中,因为 WHERE 不能与聚合函数一起使用。 HAVING语法 以下是Northwind示例数据库中“Customers”表的一部分选择: CustomerID CustomerName ContactName Address City PostalCode Country 1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany 2 Ana Trujillo Emparedados y helados Ana

    2024年02月05日
    浏览(65)
  • group by聚合分组后如何获取分组数据

    之前用group by分组后一直困惑怎么把分组后的数据拿到,因为分组后同一组的只有一条数据,最后发现了 group_concat函数。记录一下,以后能用。 语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator \\\'分隔符\\\'] ) 说明:通过使用 distinct 可以排除重复值(去重

    2024年02月05日
    浏览(44)
  • elasticsearch的group by分组和sum求和

    最近在使用es查询某个字段在特定查询条件下的某个字段的求和时,忘记了query语句是怎么写的,简单记录一下,方便自己和他人查阅。 一 什么是elasticsearch? elasticsearch是一个分布式的使用 REST 接口的搜索引擎,简称为ES,它是面向文档的,可以存储整个对象或文档。 二:

    2024年02月12日
    浏览(40)
  • ES聚合分页(group by分组后分页)

    案例:统计业务应用流量数据

    2024年02月11日
    浏览(54)
  • Sql group by 分组取时间最新的一条数据

    1.取时间最新的记录 不分组有重复(多条CreateTime一样的都是最新记录) 2.分组后取时间最新的记录 3.如果Id是uuid类型无法使用max(id)的解决办法(使用开窗函数)

    2024年02月11日
    浏览(54)
  • MySQL修炼手册4:分组与聚合:GROUP BY与HAVING的应用

    MySQL数据库的强大功能为我们提供了丰富的数据处理工具,其中GROUP BY与HAVING的应用使得数据的分组与聚合变得更加灵活和高效。在本篇博客中,我们将深入研究GROUP BY与HAVING的基础知识,并通过实际案例,展示它们在数据分析中的强大威力。 首先,为了更好地演示GROUP BY与

    2024年02月01日
    浏览(93)
  • mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

    1、项目记录表project_record的结构和数据如下: 以下为项目记录表 project_record 的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录) 2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。

    2023年04月08日
    浏览(42)
  • Django基础入门⑫:Django 对象查询详解,分组聚合

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 F对象查询与

    2024年02月12日
    浏览(57)
  • MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段

    在编写MySQL数据库查询语句时,经常遇到使用GROUP BY分组后,需要获取每组中时间记录最新的行对应的其他字段这一情况。例如下表(t_score): id student course score examdate 1 小张 语文 89.0 2023-06-29 2 小张 数学 90.0 2023-06-29 3 小张 语文 91.0 2024-01-10 4 小张 数学 93.0 2024-01-10 5 小李 语

    2024年01月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包