首页 > 其他分享 > 聚合查询 分组查询 F与Q查询 添加新字段

聚合查询 分组查询 F与Q查询 添加新字段

时间:2022-12-18 17:37:18浏览次数:43  
标签:聚合 函数 查询 作者 分组 新字

目录

聚合查询

聚合函数:Max Min Sum Count Avg
在ORM中支持单独使用聚合函数  aggregate 

from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(Max('price'), Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))
print(res)

聚合函数的概念我们之前在mysql数据库中有所接触。
在mysql中是先使用group by分组,再使用聚合函数处理。聚合函数专门用于分组之后的数据统计。或者说当不进行分组时,会默认将当前表自己分为一组。
而在ORM中,聚合函数支持单独使用(把当前表作为一组),通过aggregate方法即可实现。
与聚合函数相关的功能,通常在django.dbdjango.db.model两个模块中。

aggregate 聚合函数

书籍表展示:
image
需求:求书里面价格最大的。
image

起别名

起别名:可以使用中文,但是不建议。
注意这里使用了等号,实际上是传入了关键字实参。这里关键字实参需要放在位置实参的后面,不然会报错。
image

分组查询

annotate 注释函数

需求:统计每一本书的作者个数。
所以应该按书分组,再对每个组的作者进行统计。
这里的意思是annotate前面是哪个表就按哪个分组:
image
比如上面这个例子,就是按照书分组,有8本书,就会分为8组。我们想统计每个书有几个作者。书到作者,外键(authors)在书,是一个正向查询。正向查询按类中外键字段。我们通过authors跳转到作者表,再加上一个固定的双下划线。这里每一个组都去作者表,查找有几个作者。最后使用Count函数对作者数进行统计。
但是如上操作,只能得到书籍对象,我们的查询结果也在书籍对象中:
image

起别名

这时候又需要取别名,然后我们使用自己取的别名,就可以拿到数据了:
image

分组查询报错

执行orm分组查询是有可能报错的 并且有关键字sql_mode_strict_model
如下示例:
image
此时把only_full_group_by配置给取消就行了。
image
这里的session是当前会话有效,就是这个mysql账号退出登录后就无效了。想要长期生效可以修改配置文件。

分组查询练习

需求:统计出每个出版社的最便宜的书的价格。
思路:按照出版社分组,对书的价格使用聚合函数。
由于从出版社查书是反向查询,反向查询按照表名小写。
image

需求:统计不只一个作者的图书。
思路:先统计每一本书的作者个数(按照书分组),再筛选(filter)出作者个数大于1的数据。
image
这里筛选的时候使用了双下划线查询。

需求:查询每个作者出的书的总价格
思路:先按照作者分组,在组内求书的总价格,再将这个总价格的数据存放在书籍对象,最后通过values获取总价格。
image

总结

首先按照表中的某个字段分组:

 """
    models.表名.objects.annotate()                            按照表分组
    models.表名.objects.values('字段名').annotate()            按照values括号内指定的字段分组
    """

添加新字段

当数据库中表已经生成,且里面已经存有数据时,如果我们想添加新的字段,此时该怎么做?
直接在模型层的类中新增字段:
image
这样你迁移数据库的时候,django会提示你:
1.你需要给新字段提供默认值
2.现在回去改模型层
这是为什么呢?
image
因为你添加新字段了,django不知道如何处理这些新生成的空格。
两种解决方法:
image
第一种是设置默认值,第二种是允许该空格为NULL,也就是允许为空。

F与Q查询

首先这两种查询都是对查询的再细化。
F查询是对双下划线查询的不足之处进行补充。
Q循环是对filter查询的不足之处进行补充。

F查询

需求1:查询库存数大于卖出数的书籍
这时候我们或许会想到这样写:
image
但是不行,双下划线gt 后面只支持数字。
当查询条件不是明确的,也需要从数据库中获取时 就需要使用F查询。
image

需求2:将所有书的价格涨800块
这样不行:
image
update方法是直接覆盖,而不是在原有的基础上涨价。
image
所以这里也要用F查询:
image

字符串拼接 concat方法

需求3:将所有书的名称后面追加爆款二字
image
也是需要用F查询获取每本书原有的名字,在这个基础进行字符串的拼接,最后使用update更新数据库。
但是很可惜,orm中数字相加可以用加号,而字符串拼接是要用特定的方法的:
image

Q查询

还记得我们之前学过的filter方法吗?里面的查询条件,默认情况下都是and的关系。
如:
image
这里的意思是查询主键为1且价格大于2000的书籍。
而我们的需求:查询主键是1或者价格大于2000的数据
也就是想要查询条件变成or的关系:
image
必须要用Q查询:

Q查询之and关系

image
将查询条件用Q函数包起来,注意这个逗号隔开。逗号隔开表示这两个查询条件是and关系。

Q查询之or关系

想要使用or关系就用|将两个条件隔开。
image

Q查询之取反

Q查询还支持取反操作,使用~符号:
image
这里表示:查询主键不是1 或者 价格大于2000的书。

标签:聚合,函数,查询,作者,分组,新字
From: https://www.cnblogs.com/passion2021/p/16990335.html

相关文章

  • 聚合查询、分组查询、F与Q查询
    聚合查询aggregate(*args,**kwargs)1.基本介绍介绍:聚合查询通常情况下都是配合分组一起使用的.如果你只想使用聚合函数,但是不想分组,那么就应该使用aggregate.使......
  • DQL查询数据
    DQL查询数据!1.DQL(DataQueryLanguage数据查询语言)SELECT数据库中最核心的语言,最重要的语句狂神MySQL中p16school.sql文件(数据为部分数据)/*SQLyogUlti......
  • Mysql 中的升序、降序以及随机查询
    1.升序selecttime,Afromtable1orderbytimeasclimit10;+---------------------+---------+|time               |A      |+------......
  • EF Core无法翻译groupby等子查询
    烦人的表达式转化错误varquery1=emps.Grouby(v=>v.DeptId).Select(g=>new{DeptId=g.Key,Salary=g.Max(x=>x.Salary);varresult=fromdindeptsjoi......
  • Oracle-查询表大小
    --查找特定表大小setlinesize200;colownerfora18;colsegment_namefora28;selectowner,segment_name,sum(bytes/1024/1024)segment_sizefromdba_segments......
  • 聚合查询 分组查询 F与Q查询
    今日内容概要聚合查询常见的聚合函数函数关键字函数作用Max最大值Min最小值Sum求和Count统计Avg平均值用法#用之前需要导入fromdja......
  • python之路51 聚合查询 分组查询
    图书管理系统1.表设计先考虑普通字段再考虑外键字段数据库迁移、测试数据录入2.首页展示3.书籍展示4.书籍添加5.书籍编辑后端如何获取用户想要编辑的......
  • 图书管理系统、聚合查询、分组查询、F与Q查询
    图书管理系统讲解聚合查询分组查询F与Q查询图书管理系统讲解1.表设计 先考虑普通字段再考虑外键字段 数据库迁移、测试数据录入2.首页展示3.书籍展示4......
  • FAQ:说一说一条查询语句是如何执行的?
    一条SQL语句内部执行流程是怎样的?1select*fromuserwhereid=1;1.客户端发送SQL语句到服务器,先要通过连接器连接到数据库,在完成TCP握手之后,验证用户名和密码。......
  • 复赛和排名(分组排名)
     问题1:按不同科目进行排名函数公式解决:=SUM(1*IF(B$2:B$25=B2,C$2:C$25>=C2))此公式不受BC两列顺序的影响问题2:排名前30%的可以参加复赛函数公式解决:=IF(SUM(......