Django Mysql数据库

一、聚合查询与分组查询(很重要!!!)

****聚合查询:aggregate(*args, **kwargs),只对一个组进行聚合

1from django.db.models import Avg,Sum,Count,Max,Min 2# 1、查询所有图书的平均价格 3print(models.Book.objects.all().aggregate(Avg("price")))

aggregate()是QuerySet 的一个终止子句(也就是返回的不再是一个QuerySet集合的时候),意思是说,**它返回一个包含一些键值对的字典。****键的名称是聚合值的标识符,****值是计算出来的聚合值。**键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

1from django.db.models import Avg,Sum,Count,Max,Min 2# 1、查询所有图书的平均价格 3print(models.Book.objects.all().aggregate(avgprice = Avg("price")))

如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

1print(models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))) 2#打印的结果是: {'price__avg': 174.33333333333334, 'price__max': Decimal('366.00'), 'price__min': Decimal('12.00')}

分组查询 :annotate():为QuerySet中每一个对象都生成一个独立的汇总值。

是对分组完之后的结果进行的聚合

1、统计每一本书的作者个数

1# 方式一: 2 print(models.Book.objects.all().annotate(authorNum = Count("authorlist__name")).values("authorNum")) 3 # 方式二: 4 booklist =models.Book.objects.all().annotate(authorNum=Count("authorlist__name")) 5 for book_obj in booklist: 6 print(book_obj.title,book_obj.authorNum)

2、统计每一个出版社最便宜的书

1# 2、统计每一个出版社的最便宜的书 2 # 方式一: 3 print(models.Book.objects.values("publish__name").annotate(nMinPrice=Min('price'))) 注意:values内的字段即group by的字段,,也就是分组条件 4 # 方式二: 5 print(models.Publish.objects.all().annotate(minprice=Min("book__price")).values("name","minprice")) 6 # 方式三 7 publishlist = models.Publish.objects.annotate(minprice = Min("book__price")) 8 for publish_obj in publishlist: 9 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、查询各个作者出的书的总价格:

1# 方式一 2 print(models.Author.objects.all().annotate(priceSum = Sum("book__price")).values("name","priceSum")) 3 # 方式二 4 print(models.Book.objects.values("authorlist__name").annotate(priceSum=Sum("price")).values("authorlist__name","priceSum"))
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移