[원본] http://randa.tistory.com/
MySQL에서 비교연산자는 1(TRUE), 0(FALSE), NULL값 또는 연산에 대한 결과를 리턴한다. 이 포스팅에서는 비교연산자의 설명 및 예제를 설명하도록 한다.
1. BETWEEN min AND max
해당 연산자는 AND 좌우의 값을 포함한 범위안에 값이 있는지를 체크한다. 이는 수식으로 "expr >= ... AND expr <= ..." 동일한 결과를 나타낸다.
1 2 3 4 5 | SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1; SELECT 1 BETWEEN 2 AND 3; SELECT 'b' BETWEEN 'a' AND 'c' ; SELECT 2 BETWEEN 2 AND '3' ; SELECT 2 BETWEEN 2 AND 'x-3' ; |
1line - BETWEEN은 반드시 범위 값 중 작은게 왼쪽 큰게 오른쪽에 있어야 한다. 따라서 2는 1~3범위 안에 있음으로
2 BETWEEN 1 AND 3은 1을 리턴하고, 2 BETWEEN 3 and 1은 비교대상 중 우측이 더 작음으로 0을 리턴한다.
2line - 1은 2~3 범위안에 없기 때문에 0을 리턴한다.
3line - a~c중에는 b가 있기때문에 1이 리턴된다. BETWEEN은 숫자 뿐만 아니라 문자도 비교 가능한 것을 알 수 있다.
4line - 범위 중 3을 '' 로 묶어 문자열로 치환하였으나, 숫자만이 존재 할 경우 내부적으로 숫자로 취급한다. 따라서 2~3중에는
2가 포함되어 있기에 1을 리턴한다.
5line - 숫자와 문자열의 범위를 주었다. 이 경우 정상적으로 값을 취할 수 없기 때문에 0을 리턴한다. 5line의 예제는 비교연산
을 위해서는 동일한 형태의 데이터 타입끼리 비교를 해야 정상적인 결과를 줌을 알 수 있다.
2. COALESCE(value1,value2 ...)
COALESCE는 범위안에 값 중 NULL이 아닌 첫번째 인수를 리턴한다. 만약 모든 값 이 NULL일 경우는 NULL을 리턴한다.
1 2 | SELECT COALESCE ( NULL ,1,2,3); SELECT COALESCE ( NULL , NULL , NULL ); |
1line - 좌측부터 시작해서 첫번째로 NULL이 아닌 것은 1이기 때문에 1을 리턴한다.
2line - value 값이 전부 NULL로만 이루어져 있기 때문에 NULL을 리턴한다.
3. GREATEST(value1,value2 ...)
GREATEST는 범위안에 값 중 가장 큰 인수를 리턴한다.
1 2 3 4 | SELECT GREATEST(2,0); SELECT GREATEST(34.0,3,5.0,767.99); SELECT GREATEST( 'B' , 'A' , 'C' ); SELECT GREATEST( NULL , 'B' , 'C' ); |
1line - 2, 0중 가장 큰 수인 2를 리턴한다.
2line - 가장 큰 수치인 767.99를 리턴한다.
3line - a, b, c중 가장 뒤인 c를 리턴한다.
4line - 값 중 NULL이 포함될 경우 NULL을 리턴한다.
4. expr [NOT] IN (value1,value2 ...)
IN 구문은 expr에 해당하는 값이 ( ) 안에 존재할 경우 1(TRUE)을 리턴한다. NOT이 붙을 경우 반대로 해당하는 값이 없어야 1을 리턴한다.
1 2 3 4 | SELECT 2 IN (0,3,5,7); SELECT 'wefwf' IN ( 'wee' , 'wefwf' , 'weg' ); SELECT 2 NOT IN (0,3,5,7); SELECT 'wefwf' NOT IN ( 'wee' , 'wefwf' , 'weg' ); |
1line - 0, 3, 5, 7 중 2가 존재하지 않기때문에 0을 리턴한다.
2line - 'wefwf'는 ( ) 안에 존재하기 때문에 1을 리턴한다.
3line - 1line 결과와 반대로 1을 리턴한다.
4line - 2line 결과와 반대로 0을 리턴한다.
IN절안에는 서로 다른 데이터 타입을 쓰지않는 것이 좋다. 이는 MySQL 내부적으로 비교하는 기준이 다를 수 있기 때문이다. 따라서 만약 숫자와 문자열을 혼합한다면
1 | SELECT val1 FROM tbl1 WHERE val1 IN (1,2, 'a' ); |
1 | SELECT val1 FROM tbl1 WHERE val1 IN ( '1' , '2' , 'a' ); |
5. INTERVAL(N,N1,N2,N3,...)
INTERVAL은 값 N과 그 뒤의 값을 비교하여 결과를 리턴한다. 최소 1개 이상의 N(num) 값이 있어야 한다.
* N < N1 일 경우 뒤 N과 관계없이 무조건 0을 리턴한다.
* N1 < N2 < N3 ... 와 같이 N(num)은 뒤로갈 수록 값이 커야 한다. 내부적으로 Binary 형태로 결과를 구하기 때문이 고 만약
그렇지 않을 경우 원하는 결과가 나오지 않을 수 있다.
* N이 NULL 일 경우는 -1을 리턴한다.
* N > N(num)이 될때까지의 N(num)에 대한 개수를 구한다. 왼쪽부터 읽는다.
1 2 3 4 5 | SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); SELECT INTERVAL(10, 1, 10, 100, 1000); SELECT INTERVAL(22, 23, 30, 44, 200); SELECT INTERVAL( NULL , 3, 5, 7, 9); SELECT INTERVAL(100, 1, 10, 100, 10, 1000, 10); |
1line - N(23)보다 큰 N(num)은 30이다. 그럼 그 사이의 1, 15, 17의 개수 3. 따라서 3을 리턴한다.
2line - N(10)보다 큰 N(num)은 100이다. INTERVAL에서 >= 는 조건에 포함되지 않는다. 따라서 1, 10 2개. 2를 리턴한다.
3line - N(22) < N1(23)이다. 따라서 0을 리턴한다.
4line - N이 NULL값이기 때문에 -1을 리턴한다.
5line - N(100)보다 큰 N(num)은 1, 10, 100, 10 이 있다. N < N(num)이 만족한 1000에서 종료되기 때문에 뒤에 10은 무시된다.
따라서 4를 리턴한다.
6. IS [NOT] NULL
값이 NULL인가를 비교하여 값을 리턴한다. IS NULL의 경우 NULL인 경우 1 NULL이 아닌경우 0을 리턴한다. 반대로 NOT이 붙으면 부정의 의미가 되어 NULL이 아닌경우 1, NULL인 경우 1을 리턴한다.
1 2 | SELECT 1 IS NULL , '' IS NULL , NULL IS NULL ; SELECT 1 IS NOT NULL , '' IS NOT NULL , NULL IS NOT NULL ; |
1line - NULL(공백은 NULL이 아니다)은 NULL로 명시할 경우에만 존재함으로 0 / 0 / 1을 리턴한다.
2line - NULL(공백은 NULL이 아니다)인 경우에만 0을 리턴함으로 1 / 1 / 0을 리턴한다.
7. IS [NOT] boolean_value
불리안 값에 대응해서 값을 테스트 하는데, 여기에서 boolean_value 은 TRUE, FALSE, or UNKNOWN이 될 수 있다.
IS NOT boolean_value 신텍스는 MySQL 5.0.2에서 추가 되었다.
1 2 | SELECT 1 IS TRUE , 0 IS FALSE , NULL IS UNKNOWN; SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; |
1line - 1, 0, NULL은 각각 TRUE/FALSE/UNKNOWN과 대응됨으로 전부 1을 리턴한다.
2line - 1, 0은 각각 TRUE/FALSE에 대응함으로 참이다. NULL은 UNKNOWN인데 NOT을 붙여 부정했기에 거짓이 된다. 따라서
1/1/0을 리턴한다.
8. ISNULL(expr)
IS NULL과 비슷한 역활을 한다. expr에 대한 결과가 NULL인지 아닌가에 대하여 확인하여 NULL일 경우 1, 아닐경우 0을 리턴한다.
1 2 | SELECT ISNULL (1+1); SELECT ISNULL (1/0); |
1line - 1+1의 결과는 2다. NULL이 아님으로 0을 리턴한다.
2line - 1을 0으로 나눈다는 것은 불가능하기 때문에 NULL이다. 따라서 1을 리턴한다.
9. LEAST(value1,value2,...)
LEAST는 값 중 가장 작은 인수를 리턴한다. 인수들은 아래의 규칙에 따라서 비교가 된다
* 만일 리턴 값이 INTEGER 문맥에서 사용되거나 또는 모든 인수가 정수 값이라면, 그 인수들은 정수로 비교가 된다.
* 만일 리턴 값이 REAL 문맥에서 사용되거나 또는 모든 인수가 실수 값 (real value)이라면, 인수들은 실수(real)로 비교된다.
* 만일 어떤 인수가 문자 크기에 민감한 스트링이라면, 그 인수는 문자 크기를 구분하는 스트링으로 비교가 된다.
* 이외의 모든 경우에는, 인수들은 문자 크기와는 상관없는 스트링으로 비교가 된다.
MySQL 5.0.13 이전의 경우, LEAST() 은 모든 인수가 NULL 일 경우에만 NULL을 리턴했다. 하지만 5.0.13 이후에는, 어떤 인수라도 NULL 포함되어 있다면 NULL을 리턴한다.
1 2 3 | SELECT LEAST(2,0); SELECT LEAST(34.0,3.0,5.0,767.0); SELECT LEAST( 'B' , 'A' , 'C' ); |
1line - 0이 가장 작음으로 0을 리턴한다.
2line - 3.0이 가장 작음으로 3.0을 리턴한다.
3line - A가 가장 앞선 문자열임으로 A를 리턴한다.
10. value1 = value2
양쪽의 값을 경우 1 틀릴경우 0을 리턴한다. 단 하나의 값이라도 NULL이 포함되어지면 결과는 NULL을 리턴하게된다.
1 2 3 | SELECT 1 = 0; SELECT '0' = 0; SELECT NULL = 0; |
1line - 1은 0이 아님으로 0을 리턴한다.
2line - 0은 0임으로 1을 리턴한다
3line - NULL이 포함되었음으로 NULL을 리턴한다.
11. value1 <=> value2
<=>는 같은 값을 비교하는 =과 내용은 근본적으로 동일하다. 하지만 차이점은 NULL 하나의 값도 값으로 표시한다는게 다르다.
1 2 | SELECT 1 <=> 1, NULL <=> NULL , 1 <=> NULL ; SELECT 1 = 1, NULL = NULL , 1 = NULL ; |
1line - 1, 1, 0. NULL 값도 하나의 문자로 취급 하기 때문에 NULL을 리턴하지 않는다.
2line - 1, NULL, NULL. 하나라도 비교 대상에 NULL이 포함되면 연산불가로 판정하고 NULL 값을 리턴한다.
12. value1 <> value2, 또는 value1 != value2
=와 반대이다. 일치하지 않을 경우 1을 리턴한다.
1 2 3 | SELECT '.01' <> '0.01' ; SELECT .01 <> '0.01' ; SELECT 'zapp' <> 'zappp' ; |
1line - .01은 0.01과 같음으로 0을 리턴할 것 같지만 둘다 ' 으로 묶어 문자형 만들었다. 따라서 문자 그대로 비교하여 틀림으로
값은 1
2line - .01은 0.01과 같음으로 0을 리턴한다. 숫자의 경우 ' 으로 묶지 않으면 앞의 값이 생략된 경우 0을 추가한다.
3line - zapp와 zappp는 다름으로 1을 리턴한다.
13. value1 > value2
값 1이 값 2보다 클 경우 1을 리턴한다.
1 | SELECT 2 > 1; |
1line - 2가 1보다 큼으로 1을 리턴한다.
14. value1 >= value2
값 1이 값 2보다 크거나 같을 경우 1을 리턴한다. >=의 순서 바꾸면 안된다.
1 | SELECT 2 >= 2 |
1line - 2보다 크거나 같을 경우에 참인데 2와 2는 같음으로 1을 리턴한다.
15. value1 < value2
값 1이 값 2보다 작을 경우 1을 리턴한다.
1 | SELECT 2 < 1; |
1line - 2는 1보다 작음으로 1을 리턴한다.
12. value1 <= value2
값 1이 값 2보다 작거나 같을 경우 1을 리턴한다. <=의 순서 바꾸면 안된다.
1 | SELECT 2 <= 2; |
1line - 2보다 작거나 같을 경우에 참인데 2와 2는 같음으로 1을 리턴한다.
'MySQL' 카테고리의 다른 글
[MySQL] 버전별 기능(Features) 변경 이력 (0) | 2016.06.01 |
---|---|
[MySQL] mysqldump 시 lock tables (0) | 2016.05.31 |
[펌] [MySQL] 5.1의 InnoDB에서 MySQL 테이블 최적화하기 (0) | 2016.03.03 |
[MySQL] DUMP (mysqldump) export (1) | 2016.02.25 |
[MySQL] error 1130 (0) | 2016.02.19 |