IN运算符的说明

时间:2019-06-09 20:08:32

标签: sql

我在练习#15 sqlZoo(列出与“ Art Garfunkel”合作过的所有人员。)中有两个问题。解决方案如下所示(不是我的):

SELECT actor.name 
FROM actor 
   INNER JOIN casting ON casting.actorid = actor.id 
WHERE casting.movieid IN(
       SELECT casting.movieid FROM casting 
       WHERE casting.actorid IN(
        SELECT actor.id FROM actor 
        WHERE actor.name = 'Art Garfunkel')) 
   AND actor.name <> 'Art Garfunkel'

几乎所有内容看起来都很简单,但最后一个条件让我感到困惑。假设我要更改

WHERE casting.actorid IN(
        SELECT actor.id FROM actor 
        WHERE actor.name = 'Art Garfunkel'))

WHERE 
 casting.actorid = (SELECT actor.id FROM actor WHERE actor.name = 'Art Garfunkel'

一切正常,但是当我寻找其他可用的解决方案时,每一个都像上面的那样使用IN运算符。是否有任何理由使用IN运算符而不是我提出的解决方案? 第二个问题:为什么我不能将第7行的SELECT actor.id FROM actor更改为SELECT casting.actorid FROM casting?我的意思是actor.id和cast.actorid都相同(都是包含actor的ID的列)。那么为什么(在这个例子中)它们不能互换?

2 个答案:

答案 0 :(得分:3)

仅当您确定子查询返回单行时才可以使用=

WHERE 
 casting.actorid = (SELECT actor.id FROM actor WHERE actor.name = 'Art Garfunkel')
                    -- subquery should return single row

否则,您将得到一个错误:

  

SQL Server   子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

     

PostgreSQL   错误:由子查询返回的多于一行用作表达式

     

MySQL   子查询返回1行以上

答案 1 :(得分:0)

我称之为懒惰。 id中的actor列是-并且应该是唯一的。

使用=实际上是SQL编译器的一个好处。它明确指定子查询最多返回一行,并且有时在某些数据库中可以导致更好的执行计划。