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

2020-11-19 05:34:10 字数 5823 阅读 8812

1楼:

select 课程.课程号

,课程.课程名

from 课程 where 课程号 in(select distinct 课程号 from 选课group by 课程号

having count(*) =(select count(*) from 学生)

)根据人数判断 ,比较土,可以这样试试。

2楼:匿名用户

楼上回答的 很不错了 可以这样做的。

这个问题其实真的很简单的。。。

sql查询全部学生都选修的课程的课程号和课程名问题

3楼:匿名用户

首先,简单的把课程表与选修表关联,

coursejoinstudyon(course.cid = study.cid)

然后 ,按照课程号和课程名分组,

groupby

course.cid,

course.**ame

最后, 要求 选修的人数 = 学生总数

having

count(study.sid) = (select count(sid) from student)

结构化查询语言(structured query language)简称sql(发音:/es kju el/ "s-q-l"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。

如何用sql查询全部学生都选了人课程号和课程名

4楼:匿名用户

1,全部学生都选了人课程号和课程名

select b.**o,b.**ame

from 学生关系

a,课程关系 b,学习关系 c where a.sno=c.sno and b.**o=c.**o

group by b.**o,b.**ame having count(*)=(select count(*) from 学生关系)

2,某位学生没有选的课程名称

select a.sname,b.**ame

from 学生关系 a,课程关系 b,学习关系 c where a.sno=c.sno and b.**o=c.**o

group by a.sname,b.**ame having count(*)<(select count(*) from 课程关系)

我这是列的每个学生没选的,要是查某位学生,加个条件就行

select a.sname,b.**ame

from 学生关系 a,课程关系 b,学习关系 c where a.sno=c.sno and b.**o=c.**o

and a.sname='***'

group by a.sname,b.**ame having count(*)<(select count(*) from 课程关系)

5楼:匿名用户

全部学生都选的课程号与课程名:

select * from (select c.**o,c.**ame,count(1) as total from (select a.

*,c.* from 学生关系统 as a,学习关系 as b,课程关系

as c where a.sno=b.sno and b.

**o=c.**o ) as t group by c.**o,c.

**ame) as t where total=(select count(1) from 学生关系 group by sno)

某个学生没有选的课程名称:

select * from 课程关系 where **o no in( select **o from (select a.*,c.* from 学生关系统 as a,学习关系 as b,课程关系 as c where a.

sno=b.sno and b.**o=c.

**o ) t where sno='某个学生')

sql数据库中查询选修了所有课程的学生的学号和姓名及选修门数

6楼:匿名用户

所有离开了数据结构

(表结构)的sql语句都是白搭!

先假设数据结构为

学生表(学号主键或设有唯一索引,姓名,性别)

课程表(课程号主键或设有唯一索引,课程名)

选课表(课程号,学号)--字段“课程号”和“学号"设有双字段唯一索引

查询出选修了所有课程的学生的学号、姓名和选修门数:

selecta.学号,b.姓名,a.**tas选修门数from

(select学号,count(1)asas**tfrom选课表groupby学号

havingcount(1)=(selectcount(1)from课程表))a,

学生表bwherea.学号=b.学号;

7楼:腾讯电脑管家

select s.sname, s.s*** , s.

sage, s.sdept c.**ame g.

grade from student s , course c ,grade g where s.sno = g.sno and g.

**o = c.**o;

8楼:站在风中望着你

??????????????????????????你好,sql是什么

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

9楼:匿名用户

首先头脑中有三点概念:

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 通过选修表把他们连接起来