SQL中的IN运算符和=运算符有什么区别?

时间:2013-03-03 05:24:40

标签: sql select

我只是在学习SQL,我想知道以下几行之间有什么区别:

WHERE.parent IN(SELECT l.parent .....)

WHERE s.parent =(SELECT l.parent .....)

8 个答案:

答案 0 :(得分:10)

IN

如果子查询上有多个结果,

将不会生成错误。 允许子查询返回的结果中包含多个值。

=

如果子查询上有多个结果,

将生成错误。

答案 1 :(得分:3)

当你使用'IN'时它可以比较多个值....比如

从tablename中选择*,其中student_name in('mari','sruthi','takudu')

但是当你使用'='时,你无法比较多个值

select * from tablenamewhere student_name ='sruthi'

我希望这是正确的答案

答案 2 :(得分:3)

“IN”子句的速度要慢得多。如果

的选择部分有很多结果

IN (SELECT l.parent .....)

它会非常低效,因为它实际上为select语句中的每个结果生成一个单独的select sql语句...所以如果你返回'Cat','Dog','Cow'

它基本上会为每个结果创建一个sql语句...如果你有200个结果......你得到完整的sql语句200次......永远需要......(这是几年前的结果。 ..现在可能已经得到了改进......但是在大结果集上却非常缓慢。)

更有效地进行内部联接,例如:

Select id, parent
from table1 as T
inner join (Select parent from table2) as T2 on T.parent = T2.parent

答案 3 :(得分:1)

In可以匹配具有多个值的值,换句话说,它会检查值是否在值列表中,例如。

x in ('a', 'b', 'x')将返回true结果,因为x位于值列表

=只需要一个值,就像

一样简单

x = y返回false

x = x返回true

答案 4 :(得分:1)

一般的经验法则是:

=期望与之比较单个值。像这样:

WHERE s.parent = 'father_name'

IN在=无法工作的情况下非常有用,例如您需要与多个值进行比较的情况。

WHERE s.parent IN ('father_name', 'mother_name', 'brother_name', 'sister_name')

希望这很有用!!!

答案 5 :(得分:1)

面向未来的访问者。

  • 基本上在equals的情况下(只记得我们这里说的是where a.name = b.name),表1中的每个单元格值将逐一与表2中所有行的每个单元格值进行比较,如果是匹配然后将选择该行(此处将选择行表示来自表1和表2的行),否则将不会选择整个结果集。
  • 现在,在IN的情况下,IN的右侧的完整结果集将用于比较,因此将检查表1中的每个值是否该单元格值是否存在于完整的结果集中IN,如果存在,那么将为IN的结果集的所有行显示该值,因此假设IN结果集有20行,因此表1中的单元格值将在整个结果集中出现20次(即特定的单元格值将有20行。

为了更加清晰,请参阅下面的屏幕截图,请注意下面的整体结果集中如何考虑IN(和NOT IN)右侧的完整结果集。 整体强调的事实是在使用=进行大小写比较时,选择了第二个表中的匹配行,而在IN的情况下,选择了第二个表的完整结果。

enter image description here

答案 6 :(得分:0)

IN

这在子查询返回多个结果时有帮助。

=

此运算符不能处理多个结果。

如本例所示:

SQL>

Select LOC from dept where DEPTNO = (select DEPTNO from emp where
JOB='MANAGER');

给出错误ORA-01427:单行子查询返回多个行

代替使用

SQL>

Select LOC from dept where DEPTNO in (select DEPTNO from emp
where JOB='MANAGER');

答案 7 :(得分:0)

1)有时=在IN不存在的联接的情况下也用作比较运算符。 2)您可以在IN块中传递多个值,而不能使用=传递这些值。例如,

    SELECT * FROM [Products] where  ProductID IN((select max(ProductID) from Products), 

(从产品中选择min(产品ID))

可以工作,并为您提供预期的行数。

    SELECT * FROM [Products] where  ProductID = (select max(ProductID) from Products) 
and ProductID =(select min(ProductID) from Products)

将为您提供“没有结果”。这意味着,如果子查询应该返回多个行,那么'='就没有用了。