18.聚合查询和原生数据库语句操作

目录

1 聚合查询

1.1 聚合函数

1.2 整表聚合

1.3 分组聚合

2  原生数据库操作

2.1  仅查询 raw()

2.2  查询,更新与删除 cursor 

2.2.1  查询

2.2.2  更新

2.2.3  删除


1 聚合查询

聚合查询是统计性的查询,比如求某一个字段所有值的平均数,某一个字段的总数这种

聚合查询分整表查询与分组查询。整表查询是对表中所有数据进行查询。分组查询是先根据其他字段进行分组。

比如我现在表中有中国作者和外国作者,我现在想求书的平均价格,如果整表查询就是所有书的价格,如果分组查询就可以将中国作者平均价格与外国作者平均价格分开

我们下面依然使用这个数据表做例子

1.1 聚合函数

输入 from django.db.models import * 导入聚合函数

  • 这里可以写 from django.db.models import Sum,Avg 导入单个或某几个聚合函数

常用聚合函数有 Sum(求和),Avg(平均),Count(计数),Max(最大值),Min(最小值),注意聚合函数的首字母都是大写的

1.2  整表聚合

我们现在求price这一列的平均值

  • 表名称.objects.aggregate(结果变量名=聚合函数('列'))

发现平均值为70,返回值为字典,这里的结果变量名很像sql语句中的as

  • 截的是课程视频中写的代码,所以Count的结果是4,如果在我当前的mysql中写结果就是5

1.3  分组聚合

比如说我现在想求 所有出版社各自的平均price

  • 表名称.objects.values('以谁分组的列').annotate(结果变量名=聚合函数('统计谁的列'))

由于返回值是QuerySet,所以我们还可以接其他QuerySet的方法,比如我求出了每个出版社的平均price,我现在想查询平均price>70的

  • 这里的res是刚刚定义的变量名称

分组聚合对应的sql语句是having

2  原生数据库操作

2.1  仅查询 raw()

可以在django中使用数据库原本的查询语句,比如mysql中的sql语句

  • 模型名.objects.raw('原生语句')

上面的cmd是一个RawQuerySet对象

RawQuerySet对象可以对其进行循环或索引

我们一般不会使用原生数据库查询,因为查询一般是让用户进行查询,如果使用了sql语句,用户可以查询到许多其他的内容,比如

使用原生数据库语句查询容易被sql注入恶意查询,所以一般我们不用这种方式。如果我们确实要使用这种方式,django也有相应的防范方式

我们把要给用户输入的语句内容抠出来,放到第二个参数中,第二个参数是一个列表,可以传无限的参数,用逗号隔开就行

上面的直接拼接用户可以查到表中的所有内容,而使用这种方式用户只能查到一个内容

虽然在RawQuerySet中看起来语句是相同的,但其实有区别,如果用中括号的方式 or作为字符不会生效

2.2  查询,更新与删除 cursor 

是这样用的

2.2.1  查询

我们做个查询的例子

它会返回执行成功的语句数,它是返回不了查询结果的,所以更适合更新与删除

2.2.2  更新

我们下面做一个更新的例子,更新之前是这样的

现在我们把id为3的book_name改成 Flask

2.2.3  删除

下面我们做一个删除的例子,删除id为5的书

这里我们用真删除,假删除的实质还是更新

刷新之后发现id为5的数据没有了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值