django基础之day04,聚合查询和分组查询


聚合查询:
        聚合函数必须用在分组之后,没有分组其实默认整体就是一组
        Max Min Sum Avg Count

        1.分组的关键字是:aggretate
        2.导入模块
            from django.db.models import Max Min Sum Avg Count
            温馨提示:只要跟数据库相关的功能,基本上都在django.db.models里面
            如果不在,可能直接在django.db里面

    1.筛选出价格最高的书籍
        #聚合函数
    from django.db.models import Max,Min,Sum,Count,Avg
    #注意事项,聚合函数Max,Min,Sum,Count,Avg的首字母要大写,不然会报错


    #1.筛选出价格最高的书籍
    # res=models.Books.objects.aggregate(mr=Max('price'))
    # print(res)
    #结果:{'mr': Decimal('888.00')}


    #2.求书籍总价格
    # res=models.Books.objects.aggregate(sm=Sum('price'))
    # print(res)
    #结果:{'sm': Decimal('2442.00')}


    # 3.求书籍的平均价格
    # res=models.Books.objects.aggregate(av=Avg('price'))
    # print(res)
    #结果:{'av': 610.5}


    #4.一起使用
    # res=models.Books.objects.aggregate(Max('price'),Sum('price'),Count('price'),Avg('price'))
    # print(res)
    #结果:{'price__max': Decimal('888.00'), 'price__sum': Decimal('2442.00'), 'price__count': 4, 'price__avg': 610.5}




 分组查询:

        什么时候需要分组
            1.统计每一个部门的平均薪资
            2.统计每一个部门的男女比例

        1.关键字:annotate
        2.导入模块
              from django.db.models import Max Min Sum Avg Count

        django中models后面点什么,就按照什么分组




    #1.统计每一本书的作者个数,书名,和对应的作者人数
    # res=models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
    # print(res)
    #结果:<QuerySet [{'title': '三国演义', 'author_num': 0}, {'title': '红楼梦', 'author_num': 2}, {'title': '水浒传', 'author_num': 0}, {'title': '西游记', 'author_num': 2}]>


    #2.统计每个出版社卖的最便宜的书的价格,出版社的名字,出版的最便宜的书
    # res=models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
    # print(res)
    #结果:<QuerySet [{'name': '东方出版社', 'min_price': Decimal('222.33')}, {'name': '北方出版社', 'min_price': Decimal('333.00')}]>




    #3.统计不止一个作者的图书
    #分析步骤:
        #1.先拿书和对应的作者数
        #2.再筛选出作者数量大于1的图书,书名和作者数目
    # res=models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
    # print(res)
    #结果:<QuerySet [{'title': '红楼梦', 'author_num': 2}, {'title': '西游记', 'author_num': 2}]>



    #4.查询各个作者出的书的总价格,作者名字,总价格
    # res=models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
    # print(res)
    #结果:<QuerySet [{'name': 'jason', 'sum_price': Decimal('777.33')}, {'name': 'oscar', 'sum_price': Decimal('444.33')}, {'name': 'egon', 'sum_price': Decimal('333.00')}, {'name': 'dundun', 'sum_price': None}]>




猜你喜欢

转载自www.cnblogs.com/ludundun/p/11965807.html