首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与括号相比有什么不同:其中(a,b)=(1,2)

与括号相比有什么不同:其中(a,b)=(1,2)
EN

Stack Overflow用户
提问于 2016-07-06 15:03:51
回答 1查看 949关注 0票数 14

我偶然发现了MySQL中的以下(有效)查询(在用IN替换=时也适用于Oracle/MSSQL ):

代码语言:javascript
复制
SELECT * from mytable WHERE (a, b)=(1,2)

它与

代码语言:javascript
复制
SELECT * from mytable WHERE a=1 and b=2

我认为MySQL docs中的定义如下:

代码语言:javascript
复制
simple_expr:
  [...]
  | (expr [, expr] ...)
  [...]

这叫什么?使用它有什么优点和缺点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-06 15:20:31

当需要使用IN()将多个列与多个值组合进行比较时,它会非常方便:

代码语言:javascript
复制
 SELECT * FROM YourTable
 WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)

而不是:

代码语言:javascript
复制
SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
      (col1 = 2 and col2 = 3) OR
      (col1 = 4 and col2 = 4) OR
      ....

在查看了这两个查询的执行计划之后,我可以说在Oracle中(使用基本上相同的IN() ),优化器以相同的方式进行计算,并且两者都使用索引:

单独的条件:

代码语言:javascript
复制
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where t.tt_id = '1' and t.region_name = 'one';

6   |   0 | SELECT STATEMENT            |                              |     1 |   311 |    30   (0)| 00:00:01 |
7   |   1 |  TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE     |     1 |   311 |    30   (0)| 00:00:01 |
8   |   2 |   INDEX RANGE SCAN          | DIM_REMEDY_TICKETS_HISTORYPK |     1 |       |    20   (0)| 00:00:01 |

组合条件:

代码语言:javascript
复制
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where (t.tt_id,t.region_name) in  (('1','one'))

6   |   0 | SELECT STATEMENT            |                              |     1 |   311 |    30   (0)| 00:00:01 |
7   |   1 |  TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE     |     1 |   311 |    30   (0)| 00:00:01 |
8   |   2 |   INDEX RANGE SCAN          | DIM_REMEDY_TICKETS_HISTORYPK |     1 |       |    20   (0)| 00:00:01 |

我假设所有的RDBMS都会对这个查询进行相同的评估。

行构造函数在其他上下文中是合法的。例如,以下两个语句在语义上是等价的(并且由优化器以相同的方式进行处理):

所以:

缺点-对于一些人来说可读性可能较差,但基本上没有缺点。

无优点的代码,并结合多列比较使用IN()

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38218030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档