Операторы сравнения дают в результате величину 1
(истина, TRUE), 0
(ложь, FALSE) или
NULL
. Эти функции работают как с числами, так и со строками. Строки при
необходимости автоматически преобразуются в числа, а числа - в строки (как
в Perl).
Операции сравнения в MySQL выполняются по следующим правилам:
Если один или оба аргумента -
NULL
, то и результат сравнения будетNULL
. Справедливо для всех операторов кроме<=>
.Если оба аргумента в операторе сравнения являются строками, то они сравниваются как строки.
Если оба аргумента - целые числа, то они сравниваются как целые числа.
Шестнадцатеричные величины, если они не сравниваются с числом, трактуются как строки с двоичными данными.
-
Если один из аргументов представляет собой столбец типа
TIMESTAMP
илиDATETIME
, а второй аргумент - константа, то константа перед выполнением сравнения преобразуется к типуTIMESTAMP
. Это сделано для лучшей совместимости с ODBC. Во всех других случаях аргументы сравниваются как действительные числа с плавающей точкой.
По умолчанию сравнение строк производится без учета регистра символов с использованием текущего набора символов (по умолчанию ISO-8859-1 Latin1, который, к тому же, прекрасно подходит для английского языка).
Ниже приведены примеры, иллюстрирующие преобразование строк в числа для операторов сравнения:
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
-
=
Равно:
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
-
<>
,!=
Не равно:
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
-
<=>
NULL-безопасное сравнение (равно):
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1 1 0
-
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
Для того, чтобы MySQL хорошо работал с другими программами, обеспечивается поддержка следующих дополнительных возможностей для функции
IS NULL
:-
Можно найти последнюю вставленную строку, используя выражение:
SELECT * FROM tbl_name WHERE auto_col IS NULL
Это свойство можно блокировать установкой
SQL_AUTO_IS_NULL=0
. See Раздел 5.5.6, «Синтаксис командыSET
». -
Для данных типа
NOT NULL DATE
и столбцовDATETIME
можно найти особую дату0000-00-00
, используя выражение:SELECT * FROM tbl_name WHERE date_column IS NULL
Это необходимо для работы некоторых приложений ODBC (так как ODBC не поддерживает значение даты
0000-00-00
).
-
-
expr BETWEEN min AND max
Если величина выражения expr больше или равна заданному значению
min
и меньше или равна заданному значениюmax
, то функцияBETWEEN
возвращает1
, в противном случае -0
. Это эквивалентно выражению (min <= expr AND expr <= max
), в котором все аргументы представлены одним и тем же типом данных. В противном случае имеет место быть преобразование типов так, как сказано выше, но применительно ко всем трем аргументами. Внимание: до 4.0.5 аргументы приводились к типуexpr
.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)
. -
expr IN (value,...)
Возвращает
1
, если выражение expr равно любой величине из спискаIN
, иначе -0
. Если все величины - константы, то они оцениваются в соответствии с типом выражения expr и сортируются. Поиск элемента в этом случае производится методом логического поиска. Это означает, что функцияIN
является очень быстрой, если список значенийIN
состоит полностью из констант. Если expr является зависимым от регистра строковым выражением, то сравнение строк производится с учетом регистра:mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
Начиная с 4.1 (в соответствии со стандартом SQL-99),
IN
возвращаетNULL
не только если выражение в левой части являетсяNULL
, но также если не найдено соответствия в списке и одно из выражений в списке является величинойNULL
. -
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
Обратите внимание: при сравнении величин
NULL
с использованием оператора=
всегда будет возвращаться значениеFALSE
! -
COALESCE(list)
Возвращает первый в списке элемент со значением, не равным
NULL
:mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
-
INTERVAL(N,N1,N2,N3,...)
Возвращает
0
, еслиN < N1
, и1
, еслиN < N2
, и так далее. Все аргументы трактуются как целые числа. Для корректной работы этой функции необходимо условие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
Если регистронезависимая строка сравнивается с помощью любого
стандартного оператора (=,
<>
, ..., но не LIKE
), то конечные пустые символы (т.е. пробелы, табуляторы и переводы строк) игнорируются:
игнорируется.
mysql> SELECT "a" ="A \n"; -> 1