mysql数据库之联表查询

原文链接:mysql数据库之联表查询 - 希希大队长 - 博客园

表准备:

这次我们用到5张表:

class表:

student表:

 

score表: 

course表: 

teacher表: 

表结构模型:

 

我们针对以下需求分析联表查询:

1、查询所有的课程的名称以及对应的任课老师姓名
2、查询平均成绩大于八十分的同学的姓名和平均成绩
3、 查询没有报李平老师课的学生姓名
4、 查询选修物理课程和体育课程其中一门的学生姓名
5、 查询挂科超过两门(包括两门)的学生姓名和班级

6、找出同时选了李平老师所有课的学生班级和姓名

1、查询所有的课程的名称以及对应的任课老师姓名

分析需求:我们需要用到course和teacher表:既需要得到课程名称又要拿到老师姓名,然后看表结构模型,我们可以知道course有外键字段teacher_id指向teacher表id,那么我们就可以用内连接inner join将两张表拼接起来然后取其字段course.cname和teacher.tname即可得到我们想要的数据,SQL语句如下:

 

SELECT
    cname,
    tname 
FROM
    teacher
    INNER JOIN course ON course.teacher_id = teacher.tid;

2、查询平均成绩大于八十分的同学的姓名和平均成绩

需求分析:我们需要用到score表和shtudent表,既要拿到学生姓名又要拿到成绩,我们理所当然需要将这两个表联表或者做子连接,然后需求中需要用到平均数,那么我们应想到用聚合函数avg(),但使用聚合函数的前提是分组(不人为分组时默认整个表就是一个组) group by,下面我们来写sql语句:

首先在联表或子连接前可以通过score表分组得到student_id和平均成绩:

 

select student_id,avg(num) as avg_score from score group by student_id having avg(num) >80;

然后在以上虚拟表的基础上通过student_id拼接student表,取student.sname和avg_score即可

 

SELECT
    student.sname,
    k.avg_score 
FROM
    student
    INNER JOIN ( SELECT student_id, avg( num ) AS avg_score FROM score GROUP BY student_id HAVING avg( num ) > 80 ) AS k ON k.student_id = student.sid;

3、 查询没有报李平老师课的学生姓名

需求分析:我们根据表结构得知我们需要用到student,score,course,teacher这4张表,直接得到没有报李平老师课程的学生比较困难,那么我们就反过来想,哪些是报了李平老师课程的,然后在学生表里剔除掉即可:

首先我们可以先得到李平老师教了哪几门课,用course和teacher联表:

select course.cid,course.cname from course inner join teacher on course.teacher_id = teacher.tid where teacher.tname = "李平老师";

根据表结构我们可以知道,course表和score表通过外键连接,那么我们就可以把上面得到的虚拟表和score表子查询,取字段score.student_id即可得到所有选了李平老师课程的学生id,然后根据student_id分组或去重就可以得到不重名的学生id选了李平老师课程的虚拟表:

select score.student_id from score where course_id in (

select course.cid from course inner join teacher on course.teacher_id = teacher.tid where teacher.tname = "李平老师"
) ;

然后将上面得到的虚拟表与student表做子连接的条件得到选了李平老师课程的学生姓名,然后我们not in即可得到需求

 

select sname from student where sid not  in (

select score.student_id from score where course_id in (

select course.cid from course inner join teacher on course.teacher_id = teacher.tid where teacher.tname = "李平老师"
) 
);

4、 查询选修物理课程和体育课程的其中一门的学生姓名

需求分析:需要通过课程得到学生姓名,通过表结构我们可以得知,需要用到 student、score、course表,需要得到选了这两门课程的学生姓名,那我们就可以通过course表先拿到物理课和体育课对应的id,然后把这个id作为score表的查询条件查出对应的student_id,然后我们可以对student_id进行分组后用having过滤掉group_concat(student_id)大于等于2的部分,即可得到只选修了这两门课程中其中一门的学生id,然后我们可以拿这个结果去作为student表的子连接条件得到学生姓名,sql语句如下:

 

