반응형
괄호와 비교했을 때 어떤 차이가 있습니까? 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
반응형
'sourcecode' 카테고리의 다른 글
os.system() 호출에서 벗어나는 방법? (0) | 2023.09.11 |
---|---|
ctrl+c를 사용하여 python 중지 (0) | 2023.09.11 |
C#에서 문자열을 전화번호로 포맷하는 방법 (0) | 2023.09.11 |
문자열의 특정 문자 뒤에 있는 문자를 제거한 다음 부분 문자열을 제거하시겠습니까? (0) | 2023.09.11 |
분기를 병합한 후 삭제해야 합니까? (0) | 2023.09.11 |