查询选修了全部课程的学生姓名的sql语句怎样理解

2021-01-16 05:02:14 字数 5788 阅读 9045

1楼:匿名用户

没有表结构怎么查啊,都不可能凭空想象表结构。

查询选修了全部课程的学生的姓名,用两种查询语句表示

2楼:匿名用户

可以这么考虑!--student学生表;course课程表;sc选课表;

--sno学号;sname学生姓名;**o课程编号;

法一:selectsname

fromstudent

wheresnoin(selectsno

fromsc

groupbysno

havingcount(*)=(selectcount(*)fromcourse))

法二:selectsname

fromstudent--学生表

wherenotexists(select*fromcourse--课程表

wherenotexists(select*fromsc

where--选课表

sno=student.sno

and**o=course.**o))

sql查询选修了全部课程的学生姓名

3楼:狠有毅毅

第一问:两个not exists表示双重否定:没有一个选了课的学生没有选course表里的课程

select sname

from student

where not exists /*没有一个学生满足以下条件*/

(select * from course

where not exists /*什么条件呢?没有选过course表里的课*/

(select * from sc

where sno =student.sno /*这里两个=分别指对应的关系,表示选过课并且是course里and **o=course.**o) 的课,只不过用not exists否定掉了*/

第二问:其实和not in 是一个意思 exists只返回true 或false 这里not exists里的内容 其实就是指学生选过的课程,再用not exists否定了,就变成了没有选的

4楼:匿名用户

分析原因如下:

第一问:两个not exists表示双重否定:没有

一个选了课的学生没有选course表里的课程

select sname from student where not exists /*没有一个学生满足以下条件*/

(select * from course where not exists /*什么条件呢?没有选过course表里的课*/

(select * from sc where sno =student.sno /*这里两个=分别指对应的关系,表示选

过课并且是course里and **o=course.**o) 的课,只不过用not exists否定掉了*/

第二问:其实和not in 是一个意思 exists只返回true 或false 这里not exists里的内容 其实就 是指学生选过的课程,再用not exists否定了,就变成了没有选

5楼:匿名用户

exists 是类似于in 效率比in 好的多

not exists 类似于 not in 效率一样比not in 一样好的多

再来看这个sql语句,应该明白了吧

数据库sql语句中 查询选修了全部课程的学生的学号和姓名 理解

6楼:匿名用户

首先头脑中有三点概念:

1 。 exists 子查询找到的

提交not exists 子查询中 找不到的提交

说明:不要去翻译为存在和不存在,把脑袋搞晕。

2 。 建立程序循环的概念,这是一个动态的查询过程。如 for循环 。

3 。 exists执行的流程exists首先执行外层查询,再执行内存查询,与in相反。 流程为首先取出外

层中的第一元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果

时。返回外层表中的第一元 组,接着取出第二元组,执行相同的算法。一直到扫描完外层整表 。

for(int i =0; i<>eofout;i++)

然后再来看一个例子: 三张表 学生表student (sno,sname), 课程表course (**o,**ame) 选课表sc

(sno,**o)

要求查询出 :选修了全部课程的学生姓名

我的思路:

首先学生的选课信息存在于sc表中, 要想知道某个学生是否选修了全部课程,至少我们需要知道一共有

几门课程,这是首要的条件。其次,学生选修了与否,我们又要扫描sc全表,统计出选修了所有课程的

学生号,最后在student表中根据学生号打出姓名 。

语句如下: (已测试)

select sname from student

where sno in

(select sno from sc

group by sno //根据sno分组,统计每个学生选修了几门课程。如果等于course的总数,就是我们要找的sno

having count(*) = (select count(*) from course )) //统计course中共有几门课程

另一种思路:

引入:将题目换为 查找学号为 00003 没有选修的科目

思路:我们可以将已知学号代入,把每一个科目代入(循环),这将形成1*count(*)种组合。

将这组成作为条件,一一与sc表种进行比对,找不到匹配的我们提交 。

select **ame from course where

not exists //找不到的组合,提交course

(select * from sc where course.**o = **o and sno = ''00003'')

//在sc中匹配

换个题目: 查找没有 没有选修科目的学生姓名

思路:学号未知 , 科目未知,说明有两个未知变量。应该有两个exists。我们可以扫描

student 和 course共有 s * c 中组合,将这些组合与sc的每一项进行匹配,注意s*c组合已经包含所

有可能。如果全部找到 ,就说明已经选修了全部课程。找不到就说明有课程没选修 。再将没选修的的

提交给上一exists 循环 。若上一exists 不存在的再提交给外循环。

最后详细回答你的问题:数据库sql语句中 查询选修了全部课程的学生的学号和姓名

查询选修了全部课程的学生姓名。

select sname

from student

where not exists

(select *

from course

where not exists

(select *

from sc

where sno= student.sno

and **o= course.**o);

理解如下: 查询选修了全部课程的学生姓名。

不用管怎么样,第一个select 必定是在 student 表里选 sname 既:

select sname

from student

加上条件即: where

条件是什么呢? 条件就是---------------------》 查询选修了全部课程的

因为没有 (任意一个)谓词, 只能用 exists 或者 not exists 来表示。 这点理解吧?

所以要把条件翻译成 -----------------------》 不存在一门课程这个学生没有选修

where后面就是 不存在(not exists) (

一门课程这个学生没有选修

)接下来就是把course表中的课程依次拿出来找出 没有选修的

怎么找呢? 因为 not exists 子查询中 找不到的提交

另外你要明白 ----------------------------not exists 查询 都是相关查询----------

所以只要把 在最后一个select 中

where sno= student.sno

and **o= course.**o);

就是将这个同学通过 sc 表 和 crouse的 课程连接一遍,找到连接不上的,即: 没有选修的, 这样就找到了一门课这个学生没有选修, 存在没有选修的课,那么该学生被pass掉了,

一次进行一个同学的判断 。

若你学过程序编程,可以看下面的内容, 若没有则可忽略、。----------

上述是理解是数据库系统内部的实现,可以用for循环表示

for(i=1; i

}最后你找记住

1. 第一个select 就是 你要选的就是 学生

select sname

from student

2. 第二个 select 就是 课程

3. 第三个select 就是 学生和课程发生关系的表 ------------sc选修表

让他们连接起来

固定的模式 1 你要的结果的表 学生

2 满足条件的表 课程表

3 产生关系的表 选修表

where 通过选修表把他们连接起来

7楼:匿名用户

这思路是用了个双重否定来求解的。因为sql中没有全称量词,于是要把题目转换成等价的存在量词表达形式。即根据(x)p≡(p)来转化为双重否定的表达。

同时由于“学生x选修课程y ”

之间是不定的,需要使用两个exist。

于是“选修了全部课程的学生”等价于“不存在(有他没选的课的)学生”

使用了两次not exists来实现双重否定。

先查找在课程里查找“没有学生选的课程”,第一次否定,

然后再在学生里查找“没有属于上面情况的学生”的名字,第二次否定;

结合起来,就是 “没有(没选的课程)的学生”了。

好了,从里到外写出来,就是

select sname from student where not exists(

select * from course where not exists(

select * from sc where sno=student.sno and **o=course.**o

))这个只不过是逆向思维来解决问题的方法。举一反三,比如要查“被全部学生都选的课程名”

则是求“不存在有学生没选它的课程”

select **ame from course where not exists(

select * from student where not exists(

select * from sc where sno=student.sno and **o=course.**o

))再如,查“所有人都没选修的课程”,这个虽然是单次否定了,但仍需要两个存在量词表述。

等价于查找“不存在有学生选了它的课程”。

select **ame from course where not exists (

select * from student where exists (

select * from sc where **o=course.**o and sno=student.sno))

SQL查询没有选修1号课程的学生姓名

1楼 匿名用户 select sname from student where not exists select from sc where student sno sc sno and o 1 2楼 匿名用户 select 姓名 sname from student where not exis...

数据库中查询全部学生都选修了的课程号和课程名

1楼 select 课程 课程号 课程 课程名 from 课程 where 课程号 in select distinct 课程号 from 选课group by 课程号 having count select count from 学生 根据人数判断 ,比较土,可以这样试试。 2楼 匿名用户 楼上回...

查询尚未选课的所有学生的基本情况SQL语句

1楼 匿名用户 你的数据表结构怎么样 估计是一个学生表 一个选课表 选课表有一个学生id作为外键 select from students where studentid not in select distinct studentid from course 查询尚未选课的所有学生的基本情况。。。...