7. 쿼리 작성 및 최적화 (ANSI SQL명령)
7. 쿼리 작성 및 최적화
-
- 키워드는 대소문자를 특별히 구분하지 않고 사용 할 수 있다.
- 예약어를 테이블 명이나 칼럼명으로 사용하려면 `index` 처럼 하면 되지만, 쓰지 말자.
- 숫자 형변환 (비교 대상의 타입이 다를 경우는 자동 형 변환이 발생하고, 숫자를 우선시해서 문자열을 숫자로 바꾸는 작업을 먼저함)
- SELECT * FROM tab_test WHERE number_column = '10001'
10001을 상수로만 변경하면 되므로 성능에 이슈가 없다.
- SELECT * FROM tab_test WHERE string_column = 10001
sring_column을 항상 상수로 변경하려므로(숫자우선) 성능상 이슈가 발생, 그리고 숫자로 변경안되는 문자열도 있어서 쿼리 오류가 발생할수도 있다.
- 날자 (MySQL은 자동으로 DATE, DATETIME으로 변환하기 때문에 STR_TO_DATE()같은 함수를 사용하지 않아도 된다)
SELECT * FROM dept_emp WHERE from_date = '2011-04-29'
SELECT * FROM dept_emp WHERE from_date=STR_TO_DATE('2011-04-29', '%Y-%m-%d');
- 불리언 (BOOL, BOOLEAN이 있지만, TINYINT에 대한 동의어 일 뿐이다)
- 동등비교 <=>
= 연산자와 같으며 부가적으로 NULL 에 대한 비교도 수행한다. NULL-SAFE라고 한다
SELECT 1=1, NULL=NULL, 1=NULL, 1 <=> 1, NULL <=> NULL, 1 <=> NULL; ---> 1, NULL, NULL, 1, 1, 0
<=>는 한쪽만 NULL이면 false를 반환한다.
- LIKE연산
인덱스를 사용가능하다.
와일드카드인 %, _가 뒤에 있다면 인덱스 레인지 스캔 가능, 앞에 있다면 사용할 수 없다.
- IN 연산
여러개의 값에 대해 동등 비교 연산을 수행., 여러개의 값이 비교되지만, 범위가 아닌 여러번의 동등 비교로 실행 => 일반적으로 빠르다.
IN의 입력값이 서브 쿼리라면 상당히 느려질 수 있다.