SELECT
    student.sname 
FROM
    student 
WHERE
    sid IN (
    SELECT
        student_id 
    FROM
        score 
    WHERE
        course_id IN ( SELECT cid FROM course WHERE cname IN ( "物理", "体育" ) ) 
    GROUP BY
        student_id 
    HAVING
        count( student_id ) = 1 
    );

第二种查询方法:

SELECT
    k.sname,
    k.course_id 
FROM
    course
    INNER JOIN ( SELECT student.sname, score.course_id FROM student INNER JOIN score ON score.student_id = student.sid ) AS k ON course.cid = k.course_id 
WHERE
    course.cname IN ( "物理", "体育" ) 
GROUP BY
    k.sname 
HAVING
    count( k.sname ) = 1;

5、 查询挂科超过两门(包括两门)的学生姓名和班级

需求分析:这个需求和第四个需求类似,我们可以先拿到所有挂科的学生id,然后进行分组,筛选出挂科数大于等于2的一部分学生id,然后把取到的id作为student表的查询条件去取学生姓名即可,sql语句如下:

 

 

SELECT
    caption,
    k.sname 
FROM
    class
    INNER JOIN (
    SELECT
        sname,
        class_id 
    FROM
        student 
    WHERE
        sid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING count( student_id ) >= 2 ) 
    ) k ON k.class_id = class.cid;

6、找出同时选了李平老师所有课的学生班级和姓名

需求分析:需要用到班级和老师,那么5张表都要用到,我们还是套用前面的方法,先通过teacher表找到李平老师的id,通过这个id在course表里找到李平老师的课程表的id,然后拿这个id去score表里找选了李平老师课程的student_id,这时候我们要对student_id进行分组了,筛选出含2个以上的student_id,再通过得到的student_id去student_表里找到对应的姓名和class_id,然后将生成的虚拟表去和class表联表,取出class.cname和student.sname即是我们想要的数据,sql语句如下:

SELECT
    class.caption,
    n.sname 
