失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...

mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...

时间:2021-10-22 11:52:21

相关推荐

mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...

一、SQL语言查询选修了全部课程的学生的学号和姓名。

两种解决途径:

第一种:

我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数。相应的SQL语言如下:

selectS#,SNAMEfromSwhere S# in(selectS#fromSCgroup by S# --根据Sno分组,统计每个学生选修了几门课程。如果等于C表课程的总数,就是我们要找的S#

having count(*) = (select count(*) from C))--统计C表中共有几门课程

第二种:

问题:查询选修了全部课程的学生的学号和姓名。

可以转换为:查询没有一门课没有被该生选择的学生的学号和姓名。

相应的SQL语言如下:

select S#,SNAME --在 S 表里选 S#,SNAME

fromSwhere not exists --不存在

(select * --课程

fromCwhere not exists --没有

(select * --被该生选择的课程

fromSCwhere SC.S#=S.S# and SC.C#=C.C#)) --相关查询,三个表进行连接

这个查询语句可以这样理解:

查询没有一门课没有被该生选择的学生的学号和姓名。

第一个select 必定是在 S 表里选 S#,SNAME

selectS#,SNAME

fromS

where (不存在)

第二个select 是课程,来自C表)

select *

fromC

where (没有)

第三个select是课程被该生选择,来自SC表)

select *

fromSC

where (SC学号对应S表学号,SC表课程号对应C表课程号)

二、SQL语言查询选修了学号为“2001050105”的学生所选全部课程的学生姓名。

问题:查询选修了学号为“2001050105”的学生所选全部课程的学生姓名。

可以转换为:查询没有一门课(被学号“2001050105”的学生选择的课)没有被该生选择的学生的姓名。

相应的SQL语言如下:

select St_Name --从st_info表中选择姓名

fromst_infowhere not exists --不存在

(select * --被学号为‘2001050105’的学生选择的课程

from s_c_info assc_1where st_id='2001050105' and not exists --没有

(select * --被该生选择

from s_c_info assc_2where sc_2.st_id=st_info.St_ID and sc_2.c_no=sc_1.c_no))

这个查询语句可以这样理解:

查询没有一门课(被学号“2001050105”的学生选择的课)没有被该生选择的学生的姓名。

第一个select从st_info 中选出St_name

select St_Name

fromst_info

where (不存在)

第二个select 是从s_c_info表中选出学号为“2001050105”的学生选择的课程

select *

from s_c_info assc_1

where st_id='2001050105' and(不存在)

第三个select是从s_c_info表中选出课程被该生选择的记录

select *

from s_c_info assc_2

where(sc_2学号对应st_info学号,sc_2表课程号对应sc_1表的课程号)

之所以起别名sc_1和sc_2主要是他们来自同一个表,但是我们首先是从s_c_info表中选出了学号为“2001050105”的学生的选修记录并放到了sc_1中,这样在最后关联的时候就可以直接关联。

三、总结:

上述两个问题,其实解题思维是一样的,都是运用了两次 not exists 双重否定表示肯定,理解了这两个问题,在遇到相似的问题,可以进行相应的转化。那么该问题既然是双重否定,那么可不可以用两个 exists 呢?显然不可以。自己思考一下吧。如果理解了上述问题,很简单的就可以知道原因。

如果觉得《mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。