Sql 为什么我的查询返回空结果?

Sql 为什么我的查询返回空结果?,sql,Sql,以下是数据集: 电影(年中,头衔,年份,导演) 中文:有一部电影的ID号是mID、片名、发行年份和导演 Reviewer(rID,name) 中文:ID号为rID的审核人有特定姓名 评级(rID、mID、stars、评级日期) 中文:评论员在某个日期给电影评了一个星级(1-5) 问题是:找到所有没有收视率的电影的标题 我的回答:(返回一个空集) 正确答案: select title from movie left join rating using (mID) where star

以下是数据集:

  • 电影
    年中,头衔,年份,导演

    中文:有一部电影的ID号是mID、片名、发行年份和导演

  • Reviewer
    rID,name

    中文:ID号为
    rID
    的审核人有特定姓名

  • 评级
    rID、mID、stars、评级日期

    中文:评论员在某个日期给电影评了一个星级(1-5)

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

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

正确答案:

 select title
 from movie 
 left join rating using (mID)
 where stars is null

我不确定我的加入有什么问题?提前谢谢

您的查询会找到每个
电影
记录,这些记录都有相应的
评级
记录-这就是
电影加入评级
的含义-前提是所述
评级
记录有
星号为空

正确的查询将查找缺少
评级
记录或具有
评级
记录且带有
星星的
电影
记录为空

关键的区别在于,作为第一步,您的查询将过滤掉任何
电影
记录,而不匹配
评级
记录(因为这些记录将使连接失败),而正确的查询使用
左连接
来阻止此过滤


(请注意,即使使用
左连接
,如果
WHERE
子句构造得不好,也会发生这种过滤。例如,
WHERE stars='X'
也会过滤掉没有相应
评级
记录的
电影
记录,因为只有现有的
评级
记录才能满足要求。)
WHERE
-子句。但是对于
WHERE stars IS NULL
,不会出现此问题,因为当连接失败时,
NULL
stars
的默认值。)

您可以使用标题没有星星的查询,
“在rating.mid=movie.mid,其中rating.rid为空时,从电影左连接分级中选择标题”

或者你可以使用

select title from movie where mid not in (select distinct mid from rating )
select title from movie where mid not in (select distinct mid from rating )