06-模型层7—多表操作之单表下的分组查询
准备
1
新建一个员工表emp,包含:id、name、age、salary、dep(部门名)、province(省份)
查询“每个部门的员工人数”
——SQL方法:
select count(id) from emp group by dep
2
models.py文件中的类:
class Emp(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
salary = models.DecimalField(max_digits=8,decimal_places=2)
dep = models.CharField(max_length=32)
province = models.CharField(max_length=32)
单表下的分组查询
单表分组查询的ORM语法:
#注意前面是 values
单表模型.objects.values('group by的字段').annotate(聚合函数('统计字段'))
例1:查询每一个部门的名称以及员工的平均薪水
SQL中
select dep,avg(salary) from emp group by dep
annotate方法
注意values相当于select
###一定要记得引入~~后面就默认引入了!
from django.db.models import Avg,Max,Min,Count
ret = Emp.objects.values('dep').annotate(avg_salary=Avg('salary'))
print(ret)
#<QuerySet[{'dep':'安全部','avg_salary':388.5},{'dep':'合格部','avg_salary': 1111.0}]>
例2:查询每一个省份的名称及员工数
ret = Emp.objects.values('province').annotate(c=Count('id'))
print(ret)
#<QuerySet [{'province': '北京', 'c': 1}, {'province':'上海','c':1},{'province': '大连', 'c': 1}]>
小结:
1、单表下的分组查询语法(注意是values不是filter):
单表模型.objects.values('group by的字段').annotate(聚合函数('统计字段'))
2、在单表分组下,按着主键进行group by 是没有任何意义的!
3、ret = Emp.objects.all() 等价于 select * from emp
4、ret = Emp.objects.values('name') 等价于 select name from emp
5、ret = Emp.objects.values('id').annotate(Avg('salary'))
等价于: ret = Emp.objects.all().annotate(Avg('salary'))
#但是 “在单表分组下,按着主键进行group by 是没有任何意义的!”
#而且,按all()分组也没意义,因为它包含主键。