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()分组也没意义,因为它包含主键。
posted on 2019-05-19 10:51  江湖乄夜雨  阅读(143)  评论(0编辑  收藏  举报