zoukankan      html  css  js  c++  java
  • 094~097:ORM作业准备和讲解

    ORM作业准备和讲解:

    数据库模型如下:

    class Teacher(models.Model):
        name = models.CharField(max_length=100)
    
        class Meta:
            db_table = 'teacher'
    
    class Student(models.Model):
        name = models.CharField(max_length=100)
        gender = models.SmallIntegerField()
    
        class Meta:
            db_table = 'student'
    
    class Course(models.Model):
        name = models.CharField(max_length=100)
        teacher = models.ForeignKey("Teacher", on_delete=models.SET_NULL, null=True)
    
        class Meta:
            db_table = 'course'
    
    class Score(models.Model):
        student = models.ForeignKey('Student', on_delete=models.CASCADE)
        course = models.ForeignKey("Course", on_delete=models.CASCADE)
        number = models.FloatField()
    
        class Meta:
            db_table = 'score'

    使用之前学到过的操作实现下面的查询操作:

    1、查询平均成绩大于60分的同学的id和平均成绩;

        students = Student.objects.annotate(stu_avg=Avg("score")).filter(stu_avg__gte=60).values("id", "stu_avg")
        for item in students:
            print(item)
        print(students.query)
    SELECT `student`.`id`, AVG(`score`.`id`) AS `stu_avg` FROM `student` LEFT OUTER JOIN `score` ON (`student`.`id` = `score`.`student_id`) GROUP BY `student`.`id` HAVING AVG(`score`.`id`) >= 60 ORDER BY NULL

    2、查询所有同学的id、姓名、选课的数量、总成绩;

        rows = Student.objects.annotate(course_nums=Count("score__course"), total_score=Sum("score__number")).values("id", "name", "course_nums", "total_score")
        for row in rows:
            print(row)
    SELECT `student`.`id`, `student`.`name`, COUNT(`score`.`course_id`) AS `course_nums`, SUM(`score`.`number`) AS `total_score` FROM `student` LEFT OUTER JOIN `score` ON (`student`.`id` = `score`.`student_id`) GROUP BY `student`.`id` ORDER BY NULL

    3、查询姓“李”的老师的个数;

        teacher_nums = Teacher.objects.filter(name__startswith="").count()
        print(teacher_nums)

    4、查询没学过“李老师”课的同学的id、姓名;

        students = Student.objects.exclude(score__course__teacher__name="李老师").values("id", "name")
        for item in students:
            print(item)

    5、查询学过课程id为1和2的所有同学的id、姓名;

        rows = Student.objects.filter(score__course__in=[1, 2]).distinct().values('id', 'name')
        for row in rows:
            print(row)

    6、查询学过“黄老师”所教的“所有课”的同学的id、姓名;

        rows = Student.objects.annotate(nums=Count("score__course", filter=Q(score__course__teacher__name = '黄老师'))).filter(nums=Course.objects.filter(teacher__name='黄老师').count()).values('id', 'name')
        for row in rows:
            print(row)

    7、查询所有课程成绩小于60分的同学的id和姓名;

    8、查询没有学全所有课的同学的id、姓名;
    9、查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
    10、查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分;
    11、查询没门课程的平均成绩,按照平均成绩进行排序;
    12、统计总共有多少女生,多少男生;
    13、将“黄老师”的每一门课程都在原来的基础之上加5分;
    14、查询两门以上不及格的同学的id、姓名、以及不及格课程数;
    15、查询每门课的选课人数;

     

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/zheng-weimin/p/10311800.html
Copyright © 2011-2022 走看看