#一 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多表查询练习题的更多相关文章

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

    -------------------------------------------------自己偷的懒,或许用加倍时间也补不回来,珍惜现在的拥有的时光,把我现在! 上节回顾 基于对象的跨表查询( ...

  2. Django多表查询

    一.前言 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...

  3. Django 多表查询

    多表查询是模型层的重要功能之一, Django提供了一套基于关联字段独特的解决方案. ForeignKey 来自Django官方文档的模型示例: from django.db import model ...

  4. Django --- ORM表查询

    目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...

  5. Django单表查询及其方法

    单表查询 前期准备 首先新建一个test的python文件,然后再manage.py中导入main语句及其下面的复制到新文件中 并导入django 写上django.setup() 就可以导入对应的m ...

  6. django 多表查询并返回结果

    (不喜勿喷,个人记录) 问题,有两张关联的表,表B的api_id关联表A的id 我想在页面上返回两张表查询之后的共同结果? 因为两张表的id是一样的,就先获取到表A的对象,然后拿表A的对象id当做表B ...

  7. HAVING,多表查询思路,可视化软件navicat,多表查询练习题,

    HAVING "where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之 前起作用,且"where"后面不能写&quo ...

  8. MySQL连表查询练习题

    1.建库 库名:linux50 字符集:utf8 校验规则:utf8_general_ci  create database linux4 charset utf8 default collate ...

  9. Django 单表查询

    前言 如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本? 我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码: 前期准备 创建一个电影表 class ...

随机推荐

  1. jsp+ajax+servlet+jquery从后台取json数据示例

    <span style="font-size:18px;"><%@ page language="java" import="jav ...

  2. minicom支持向串口自动发送命令的功能

    1. 用法 minicom -S <script name> -C <log name> 参数解析: -S: 指定要执行的脚本 -C: 指定输出日志文件名 2. 既然可以指定脚 ...

  3. # bzoj2215: [Poi2011]Conspiracy 2-sat

    bzoj2215: [Poi2011]Conspiracy 2-sat 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2215 思路 一个点的 ...

  4. qvalue: Check that you have valid p-values or use a different range of lambda

    ERROR: The estimated pi0 <= 0. Check that you have valid p-values or use a different range of lam ...

  5. An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

    An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling 2018-0 ...

  6. js数组常用方法,含es5

    (1)基本的数组方法 1.join() Array.join()方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串.可以自己指定分隔的符号,如果不指定,默认使用逗号 var arr ...

  7. 3、Python编程之MySQLdb模块(0602)

    解释器环境与选项 python解释器启动 python [options] [ -c cmd | filename | - ] [ args ] python解释器环境变量 python代码的测试.调 ...

  8. windows下远程连接Mysql

    使用“Ctrl + R”组合键快速打开cmd窗口,并输入“cmd”命令,打开cmd窗口. 使用“mysql -uroot -proot”命令可以连接到本地的mysql服务. 使用“use mysql” ...

  9. python测试

    [链接]JointhePythonDeveloperscommunityonSlack! http://pythondevelopers.herokuapp.com/

  10. 极简 R 包建立方法--转载

    https://cosx.org/2013/11/building-r-packages-easily/ 最近想试一下捣腾一个 R 包出来,故参考了一些教程.现在看到的最好的就是谢益辉大大之前写过的开 ...