Django Mysql數據庫-聚合查詢與分組查詢


一、聚合查詢與分組查詢(很重要!!!)

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM