我正在试图弄清楚如何正确使用FROM。因此,举个例子,我有一个像这样的表:
STUDENT(*snum: integer,sname: string,deptid:integer,slevel:string,age:integer)
ENROLLED(*snum:integer, *cname: string)
我正在计算在21岁以下的课程中注册的学生人数。有人可以解释为什么它会返回0吗?我认为我正在做的是看一个注册然后比较类名和我正在寻找它的类。然后我检查是否有一个学生目前在该课程注册,如果有,那么检查年龄是否低于21岁。任何人都可以解释我做错了吗?
SELECT COUNT(*)
FROM
ENROLLED e,
STUDENT s
WHERE
e.cname='ENG101'
AND e.snum=s.snum
AND s.age < 21;
示例数据: 插入ENROLLED值(1234,'ENG400'); 插入STUDENT值(1234,'T.Banks',3,'SR',18);
答案 0 :(得分:1)
我会以不同的方式编写查询:
SELECT
COUNT(*) EnrolledStudents
FROM
ENROLLED e
INNER JOIN
STUDENT s
ON
e.snum = s.snum
WHERE
e.cname = 'ENG101'
AND
s.age < 21;
也许可以尝试一下,看看WHERE中的一个语句是否导致了问题:
SELECT
e.cname,
s.age,
COUNT(*) EnrolledStudents
FROM
ENROLLED e
INNER JOIN
STUDENT s
ON
e.snum = s.snum
GROUP BY
e.cname,
s.age;
我的赌注是“ENG101”不正确或者ENG101中没有学生年龄< 21。
答案 1 :(得分:0)
我认为你必须首先使用“INNER JOIN”,就像上面的评论一样。实际上SQL将首先处理JOIN并使用where condition作为过滤器来选择连接表中的适当行。因此“A.id = B.id where condition”的结果与“where condition and A.id = B.id”完全不同,第一个条件在哪里失败,不需要做其他条件。