Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么';查询之间的区别是什么?_Sql - Fatal编程技术网

Sql 什么';查询之间的区别是什么?

Sql 什么';查询之间的区别是什么?,sql,Sql,以下是数据集: 电影(年中,片名,年份,导演)英语:有一部ID为的电影 编号mID、标题、发布年份和导演 审阅者(rID,名称)英语:ID号为rID的审阅者具有 某个名字 评级(rID、mID、stars、ratingDate)英语:评论家rID给出 这部电影在某个特定的评级日期中有很多明星(1-5) 问题是:找到所有没有收视率的电影的标题 我的回答:(返回一个空集) 正确答案: select title from movie left join rating using (mID)

以下是数据集:

电影(年中,片名,年份,导演)英语:有一部ID为的电影 编号mID、标题、发布年份和导演

审阅者(rID,名称)英语:ID号为rID的审阅者具有 某个名字

评级(rID、mID、stars、ratingDate)英语:评论家rID给出 这部电影在某个特定的评级日期中有很多明星(1-5)

问题是:找到所有没有收视率的电影的标题

我的回答:(返回一个空集)

正确答案:

 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