表准备:

这次我们用到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语句如下:

SELECTcname,tname
FROMteacherINNER 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即可

SELECTstudent.sname,k.avg_score
FROMstudentINNER 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语句如下:

SELECTstudent.sname
FROMstudent
WHEREsid IN (SELECTstudent_id FROMscore WHEREcourse_id IN ( SELECT cid FROM course WHERE cname IN ( "物理", "体育" ) ) GROUP BYstudent_id HAVINGcount( student_id ) = 1 );

第二种查询方法:

SELECTk.sname,k.course_id
FROMcourseINNER 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
WHEREcourse.cname IN ( "物理", "体育" )
GROUP BYk.sname
HAVINGcount( k.sname ) = 1;

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

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

SELECTcaption,k.sname
FROMclassINNER JOIN (SELECTsname,class_id FROMstudent WHEREsid 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语句如下:

SELECTclass.caption,n.sname
FROMclassINNER JOIN (SELECTclass_id,sname FROMstudent WHEREsid IN (SELECTstudent_id FROM(SELECTstudent_id,course_id FROMscore WHEREcourse_id IN ( SELECT course.cid FROM teacher INNER JOIN course ON course.teacher_id = teacher.tid WHERE teacher.tid = 2 ) ) AS k GROUP BYstudent_id HAVINGcount( student_id ) = 2 ) ) AS n ON class.cid = n.class_id ORDER BY n.sname;

今天的联表查询到这里就结束啦!给个赞呗~

转载于:https://www.cnblogs.com/dongxixi/p/10879008.html

mysql数据库之联表查询相关推荐

  1. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  2. mysql 连表查询_mysql数据库之联表查询

    表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...

  3. 宅在家里写数据库中联表查询

    联表查询的关键字是join,如果需要判断条件的话是join on(on后面加判断条件),这两个一般是成对出现的,这里以两个表的连接进行讲解,首先给出两个表,分别是student学生表和result成绩 ...

  4. oracle数据库同时实现联表查询和分页查询(未明确定义列)

    ps:只是记录新手小白的脱坑之路,大佬勿喷 今天在做前端数据查询的时候,在实现联表查询的同时进行分页查询遇到了令人头秃的问题,分页查询的sql语句是这样的 select * from (select ...

  5. MySQL数据库基础-----多表查询

    一.多表关系 在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系. 1. 一对多 案例: 部门 与 员工的关系 关 ...

  6. Mysql数据库的单表查询

    我们在使用Mysql数据库存储数据时,对数据的查询方法是至关重要的,此博客主要介绍Mysql数据库的查询数据方法. 单表查询 单表查询就是我们仅对一个表进行查询,我们可以首先创建一个名为table的表 ...

  7. 原力计划【MySQL数据库】- 多表查询

    目录  多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系. 基本上分为三种: 一对多(多 ...

  8. Springboot中使用Mybatis框架对数据库进行联表查询,踩坑填坑

    因为mybatis使用的基本是原生sql语句 所以首先从数据库开始说 以mysql数据库为例,对表的连接查询分为四种 内连接,外连接,交叉连接,和联合连接 内连接使用比较运算符根据每个表共有的列的值匹 ...

  9. mysql数据库操作多表查询_MySQL数据库查询操作进阶——多表查询

    多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...

最新文章

  1. AIX下镜像制作与取消,更换硬盘
  2. 单轴步进驱动模块SH-20403
  3. 数学——Euler方法求解微分方程详解(python3)
  4. spring boot四:探究hello world
  5. OS / Linux / 制作 deb 包
  6. 基于ZooKeeper实现分布式锁
  7. wordpress 关于裁剪图片错误问题
  8. 数据包络分析-超效率模型
  9. c语言自学教程——字符函数和字符串函数
  10. 数据驱动进化优化(data-driven evolutionary optimization)
  11. 预测房价实验-房价数据集
  12. CSS深入理解之relative
  13. python dataframe重新索引_Concat DataFrame重新索引仅对唯一值索引对象有效
  14. HTML5全栈工程师好就业吗
  15. 蓝桥杯,历届试题,九宫重排
  16. 常用数字与字母的正则表达式(转载)
  17. (转)Unity 之 UGUI 小总结
  18. Http请求全过程简述
  19. 朴素贝叶斯--新浪新闻分类实例
  20. eds能谱图分析实例_成分分析的四大神器—XRF、ICP、EDX和WDX

热门文章

  1. hadoop10---消息队列
  2. 从非数组对象转数组方法小结
  3. find(),find_if(),以及巧妙的函数对象,函数适配器
  4. HttpClient4文件上传
  5. 源码编译mysql-5.6.15
  6. jquery获取元素索引
  7. windows server2012 图形加速,玩游戏不掉帧
  8. 看〈走出软件作坊〉浅谈扁平化管理
  9. 第二章例题:EnvironmentVars
  10. 检讨:丢了我女儿和项目设计感想