본문 바로가기

SQL/Mysql

MYSQL 연산자/like연산자/between연산자/in연산자 (REAL MY SQL 정리)

728x90
반응형

1. 연산자

 

1-1. 동등비교 <=>(양쪽모두 null-> true반환, 한쪽만 null -> false반환), =

1-2. 부정비교(<>, !=, !(false->0, true->1)

1-3. and(&&)와 or(||) 연산자 

set sql_mode='pipes_as_concat'; --||을 oracle연산자와 동일하게 변경
select 'abc'||'def' as concated_string; -- 결과값 abcdef

1-4. 나누기(/, div)와 나머지(mod, %) 연산자

1-5. regexp연산자

   ex> 'x','y','z'문자로 시작하는 검증 표현식 

   select 'abc' regexp '^[x-z]';

   - 시작 문자패턴 검증식: ^

   - 끝 문자패턴 검증식: $

   - 문자그룹표시 [] - 이중 하나만있어도 결과값 뱉어냄 ex> [x-z] -> x or y or z중 한글자만 있어도 

   -문자열 그룹표시 () - 이중 모두있어야 결과값 뱉어냄 ex> (xyz) -> xyz모두 있어야 

   - 또는 | - abc|xyz abc또는 xyz

   - 문자개수 . ->'...' -> 3개의 문자로 구성된 문자열 찾음 

   - * : 이 기호앞에 표시된 정규 표현식이 0 또는 1번 이상 반복될 수 있다는 표시

   - +: 이 기호앞에 표시된 정규 표현식이 1번이상 반복될 수 있다는 표시

   -?: 이 기호앞에 표시된 정규표현식이 0 또는 1번만 올 수 있다는 표시 

   - 특징: regexp연산자조건 비교는 인덱스 레인지스캔을 사용할 수 없다. 따라서 where조건절에 regexp연산자를 사용한 조건을 단독으로 사용하는것은 성능상 좋지 않다. 가급적 범위를 줄일 수 있는 조건과 regexp연산자를 사용하길 권한다.



2. like연산자

 

- 특징: regexp연산자는 인덱스를 전혀 사용하지 못한다는 단점이있지만 like연산자는 인덱스를 이용해 처리할 수 있다는 장점이있다. '%'(0또는 1개이상의 모든 문자에 일치), '_'(정확히 1개의 문자에 일치) 가 전부이며 regexp는 대상 문자열의 일부만 일치해도 true를 반환하는 반면, like는 항상 문자열의 처음부터 끝까지 일치하는 경우에만 true를 반환한다. 

- escape문의 사용: select 'abc' like 'a/%' escape '/';

- 와일드카드가 검색어 뒤쪽에있다면 인덱스 레인지 스캔으로 사용할 수 있지만, 검색어 앞쪽에 있다면 인덱스 레인지스캔을 사용할 수 없다. 

 



3. between 연산자

 

- 범위를 읽어야하는 연산자 between은 모든 인덱스의 범위를 검색해야만 한다. (선형으로 인덱스 검색) 


 


4. in 연산자

 

- in 연산자가 서브쿼리인경우  상수가아닌경우는 상당히 느려질 수 있다. 

- in 연산자는 null레코드를 검색할순 없다. (<=>, is null 사용)

- not in의 실행계획은 인덱스 풀스캔으로 표시된다.  (부정형비교라 인덱스로 이용해 범위줄이는 조건으로 사용불가)

728x90