Loading...
MySQL 9.5 Reference Manual 9.5의 14.4.2 Comparison Functions and Operators의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Table 14.4 Comparison Operators
| Name | Description |
|---|---|
> | 크다 (greater than) 연산자 |
>= | 크거나 같다 (greater than or equal) 연산자 |
< | 작다 (less than) 연산자 |
<>, != | 같지 않다 (not equal) 연산자 |
<= | 작거나 같다 (less than or equal) 연산자 |
<=> | NULL-safe equal to 연산자 |
= | 같다 (equal) 연산자 |
BETWEEN ... AND ... | 값이 값의 범위 안에 있는지 여부 |
COALESCE() | 첫 번째 non-NULL 인수 반환 |
EXISTS() | 쿼리 결과에 행이 존재하는지 여부 |
GREATEST() | 가장 큰 인수 반환 |
IN() | 값이 값 집합 안에 있는지 여부 |
INTERVAL() | 첫 번째 인수보다 작은 인수의 인덱스 반환 |
IS | 값을 불리언과 비교 |
IS NOT | 값을 불리언과 비교 |
IS NOT NULL | NOT NULL 값 테스트 |
IS NULL | NULL 값 테스트 |
ISNULL() | 인수가 NULL인지 테스트 |
LEAST() | 가장 작은 인수 반환 |
LIKE | 단순 패턴 매칭 |
NOT BETWEEN ... AND ... | 값이 값의 범위 안에 있지 않은지 여부 |
NOT EXISTS() | 쿼리 결과에 행이 없는지 여부 |
NOT IN() | 값이 값 집합 안에 있지 않은지 여부 |
NOT LIKE | 단순 패턴 매칭의 부정 |
STRCMP() | 두 문자열 비교 |
| Name | Description |
|---|
비교 연산의 결과는 1 (TRUE), 0 (FALSE), 또는 NULL입니다.
이 연산은 숫자와 문자열 모두에 대해 동작합니다. 필요에 따라 문자열은 자동으로 숫자로, 숫자는 문자열로 변환됩니다.
다음 관계형 비교 연산자는 스칼라 피연산자뿐 아니라 행 피연산자를 비교하는 데도 사용할 수 있습니다:
1= > < >= <= <> !=
이 섹션 뒤에서 나오는 이러한 연산자에 대한 설명은 행 피연산자와 함께 동작하는 방식을 자세히 다룹니다.
행 하위쿼리 문맥에서의 행 비교에 대한 추가 예시는 Section 15.2.15.5, “Row Subqueries”를 참조하십시오.
이 섹션의 함수 중 일부는 1 (TRUE), 0 (FALSE), 또는 NULL이 아닌 값을 반환합니다.
LEAST()와 GREATEST()는 이러한 함수의 예입니다.
이들과 유사한 함수가 반환 값을 결정하기 위해 수행하는 비교 연산 규칙은 Section 14.3, “Type Conversion in Expression Evaluation”에 설명되어 있습니다.
참고
이전 버전의 MySQL에서는 LEAST()나 GREATEST()를 포함하는 표현식을 평가할 때, 서버가 함수가 사용되는 문맥을 추측하려 하고, 표현식 전체의 데이터 타입으로 함수 인수를 강제 변환(coerce)했습니다.
예를 들어, LEAST("11", "45", "2")의 인수는 문자열로 평가 및 정렬되므로 이 표현식은 "11"을 반환합니다.
이 함수는 주어진 인수를 그대로 사용하여 실행되며, 인수가 모두 같은 타입이 아닐 때에만 하나 이상의 인수에 대해 데이터 타입 변환을 수행합니다.
반환 값을 사용하는 표현식에서 요구하는 타입 강제 변환은 이제 함수 실행 이후에 수행됩니다.
이는 LEAST("11", "45", "2") + 0이 "11" + 0으로 평가되고 따라서 정수 11이 된다는 의미입니다.
비교 목적을 위해 값을 특정 타입으로 변환하려면 CAST() 함수를 사용할 수 있습니다.
문자열 값은 CONVERT()를 사용하여 다른 문자 집합으로 변환할 수 있습니다.
Section 14.10, “Cast Functions and Operators”를 참조하십시오.
기본적으로 문자열 비교는 대소문자를 구분하지 않으며 현재 문자 집합을 사용합니다.
기본값은 utf8mb4입니다.
Equal:
1mysql> SELECT 1 = 0; 2 -> 0 3mysql> SELECT '0' = 0; 4 -> 1 5mysql> SELECT '0.0' = 0; 6 -> 1 7mysql> SELECT '0.01' = 0; 8 -> 0 9mysql> SELECT '.01' = 0.01; 10 -> 1
행 비교의 경우, (a, b) = (x, y)는 다음과 동일합니다:
1(a = x) AND (b = y)
NULL-safe equal입니다.
이 연산자는 = 연산자와 같이 동등성 비교를 수행하지만, 두 피연산자가 모두 NULL이면 NULL 대신 1을 반환하고, 피연산자 중 하나가 NULL이면 NULL 대신 0을 반환합니다.
<=> 연산자는 표준 SQL의 IS NOT DISTINCT FROM 연산자와 동일합니다.
1mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; 2 -> 1, 1, 0 3mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; 4 -> 1, NULL, NULL
행 비교의 경우, (a, b) <=> (x, y)는 다음과 동일합니다:
1(a <=> x) AND (b <=> y)
Not equal:
1mysql> SELECT '.01' <> '0.01'; 2 -> 1 3mysql> SELECT .01 <> '0.01'; 4 -> 0 5mysql> SELECT 'zapp' <> 'zappp'; 6 -> 1
행 비교의 경우, (a, b) <> (x, y)와 (a, b) != (x, y)는 다음과 동일합니다:
1(a <> x) OR (b <> y)
Less than or equal:
1mysql> SELECT 0.1 <= 2; 2 -> 1
행 비교의 경우, (a, b) <= (x, y)는 다음과 동일합니다:
1(a < x) OR ((a = x) AND (b <= y))
Less than:
1mysql> SELECT 2 < 2; 2 -> 0
행 비교의 경우, (a, b) < (x, y)는 다음과 동일합니다:
1(a < x) OR ((a = x) AND (b < y))
Greater than or equal:
1mysql> SELECT 2 >= 2; 2 -> 1
행 비교의 경우, (a, b) >= (x, y)는 다음과 동일합니다:
1(a > x) OR ((a = x) AND (b >= y))
Greater than:
1mysql> SELECT 2 > 2; 2 -> 0
행 비교의 경우, (a, b) > (x, y)는 다음과 동일합니다:
1(a > x) OR ((a = x) AND (b > y))
_expr_가 _min_보다 크거나 같고 _expr_가 _max_보다 작거나 같으면 BETWEEN은 1을 반환하고, 그렇지 않으면 0을 반환합니다.
이는 모든 인수가 같은 타입일 때 (min <= expr AND expr <= max) 표현식과 동일합니다.
그렇지 않으면 Section 14.3, “Type Conversion in Expression Evaluation”에 설명된 규칙에 따라 타입 변환이 수행되며, 이 규칙은 세 인수 모두에 적용됩니다.
1mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1; 2 -> 1, 0 3mysql> SELECT 1 BETWEEN 2 AND 3; 4 -> 0 5mysql> SELECT 'b' BETWEEN 'a' AND 'c'; 6 -> 1 7mysql> SELECT 2 BETWEEN 2 AND '3'; 8 -> 1 9mysql> SELECT 2 BETWEEN 2 AND 'x-3'; 10 -> 0
date 또는 time 값을 대상으로 BETWEEN을 사용할 때 최상의 결과를 얻으려면, CAST()를 사용하여 값을 명시적으로 원하는 데이터 타입으로 변환하십시오.
예: [DATETIME](https://dev.mysql.com/doc/refman/9.5/en/datetime.html "13.2.2 The DATE, DATETIME, and TIMESTAMP Types)을 두 개의 DATE 값과 비교하는 경우, DATE 값을 DATETIME 값으로 변환하십시오.
'2001-1-1'과 같은 문자열 상수를 DATE와 비교에 사용하는 경우, 그 문자열을 DATE로 캐스트하십시오.
이는 NOT (expr BETWEEN min AND max)와 동일합니다.
리스트에서 첫 번째 non-NULL 값을 반환하며, non-NULL 값이 없으면 NULL을 반환합니다.
COALESCE()의 반환 타입은 인수 타입들의 집계된 타입입니다.
1mysql> SELECT COALESCE(NULL,1); 2 -> 1 3mysql> SELECT COALESCE(NULL,NULL,NULL); 4 -> NULL
쿼리 결과에 행이 존재하는지 여부입니다.
1CREATE TABLE t (col VARCHAR(3)); 2INSERT INTO t VALUES ('aaa', 'bbb', 'ccc', 'eee'); 3 4SELECT EXISTS (SELECT * FROM t WHERE col LIKE 'c%'); 5 -> 1 6 7SELECT EXISTS (SELECT * FROM t WHERE col LIKE 'd%'); 8 -> 0
쿼리 결과에 행이 없는지 여부입니다:
1SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'c%'); 2 -> 0 3 4SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'd%'); 5 -> 1
두 개 이상의 인수에 대해 가장 큰(최대값을 가진) 인수를 반환합니다.
인수는 LEAST()와 동일한 규칙을 사용하여 비교됩니다.
1mysql> SELECT GREATEST(2,0); 2 -> 2 3mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); 4 -> 767.0 5mysql> SELECT GREATEST('B','A','C'); 6 -> 'C'
GREATEST()는 인수 중 하나라도 NULL이면 NULL을 반환합니다.
_expr_가 IN() 리스트에 있는 값 중 하나와 같으면 1(true)을, 그렇지 않으면 0(false)을 반환합니다.
타입 변환은 Section 14.3, “Type Conversion in Expression Evaluation”에 설명된 규칙에 따라 모든 인수에 적용되어 수행됩니다.
IN() 리스트의 값에 타입 변환이 필요 없고, 이 값들이 모두 같은 타입의 non-JSON 상수이며, _expr_가 (필요한 경우 타입 변환 후) 동일한 타입의 값으로 각각과 비교될 수 있는 경우, 최적화가 수행됩니다.
리스트의 값들은 정렬되고 _expr_에 대한 검색은 이진 검색을 사용하여 수행되므로, IN() 연산은 매우 빠릅니다.
1mysql> SELECT 2 IN (0,3,5,7); 2 -> 0 3mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); 4 -> 1
IN()은 행 생성자를 비교하는 데에도 사용할 수 있습니다:
1mysql> SELECT (3,4) IN ((1,2), (3,4)); 2 -> 1 3mysql> SELECT (3,4) IN ((1,2), (3,5)); 4 -> 0
IN() 리스트에서 따옴표로 감싼 값과 감싸지 않은 값을 섞어 쓰지 말아야 합니다.
따옴표로 감싼 값(문자열 등)과 감싸지 않은 값(숫자 등)에 대한 비교 규칙이 다르기 때문입니다.
타입을 섞어 쓰면 일관성 없는 결과로 이어질 수 있습니다.
예를 들어, 다음과 같은 IN() 표현식을 작성하지 마십시오:
1SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
대신 다음과 같이 작성하십시오:
1SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
암시적 타입 변환은 직관적이지 않은 결과를 생성할 수 있습니다:
1mysql> SELECT 'a' IN (0), 0 IN ('b'); 2 -> 1, 1
두 경우 모두 비교 값은 부동소수점 값으로 변환되며, 각각 0.0이 되고, 비교 결과는 1(true)이 됩니다.
IN() 리스트에 포함될 수 있는 값의 수는 max_allowed_packet 값에 의해서만 제한됩니다.
SQL 표준을 준수하기 위해, IN()은 왼쪽의 표현식이 NULL인 경우뿐 아니라, 리스트에서 일치 항목이 없고 리스트 내 표현식 중 하나가 NULL인 경우에도 NULL을 반환합니다.
IN() 구문은 특정 유형의 하위쿼리를 작성하는 데에도 사용할 수 있습니다.
Section 15.2.15.3, “Subqueries with ANY, IN, or SOME”를 참조하십시오.
이는 NOT (expr IN (value,...))와 동일합니다.
N ≤ _N1_이면 0을 반환하고, N ≤ _N2_이면 1을, 이와 같이 계속하며, _N_이 NULL이면 -1을 반환합니다.
모든 인수는 정수로 취급됩니다.
이 함수가 올바르게 동작하려면 N1 ≤ N2 ≤ N3 ≤ ... ≤ _Nn_이어야 합니다.
이는 이진 검색(매우 빠름)이 사용되기 때문입니다.
1mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); 2 -> 3 3mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); 4 -> 2 5mysql> SELECT INTERVAL(22, 23, 30, 44, 200); 6 -> 0
값을 불리언 값과 비교합니다.
여기서 _boolean_value_는 TRUE, FALSE, 또는 UNKNOWN일 수 있습니다.
1mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; 2 -> 1, 1, 1
값을 불리언 값과 비교합니다.
여기서 _boolean_value_는 TRUE, FALSE, 또는 UNKNOWN일 수 있습니다.
1mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; 2 -> 1, 1, 0
값이 NULL인지 테스트합니다.
1mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; 2 -> 0, 0, 1
ODBC 프로그램과 잘 동작하기 위해, MySQL은 IS NULL을 사용할 때 다음과 같은 추가 기능을 지원합니다:
sql_auto_is_null 변수가 1로 설정되어 있으면, 자동으로 생성된 AUTO_INCREMENT 값을 성공적으로 삽입한 구문 이후에 다음 형태의 구문을 실행하여 그 값을 찾을 수 있습니다:
1SELECT * FROM tbl_name WHERE auto_col IS NULL
구문이 행을 반환하면, 반환 값은 LAST_INSERT_ID() 함수를 호출한 것과 동일합니다.
여러 행을 insert한 후의 반환 값을 포함한 자세한 내용은 Section 14.15, “Information Functions”을 참조하십시오.
AUTO_INCREMENT 값이 성공적으로 insert되지 않은 경우, SELECT 구문은 어떠한 행도 반환하지 않습니다.
IS NULL 비교를 사용하여 AUTO_INCREMENT 값을 조회하는 동작은 sql_auto_is_null = 0으로 설정하여 비활성화할 수 있습니다.
Section 7.1.8, “Server System Variables”를 참조하십시오.
sql_auto_is_null의 기본값은 0입니다.
NOT NULL로 선언된 DATE 및 DATETIME 컬럼의 경우, 다음과 같은 구문을 사용하여 특수한 date 값 '0000-00-00'을 찾을 수 있습니다:
1SELECT * FROM tbl_name WHERE date_column IS NULL
이는 일부 ODBC 애플리케이션이 동작하도록 하는 데 필요합니다.
ODBC는 '0000-00-00' date 값을 지원하지 않기 때문입니다.
Obtaining Auto-Increment Values와 Connector/ODBC Connection Parameters의 FLAG_AUTO_IS_NULL 옵션에 대한 설명을 참조하십시오.
값이 NULL이 아닌지 테스트합니다.
1mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; 2 -> 1, 1, 0
_expr_이 NULL이면 ISNULL()은 1을 반환하고, 그렇지 않으면 0을 반환합니다.
1mysql> SELECT ISNULL(1+1); 2 -> 0 3mysql> SELECT ISNULL(1/0); 4 -> 1
ISNULL()은 값이 NULL인지 테스트하기 위해 = 대신 사용할 수 있습니다.
(=을 사용하여 값을 NULL과 비교하면 항상 NULL이 됩니다.)
ISNULL() 함수는 IS NULL 비교 연산자와 일부 특수 동작을 공유합니다.
IS NULL에 대한 설명을 참조하십시오.
두 개 이상의 인수에 대해 가장 작은(최소값을 가진) 인수를 반환합니다.
인수는 다음 규칙을 사용하여 비교됩니다:
인수 중 하나라도 NULL이면, 결과는 NULL입니다. 비교는 필요 없습니다.
모든 인수가 정수 값인 경우, 정수로 비교됩니다.
하나 이상의 인수가 double precision이면, double-precision 값으로 비교됩니다.
그렇지 않고, 하나 이상의 인수가 DECIMAL 값이면, DECIMAL 값으로 비교됩니다.
인수가 숫자와 문자열이 섞여 있는 경우, 문자열로 비교됩니다.
인수 중 하나라도 nonbinary(문자) 문자열이면, 인수는 nonbinary 문자열로 비교됩니다.
그 외 모든 경우에, 인수는 binary 문자열로 비교됩니다.
LEAST()의 반환 타입은 비교 인수 타입들의 집계된 타입입니다.
1mysql> SELECT LEAST(2,0); 2 -> 0 3mysql> SELECT LEAST(34.0,3.0,5.0,767.0); 4 -> 3.0 5mysql> SELECT LEAST('B','A','C'); 6 -> 'A'
14.4.1 Operator Precedence
14.4.3 Logical Operators