目录
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的
分组聚合对应的sql语句是having
2??原生数据库操作
2.1??仅查询 raw()
可以在django中使用数据库原本的查询语句,比如mysql中的sql语句
上面的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的数据没有了
|