Table 11.3. Comparison Operators
| Name | Description |
|---|---|
BETWEEN ... AND ... | Check whether a value is within a range of values |
COALESCE() | Return the first non-NULL argument |
<=> | NULL-safe equal to operator |
= | Equal operator |
>= | Greater than or equal operator |
> | Greater than operator |
GREATEST() | Return the largest argument |
IN() | Check whether a value is within a set of values |
INTERVAL() | Return the index of the argument that is less than the first argument |
IS NOT NULL | NOT NULL value test |
IS NOT | Test a value against a boolean |
IS NULL | NULL value test |
IS | Test a value against a boolean |
ISNULL() | Test whether the argument is NULL |
LEAST() | Return the smallest argument |
<= | Less than or equal operator |
< | Less than operator |
LIKE | Simple pattern matching |
NOT BETWEEN ... AND ... | Check whether a value is not within a range of values |
!=, <> | Not equal operator |
NOT IN() | Check whether a value is not within a set of values |
NOT LIKE | Negation of simple pattern matching |
STRCMP() | Compare two strings |
Comparison operations result in a value of 1
(TRUE), 0
(FALSE), or NULL. These
operations work for both numbers and strings. Strings are
automatically converted to numbers and numbers to strings as
necessary.
The following relational comparison operators can be used to compare not only scalar operands, but row operands:
= > < >= <= <> !=
For examples of row comparisons, see Section 12.2.10.5, “Row Subqueries”.
Some of the functions in this section return values other than
1 (TRUE),
0 (FALSE), or
NULL. For example,
LEAST() and
GREATEST(). However, the value
they return is based on comparison operations performed
according to the rules described in
Section 11.2, “Type Conversion in Expression Evaluation”.
To convert a value to a specific type for comparison purposes,
you can use the CAST() function.
String values can be converted to a different character set
using CONVERT(). See
Section 11.10, “Cast Functions and Operators”.
By default, string comparisons are not case sensitive and use
the current character set. The default is
latin1 (cp1252 West European), which also
works well for English.
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;-> 1NULL-safe equal. This operator performs an equality comparison like the=operator, but returns1rather thanNULLif both operands areNULL, and0rather thanNULLif one operand isNULL.mysql>
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;-> 1, 1, 0 mysql>SELECT 1 = 1, NULL = NULL, 1 = NULL;-> 1, NULL, NULLNot equal:
mysql>
SELECT '.01' <> '0.01';-> 1 mysql>SELECT .01 <> '0.01';-> 0 mysql>SELECT 'zapp' <> 'zappp';-> 1Less than or equal:
mysql>
SELECT 0.1 <= 2;-> 1Less than:
mysql>
SELECT 2 < 2;-> 0Greater than or equal:
mysql>
SELECT 2 >= 2;-> 1Greater than:
mysql>
SELECT 2 > 2;-> 0Tests a value against a boolean value, where
boolean_valuecan beTRUE,FALSE, orUNKNOWN.mysql>
SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;-> 1, 1, 1Tests a value against a boolean value, where
boolean_valuecan beTRUE,FALSE, orUNKNOWN.mysql>
SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;-> 1, 1, 0Tests whether a value is
NULL.mysql>
SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;-> 0, 0, 1To work well with ODBC programs, MySQL supports the following extra features when using
IS NULL:If
sql_auto_is_nullvariable is set to 1, then after a statement that successfully inserts an automatically generatedAUTO_INCREMENTvalue, you can find that value by issuing a statement of the following form:SELECT * FROM
tbl_nameWHEREauto_colIS NULLIf the statement returns a row, the value returned is the same as if you invoked the
LAST_INSERT_ID()function. For details, including the return value after a multiple-row insert, see Section 11.14, “Information Functions”. If noAUTO_INCREMENTvalue was successfully inserted, theSELECTstatement returns no row.The behavior of retrieving an
AUTO_INCREMENTvalue by using anIS NULLcomparison can be disabled by settingsql_auto_is_null = 0. See Section 5.1.4, “Server System Variables”.The default value of
sql_auto_is_nullis 0 as of MySQL 5.5.3, and 1 for earlier versions.For
DATEandDATETIMEcolumns that are declared asNOT NULL, you can find the special date'0000-00-00'by using a statement like this:SELECT * FROM
tbl_nameWHEREdate_columnIS NULLThis is needed to get some ODBC applications to work because ODBC does not support a
'0000-00-00'date value.See Section 22.1.7.1.1, “Obtaining Auto-Increment Values”, and the description for the
FLAG_AUTO_IS_NULLoption at Section 22.1.4.2, “Connector/ODBC Connection Parameters”.
Tests whether a value is not
NULL.mysql>
SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;-> 1, 1, 0If
expris greater than or equal tominandexpris less than or equal tomax,BETWEENreturns1, otherwise it returns0. This is equivalent to the expression(if all the arguments are of the same type. Otherwise type conversion takes place according to the rules described in Section 11.2, “Type Conversion in Expression Evaluation”, but applied to all the three arguments.min<=exprANDexpr<=max)mysql>
SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1;-> 1, 0 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';-> 0For best results when using
BETWEENwith date or time values, useCAST()to explicitly convert the values to the desired data type. Examples: If you compare aDATETIMEto twoDATEvalues, convert theDATEvalues toDATETIMEvalues. If you use a string constant such as'2001-1-1'in a comparison to aDATE, cast the string to aDATE.This is the same as
NOT (.exprBETWEENminANDmax)Returns the first non-
NULLvalue in the list, orNULLif there are no non-NULLvalues.mysql>
SELECT COALESCE(NULL,1);-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);-> NULLWith two or more arguments, returns the largest (maximum-valued) argument. The arguments are compared using the same rules as for
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'GREATEST()returnsNULLif any argument isNULL.Returns
1ifexpris equal to any of the values in theINlist, else returns0. If all values are constants, they are evaluated according to the type ofexprand sorted. The search for the item then is done using a binary search. This meansINis very quick if theINvalue list consists entirely of constants. Otherwise, type conversion takes place according to the rules described in Section 11.2, “Type Conversion in Expression Evaluation”, but applied to all the arguments.mysql>
SELECT 2 IN (0,3,5,7);-> 0 mysql>SELECT 'wefwf' IN ('wee','wefwf','weg');-> 1You should never mix quoted and unquoted values in an
INlist because the comparison rules for quoted values (such as strings) and unquoted values (such as numbers) differ. Mixing types may therefore lead to inconsistent results. For example, do not write anINexpression like this:SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
Instead, write it like this:
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');The number of values in the
INlist is only limited by themax_allowed_packetvalue.To comply with the SQL standard,
INreturnsNULLnot only if the expression on the left hand side isNULL, but also if no match is found in the list and one of the expressions in the list isNULL.IN()syntax can also be used to write certain types of subqueries. See Section 12.2.10.3, “Subqueries withANY,IN, orSOME”.This is the same as
NOT (.exprIN (value,...))If
exprisNULL,ISNULL()returns1, otherwise it returns0.mysql>
SELECT ISNULL(1+1);-> 0 mysql>SELECT ISNULL(1/0);-> 1ISNULL()can be used instead of=to test whether a value isNULL. (Comparing a value toNULLusing=always yields false.)The
ISNULL()function shares some special behaviors with theIS NULLcomparison operator. See the description ofIS NULL.Returns
0ifN<N1,1ifN<N2and so on or-1ifNisNULL. All arguments are treated as integers. It is required thatN1<N2<N3<...<Nnfor this function to work correctly. This is because a binary search is used (very fast).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);-> 0With two or more arguments, returns the smallest (minimum-valued) argument. The arguments are compared using the following rules:
If any argument is
NULL, the result isNULL. No comparison is needed.If the return value is used in an
INTEGERcontext or all arguments are integer-valued, they are compared as integers.If the return value is used in a
REALcontext or all arguments are real-valued, they are compared as reals.If the arguments comprise a mix of numbers and strings, they are compared as numbers.
If any argument is a nonbinary (character) string, the arguments are compared as nonbinary strings.
In all other cases, the arguments are compared as binary strings.
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'Note that the preceding conversion rules can produce strange results in some borderline cases:
mysql>
SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);-> -9223372036854775808This happens because MySQL reads
9223372036854775808.0in an integer context. The integer representation is not good enough to hold the value, so it wraps to a signed integer.