Sql 什么';查询之间的区别是什么?
以下是数据集: 电影(年中,片名,年份,导演)英语:有一部ID为的电影 编号mID、标题、发布年份和导演 审阅者(rID,名称)英语:ID号为rID的审阅者具有 某个名字 评级(rID、mID、stars、ratingDate)英语:评论家rID给出 这部电影在某个特定的评级日期中有很多明星(1-5) 问题是:找到所有没有收视率的电影的标题 我的回答:(返回一个空集) 正确答案:Sql 什么';查询之间的区别是什么?,sql,Sql,以下是数据集: 电影(年中,片名,年份,导演)英语:有一部ID为的电影 编号mID、标题、发布年份和导演 审阅者(rID,名称)英语:ID号为rID的审阅者具有 某个名字 评级(rID、mID、stars、ratingDate)英语:评论家rID给出 这部电影在某个特定的评级日期中有很多明星(1-5) 问题是:找到所有没有收视率的电影的标题 我的回答:(返回一个空集) 正确答案: select title from movie left join rating using (mID)
select title
from movie
left join rating using (mID)
where stars is null
我不确定我的加入有什么问题?提前谢谢 如果电影没有分级,
rating.mid
将为空,因此movie.mid=rating.mid
将为假
如果一部电影确实有收视率,那么movie.mid=rating.mid
将起作用,但是(大概)stars为null
将为false
所以你的条件永远不会满足
您发布的正确答案有效,因为
join
条件与where
条件是分开的。首先将movies
表连接到rating
表,然后将结果过滤到没有连接到它们的行。在movie和rating之间执行完全交叉连接。这意味着您的结果集最初包含所有可能的(电影、分级)组合
您需要movie.mid=rating.mid
。这将限制您的结果集仅限于那些(电影、分级)对,其中分级实际上是与之配对的电影的分级
但是想象一下一部没有评级的电影。它永远不会出现在评级表中,因此movie.mid=rating.mid
也永远不会为真。因为这从来都不是真的,所有没有评级的电影都将从where子句的结果集中删除
正确答案使用
左连接
。联接将电影中的所有行与评级中通过联接条件的所有行相匹配(在本例中,mID
需要相等)。到目前为止,这在语义上和你写的是一样的。但是,left
部分开始发挥作用:这意味着对于评级中没有任何行通过联接条件的任何电影行,电影行无论如何(一次)都包含在评级表列的所有NULL
值中。stars为null
条件则只接受由left
效果生成的行。(请注意,where子句只有在评级表中不允许stars
为空的情况下才能正确工作。)对该问题进行另一次抨击,以便任何人都能理解它。至于你加入的问题,你是否错过了t-aka关节?!
select title
from movie
left join rating using (mID)
where stars is null