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