与括号比较时有什么区别:WHERE(a,b)=(1,2)

Man*_*l M 18 mysql sql sql-server oracle

我在MySQL(也适用于更换当Oracle/MSSQL跨follwoing(有效)查询跌跌撞撞=IN):

SELECT * from mytable WHERE (a, b)=(1,2)
Run Code Online (Sandbox Code Playgroud)

它是一样的

SELECT * from mytable WHERE a=1 and b=2
Run Code Online (Sandbox Code Playgroud)

我认为MySQL文档中的定义在这里:

simple_expr:
  [...]
  | (expr [, expr] ...)
  [...]
Run Code Online (Sandbox Code Playgroud)

这个叫什么?使用它有什么利弊吗?

sag*_*agi 13

通过使用IN()以下方法将多个列与多个值组合进行比较时,它非常方便:

 SELECT * FROM YourTable
 WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)
Run Code Online (Sandbox Code Playgroud)

代替:

SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
      (col1 = 2 and col2 = 3) OR
      (col1 = 4 and col2 = 4) OR
      ....
Run Code Online (Sandbox Code Playgroud)

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

单独条件:

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 |
Run Code Online (Sandbox Code Playgroud)

综合条件:

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 |
Run Code Online (Sandbox Code Playgroud)

我假设所有RDBMS都会对此查询进行相同的评估.

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

所以:

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

优点 - 减少代码,并使用以下方法组合多列比较IN():

  • 在执行`IN`时非常方便,例如`WHERE(a,b)IN(SELECT c1,c2 FROM ...`. (3认同)
  • 这是一个伟大而精心解答的答案!这里没有多少人这样欢呼!+1. (3认同)