Mysql 与括号相比有什么区别:其中(a,b)=(1,2)
我偶然发现MySQL中的以下有效查询在Oracle/MSSQL中将=替换为in时也适用: 这和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 =
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 |