출처 : http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21700&cat1=12&cat2=351&cat3=363&lang=k
12.1.3. 비교 함수와 연산자
1
(TRUE
), 0
(FALSE
), 또는 NULL
가 된다. 이러한 연산은 숫자 및 스트링에서 실행된다. 스트링은 자동으로 숫자로 변환되며 필요할 경우
에는 숫자를 스트링으로 변환 시킬 수도 있다.
LEAST()
및 GREATEST()
와 같은 함수들)은 1
(
TRUE
), 0
(FALSE
), 또는 NULL
이 아닌 값 자체를 리턴 한다. 하지만, 이러한 함수들은 Section 12.1.2, “수식 계산에서의 타입 변환”에서 설명한 규칙에 따
라서 실행된 비교 연산에 근거하여 값을 리턴한다.
CAST()
함수를 사용하면 된다. 스트링 값은
CONVERT()
을 사용하면 서로 다른 문자 셋으로 변환 시킬 수가 있다. Section 12.8, “캐스트(Cast) 함수 및 연산자”를 참조.
문자 셋을 사용한다. 디폴트는
latin1
(cp1252 West European)이며, 이것은 영어에서도 잘 동작을 한다.
=
같음(equal):
mysql> SELECT 1 = 0;
-> 0
mysql> SELECT '0' = 0;
-> 1
mysql> SELECT '0.0' = 0;
-> 1
mysql> SELECT '0.01' = 0;
-> 0
mysql> SELECT '.01' = 0.01;
-> 1
<=>
NULL
-세이프(safe) 등호. 이 연산자는 =
연산자와 같은 등식 비교 연산
을 실행하지만, 양쪽의 연산자가 모두 NULL
이면, NULL
대신에 1을, 그리고
하나의 연산자만 NULL
이면, NULL
대신에 0 을 리턴한다.
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
<>
,!=
같지 않음(Not equal):
mysql> SELECT '.01' <> '0.01';
-> 1
mysql> SELECT .01 <> '0.01';
-> 0
mysql> SELECT 'zapp' <> 'zappp';
-> 1
<=
작거나 같음:
mysql> SELECT 0.1 <= 2;
-> 1
<
보다 작음:
mysql> SELECT 2 < 2;
-> 0
>=
크거나 같음:
mysql> SELECT 2 >= 2;
-> 1
>
보다 큼:
mysql> SELECT 2 > 2;
-> 0
IS boolean_value
,IS NOT boolean_value
불리안 값에 대응해서 값을 테스트 하는데, 여기에서 boolean_value 은 TRUE
, FALSE
, or UNKNOWN
이 될 수 있다.
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
-> 1, 1, 1
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
IS [NOT] boolean_value
신텍스는 MySQL 5.0.2에서 추가 되었다.
IS NULL
,IS NOT NULL
값이 NULL
인지 아닌지를 테스트
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0, 0, 1
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1, 1, 0
ODBC 프로그램과 잘 동작을 하도록 하기 위해서, MySQL은IS NULL
을
사용할 때 아래와 같은 추가적인 기능들을 지원한다:
- 값을 생성한 다음에 곧바로 아래와 같은 명령문을 입력하면 가장
최근의AUTO_INCREMENT
값을 가지고 있는 열을 찾을 수가 있다:
o SELECT * FROM tbl_name WHERE auto_col IS NULLNULL
이러한 동작은 SQL_AUTO_IS_NULL=0
로 설정을 하면 비 활성화
시킬 수가 있다. Section 13.5.3, “SET
신텍스”를 참조.
NOT NULL
로 선언된DATE
및DATETIME
컬럼에 대해서는, 아래와
같은 명령문을 사용하면 특수 날짜인'0000-00-00'
을 찾을 수가 있다:
o SELECT * FROM tbl_name WHERE date_column IS NULL
이것은 ODBC가 '0000-00-00'
와 같은 날짜 값을 지원하지 않기
때문에 어떤 경우의 어플리케이션을 실행하기 위해서 필요할 때가 있다.
expr
BETWEEN min AND max
만일 expr 가 min 보다 크거나 같고 expr 가 max 보다 작거나 같으면, BETWEEN
은 1
을 리턴하고, 그렇지 않으면 0
을 리턴 한다. 이것은 모든 인수가 동일한 타입일
경우의 수식 (min <= expr AND expr <= max)
과 같다. 그렇지 않을 경우, 타입 변환이
Section 12.1.2, “수식 계산에서의 타입 변환”에서 설명한 방식에 따라서 실행되지만,
세 가지 인수 모두에 적용된다.
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
expr
NOT BETWEEN min AND max
이것은 NOT (expr BETWEEN min AND max)
과 동일하다.
COALESCE(value,...)
리스트에 있는 첫 번째 논(non)-NULL
값을 리턴하거나, 또는 논(non)-NULL
값이
없을 경우에는 NULL
을 리턴한다.
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
GREATEST(value1,value2,...)
두 개 이상의 인수를 사용하면, 그 중에 가장 큰 인수 값을 리턴 한다. 인수들은 LEAST()
에서 적용하는 규칙과 같은 것을 사용해서 비교가 된다.
mysql> SELECT GREATEST(2,0);
-> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> SELECT GREATEST('B','A','C');
-> 'C'
MySQL 5.0.13 이전 버전에서는, GREATEST()
은 모든 인수가 NULL
일 경우에만 NULL
을 리턴한다. 5.0.13 이후에는, 인수 중의 하나가 NULL
이면 NULL
을 리턴한다.
expr
IN (value,...)
만일 expr 이 IN
리스트에 있는 값들 중의 하나와 같게 되면 1을, 그렇지 않으면 0 을
리턴한다. 만일 모든 값이 상수라면, 그 값들은 expr 의 타입에 따라서 값이 계산된
후에 정렬이 된다. 그런 다음에, 아이템에 대한 검색은 바이너리 검색을 통해서
실행된다. 이것은, 만일 This means IN
의 값 리스트가 전체적으로 상수로 구성되어
있다면 IN
이 매우 빠르다는 것을 의미하는 것이다. 그렇지 않을 경우에는,
Section 12.1.2, “수식 계산에서의 타입 변환”에서 설명한 규칙에 따라서 타입 변환이
일어나지만, 모든 인수에 적용이 된다.
mysql> SELECT 2 IN (0,3,5,'wefwf');
-> 0
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
-> 1
IN
리스트에 있는 값의 번호는 max_allowed_packet
값에 의해서만 한정이 된다.
표준 SQL을 따르기 위해서, IN
은 왼쪽 부분의 수식이 NULL
일 경우 뿐만 아니라,
리스트에서 매치되는 것을 발견하지 못하고 리스트에 있는 수식 중의 하나가 NULL
일
경우에도 NULL
을 리턴한다. IN()
신텍스는 특정 타입의 서브 쿼리를 작성할 때에도
사용할 수가 있다.
Section 13.2.8.3, “ANY
, IN
, 그리고 SOME
을
사용하는
서브
쿼리
”를 참조.
expr
NOT IN (value,...)
NOT (expr IN (value,...))
과 동일한 것임.
ISNULL(expr)
만일 expr 이 NULL
이라면, ISNULL()
은 1
을, 그렇지 않을 경우라면 0
을 리턴한다.
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
can be used instead of =
to test whether 어떤 값이 NULL
인지 아닌지를 테스트
하기 위해서 = 대신에 ISNULL()
을 사용할 수도 있다. (= 를 사용해서 어떤 값을 NULL
과 비교하면 항상 거짓(false)이 나온다.) ISNULL()
함수는 IS NULL
비교 연산자와 함께 특정 동작을 공유한다. IS NULL
에 대한 설명을 참조할 것.
INTERVAL(N,N1,N2,N3,...)
N < N1 일 경우에는 0 을, N < N2 과 같은 순서일 경우에는 1 을, 또는 N 이 NULL
이면 -1을 리턴한다. 모든 인수는 정수로 다루어진다. 이 함수에 대해서는
N1 < N2 < N3 < ...
< Nn 이 제대로 동작 되어야 한다. 그 이유는 여기에서는
바이너리 검색이 사용되기 때문이다.
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
LEAST(value1,value2,...)
두 개 이상의 인수를 사용하면, 가장 작은 인수 값을 리턴한다.
인수들은 아래의 규칙에 따라서 비교가 된다:
- 만일 리턴 값이
INTEGER
문맥에서 사용되거나 또는 모든 인수가 정수
값이라면, 그 인수들은 정수로 비교가 된다. - 만일 리턴 값이
REAL
문맥에서 사용되거나 또는 모든 인수가 실수 값
(real value)이라면, 인수들은 실수(real)로 비교된다. - 만일 어떤 인수가 문자 크기에 민감한 스트링이라면, 그 인수는 문자
크기를 구분하는 스트링으로 비교가 된다. - 이외의 모든 경우에는, 인수들은 문자 크기와는 상관없는 스트링으로
비교가 된다.
MySQL 5.0.13 이전의 경우, LEAST()
은 모든 인수가 NULL
일 경우에만 NULL
을 리턴한다. 5.0.13 이후에는, 어떤 인수가 NULL
이면 NULL
을 리턴한다.
mysql> SELECT LEAST(2,0);
-> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> SELECT LEAST('B','A','C');
-> 'A'
위의 변환 규칙은 어떤 경계 라인(borderline)의 경우에는 예상하지 못한
결과를 만들 수도 있다는 점을 알아 두기 바란다:
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);
-> -9223372036854775808
위의 결과가 나오는 이유는, MySQL이 9223372036854775808.0
을 정수 문맥에서
읽기 때문이다. 위의 값을 가지기 위해서는 정수 표현식이 좋지 않기 때문에,
이것을 부호화된 정수 타입으로 만들었다.