Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 与括号相比有什么区别:其中(a,b)=(1,2)_Mysql_Sql_Sql Server_Oracle - Fatal编程技术网

Mysql 与括号相比有什么区别:其中(a,b)=(1,2)

Mysql 与括号相比有什么区别:其中(a,b)=(1,2),mysql,sql,sql-server,oracle,Mysql,Sql,Sql Server,Oracle,我偶然发现MySQL中的以下有效查询在Oracle/MSSQL中将=替换为in时也适用: 这和 SELECT * from mytable WHERE a=1 and b=2 我认为这本书的定义如下: 这叫什么?使用它有什么优点和缺点吗?当需要比较多个列和多个值组合时,使用IN: 而不是: SELECT * FROM YourTable WHERE (col1 = 1 and col2 = 2) OR (col1 = 2 and col2 = 3) OR (col1 =

我偶然发现MySQL中的以下有效查询在Oracle/MSSQL中将=替换为in时也适用:

这和

SELECT * from mytable WHERE a=1 and b=2
我认为这本书的定义如下:


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

当需要比较多个列和多个值组合时,使用IN:

而不是:

SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
      (col1 = 2 and col2 = 3) OR
      (col1 = 4 and col2 = 4) OR
      ....
在查看了两个查询的执行计划之后,我可以说,在OracleUsing中,优化器以相同的方式计算这两个查询,并且都使用索引:

单独条件:

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 |
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 |
组合条件:

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 |
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都会对这个查询进行相同的评估

行构造函数在其他上下文中是合法的。例如,以下两条语句在语义上是等价的,优化器以相同的方式处理它们:

因此:

缺点-对某些人来说可能不太容易理解,但基本上没有缺点


Pros-更少的代码,以及在中使用的多列比较组合:

Pros。少打字。欺骗。我认为不能使用索引-但我不确定-很容易验证,尽管第一次测试解释告诉我在两个查询中使用相同的索引,这里似乎没有区别。我认为如果where子句更复杂,那么第一个语法就不那么清晰了。SQL功能641,行和表构造函数。据了解,它对子查询非常有用,例如,TSo中的SELECT c中的a,b,d中的a,b,这在Oracle中也有效,但在SQL Server中不起作用。在中进行时非常方便,例如,在SELECT c1中的a,b,c2 FROM…@ManuelM Yea中,它在中工作,我认为它在SQL Server中也有效。这是一个非常好的详细回答!这里没有这么多人,干杯+1.遗憾的是,如果右侧有null,其中a,b,c=1,2,null,1,2,null 1,2,3/null中的a,b,c都不能作为查询参数,那么它就不起作用了
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 |