2

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

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

相对

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

4

8 回答 8

13

IN

如果子查询有多个结果,则不会生成错误。允许在子查询返回的结果中包含多个值。

=

如果子查询有多个结果,将产生错误。

于 2013-03-03T05:25:49.897 回答
4

“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
于 2014-06-04T20:11:45.220 回答
3

当您使用“IN”时,它可以比较多个值....比如

select * from tablename where student_name in('mari','sruthi','takudu')

但是当你使用'='时,你不能比较多个值

select * from tablenamewhere student_name = 'sruthi'

我希望这是正确的答案

于 2013-03-06T11:50:29.353 回答
2

对于未来的访客。

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

为了更清楚地看到下面的屏幕截图,请注意下面的IN(和NOT IN)右侧的完整结果集是如何在整个结果集中被考虑的;整个重点在于,在使用 比较的情况下=,选择第二个表中的匹配行,而在第二个表中选择IN完整结果的情况下。

在此处输入图像描述

于 2017-11-19T18:17:32.347 回答
1

In可以将一个值与多个值匹配,换句话说,它检查一个值是否在值列表中,例如

x in ('a', 'b', 'x')将返回真结果,因为 x 在值列表中

虽然=只期望一个值,但它很简单

x = y 返回假

x = x 返回真

于 2013-03-03T05:41:09.210 回答
1

一般的经验法则是:

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

WHERE s.parent = 'father_name'

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

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

希望这有用!!!

于 2014-06-04T22:02:38.323 回答
0

当子查询返回多个结果时,这会有所帮助。

=

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

就像在这个例子中一样:

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');
于 2019-03-28T08:54:05.467 回答
0

1) 有时 = 也用作比较运算符,以防 IN 没有的连接。2) 您可以在 IN 块中传递多个值,而 = 则无法做到这一点。例如,

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

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

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

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

将为您提供“无结果”。这意味着,如果子查询应该返回多个行数,在这种情况下 '=' 是没有用的。

于 2019-04-22T18:47:39.250 回答