当我们使用等号和IN运算符具有相同的值时,SQL引擎有什么不同?执行时间会改变吗?

第一个使用等式判断运算符

WHERE column_value = 'All'

第二个使用IN运算符和单个值

WHERE column_value IN ('All')

如果只有一个值,SQL引擎是否会将IN更改为=

MySQL和PostgreSQL有什么不同吗?

推荐答案

这两种说法没有区别,当IN中只有一个元素时,优化者会将IN转换为=.

但是当你遇到这样的问题时,只需运行两个语句,运行它们的执行计划,并查看它们之间的差异.这里——你找不到.

在网上进行了大量搜索之后,我在SQL上找到了一个document来支持这一点(我认为它适用于所有DBMS):

如果括号内只有一个值,则[sic]相当于,

WHERE "column_name" = 'value1

以下是Oracle中两个查询的执行计划(大多数DBMS将以相同的方式进行处理):

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number = '123456789'

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

IN()美元:

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number in('123456789');

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

正如你所见,两者都是相同的.这是一个索引列.对于未编制索引的列也是如此(只是完整的表扫描).

Mysql相关问答推荐

创建从表中筛选数据的过程时出错

mysql使用LIKE查找二进制字段有问题

在MySQL中从非连续数据创建时间线

MySQL工作台的编码问题

如何查询一行

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

获取每个参数的记录,不重复

数据导入和默认目标架构空列表. (Mysql 工作台 8)

MySQL 可以用于将列表排序为三分之三吗?

显示值为空的所有列名

使用 MySQL 在树中查找 Leaf

判断一对记录是否属于多个组ID

在 MySQL 中检测 utf8 损坏的字符

默认为空字符串的列

计算执行的查询数

在osx的命令行中使用Mysql-找不到命令?

应该使用什么列类型将序列化数据存储在 mysql 数据库中?

带有 LIKE 运算符的 Select 语句中的 MySQL case

从另一个表中 Select 具有 id 的行

为什么 GRANT 在 MySQL 中不起作用?