Django多表查询练习题
#一 model表:
from django.db import models # Create your models here. class Teacher(models.Model):
tid=models.AutoField(primary_key=True)
tname=models.CharField(max_length=32)
classes=models.ManyToManyField("Klass")
def __str__(self):
return self.tname class Meta:
db_table ="teacher" class Grade(models.Model):
gid=models.AutoField(primary_key=True)
gname=models.CharField(max_length=32) def __str__(self):
return self.gname
class Meta:
db_table ="grade" class Klass(models.Model):
kid=models.AutoField(primary_key=True)
kname=models.CharField(max_length=32)
grade=models.ForeignKey("Grade",on_delete=models.CASCADE)
def __str__(self):
return self.kname
class Meta:
db_table ="klass" class Student(models.Model):
sid=models.AutoField(primary_key=True)
sname=models.CharField(max_length=32)
gender=models.IntegerField(choices=((0,"男"),(1,"女")))
cls=models.ForeignKey("Klass",on_delete=models.CASCADE)
def __str__(self):
return self.sname
class Meta:
db_table ="student" class Course(models.Model):
cid=models.AutoField(primary_key=True)
cname=models.CharField(max_length=32)
teacher=models.ForeignKey("Teacher",on_delete=models.CASCADE)
def __str__(self):
return self.cname class Meta:
db_table = "course" class Score(models.Model):
sid=models.AutoField(primary_key=True)
student=models.ForeignKey("Student",on_delete=models.CASCADE)
course=models.ForeignKey("Course",on_delete=models.CASCADE)
score=models.IntegerField() def __str__(self):
return str(self.student)+str(self.course)+str(self.score)
class Meta:
db_table ="score" # class Meta:
# unique_together = (("student","course"),)
二.ER图
三.查询练习题
from django.shortcuts import render,HttpResponse # Create your views here.
from django.db.models import Count,Avg,Min,Max,F,Q
from .models import *
def query(request):
'''
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,最高分,最低分; '''
#2、 查询学生总人数;
# select count(*) from student
res = Student.objects.all().aggregate(c=Count("sid"))
print("res",res) # res {'c': 3} # #3、 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;(course表,score表,student表)
# queryset = Student.objects.filter(score__course__cname="生物").filter(score__score__gt=60).values("sid","sname","score__score").distinct()
# queryset2 = Student.objects.filter(score__course__cname="物理").filter(score__score__gt=60).values("sid","sname","score__score").distinct()
queryset3=Score.objects.filter(score__gt=60).filter(course__cname="生物").values('student__sname','student__sid',"score","course__cname")
queryset4=Score.objects.filter(score__gt=60).filter(course__cname="物理").values('student__sname','student__sid',"score","course__cname")
# lst1 = [{'student__sname': '乔丹', 'student__sid': 1, 'score': 67, 'course__cname': '生物'}]
# lst2 = [{'student__sname': '乔丹', 'student__sid': 1, 'score': 77, 'course__cname': '物理'},
# {'student__sname': '艾弗森', 'student__sid': 2, 'score': 88, 'course__cname': '物理'}] li1 = []
for dic in queryset3:
li1.append({dic["student__sname"]: dic["student__sid"]}) li2 = []
for dic2 in queryset4:
li2.append({dic["student__sname"]: dic["student__sid"]}) li3 = [] for name in li1:
if name in li2:
li3.append(name)
print(li3) queryset5 = Score.objects.filter(score__gte=60,course__cname__in=["生物","物理"]).values('student__sname','student__sid',"score","course__cname") #老师的,不对 # print("queryset",queryset)
# print("queryset2",queryset2)
# print("queryset3",queryset3)
# print("queryset4",queryset4)
print("queryset5",queryset5)
print() #4、 查询每个年级的班级数,取出班级数最多的前三个年级;
q1 =Grade.objects.all().annotate(c=Count("klass")).values("gname","c").order_by('-c')[0:3]
print("q1",q1) #5、 查询平均成绩最高的学生的id和姓名以及平均成绩;
q5 =Student.objects.annotate(avg_score=Avg("score__score")).values('sname','avg_score').order_by("-avg_score")[0]
print("q5",q5)
#6、 查询每个年级的学生人数;
q6= Grade.objects.annotate(c=Count("klass__student")).values("gname","c")
print(q6) #7、 查询每位学生的学号,姓名,平均成绩;
# q7 =Student.objects.annotate(avg_score=Avg("score__socre")).values("sid","sname","avg_score") #错误的写法
q7 =Student.objects.values("sid", "sname").annotate(avg_score=Avg("score__score"))
print("q7",q7) #8、 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
# q8 =Student.objects.filter(sid=2).first().score_set.all().order_by("-score")[0] # 自己的思路?
q8 = Student.objects.filter(sid=2).order_by("-score__score").values("sname","score__score","score__course__cname")[0] print("q8",q8)
#9查询每一个姓“李”的老师所带班级数
q9=Teacher.objects.filter(tname__startswith="李").annotate(c=Count("classes")).values("tname","c")
print(q9)
#10、查询班级数小于5的年级id和年级名;
q10=Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("gid","gname")
print(q10) #11、查询教过课程超过2门的老师的id和姓名;
q11=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("tname","tid","c")
print("q11",q11) #12、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
# q12=Student.objects.filter( Q(score__course__cid=1)&Q(score__course__cid=2)).values("sid","sname") # 自己想的,?
ret = Student.objects.filter(score__course__cid=1).filter(score__course__cid=2).values("pk", "sname")
# print("q12",q12)
print(ret) #13、查询所带班级数最多的老师id和姓名;
q13=Teacher.objects.annotate(c=Count("classes")).order_by('-c').values("tname","tid","c")[0]
print(q13) # 14 查询有课程成绩小于60分的同学的学号、姓名;
q14 =Student.objects.filter(score__score__lt=60).values("sid","sname","score__score").distinct()
print(q14) #15、查询男生、女生的人数,按倒序排列; ?
# q15_1 = Student.objects.filter(gender=0).count()
# q15_2=Student.objects.filter(gender=1).count()
# print("男",q15_1)
# print("女",q15_2)
q15 = Student.objects.values("gender").annotate(c=Count(1)).order_by("-c") #???
print(q15) #16、查询各个课程及相应的选修人数;
q16 = Course.objects.annotate(c=Count("score__student__id")).values("cname","c") #可以
ret = Score.objects.values("course").annotate(c=Count(1)).values("course__cname", "c") # ???
print("ret",ret)
print("q16",q16) #17、查询同时选修了物理课和生物课的学生id和姓名;
q17=Student.objects.filter(score__course__cname="物理").filter(score__course__cname="生物").values("sid","sname")
print("q17",q17)
ret = Student.objects.filter(score__course__cname__in=["物理", "生物"]).values("pk", "sname").distinct()#??? in 不是同时满足吧
print("ret",ret)
#18、检索“3”课程分数小于60,按分数降序排列的同学学号;
q18=Course.objects.filter(cid=3).filter(score__score__lt=60).order_by("-score__score").values("score__student_id","score__student__sname")
ret=Score.objects.filter(course_id=3, score__lt=60).order_by("-score").values("student_id")
print("q18",q18)
print(ret) #19、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
q19=Course.objects.annotate(avg_score=Avg("score__score")).order_by("avg_score").order_by("-cid").values("cname","avg_score")#错误,不能分开排序
q19=Course.objects.annotate(avg_score=Avg("score__score")).order_by("avg_score","-cid").values("cname","avg_score")# 正确
print("q19",q19)
ret = Score.objects.values("course").annotate(avg_score=Avg("score")).order_by("avg_score", "-course")# 正确
print(ret) #20、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
q20=Course.objects.annotate(M_score=Max("score__score"),m_score=Min("score__score")).values("cid","M_score","m_score")
print(q20) return HttpResponse("OK")
Django多表查询练习题的更多相关文章
- Django 多表查询练习题 Q查询 F查询 聚合 分组
-------------------------------------------------自己偷的懒,或许用加倍时间也补不回来,珍惜现在的拥有的时光,把我现在! 上节回顾 基于对象的跨表查询( ...
- Django多表查询
一.前言 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...
- Django 多表查询
多表查询是模型层的重要功能之一, Django提供了一套基于关联字段独特的解决方案. ForeignKey 来自Django官方文档的模型示例: from django.db import model ...
- Django --- ORM表查询
目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...
- Django单表查询及其方法
单表查询 前期准备 首先新建一个test的python文件,然后再manage.py中导入main语句及其下面的复制到新文件中 并导入django 写上django.setup() 就可以导入对应的m ...
- django 多表查询并返回结果
(不喜勿喷,个人记录) 问题,有两张关联的表,表B的api_id关联表A的id 我想在页面上返回两张表查询之后的共同结果? 因为两张表的id是一样的,就先获取到表A的对象,然后拿表A的对象id当做表B ...
- HAVING,多表查询思路,可视化软件navicat,多表查询练习题,
HAVING "where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之 前起作用,且"where"后面不能写&quo ...
- MySQL连表查询练习题
1.建库 库名:linux50 字符集:utf8 校验规则:utf8_general_ci  create database linux4 charset utf8 default collate ...
- Django 单表查询
前言 如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本? 我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码: 前期准备 创建一个电影表 class ...
随机推荐
- CSS的进一步深入(更新中···)
在之前我们学了6种选择器和三种CSS样式的引入,学习选择器就是为了更好的选择文本,学习CSS的引入是为了使文本增加各种样式和属性, 下面我们简单来学习一下为文本加样式和一些属性和属性值: 1.文本的样 ...
- Android 系统(64)---Android中m、mm、mmm、mma、mmma的区别【转】
本文转载自:https://blog.csdn.net/zhangbijun1230/article/details/80196379 Android中m.mm.mmm.mma.mmma的区别 m ...
- GCD与莫比乌斯反演的勾当
目录 机房最后一个学懵逼钨丝的人 题目一 题目 bzoj1101 机房最后一个学懵逼钨丝的人 题目一 链接 题目没找到 求\(\sum_{1}^{n}\sum_{1}^{m}gcd(i,j)\) 式子 ...
- SCU 4439 Vertex Cover(二分图最小覆盖点)题解
题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...
- CF983B XOR-pyramid
设\(xorx[l][r]\)表示题目中\(f(l,r)\)的值,则可以得出 \[ xorx[i][j]=xorx[i][j-1] \oplus xorx[i+1][j] \] 设\(maxx[l][ ...
- 光学定位点(mark点)
Mark点是使用机器焊接时用于定位的点. 表贴元件的pcb更需要设置Mark点,因为在大批量生产时,贴片机都是操作人员手动或者机器自动寻找Mark点进行校准.极少数不设置Mark点也可以,操作非常 ...
- Async、Await
Async.Await:net4.x新增的异步编程方式: 目的:为了简化异步程序编写 Async方式, 使用Async标记Async1为异步方法, 用Await标记GetRequestStreamAs ...
- hadoop的Linux操作
初学hadoop之linux系统操作的hdfs的常用命令 Hadoop之HDFS文件操作 Hadoop fs命令详解 官网doc sudo su - hdfs:免密,以hdfs账户登陆.可操作hdfs ...
- AngularJS 笔记1
2017-03-23 本文更新链接: http://www.cnblogs.com/daysme/p/6606805.html 什么是 angularjs 2009年有两个外国人创建,后由谷歌收购并开 ...
- 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)
https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. #include<iost ...