sql如何为noob编写复杂的查询?

sql如何为noob编写复杂的查询?,sql,database,Sql,Database,这是我的桌子 Student (sname, sid, gpa, level, deptno) Course (cno, cname, deptno, units) Dept (dname, deptno) Takes (sid, cno) 编写一个SQL查询,返回参加考试的学生的姓名,即SNAME 系外课程比系内课程多。你可以 假设数据库中的所有学生在其系内至少选修了一门课程 我不想为这个问题寻找任何解决方案,但仍然欢迎任何答案。 但我更希望人们能告诉我如何生成编写这样一个复

这是我的桌子

 Student (sname, sid, gpa, level, deptno) 
 Course (cno, cname, deptno, units) 
 Dept (dname, deptno) 
 Takes (sid, cno) 
编写一个SQL查询,返回参加考试的学生的姓名,即SNAME 系外课程比系内课程多。你可以 假设数据库中的所有学生在其系内至少选修了一门课程

我不想为这个问题寻找任何解决方案,但仍然欢迎任何答案。 但我更希望人们能告诉我如何生成编写这样一个复杂查询的步骤

我的答案是

 Select S.sname
 From Student S, Course C, Dept D, Takes T
 Where T.cno=C.cno and D.deptno=C.deptno and S.sid = T.sid
 Having COUNT(S.deptno=C.deptno) > COUNT( S.deptno != C.deptno)
我不确定我是否可以用这种方式使用计数。
谢谢

尽管我从未使用过DB/SQL类,但我经常使用中等复杂的SQL查询,并且发现生成查询的最佳方法是一次处理一个查询。例如,首先要获得一份学生名单。然后,计算他们在部门内部和外部接受的类的数量,最后,比较查询中的两个值并返回所需的最终结果集


tl;dr:baby steps

有人认为这是hw,但以下是标准解决方案:

 SELECT S.sname from Student S
 WHERE (SELECT COUNT (*) 
 FROM Takes T, Course C
 WHERE S.sid = T.sid AND T.cno = C.cno AND C.deptno = S.deptno)
 < (SELECT COUNT(*)
 FROM Takes T2, Course C2
 WHERE S.sid = T2.sid AND T2.cno = C2.cno AND C2.deptno != S.deptno)

您的第一次尝试已更正:

 SELECT S.sname
 FROM Student S, Course C, Dept D, Takes T
 WHERE T.cno = C.cno AND D.deptno = C.deptno AND S.sid = T.sid
 GROUP BY S.sid
 HAVING COUNT(CASE WHEN S.deptno =  C.deptno THEN 1 ELSE NULL END) 
      < COUNT(CASE WHEN S.deptno <> C.deptno THEN 1 ELSE NULL END) ;
并转换为SQL-92语法:

 SELECT S.sname
 FROM Student S 
   JOIN Takes T   ON S.sid = T.sid
   JOIN Course C  ON T.cno = C.cno
   JOIN Dept D    ON D.deptno = C.deptno
 GROUP BY S.sid        
        , S.sname                  --- this is not needed in SQL-2003
                                   --- but still required by most DBMS     
 HAVING 
        COUNT(CASE WHEN S.deptno =  C.deptno THEN 1 END) 
      < COUNT(CASE WHEN S.deptno <> C.deptno THEN 1 END) ;

                                   --- the ELSE NULL is not needed either
                                   --- it's the implied default

这是给哪门课的?听起来像是斯坦福数据库课程的练习。我已经发布了解决方案,所以它不适合任何课程。。保持冷静guys@runcode:您可以将答案查询作为答案。不要把它包括在问题中。这是正确的,尽管我会使用JOIN,而不是这个20年前的语法。我的答案包括在问题中,对吗?那么我使用上面提到的COUNT的方式,对吗?实际上我只是想COUNT可以用这种方式,因为我从来没有看到过任何像这样使用COUNT的例子,你知道有哪些网站有很多SQL查询示例吗?COUNTx计算x不为null的次数,因此它会同时计算True和False。不过,您的意思是只计算真实值。具有SQL练习的站点: