如何为ALL条件编写此SQL查询?

时间:2015-02-16 09:41:18

标签: mysql sql database group-by having

我需要在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专业。您可以看到我尝试添加一些逻辑来检查返回的每条记录,但我担心我可能会误解语法。这些查询将运行,但它们返回空集。谢谢你的帮助。

3 个答案:

答案 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'
)