sourcecode

괄호와 비교했을 때 어떤 차이가 있습니까? WHERE (a, b)= (1,2)

copyscript 2023. 9. 11. 21:59
반응형

괄호와 비교했을 때 어떤 차이가 있습니까? WHERE (a, b)= (1,2)

MySQL에서 우연히 다음과 같은(유효한) 쿼리를 발견했습니다(교체할 때 Oracle/MSSQL에서도 작동함).=와 함께IN):

SELECT * from mytable WHERE (a, b)=(1,2)

와 같습니다.

SELECT * from mytable WHERE a=1 and b=2

MySQL 문서의 정의는 다음과 같습니다.

simple_expr:
  [...]
  | (expr [, expr] ...)
  [...]

이것은 뭐라고 부릅니까?사용에 대한 장단점이 있습니까?

다음을 사용하여 여러 열을 여러 값의 조합과 비교할 필요가 있을 때 매우 유용할 수 있습니다.IN():

 SELECT * FROM YourTable
 WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)

대신:

SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
      (col1 = 2 and col2 = 3) OR
      (col1 = 4 and col2 = 4) OR
      ....

두 쿼리의 실행 계획을 검토해 본 결과 오라클에서 그렇게 말할 수 있습니다(UsingIN()기본적으로 동일), 옵티마이저는 동일한 방식으로 평가하고 둘 다 지수를 사용합니다.

별도 조건:

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가 이 쿼리를 동일하게 평가할 것이라고 가정합니다.

행 생성자는 다른 맥락에서 합법적입니다.예를 들어, 다음 두 문장은 의미론적으로 동등합니다(optimizer에서 동일한 방식으로 처리됨).

그래서:

단점 - 일부 사람들은 덜 읽을 수 있지만 기본적으로 단점은 없습니다.

장점 - 코드가 적음, 여러 열을 사용하여 비교IN():

언급URL : https://stackoverflow.com/questions/38218030/what-is-the-difference-when-comparing-with-parentheses-where-a-b-1-2

반응형