FROM
    class
    INNER JOIN (
    SELECT
        class_id,
        sname 
    FROM
        student 
    WHERE
        sid IN (
        SELECT
            student_id 
        FROM
            (
            SELECT
                student_id,
                course_id 
            FROM
                score 
            WHERE
                course_id IN ( SELECT course.cid FROM teacher INNER JOIN course ON course.teacher_id = teacher.tid WHERE teacher.tid = 2 ) 
            ) AS k 
        GROUP BY
            student_id 
        HAVING
            count( student_id ) = 2 
        ) 
    ) AS n ON class.cid = n.class_id ORDER BY n.sname;
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1-1、管理员从“管理页面”进行后台登陆,新系统默认系统管理员帐号和 密码为admin和admin。 1-2、为了增加 系统安全,登陆后请你马上到“管理页面-修改密码”修改你的系统管理员密码。 1-3、“管理页面-帐号管理”你可以添加、编辑、删除管理员帐号(如果你有系统管理员权限)。 1-4、“管理页面-教师管理-添加教师”你可以添加教师帐号。 1-5、“管理页面-教师管理”你可以编辑、删除教师帐号,任课情况和班主任只是该教师当前所授课程和任哪班的班主任,若要修改请到相应的“课程管理”和“班级管理”。 1-6、“管理页面-年级管理”你可以添加、编辑、删除年级。年级的概念是“高三(2)班”中的“高三”。 1-7、“管理页面-学期管理”你可以添加、编辑、删除学期,并且必须把某一个学期设置为当前学期。学期名最好以“2006-2007第二学期”这样的格式发布。 2-1、“功能页面-系统设置”,你可以设置网站名称、网页左上方图标地址、网站主体格属性。 2-2、“功能页面-年级变迁”,新学期可以对同一年级下班级进行 批量升级,但请注意,必须从高年级开始升。比如,想将高二升为高三,再将高一升为高二。 2-3、“功能页面- 下载管理”,你可以添加、编辑、删除软件下载的分类名。 2-4、“功能页面- 软件管理”,你可以添加、编辑、删除 所有软件,包括教师添加的软件。 2-5、“功能页面-留言管理”,你可以按时间批量学生对教师留言、家长对教师留言、学生与家长留言,点击“执行删除”将在不做任何提示的情况下删除所有留言,不可 恢复。 3-1、“班级管理-班级管理”,你可以编辑、删除某个班级,同时可以查询,如“高三(2)班”只需输入“(2)班”即可。 3-2、“班级管理-批量班级添加一”,选择年级、班主任,输入班级名称,可一次性添加9个班级。 3-3、“班级管理-批量班级添加二”,选择需要添加的班级数,选择年级,输入班级的公共字部分,如“班”,也可以不输,然后点击“设定参数”。在下面的新格中输入班级名,选择班主任,添加新班级。此两种方法视情况自由选择。 4-1、“课程管理-课程管理”,你可以编辑、删除某个课程。 4-2、“课程管理-批量课程添加”,选择批量添加的课程数,输入公共字,也可以不输,点击“设定参数”,在下面出来的新格中填写课程名称,然后添加。 4-3、“课程管理-任课管理”,你可以编辑、删除某个教师相对应的任课关系。任课关系是教师、课程、班级、学期四者间的关系。 4-4、“课程管理-课程添加”,可先选择条数、教师、学期、班级,再点“设定”,然后在下面新生成的格里根据实际重新选择添加。只有存在任课关系的教师才可以登陆管理自己相应班级和课程的成绩,否则无法管理。 5-1、“学生管理-学生管理”,你可以编辑、删除某个同学。 5-2、“学生管理-批量学生添加”,先根据学生数、班级、状态、入学年月设定,学号可填可不填,即公共字。在下面生成的新格中完成填写,添加新学生。 5-3、“学生管理-按班批量学生添加”,选择班级、状态、入学年月,“起始学号”和“终止学号”为位数相同的数字,比如1200-1240,终止大于起始。 5-4、“学生管理-评语管理”,管理员无评语管理功能,评语管理是教师针对学生的评价。 5-5、“学生管理-数据导入”,管理员可以上传EXCEL文件的学生名单及成绩文件至 服务器,再将数据导入。 6-1、“成绩管理-成绩管理”,你可以编辑、删除某个学生的成绩,并且可以根据条件来显示需要的学生成绩。 6-2、“成绩管理-批量成绩添加”,可以根据成绩数、班级、课程、学期、类型来设定,根据新生成的格来输入成绩,需要一个个输入学号和对应的成绩。 6-3、“成绩管理-按班批量成绩添加”,可以选择班级、课程、学期、类型进行设定,然后下面会生成新格,列出该班的所有学生,你只需要输入对应的成绩,操作比较方便。 7-1、“管理统计-学生统计”,选定某一个班级,可以显示该班级的学生数及状态和所属班级。 7-2、“管理统计-排名统计”,选定所有条件后,列出符合条件的记 录,并按分数从高到低或从低到高进行排序。 ■■■■家长操作说明■■■■ 家长帐号是由各班的班主任管理,所以登陆帐号和密码可以从班主任处获得。在网页左边可进行登陆,登陆后左边登陆窗口变成各连接菜单,右边显示你是哪个同学的家长。 1、“修改资料”,登陆后你可以修改自己的姓名和密码,建议填写真实姓名,以便班主任更好的管理。 2、“教师留言”,可以给相关的班主任和任课教师留言,标题和内容需要都填写。 3、“子女留言”,按时间列出子女给你的留言,通过上面的“给孩子留言”连接,你也可以给你孩子发送留言。 4、“教师评语”,列出相

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值