SELECT * FROM table WHERE col IN (1,2,3)
或
SELECT * FROM table WHERE col = 1 OR col = 2 OR col = 3
答案 0 :(得分:5)
他们是一样的。
编辑:它们在MySQL中是相同的。
使用索引:
mysql> explain select * from trees where id = 1 or id = 2;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | trees | range | PRIMARY | PRIMARY | 8 | NULL | 2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
mysql> explain select * from trees where id in (1,2);
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | trees | range | PRIMARY | PRIMARY | 8 | NULL | 2 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
使用全表扫描:
mysql> explain select * from trees where version = 1 or version = 2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | trees | ALL | NULL | NULL | NULL | NULL | 7 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
mysql> explain select * from trees where version in (1,2);
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | trees | ALL | NULL | NULL | NULL | NULL | 7 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
答案 1 :(得分:3)
对于大多数RDBMS,查询在执行之前通过优化器进行处理。由于你的谓词在逻辑上是等价的,我希望它们以相同的速度执行,因为它们将被优化以便以相同的方式执行。
但它依赖于数据库。您没有指定您正在使用的引擎。
答案 2 :(得分:2)
这取决于数据库供应商的解释以及它们如何表示where语句。
答案 3 :(得分:2)
在Microsoft SQL Server中,我认为它们的解释方式完全相同。
答案 4 :(得分:2)
可能与否,但确实如此......大多数数据库将前一种语法转换为后者。为什么不呢?它们在逻辑上和功能上完全相同。
请参阅here
答案 5 :(得分:2)
在两者上运行EXPLAIN SELECT ....
答案 6 :(得分:2)
正确的答案是:取决于引擎。使用EXPLAIN检查发生了什么。
某些数据库会将IN表单转换为一系列ORed子句。其他人不会。
例如,Postgres在使用IN表单时会降低(!)成本。我亲自寻找第一种形式,因为(1)一些引擎可以优化它,(2)它更多 直观,(3)更短。
有些偏离主题:尽管如此,请不要过度使用IN加入桌面。我已经看过很多次这样的构造:
SELECT * FROM employee WHERE boss_id IN(SELECT id FROM boss WHERE some_condition ..)
我猜它的原因是有人选择外部选择,然后通过发出内部选择找出引用表中的条件,然后只是复制&糊。当然这种构造比正确的JOIN更糟糕。
答案 7 :(得分:0)
在这种情况下,查询是等价的,或者第一个查询在测试中会更快一些。 某些优化适用于从子查询中使用IN运算符的比较,而不是这里的情况。