Django Mysql数据库-聚合查询与分组查询详解编程语言
2023-06-13 09:11:49 时间
一、聚合查询与分组查询(很重要!!!)
聚合查询:aggregate(*args, **kwargs),只对一个组进行聚合
from django.db.models import Avg,Sum,Count,Max,Min # 1、查询所有图书的平均价格 print(models.Book.objects.all().aggregate(Avg("price")))
aggregate()是QuerySet 的一个终止子句(也就是返回的不再是一个QuerySet集合的时候),意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
from django.db.models import Avg,Sum,Count,Max,Min # 1、查询所有图书的平均价格 print(models.Book.objects.all().aggregate(avgprice = Avg("price")))
如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
print(models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))) #打印的结果是: {price__avg: 174.33333333333334, price__max: Decimal(366.00), price__min: Decimal(12.00)}
分组查询 :annotate():为QuerySet中每一个对象都生成一个独立的汇总值。
是对分组完之后的结果进行的聚合
1、统计每一本书的作者个数
# 方式一: print(models.Book.objects.all().annotate(authorNum = Count("authorlist__name")).values("authorNum")) # 方式二: booklist =models.Book.objects.all().annotate(authorNum=Count("authorlist__name")) for book_obj in booklist: print(book_obj.title,book_obj.authorNum)
2、统计每一个出版社最便宜的书
# 2、统计每一个出版社的最便宜的书 # 方式一: print(models.Book.objects.values("publish__name").annotate(nMinPrice=Min(price))) 注意:values内的字段即group by的字段,,也就是分组条件 # 方式二: print(models.Publish.objects.all().annotate(minprice=Min("book__price")).values("name","minprice")) # 方式三 publishlist = models.Publish.objects.annotate(minprice = Min("book__price")) for publish_obj in publishlist: print(publish_obj.name,publish_obj.minprice)
3、统计每一本以py开头的书籍的作者个数:
print(models.Book.objects.filter(title__startswith="py").annotate(authNum = Count("authorlist__name")).values("authNum"))
4、统计不止一个作者的图书:
print(models.Book.objects.annotate(num_authors=Count(authorlist__name)).filter(num_authors__gt=1).values("title","num_authors"))
5、根据一本图书作者数量的多少对查询集QuerySet进行排序:
print(models.Book.objects.all().annotate(authorsNum=Count("authorlist__name")).order_by("authorsNum"))
6、查询各个作者出的书的总价格:
# 方式一 print(models.Author.objects.all().annotate(priceSum = Sum("book__price")).values("name","priceSum")) # 方式二 print(models.Book.objects.values("authorlist__name").annotate(priceSum=Sum("price")).values("authorlist__name","priceSum"))
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18153.html
cgojava相关文章
- 【MySQL数据库中的DATE函数】(mysql转date)
- Mysql自动修复:令人惊喜的数据库服务(mysql自动修复)
- PHP中如何连接MySQL数据库?(php怎么连接mysql数据库)
- 快速构建MySQL数据库:如何导入大批量数据(mysql导入大批量数据)
- MySQL性能测试:试验数据报告(mysql测试数据)
- MySQL指定数据库引擎使用指南(mysql指定引擎)
- MySQL实现多字段同时更新(mysql多字段更新)
- MySQL主从库搭建及应用(mysql主库从库)
- 优化MySQL:为什么要给它加索引?(给mysql加索引)
- MySQL 启动配置文件优化实践(mysql启动文件)
- MySQL数据库实时监控解决方案(mysql数据库监控工具)
- Ubuntu系统下安装MySQL数据库(ubuntu下安装mysql)
- MySQL数据库:如何使用备份命令(备份mysql命令)
- MySQL事务:维护数据的原子性和完整性(mysql的事务是什么)
- 实现MySQL数据复制的集群方案(mysql复制集群)
- MySQL:使用预编译加快数据库查询(mysql的预编译)
- 如何实现MSSQL数据库转换为MySQL数据库,教你一些方法。(mssql转换mysql)
- 深入探讨:如何操作MySQL事务?(操作mysql事务)
- MySQL指令妙用:连接数据库的简单步骤(mysql连接数据库命令)
- MySQL远程查询——极致数据库管理体验(mysql查询远程数据库)
- MySQL:精准恢复误删除的数据(mysql恢复误删数据)
- MySQL中文乱码问题如何解决中文字符变成问号(mysql中中文变成问号)
- MySQL通过CMD登录的自动化操作方法(cmd登陆mysql】)
- 使用Akka连接MySQL稳健而高效的解决方案(akka连接mysql)
- 妙招6天通关MySQL(6天掌握mysql)