我正在使用SQLite3,我有4个表:
HAVING foreignstudent = 'TRUE'
ORDER BY max(score) desc;
似乎添加内容将允许仅在外国学生为真的情况下打印值。但是,它不起作用......
答案 0 :(得分:1)
让我们先看看你的第一个问题:
SELECT sid, name, crsid, avg(grade)
FROM classmate natural join took natural join classSection
natural join class
GROUP BY crsid
ORDER BY max(score) desc;
除了提及问题中未定义的表之外,此查询还存在三个问题/坏习惯。首先,您没有使用指定列来自何处的表别名。第二个是列位于select
子句中,但不在group by
中。第三是使用natural join
。 Natural join
似乎非常有用,但它的作用取决于表的底层结构 - 添加,删除或重命名列会影响连接,而不是通过导致错误而是通过生成不同的结果。呸!因此,请尝试将此查询编写为:
SELECT cm.sid, cm.name, c.crsid, avg(t.grade)
FROM classmate cm join
took t
using (sid) join
classSection cs
using (secid) join
course c
using (crsid)
GROUP BY cm.sid, cm.name, c.crsid;
接下来,如果您只想过滤外国学生,请添加where
子句,而不是having
子句:
SELECT cm.sid, cm.name, c.crsid, avg(grade)
FROM classmate cm join
took t
using (sid) join
classSection cs
using (secid) join
course c
using (crsid)
WHERE cm.foreignstudent = 1
GROUP BY cm.sid, cm.name, c.crsid;
在SQLite中,“true”是值1
。