[SQL] 대 = 같은 LIKE
SQL대 = 같은 LIKE
SQL을 사용하는 경우, 대신 등의 WHERE 절에 =를 사용하여 어떤 이점이 있습니까?
특별한 운영하지 않고, LIKE과 = 같은, 권리인가?
해결법
-
==============================
1.LIKE와 = 다른 사업자입니다. 대부분의 대답은 여기에 이러한 연산자 사이의 유일한 차이는없는 와일드 카드 지원에 초점을!
LIKE와 = 다른 사업자입니다. 대부분의 대답은 여기에 이러한 연산자 사이의 유일한 차이는없는 와일드 카드 지원에 초점을!
= 숫자 및 문자열에 동작하는 비교 연산자이다. 문자열을 비교하면, 비교 연산자는 전체 문자열을 비교한다.
등을 문자 단위로 비교하는 문자열 연산자이다.
복잡한 문제에 두 연산자는 비교의 결과에 중요한 영향을 미칠 수있는 정렬을 사용합니다.
이러한 연산자는 분명히 다른 결과를 어디에서의 첫 번째 예를 식별 할 수 있습니다. 나 MySQL의 설명서를 인용 할 수 있습니다 :
mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci; +-----------------------------------------+ | 'ä' LIKE 'ae' COLLATE latin1_german2_ci | +-----------------------------------------+ | 0 | +-----------------------------------------+ mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci; +--------------------------------------+ | 'ä' = 'ae' COLLATE latin1_german2_ci | +--------------------------------------+ | 1 | +--------------------------------------+
그 의미는 MySQL 매뉴얼이 페이지는 문자열 비교 함수라고하며, = 논의되지 않는다는 것을 참고, = 엄격하게 문자열 비교 함수가 아닙니다 바랍니다.
는 SQL 표준 § 8.2 문자열을 비교하는 방법을 = 설명 :
(강조했다.)
이것은 무엇을 의미 하는가? 그것은 문자열을 비교할 때, = 연산자 현재 정렬 주위 단지 얇은 래퍼 것을 의미한다. 데이터 정렬은 문자열을 비교하기위한 다양한 규칙이있는 라이브러리입니다. 여기에서 MySQL 바이너리 데이터 정렬의 예입니다 :
static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)), const uchar *s, size_t slen, const uchar *t, size_t tlen, my_bool t_is_prefix) { size_t len= MY_MIN(slen,tlen); int cmp= memcmp(s,t,len); return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen); }
이 특정 데이터 정렬 (이 "진"이라고 이유입니다 - 그것은 문자열에 특별한 의미를 부여하지 않는) 바이트 단위로 비교 발생합니다. 다른 데이터 정렬은 고급 비교를 제공 할 수 있습니다.
예를 들어, 다음은 대소 문자를 구분 비교를 지원하는 UTF-8 정렬입니다. 코드는 여기에 붙여 넣기 만 해당 링크로 이동 my_strnncollsp_utf8mb4의 몸을 읽을 너무 깁니다 (). 이 정렬은 한 번에 다수의 바이트를 처리 할 수 있으며 (이 경우를 구분 비교) 다양한 변환을 적용 할 수있다. = 연산자 완전히 정렬의 변화들로부터 추출된다.
는 SQL 표준 § 8.5 LIKE 문자열을 비교하는 방법을 설명합니다 :
(강조했다.)
이것은 그래서 그것을 무너 뜨리는하자, 꽤 장황하다. II 및 III 항목 각각 와일드 카드 _ % 및 참조. P는 어떤 와일드 카드를 포함하지 않는 경우에만 항목 IV이 적용됩니다. 이것은 OP로 인한이자의 경우입니다.
이 경우, 현재의 정렬을 사용하여 P의 각 서브 스트링에 대하여 M의 각 "문자열"(개별 문자)를 비교한다.
결론은 문자열을 비교하는 경우 등은 한 번에 한 문자를 비교하면서 = 전체 문자열을 비교한다는 것이다. 두 비교는 현재 데이터 정렬을 사용합니다. 이 글에서 첫번째 예에서 입증되는 바와 같이,이 차이는, 일부 경우에 상이한 결과를 이끈다.
당신은 어느 하나를 사용해야합니까? 당신이 사용 사례에 대한 정확한 년대를 사용할 필요가 - 아무도 당신을 말할 수 있습니다. 조기에 비교 연산자를 전환하여 최적화하지 마십시오.
-
==============================
2.등호 (=) 연산자는 "비교 연산자가 어떤지를 비교하여 두 값"이다. 방정식의 양쪽이 동일하지 않는 즉, SQL 문에, 그것은 사실 반환하지 않습니다. 예를 들면 :
등호 (=) 연산자는 "비교 연산자가 어떤지를 비교하여 두 값"이다. 방정식의 양쪽이 동일하지 않는 즉, SQL 문에, 그것은 사실 반환하지 않습니다. 예를 들면 :
SELECT * FROM Store WHERE Quantity = 200;
등의 연산자 "를 구현하는 패턴 일치 비교"시도가 일치하는 것을 "와일드 카드 문자를 포함하는 패턴 문자열에 대한 문자열 값을." 예를 들면 :
SELECT * FROM Employees WHERE Name LIKE 'Chris%';
LIKE는 일반적으로 단지 문자열과 빠른 등호 (내가 믿는)입니다 함께 사용됩니다. is 연산자 취급을 리터럴 문자로 와일드 카드 문자를 동일합니다. 다음과 같이 반환 된 결과의 차이는 다음과 같습니다
SELECT * FROM Employees WHERE Name = 'Chris';
과
SELECT * FROM Employees WHERE Name LIKE 'Chris';
일반적으로 더 이상 자사의 패턴 매치로 걸릴 것 등을 사용하지만, 같은 결과를 반환합니다. 하나,
SELECT * FROM Employees WHERE Name = 'Chris%';
과
SELECT * FROM Employees WHERE Name LIKE 'Chris%';
사용 여기서 "="다른 결과를 반환 할 것 "크리스 %"만 결과에 결과가 반환되는 등의 연산자는 "크리스"로 시작하는 무엇이든을 반환합니다.
희망이 도움이. 좋은 정보는 여기에서 찾을 수 있습니다.
-
==============================
3.LIKE와 =이 다릅니다. LIKE는 검색 쿼리에서 사용하는 것 인 것이다. 또한 _ (단순 문자 와일드 카드) 및 % (멀티 문자 와일드 카드) 와일드 카드를 원하는 수 있습니다.
LIKE와 =이 다릅니다. LIKE는 검색 쿼리에서 사용하는 것 인 것이다. 또한 _ (단순 문자 와일드 카드) 및 % (멀티 문자 와일드 카드) 와일드 카드를 원하는 수 있습니다.
당신이 정확히 일치를 원하는 경우 = 사용되어야하며, 더 빨리 될 것입니다.
이 사이트는 LIKE 설명
-
==============================
4.이 복사본 / 대 '='성능 '과 같은'질문 SQL에 대한 내 다른 답변으로 붙여 넣을 수 있습니다 :
이 복사본 / 대 '='성능 '과 같은'질문 SQL에 대한 내 다른 답변으로 붙여 넣을 수 있습니다 :
MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.
아래 (와일드 카드) 인덱스에 같은를 사용하는 경우, 그것은 30 초 걸렸다 :
where login like '12345678'
'설명'를 사용하여 내가 얻을 :
에 '='에서 같은 쿼리를 사용하면 0.1 초 걸렸다 :
where login ='12345678'
'설명'사용 내가 얻을 :
당신이 볼 수 있듯이 쿼리가 300 배 더 많은 시간이 걸렸습니다, 그래서 등 완전히 취소 된 인덱스가 추구합니다.
-
==============================
5.공간을 후행 = 연산자를 무시하지만 LIKE하지 않습니다 : 한 가지 차이점은 - - 떨어져 LIKE와 함께 와일드 카드를 사용할 수있는 가능성에서 후행 공백입니다.
공간을 후행 = 연산자를 무시하지만 LIKE하지 않습니다 : 한 가지 차이점은 - - 떨어져 LIKE와 함께 와일드 카드를 사용할 수있는 가능성에서 후행 공백입니다.
-
==============================
6.데이터베이스 시스템에 따라 다릅니다.
데이터베이스 시스템에 따라 다릅니다.
일반적으로 특수 문자로, 예, = 및 LIKE은 동일합니다.
일부 데이터베이스 시스템은, 그러나, 다른 사업자와 다르게 정렬 설정을 처리 할 수 있습니다.
예를 들어, 문자열에 =와 MySQL의 비교에 특수 문자가없는 같은 것은 동일합니다, 항상 대소 문자를 구별 기본적으로 있습니다. =이없는 동안 다른 RDBMS의 등에는 대소 문자를 구별하지 않습니다.
-
==============================
7.varcharcol는 '포함'이 열에 대해 빈 셀이하지 않는 것을 당연하게 우리가 그것을 받아이 예를 들어,
varcharcol는 '포함'이 열에 대해 빈 셀이하지 않는 것을 당연하게 우리가 그것을 받아이 예를 들어,
select * from some_table where varcharCol = '' select * from some_table where varcharCol like ''
두번째 프로그램 동안 0 로우 출력 전체 목록의 첫번째 결과. = 동안 필터 같은 역할 등을 엄격히 매치 경우이다. 필터는, 조건이없는 경우, 모든 데이터는 유효하다.
같은 - 목적의 미덕에 의해 약간 느린 작동 VARCHAR와 유사한 데이터와 함께 사용하기위한 것입니다.
-
==============================
8.당신이 정확히 일치하는 검색하면 모두 = 및 LIKE를 사용할 수 있습니다.
당신이 정확히 일치하는 검색하면 모두 = 및 LIKE를 사용할 수 있습니다.
당신은 "LIKE"을 사용하면, "="를 사용하면, SQL Server Management Studio를 두 번 같은 질문을함으로써이 자신을 확인할 수 있으며, - 사용 "="(정확히 일치하는 검색) 작은 조금 더 빨리이 경우입니다 다음 "쿼리"/ "실제 실행 계획 포함"을 사용.
두 쿼리를 실행하고 당신은 두 번 결과를 확인, 플러스 두 개의 실제 실행 계획해야한다. 내 경우에는, 그들은 분할 50 % 50 % 대였다,하지만 "="실행 계획은 작은 "추정 하위 트리 비용"(당신이 왼쪽 가장 상자 "SELECT"가져가 이상 할 때 표시)이있다 - 그러나 다시, 그것은 정말 아니 큰 차이.
당신이 당신의 LIKE 표현식에서 와일드 카드 검색을 시작할 때, 검색 성능이 dimish됩니다. 여전히 매우 빠르게 할 수있다 "LIKE 밀 %"를 검색 -가있는 경우 SQL Server는 해당 컬럼에 인덱스를 사용할 수 있습니다. SQL 서버이 검색을 만족시킬 수있는 유일한 방법은 전체 테이블 스캔을 수행하여 이후 "LIKE % 발현 %"를 검색하면, 끔찍하게 느립니다. 그래서 LIKE의 조심!
즙을 짜고 난 찌꺼기
-
==============================
9.사용 = 당신은 런타임에 쿼리를 작성 와일드 카드와 문자열에 특수 문자 충돌을 방지 할 수 있습니다.
사용 = 당신은 런타임에 쿼리를 작성 와일드 카드와 문자열에 특수 문자 충돌을 방지 할 수 있습니다.
이것은하지 않는 LIKE 절에 미끄러 수있는 모든 특수 와일드 카드 문자를 이스케이프 할 필요와 의도 된 결과를 생성하지 않음으로써 쉽게 프로그래머의 생활을합니다. 결국, = 99 % 유스 케이스 시나리오, 그것은 고통이 그들에게 모든 시간을 탈출해야하는 것입니다.
90 년대에 눈을 롤
나는 또한 약간 느린 용의자,하지만 난 패턴에는 와일드 카드가없는 경우는 상당한 의심.
-
==============================
10.성능에 대한 원래의 질문을 해결하기 위해서는 인덱스 활용에 온다. 간단한 테이블 스캔이 발생할 때, "등"및 "="과 동일하다. 인덱스가 관여 할 때, LIKE 절 형성 방법에 따라 달라집니다. 보다 구체적으로, 와일드 카드 (들)의 위치는 무엇인가?
성능에 대한 원래의 질문을 해결하기 위해서는 인덱스 활용에 온다. 간단한 테이블 스캔이 발생할 때, "등"및 "="과 동일하다. 인덱스가 관여 할 때, LIKE 절 형성 방법에 따라 달라집니다. 보다 구체적으로, 와일드 카드 (들)의 위치는 무엇인가?
다음을 고려하세요:
CREATE TABLE test( txt_col varchar(10) NOT NULL ) go insert test (txt_col) select CONVERT(varchar(10), row_number() over (order by (select 1))) r from master..spt_values a, master..spt_values b go CREATE INDEX IX_test_data ON test (txt_col); go --Turn on Show Execution Plan set statistics io on --A LIKE Clause with a wildcard at the beginning DBCC DROPCLEANBUFFERS SELECT txt_Col from test where txt_col like '%10000' --Results in --Table 'test'. Scan count 3, logical reads 15404, physical reads 2, read-ahead reads 15416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. --Index SCAN is 85% of Query Cost --A LIKE Clause with a wildcard in the middle DBCC DROPCLEANBUFFERS SELECT txt_Col from test where txt_col like '1%99' --Results in --Table 'test'. Scan count 1, logical reads 3023, physical reads 3, read-ahead reads 3018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. --Index Seek is 100% of Query Cost for test data, but it may result in a Table Scan depending on table size/structure --A LIKE Clause with no wildcards DBCC DROPCLEANBUFFERS SELECT txt_Col from test where txt_col like '10000' --Results in --Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. --Index Seek is 100% of Query Cost GO --an "=" clause = does Index Seek same as above DBCC DROPCLEANBUFFERS SELECT txt_Col from test where txt_col = '10000' --Results in --Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. --Index Seek is 100% of Query Cost GO DROP TABLE test
"LIKE"대 사용 "="경우에도 쿼리 계획의 창조에서 무시할 차이가있을 수 있습니다.
-
==============================
11.와일드 카드 외에, AND = LIKE 차이점은 SQL 서버의 종류와 칼럼 형의 양쪽에 의존 할 것이다.
와일드 카드 외에, AND = LIKE 차이점은 SQL 서버의 종류와 칼럼 형의 양쪽에 의존 할 것이다.
이 예제를 보자
CREATE TABLE testtable ( varchar_name VARCHAR(10), char_name CHAR(10), val INTEGER ); INSERT INTO testtable(varchar_name, char_name, val) VALUES ('A', 'A', 10), ('B', 'B', 20); SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A' UNION ALL SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A ' UNION ALL SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A' UNION ALL SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A ' UNION ALL SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A' UNION ALL SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A ' UNION ALL SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A' UNION ALL SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '
-
==============================
12.등을 키워드 의심 할 여지없이 부착 된 "성능 가격 태그"와 함께 제공됩니다. 즉, 잠재적으로 쿼리에 사용되는 와일드 카드 문자를 포함 할 수있는 입력 필드가 있다면, 내가 입력이 와일드 카드 중 하나가 포함 된 경우에만 LIKE를 사용하는 것이 좋습니다 것이라고 말했다. 그렇지 않으면, 비교에 표준 동일한을 사용합니다.
등을 키워드 의심 할 여지없이 부착 된 "성능 가격 태그"와 함께 제공됩니다. 즉, 잠재적으로 쿼리에 사용되는 와일드 카드 문자를 포함 할 수있는 입력 필드가 있다면, 내가 입력이 와일드 카드 중 하나가 포함 된 경우에만 LIKE를 사용하는 것이 좋습니다 것이라고 말했다. 그렇지 않으면, 비교에 표준 동일한을 사용합니다.
친애하는...
-
==============================
13.정말 당신이 쿼리가 수행 할 작업에 온다. 당신이 정확하게 일치를 의미하는 경우 = 사용합니다. 당신이 흐려 일치를 의미하는 경우, LIKE를 사용합니다. 당신이 무슨 뜻인지 말하는 것은 보통 코드와 좋은 정책입니다.
정말 당신이 쿼리가 수행 할 작업에 온다. 당신이 정확하게 일치를 의미하는 경우 = 사용합니다. 당신이 흐려 일치를 의미하는 경우, LIKE를 사용합니다. 당신이 무슨 뜻인지 말하는 것은 보통 코드와 좋은 정책입니다.
-
==============================
14.와일드 카드와 함께하는 '와 같은'오라클에서는 '같음'과 동일한 결과를 반환하지만, 추가 처리를 필요로 할 수있다. 리터럴을 사용하는 경우,하지만 바인드 변수를 사용하지 않을 경우 톰 카이트에 따르면, 오라클은 '등호'로 와일드 카드로 '와 같은'는 처리합니다.
와일드 카드와 함께하는 '와 같은'오라클에서는 '같음'과 동일한 결과를 반환하지만, 추가 처리를 필요로 할 수있다. 리터럴을 사용하는 경우,하지만 바인드 변수를 사용하지 않을 경우 톰 카이트에 따르면, 오라클은 '등호'로 와일드 카드로 '와 같은'는 처리합니다.
-
==============================
15.= LIKE과는 같지 않다;
= LIKE과는 같지 않다;
from https://stackoverflow.com/questions/543580/equals-vs-like by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복] (0) | 2020.03.15 |
---|---|
[SQL] MySQL의 쿼리에서, 왜 사용하는 대신 어디 조인? (0) | 2020.03.15 |
[SQL] 널 열 고유 제한 조건을 만들기 (0) | 2020.03.15 |
[SQL] MySQL의에서 일괄 삽입 작업을 수행하는 방법 (0) | 2020.03.15 |
[SQL] 무한 행 오프셋 MYSQL (0) | 2020.03.15 |