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、查询每门课的选课人数;

     

  • 相关阅读:
    c#基于业务对象的筛选
    SQLServer索引调优实践
    C#中抽象类和接口的区别
    c#基础(2) 理解委托和事件
    建议学习jQuery的步骤!
    SQL SERVER存储过程调用存储过程并接收输出参数或返回值的方法
    ASP.NET基于JQUERY的高性能的TreeView
    GetManifestResourceStream得到的Stream是null的解决
    Using GDI+ on Windows Mobile 初体验
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
  • 原文地址:https://www.cnblogs.com/zheng-weimin/p/10311800.html
Copyright © 2011-2022 走看看