Py学习  »  DATABASE

Mysql中的多表连接问题

经管之家 • 2 年前 • 413 次点击  
问题:有关系S(SNO, SNAME, SDEPT,SAGE),C(CNO, CNAME),SC(SNO, CNO, GRADE)。其中SNO是学生号,SNAME是学生姓名,SDEPT是系别,SAGE是学生年龄, CNO是课程号,CNAME是课程名称,GRADE是成绩。要查询“计算机”系的没有不及格成绩的学生学号和姓名?
A、SELECT Sno, Sname FROM SWHERE Sdept='计算机’
INTERSECT SELECT Sno, Sname FROM SC WHERE GRADE>=60;
B、SELECT Sno, Sname FROM S WHERE Sdept='计算机’and Sno not in (SELECT SNO FROM SC WHERE GRADE<60);
C、SELECT Sno, Sname FROM S WHERE Sdept='计算机’ EXCEPT
SELECT SNO FROM SC WHERE GRADE<60;
D、SELECT Sno, Sname FROM S WHERE Sdept='计算机’and sno in
(SELECT SNO FROM SC WHERE GRADE>=60);
解析:正确答案为B,这是典型的多表连接问题,同时考察了关于in和not in的应用。
知识点1:多表连接
在MySQL中,多表连接是一种非常常见的操作,可以将多个表中的数据进行联合查询。本文将介绍MySQL多表连接的技巧,帮助你更加高效地进行数据查询。
在MySQL中,常用的多表连接有三种:内连接、左连接和右连接。
(1)内连接
内连接是指只有在两个表中都存在匹配的数据时才会返回结果。内连接的语法如下:select 表名1.列名1,表名2.列名1…
from 表名1 [inner] join 表名2 on 表名1.列名1 =表名2.列名1
(2)左连接
左连接是指返回左表中所有的数据,同时将右表中匹配的数据进行连接。左连接的语法如下:
select 表名1.列名1,表名2.列名...1 from 表名1 left join 表名2
on 表名1.列名1 =表名2.列名1
(3)右连接
右连接是指返回右表中所有的数据,同时将左表中匹配的数据进行连接。右连接的语法如下:
select 表名1.列名1,表名2.列名1…from 表名1 right join 表名2
on 表名1.列名1 =表名2.列名1
知识点2:如何把握查询需求“没有不及格成绩的学生学号和姓名”?
这里部分学员选择了D。该选项的where语句中使用“sno in
(SELECT SNO FROM SC WHERE GRADE>=60);”存在漏判。这里只要有学员存在一门课程大于等于60,就会将其SNO筛选出来,即使他存在不及格的科目。
注意B选项:
Sno not in (SELECT SNO FROM SC WHERE GRADE<60);
先找出存在不及格科目的学号,然后限定要查询的学生的学号不在此数据集内。这样满足查询需求:不存在不及格学生。
添加老师微信,一起了解更多内容:


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157614