码迷,mamicode.com
首页 > 数据库 > 详细

Django Mysql数据库-聚合查询与分组查询

时间:2019-03-12 14:05:14      阅读:521      评论:0      收藏:0      [点我收藏+]

标签:for   查询   strong   min   多少   重要   mode   ima   pre   

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

聚合查询: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"))

 

Django Mysql数据库-聚合查询与分组查询

标签:for   查询   strong   min   多少   重要   mode   ima   pre   

原文地址:https://www.cnblogs.com/Paul-watermelon/p/10516146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!