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

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

聚合查詢:aggregate(*args, **kwargs),只對一個組進行聚合函數

from django.db.models import Avg,Sum,Count,Max,Min # 一、查詢全部圖書的平均價格
print(models.Book.objects.all().aggregate(Avg("price")))

aggregate()QuerySet 的一個終止子句(也就是返回的再也不是一個QuerySet集合的時候),意思是說,它返回一個包含一些鍵值對的字典。鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數的名稱自動生成出來的。若是你想要爲聚合值指定一個名稱,能夠向聚合子句提供它。spa

from django.db.models import Avg,Sum,Count,Max,Min # 一、查詢全部圖書的平均價格
print(models.Book.objects.all().aggregate(avgprice = Avg("price")))

若是你但願生成不止一個聚合,你能夠向aggregate()子句中添加另外一個參數。因此,若是你也想知道全部圖書價格的最大值和最小值,能夠這樣查詢:code

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中每個對象都生成一個獨立的彙總值。對象

                                      是對分組完以後的結果進行的聚合blog

一、統計每一本書的做者個數排序

 

# 方式一:
    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)

 

二、統計每個出版社最便宜的書ci

# 二、統計每個出版社的最便宜的書
    # 方式一:
    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)


三、統計每一本以py開頭的書籍的做者個數:it

print(models.Book.objects.filter(title__startswith="py").annotate(authNum = Count("authorlist__name")).values("authNum"))

 

四、統計不止一個做者的圖書:class

print(models.Book.objects.annotate(num_authors=Count('authorlist__name')).filter(num_authors__gt=1).values("title","num_authors"))

 

五、根據一本圖書做者數量的多少對查詢集QuerySet進行排序:

print(models.Book.objects.all().annotate(authorsNum=Count("authorlist__name")).order_by("authorsNum"))

 

六、查詢各個做者出的書的總價格:

# 方式一
    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"))
相關文章
相關標籤/搜索