使用聚合函数及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)

原文地址:https://www.cnblogs.com/zhouhai007/p/10279582.html

时间: 2024-11-03 02:19:54

使用聚合函数及F/Q及分组查询的相关文章

sql 学习之 group by 及 聚合函数

1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SELECT列表必须只包括聚合列,否则必须有一个GROUP BY 子句.例如: select customerid,salespersonid,count(*) from sales.salesorderheader where customerid <= 11010 group by customeri

八、分组查询详解(group by &amp; having)

本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区别 分组后排序 where & group by & having & order by & limit 一起协作 mysql分组中的坑 in多列查询的使用 一.分组查询 语法: SELECT column, group_function,... FROM table [WHERE condition] GROUP BY group_by_expressio

在MongoDB中实现聚合函数

在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的解决方案,比如NoSQL数据库,它提供了所需的数据存储和处理能力.扩展性和成本效率.NoSQL数据库不使用SQL作为查询语言.这种数据库有多种不同的类型,比如文档结构存储.键值结构存储.图结构.对象数据库等等. 我们在本文中使用的NoSQL是MongoDB,它是一种开

【SQL】CLR聚合函数什么鬼

之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 CLR聚合函数在SQL中虽然是函数,但在C#中实际上是以一个类或结构的形式存在的(是的,实现聚合函数的实体可以是结构,也可以是类),这点有别于CLR普通函数,后者是类中的一个方法,鉴于此,下文把实现聚合函数的类或结构统称为聚合类,以免读者思维混淆 聚合类必须用特性[SqlUserDefinedAgg

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

orm聚合查询、分组查询、F查询和Q查询

1.聚合查询(Avg,Count,Max,Min,Sum) Avg为求平均数,Count为求个数,Max为求最大值,Min为求最小值,Sum为求和 以Avg举例 from django.db.models import Avg,Count,Max,Min,Sum ret=Book.objects.all().aggregate(Avg('price')) //其中price必须是以有的字段 2.分组查询 ? 要点: ? values在annotate前,表示group by,在annotate后

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

F对象、Q对象、聚合函数

F对象作用:用于类属性之间的比较.使用之前需要先导入:from django.db.models import F例:查询图书阅读量大于评论量图书信息.BookInfo.objects.filter(bread__gt=F('bcomment'))例:查询图书阅读量大于2倍评论量图书信息.BookInfo.objects.filter(bread__gt=F('bcomment')*2) Q对象作用:用于查询时条件之间的逻辑关系.not and or,可以对Q对象进行&|~操作.使用之前需要先导