Django 多表查询练习题 Q查询 F查询 聚合 分组

时间:2023-02-23 15:15:15

-------------------------------------------------自己偷的懒,或许用加倍时间也补不回来,珍惜现在的拥有的时光,把我现在!


 


上节回顾



基于对象的跨表查询(子查询语句) *******

正向查询按字段,反向查询按表名小写

一对多查询
book.publish
Book对象 ------------------------- Publish对象
publish.book_set.all()

多对多查询
book.authors.all()
Book对象 ------------------------- Author对象
author.book_set.all()


一对一查询
author.ad
Author对象 ------------------------- AuthorDetail对象
ad.author


基于双下划綫的跨表查询(join语句) *******

正向查询按字段,反向查询按表名小写
#查询linux书籍的所有作者
models.Book.objects.filter(title="linux").values("authors__name")

#手机号以151开头的作者出版过的所有书籍名称以及出版社名称

Book.objects.filter(authors__ad__tel__startswith="151").values("title","publish__name")



聚合与分组查询


聚合:

# 1 计算所有图书的平均价格
Book.objects.all().aggregate(avg_price=Avg("price"))
{'avg_price': 137.166667}
(0.000) SELECT AVG(`app01_book`.`price`) AS `avg_price` FROM `app01_book`; args=()

# 2 计算所有图书的最高价格,最低价格
Book.objects.all().aggregate(max_price=Max("price"),min_price=Min("price"))
(0.000) SELECT MAX(`app01_book`.`price`) AS `max_price`, MIN(`app01_book`.`price`) AS `min_price` FROM `app01_book`; args=()
{'max_price': Decimal('222.00'), 'min_price': Decimal('111.00')}

分组:



emp:

id name age salary dep
1 alex 12 2000 销售部
2 egon 22 3000 人事部
3 wen 22 5000 人事部

#查询每一个部门名称以及对应的员工数

sql:
select dep,Count(*) from emp group by dep;
select dep,AVG(salary) from emp group by dep;






1、 自行创建测试数据;
2、 查询学生总人数;
3、 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
4、 查询每个年级的班级数,取出班级数最多的前三个年级;
5、 查询平均成绩最高的学生的id和姓名以及平均成绩;
6、 查询每个年级的学生人数;
7、 查询每位学生的学号,姓名,平均成绩;
8、 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
9、 查询姓“李”的老师的个数和所带班级数;
10、查询班级数小于5的年级id和年级名;
11、查询教过课程超过2门的老师的id和姓名;
12、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
13、查询所带班级数最多的老师id和姓名;
14、查询有课程成绩小于60分的同学的学号、姓名;
15、查询男生、女生的人数,按倒序排列;
16、查询各个课程及相应的选修人数;
17、查询同时选修了物理课和生物课的学生id和姓名;
18、检索“3”课程分数小于60,按分数降序排列的同学学号;
19、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
20、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;


接下来学习任务:

Djagno:
1 Ajax
2 cooke session 用户认证组件
3 forms组件
4 中间件,分页


'''