我需要在MySQL中构建一个SQL查询来解决问题,作为类的赋值的一部分。我已经在这个问题上工作了一段时间,但我很难弄清楚如何正确地构建这个查询。我对SQL语言和数据库一般都很陌生,而且我对这个问题感到困惑。到目前为止,我已经发布了我已经提出的内容,但遗憾的是我无法得到我正在寻找的结果。如果有人能给我一些指导如何实现这一点我会非常感激。
这是我的表格结构:
当然( cid ,fid,房间)
注册( cid , sid ,年级)
教师( fid ,fname,dept,rank)
学生( sid ,sname,major,credits)
这是我需要构建的查询:
显示所有教授所有计算机科学专业的教师的教师姓名和教职员名称(主要=' CSC')。
这是我迄今为止所做的尝试:
select f.fid, f.fname
from faculty f
join course c
on f.fid = c.fid
join enroll e
on c.cid = e.cid
join student s
on e.sid = s.sid
where s.sid = ALL
(select sid
from student
where major = 'CSC');
select f.fid, f.fname
from faculty f
join course c
on f.fid = c.fid
join enroll e
on c.cid = e.cid
join student s
on e.sid = s.sid
group by f.fid, s.sid
having s.sid = ALL
(select sid
from student
where major = 'CSC'));
我很难理解的逻辑障碍是如何确保教师正在教授所有当前的CSC专业。您可以看到我尝试添加一些逻辑来检查返回的每条记录,但我担心我可能会误解语法。这些查询将运行,但它们返回空集。谢谢你的帮助。
答案 0 :(得分:1)
你所做的一切看起来都不错。我想你可能只是在思考它。这应该在逻辑上给你你想要的东西:
Select f.fid, f.fname
from faculty f
join course c on c.fid = f.fid
join enroll e on e.cid = c.cid
join student s on s.sid = e.sid
Where major = 'CSC'
group by f.fid, f.fname
答案 1 :(得分:1)
尝试
select f.fid, f.fname
from faculty f
join course c
on f.fid = c.fid
join enroll e
on c.cid = e.cid
join student s
on e.sid = s.sid
where s.sid IN (select sid from student where major = 'CSC');
答案 2 :(得分:1)
我同意这个问题可能不清楚,他们可能只是在教过任何 CSC专业的教师之后。但是,如果你仍然需要所有教过所有 CSC专业的教师,这应该有效:
以下查询告诉我们教师和CSC专业对:
select f.fid, s.sid
from faculty f
inner join course c
on f.fid = c.fid
inner join enroll e
on e.cid = c.cid
inner join student s
on e.sid = s.sid
where s.major = 'CSC'
group by f.fid, s.sid
因此,如果我们知道计算机科学专业的学生人数:
select count(1)
from student s
where s.major = 'CSC'
然后我们可以将每位教员教授的CSC专业数量相加,并检查它是否等于CSC专业的总数:
select b.fid, b.fname
from (
select a.fid, a.fname, count(1) as taught_count
from (
select f.fid, f.fname, s.sid
from faculty f
inner join course c
on f.fid = c.fid
inner join enroll e
on e.cid = c.cid
inner join student s
on e.sid = s.sid
where s.major = 'CSC'
group by f.fid, s.sid
) a
group by a.fid, a.fname
) b
where b.taught_count = (
select count(1)
from student s
where s.major = 'CSC'
)