使用聚合函数及F/Q及分组查询

Posted zhouhai007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用聚合函数及F/Q及分组查询相关的知识,希望对你有一定的参考价值。

import os

from django.core.wsgi import get_wsgi_application
if __name__==__main__:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "b20190116.settings")

    application = get_wsgi_application()
    # 聚合查询(一堆聚合函数,使用之前先导入)
    from django.db.models import Count, Max, Min, Avg, Sum

    # 查询所有书的平均价格
    # ret=models.Book.objects.all().aggregate(aa=Avg(price))
    # print(ret)
    #    可以一次使用多个
    #     ret=models.Book.objects.all().aggregate(Avg(price),Max(price),Sum(price))
    #     print(ret.get(price__max))
    #     print(ret[price__max])
    #     print(ret)

    # author = models.Author.objects.filter(pk=1)
    # 现在author是queryset对象(是个容器类型)
    # print(author)
    # # # 拿出一个author对象
    # print(type(author.first()))

    #     查询每个部门下员工数
    # SELECT partment,COUNT(nid) FROM app01_author GROUP BY partment
    #     终极总结:
    ‘‘‘
    group by 谁,就以谁做基表
    values在前:表示group by
    values在后:取值
    filter在前:表示where条件
    filter在后: 表示having
    ‘‘‘
    # 单表
    # ret=models.Author.objects.all().values(partment).annotate(c=Count(pk)).values(partment,c,)
    # print(ret)
    # 统计id小于10的每个部门的人数
    # ret=models.Author.objects.all().filter(nid__lt=3).values(partment).annotate(Count(pk))
    # print(ret)
    # 统计id小于10的并且部门的人数大于1的部门
    # ret = models.Author.objects.all().filter(nid__lt=10).values(partment).annotate(cc=Count(pk)).filter(cc__gt=1).values(partment)
    # print(ret)
    # 练习:统计每一本书作者个数
    ret = models.Book.objects.all().values(pk).annotate(c=Count(authors)).values(name, c)
    print(ret.query)
    print(ret)
    # 默认按基表的id给group by
    # ret=models.Book.objects.all().annotate(c=Count(authors)).values(name,c)
    # print(ret)
    #     统计每一个出版社的最便宜的书的出版社名字和书的价格
    #     分组数数的表中的数据是不能取的
    #     ret=models.Publish.objects.all().values(pk).annotate(c=Count(book__price)).values(name,c)
    #     ret=models.Publish.objects.all().annotate(c=Count(book__price)).values(name,c)
    #     print(ret.query)
    #     print(ret)

    # 练习:统计每一本以py开头的书籍的作者个数:group by 书
    #   ret=models.Book.objects.all().filter(name__startswith=).annotate(sss=Count(authors__name)).values(name,sss)
    #   print(ret)
    #   统计不止一个作者的图书:(作者数量大于一)
    #     ret=models.Book.objects.all().annotate(c=Count(authors)).filter(c__gt=1).values(name,c)
    #     ret=models.Book.objects.all().values(pk).annotate(c=Count(authors)).filter(c__gt=1).values(name,c)
    #     print(ret)

    # 统计每一个出版社出版的书籍个数
    # -不知道以谁做基表
    # 1  红楼梦  12    1   北京出版社   北京
    # 2  水浒传  13    1   北京出版社   北京
    # 1  西游记  14    1   北京出版社   北京
    #
    # 1  三国  167   2   北京出版社    北京

    # 1 北京出版社   1   红楼梦
    # 1 北京出版社   2   水浒传       2
    #                 -出版社名称:北京出版社   书的个数:2  书名:不能取
    #
    # 2 南京出版社   3  三国       1
    #                 -出版社名称:南京出版社   书的个数:1  书名:

    ‘‘‘
    保安部  1    lqz        18    
    保安部  2    egon    17
                -部门:保安部  人数:2  人名:不能取
    财务部  6    小猴       16
                -部门:财务部  人数:1
    ‘‘‘
    #     把红楼梦这本书的评论数+1
    # ret=models.Book.objects.filter(name=红楼梦).update(commit_num+=1)

    # F函数干什么用的?获取出某个字段的值
    from django.db.models import F, Q

    # ret=models.Book.objects.filter(name=红楼梦).update(commit_num=F(commit_num)+6)
    # print(ret)

    # 查询评论数大于阅读数2倍的书籍
    # ret=models.Book.objects.all().filter(commit_num__gt=2*F(reat_num)).values(name)
    # print(ret)
    # Q查询 与 或 非
    # 查询名字为红楼梦或者价格等44的书
    # ret=models.Book.objects.all().filter(name=红楼梦,price=44)
    # 或
    # ret=models.Book.objects.all().filter(Q(name=红楼梦) | Q(price=44)).values(name)
    # 与  就是and
    # ret=models.Book.objects.all().filter(Q(name=红楼梦) & Q(price=44)).values(name)
    # 非    名字不是红楼梦的书
    # ret = models.Book.objects.filter(~Q(name=红楼梦))
    # ret = models.Book.objects.filter(~(Q(name=红楼梦) | Q(price=44)))
    # print(ret)

    # 基于对象的跨表查询
    # book=models.Book.objects.get(pk=1)
    #
    # print(book.publish.name)
    #     基于双下划线
    #     查询书名为红楼梦的出版社名称
    ret = models.Book.objects.all().filter(name=红楼梦).values(publish__name)
    print(ret)

 

以上是关于使用聚合函数及F/Q及分组查询的主要内容,如果未能解决你的问题,请参考以下文章

十MySQL 聚合函数分组查询及过滤分组

十MySQL 聚合函数分组查询及过滤分组

MySQL聚合函数及分组查询

MySQL聚合函数及分组查询

SQL语句汇总——聚合函数分组子查询及组合查询

SQL语句汇总(三)——聚合函数分组子查询及组合查询 - Darly