복붙노트

[SQL] 대 = 같은 LIKE

SQL

대 = 같은 LIKE

SQL을 사용하는 경우, 대신 등의 WHERE 절에 =를 사용하여 어떤 이점이 있습니까?

특별한 운영하지 않고, LIKE과 = 같은, 권리인가?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.LIKE와 =이 다릅니다. LIKE는 검색 쿼리에서 사용하는 것 인 것이다. 또한 _ (단순 문자 와일드 카드) 및 % (멀티 문자 와일드 카드) 와일드 카드를 원하는 수 있습니다.

    LIKE와 =이 다릅니다. LIKE는 검색 쿼리에서 사용하는 것 인 것이다. 또한 _ (단순 문자 와일드 카드) 및 % (멀티 문자 와일드 카드) 와일드 카드를 원하는 수 있습니다.

    당신이 정확히 일치를 원하는 경우 = 사용되어야하며, 더 빨리 될 것입니다.

    이 사이트는 LIKE 설명

  4. ==============================

    4.이 복사본 / 대 '='성능 '과 같은'질문 SQL에 대한 내 다른 답변으로 붙여 넣을 수 있습니다 :

    이 복사본 / 대 '='성능 '과 같은'질문 SQL에 대한 내 다른 답변으로 붙여 넣을 수 있습니다 :

    MySQL은 5.5을 사용하여 개인 예 : 나는 내부는 2 표, 3 백만 행 중 하나와 만 행 일 사이에 가입했다.

    아래 (와일드 카드) 인덱스에 같은를 사용하는 경우, 그것은 30 초 걸렸다 :

    where login like '12345678'
    

    '설명'를 사용하여 내가 얻을 :

    에 '='에서 같은 쿼리를 사용하면 0.1 초 걸렸다 :

    where login ='12345678'
    

    '설명'사용 내가 얻을 :

    당신이 볼 수 있듯이 쿼리가 300 배 더 많은 시간이 걸렸습니다, 그래서 등 완전히 취소 된 인덱스가 추구합니다.

  5. ==============================

    5.공간을 후행 = 연산자를 무시하지만 LIKE하지 않습니다 : 한 가지 차이점은 - - 떨어져 LIKE와 함께 와일드 카드를 사용할 수있는 가능성에서 후행 공백입니다.

    공간을 후행 = 연산자를 무시하지만 LIKE하지 않습니다 : 한 가지 차이점은 - - 떨어져 LIKE와 함께 와일드 카드를 사용할 수있는 가능성에서 후행 공백입니다.

  6. ==============================

    6.데이터베이스 시스템에 따라 다릅니다.

    데이터베이스 시스템에 따라 다릅니다.

    일반적으로 특수 문자로, 예, = 및 LIKE은 동일합니다.

    일부 데이터베이스 시스템은, 그러나, 다른 사업자와 다르게 정렬 설정을 처리 할 수 ​​있습니다.

    예를 들어, 문자열에 =와 MySQL의 비교에 특수 문자가없는 같은 것은 동일합니다, 항상 대소 문자를 구별 기본적으로 있습니다. =이없는 동안 다른 RDBMS의 등에는 대소 문자를 구별하지 않습니다.

  7. ==============================

    7.varcharcol는 '포함'이 열에 대해 빈 셀이하지 않는 것을 당연하게 우리가 그것을 받아이 예를 들어,

    varcharcol는 '포함'이 열에 대해 빈 셀이하지 않는 것을 당연하게 우리가 그것을 받아이 예를 들어,

    select * from some_table where varcharCol = ''
    select * from some_table where varcharCol like ''
    

    두번째 프로그램 동안 0 로우 출력 전체 목록의 첫번째 결과. = 동안 필터 같은 역할 등을 엄격히 매치 경우이다. 필터는, 조건이없는 경우, 모든 데이터는 유효하다.

    같은 - 목적의 미덕에 의해 약간 느린 작동 VARCHAR와 유사한 데이터와 함께 사용하기위한 것입니다.

  8. ==============================

    8.당신이 정확히 일치하는 검색하면 모두 = 및 LIKE를 사용할 수 있습니다.

    당신이 정확히 일치하는 검색하면 모두 = 및 LIKE를 사용할 수 있습니다.

    당신은 "LIKE"을 사용하면, "="를 사용하면, SQL Server Management Studio를 두 번 같은 질문을함으로써이 자신을 확인할 수 있으며, - 사용 "="(정확히 일치하는 검색) 작은 조금 더 빨리이 경우입니다 다음 "쿼리"/ "실제 실행 계획 포함"을 사용.

    두 쿼리를 실행하고 당신은 두 번 결과를 확인, 플러스 두 개의 실제 실행 계획해야한다. 내 경우에는, 그들은 분할 50 % 50 % 대였다,하지만 "="실행 계획은 작은 "추정 하위 트리 비용"(당신이 왼쪽 가장 상자 "SELECT"가져가 이상 할 때 표시)이있다 - 그러나 다시, 그것은 정말 아니 큰 차이.

    당신이 당신의 LIKE 표현식에서 와일드 카드 검색을 시작할 때, 검색 성능이 dimish됩니다. 여전히 매우 빠르게 할 수있다 "LIKE 밀 %"를 검색 -가있는 경우 SQL Server는 해당 컬럼에 인덱스를 사용할 수 있습니다. SQL 서버이 검색을 만족시킬 수있는 유일한 방법은 전체 테이블 스캔을 수행하여 이후 "LIKE % 발현 %"를 검색하면, 끔찍하게 느립니다. 그래서 LIKE의 조심!

    즙을 짜고 난 찌꺼기

  9. ==============================

    9.사용 = 당신은 런타임에 쿼리를 작성 와일드 카드와 문자열에 특수 문자 충돌을 방지 할 수 있습니다.

    사용 = 당신은 런타임에 쿼리를 작성 와일드 카드와 문자열에 특수 문자 충돌을 방지 할 수 있습니다.

    이것은하지 않는 LIKE 절에 미끄러 수있는 모든 특수 와일드 카드 문자를 이스케이프 할 필요와 의도 된 결과를 생성하지 않음으로써 쉽게 프로그래머의 생활을합니다. 결국, = 99 % 유스 케이스 시나리오, 그것은 고통이 그들에게 모든 시간을 탈출해야하는 것입니다.

    90 년대에 눈을 롤

    나는 또한 약간 느린 용의자,하지만 난 패턴에는 와일드 카드가없는 경우는 상당한 의심.

  10. ==============================

    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. ==============================

    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. ==============================

    12.등을 키워드 의심 할 여지없이 부착 된 "성능 가격 태그"와 함께 제공됩니다. 즉, 잠재적으로 쿼리에 사용되는 와일드 카드 문자를 포함 할 수있는 입력 필드가 있다면, 내가 입력이 와일드 카드 중 하나가 포함 된 경우에만 LIKE를 사용하는 것이 좋습니다 것이라고 말했다. 그렇지 않으면, 비교에 표준 동일한을 사용합니다.

    등을 키워드 의심 할 여지없이 부착 된 "성능 가격 태그"와 함께 제공됩니다. 즉, 잠재적으로 쿼리에 사용되는 와일드 카드 문자를 포함 할 수있는 입력 필드가 있다면, 내가 입력이 와일드 카드 중 하나가 포함 된 경우에만 LIKE를 사용하는 것이 좋습니다 것이라고 말했다. 그렇지 않으면, 비교에 표준 동일한을 사용합니다.

    친애하는...

  13. ==============================

    13.정말 당신이 쿼리가 수행 할 작업에 온다. 당신이 정확하게 일치를 의미하는 경우 = 사용합니다. 당신이 흐려 일치를 의미하는 경우, LIKE를 사용합니다. 당신이 무슨 뜻인지 말하는 것은 보통 코드와 좋은 정책입니다.

    정말 당신이 쿼리가 수행 할 작업에 온다. 당신이 정확하게 일치를 의미하는 경우 = 사용합니다. 당신이 흐려 일치를 의미하는 경우, LIKE를 사용합니다. 당신이 무슨 뜻인지 말하는 것은 보통 코드와 좋은 정책입니다.

  14. ==============================

    14.와일드 카드와 함께하는 '와 같은'오라클에서는 '같음'과 동일한 결과를 반환하지만, 추가 처리를 필요로 할 수있다. 리터럴을 사용하는 경우,하지만 바인드 변수를 사용하지 않을 경우 톰 카이트에 따르면, 오라클은 '등호'로 와일드 카드로 '와 같은'는 처리합니다.

    와일드 카드와 함께하는 '와 같은'오라클에서는 '같음'과 동일한 결과를 반환하지만, 추가 처리를 필요로 할 수있다. 리터럴을 사용하는 경우,하지만 바인드 변수를 사용하지 않을 경우 톰 카이트에 따르면, 오라클은 '등호'로 와일드 카드로 '와 같은'는 처리합니다.

  15. ==============================

    15.= LIKE과는 같지 않다;

    = LIKE과는 같지 않다;

  16. from https://stackoverflow.com/questions/543580/equals-vs-like by cc-by-sa and MIT license