14.4.2 Функции и операторы сравнения
Таблица 14.4 Операторы сравнения
| Имя | Описание |
|---|---|
> | Оператор больше чем |
>= | Оператор больше или равно |
< | Оператор меньше чем |
<>, != | Оператор не равно |
<= | Оператор меньше или равно |
<=> | Оператор равенства (с учётом NULL) |
= | Оператор равенства |
BETWEEN ... AND ... | Проверка, находится ли значение в заданном диапазоне |
COALESCE() | Возвращает первое не NULL значение |
EXISTS() | Проверка наличия строк в результате запроса |
GREATEST() | Возвращает наибольшее значение |
IN() | Проверка, находится ли значение в наборе значений |
INTERVAL() | Возвращает индекс аргумента, меньшего первого аргумента |
IS | Проверка значения на соответствие булевому значению |
IS NOT | Проверка значения на несоответствие булевому значению |
IS NOT NULL | Проверка на НЕ NULL значение |
IS NULL | Проверка на NULL значение |
ISNULL() | Проверка, является ли аргумент NULL |
LEAST() | Возвращает наименьшее значение |
LIKE | Простое сопоставление шаблонов |
NOT BETWEEN ... AND ... | Проверка, не находится ли значение в заданном диапазоне |
NOT EXISTS() | Проверка отсутствия строк в результате запроса |
NOT IN() | Проверка, не находится ли значение в наборе значений |
NOT LIKE | Отрицание простого сопоставления шаблонов |
STRCMP() | Сравнение двух строк |
Операции сравнения возвращают значение 1 (TRUE), 0 (FALSE) или NULL. Эти операции работают как с числами, так и со строками. Строки автоматически преобразуются в числа, а числа — в строки по мере необходимости.
Следующие операторы сравнения могут использоваться для сравнения не только скалярных, но и строковых операндов:
= > < >= <= <> !=
Описания этих операторов, представленные далее в этом разделе, показывают, как они работают с строковыми операндами. Дополнительные примеры сравнений строк в контексте подзапросов с строковыми операндами можно найти в Разделе 15.2.15.5 «Подзапросы со строковыми операндами».
Некоторые функции в этом разделе возвращают значения, отличные от 1 (TRUE), 0 (FALSE) или NULL. LEAST() и GREATEST() — примеры таких функций; правила сравнения, используемые этими и аналогичными функциями для определения возвращаемых значений, описаны в Разделе 14.3 «Преобразование типов в выражениях».
В предыдущих версиях MySQL при оценке выражения, содержащего LEAST() или GREATEST(), сервер пытался угадать контекст использования функции и принудительно преобразовывать аргументы функции к типу данных всего выражения. Например, аргументы LEAST("11",
"45", "2") оценивались и сортировались как строки, поэтому это выражение возвращало "11".
Функция выполняется с предоставленными аргументами, выполняя преобразования типов к одному или нескольким аргументам только в том случае, если не все аргументы имеют один и тот же тип. Любое преобразование типа, предписанное выражением, которое использует возвращаемое значение, теперь выполняется после выполнения функции. Это означает, что LEAST("11", "45", "2") +
0 вычисляется как "11" + 0 и, следовательно, как целое число 11.
Для преобразования значения в определённый тип для целей сравнения можно использовать функцию CAST(). Строковые значения могут быть преобразованы в другой набор символов с помощью функции CONVERT(). См. Раздел 14.10 «Функции и операторы преобразования типов».
По умолчанию сравнение строк не учитывает регистр и использует текущий набор символов. По умолчанию это utf8mb4.
-
Равно:
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Для сравнения строк,
(a, b) = (x, y)эквивалентно:(a = x) AND (b = y)
-
NULL-безопасное равенство. Этот оператор выполняет сравнение на равенство, как оператор=, но возвращает1вместоNULL, если оба операнда являютсяNULL, и0вместоNULL, если один операнд являетсяNULL.Оператор
<=>эквивалентен стандартному оператору SQLIS NOT DISTINCT FROM.mysql>
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;-> 1, 1, 0 mysql>SELECT 1 = 1, NULL = NULL, 1 = NULL;-> 1, NULL, NULLДля сравнения строк,
(a, b) <=> (x, y)эквивалентно:(a <=> x) AND (b <=> y)
-
Не равно:
mysql>
SELECT '.01' <> '0.01';-> 1 mysql>SELECT .01 <> '0.01';-> 0 mysql>SELECT 'zapp' <> 'zappp';-> 1Для сравнения строк,
(a, b) <> (x, y)и(a, b) != (x, y)эквивалентны:(a <> x) OR (b <> y)
-
Меньше или равно:
mysql>
SELECT 0.1 <= 2;-> 1Для сравнения строк,
(a, b) <= (x, y)эквивалентно:(a < x) OR ((a = x) AND (b <= y))
-
Меньше:
mysql>
SELECT 2 < 2;-> 0Для сравнения строк,
(a, b) < (x, y)эквивалентно:(a < x) OR ((a = x) AND (b < y))
-
Больше или равно:
mysql>
SELECT 2 >= 2;-> 1Для сравнения строк,
(a, b) >= (x, y)эквивалентно:(a > x) OR ((a = x) AND (b >= y))
-
Больше:
mysql>
SELECT 2 > 2;-> 0Для сравнения строк,
(a, b) > (x, y)эквивалентно:(a > x) OR ((a = x) AND (b > y))
-
Если
exprбольше или равноminиexprменьше или равноmax,BETWEENвозвращает1, в противном случае возвращает0. Это эквивалентно выражению(, если все аргументы одного типа. В противном случае преобразование типов происходит в соответствии с правилами, описанными в Разделе 14.3, «Преобразование типов при вычислении выражений», но применяется ко всем трём аргументам.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';-> 0Для достижения наилучших результатов при использовании
BETWEENс датами или значениями времени, используйтеCAST()для явного преобразования значений к нужному типу данных. Примеры: Если вы сравниваетеDATETIMEс двумя значениямиDATE, преобразуйте значенияDATEв значенияDATETIME. Если вы используете строковую константу, такую как'2001-1-1', в сравнении сDATE, преобразуйте строку вDATE. -
Это то же самое, что и
NOT (.exprBETWEENminANDmax) -
Возвращает первое не-
NULLзначение в списке илиNULL, если нет не-NULLзначений.Тип возвращаемого значения
COALESCE()является агрегированным типом типов аргументов.mysql>
SELECT COALESCE(NULL,1);-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);-> NULL -
Содержит ли результат запроса какие-либо строки.
CREATE TABLE t (col VARCHAR(3)); INSERT INTO t VALUES ('aaa', 'bbb', 'ccc', 'eee'); SELECT EXISTS (SELECT * FROM t WHERE col LIKE 'c%'); -> 1 SELECT EXISTS (SELECT * FROM t WHERE col LIKE 'd%'); -> 0 -
Содержит ли результат запроса строки:
SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'c%'); -> 0 SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'd%'); -> 1 -
С двумя или более аргументами возвращает наибольший (максимальный) аргумент. Аргументы сравниваются по тем же правилам, что и для
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()возвращаетNULL, если какой-либо аргумент являетсяNULL. -
Возвращает
1(истина), еслиexprравно любому из значений в спискеIN(), в противном случае возвращает0(ложь).Преобразование типов происходит в соответствии с правилами, описанными в Разделе 14.3, «Преобразование типов при вычислении выражений», применяется ко всем аргументам. Если для значений в списке
IN()не требуется преобразование типов, все они являются не-JSONконстантами одного типа, иexprможет быть сравнено с каждой из них как значение того же типа (возможно, после преобразования типа), происходит оптимизация. Значения списка сортируются, и поискexprвыполняется с помощью бинарного поиска, что делает операциюIN()очень быстрой.mysql>
SELECT 2 IN (0,3,5,7);-> 0 mysql>SELECT 'wefwf' IN ('wee','wefwf','weg');-> 1IN()может использоваться для сравнения конструкторов строк:mysql>
SELECT (3,4) IN ((1,2), (3,4));-> 1 mysql>SELECT (3,4) IN ((1,2), (3,5));-> 0Никогда не следует смешивать значения в кавычках и без кавычек в списке
IN(), поскольку правила сравнения для значений в кавычках (например, строк) и значений без кавычек (например, чисел) различны. Смешивание типов может привести к несогласованным результатам. Например, не следует писать выражениеIN()следующим образом:SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
Вместо этого напишите так:
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');Неявное преобразование типов может давать неинтуитивные результаты:
mysql>
SELECT 'a' IN (0), 0 IN ('b');-> 1, 1В обоих случаях значения сравнения преобразуются в значения с плавающей точкой, давая 0,0 в каждом случае, и результат сравнения 1 (истина).
Количество значений в списке
IN()ограничено только значениемmax_allowed_packet.В соответствии со стандартом SQL,
IN()возвращаетNULLне только если выражение в левой части являетсяNULL, но и если совпадение не найдено в списке и одно из выражений в списке являетсяNULL.Синтаксис
IN()также может использоваться для записи определённых типов подзапросов. См. Раздел 15.2.15.3, «Подзапросы с ANY, IN или SOME». -
Это то же самое, что и
NOT (.exprIN (value,...)) -
Возвращает
0, еслиN≤N1,1, еслиN≤N2и так далее, или-1, еслиNявляетсяNULL. Все аргументы рассматриваются как целые числа. Требуется, чтобы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 -
Проверяет значение на соответствие булеву значению, где
boolean_valueможет бытьTRUE,FALSEилиUNKNOWN.mysql>
SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;-> 1, 1, 1
-
Проверяет значение на соответствие булевому значению, где
boolean_valueможет бытьTRUE,FALSEилиUNKNOWN.mysql>
SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;-> 1, 1, 0 -
Проверяет, является ли значение
NULL.mysql>
SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;-> 0, 0, 1Для корректной работы с программами ODBC MySQL поддерживает следующие дополнительные возможности при использовании
IS NULL:-
Если переменная
sql_auto_is_nullустановлена в 1, то после оператора, успешно вставившего автоматически сгенерированноеAUTO_INCREMENTзначение, это значение можно получить, выполнив оператор следующего вида:SELECT * FROM
tbl_nameWHEREauto_colIS NULLЕсли оператор возвращает строку, возвращаемое значение совпадает со значением функции
LAST_INSERT_ID(). Подробности, включая возвращаемое значение после вставки нескольких строк, см. в Разделе 14.15, «Функции информации». Если значениеAUTO_INCREMENTне было успешно вставлено, операторSELECTне вернёт ни одной строки.Поведение получения значения
AUTO_INCREMENTс помощью сравненияIS NULLможно отключить, установивsql_auto_is_null = 0. См. Раздел 7.1.8, «Системные переменные сервера».Значение по умолчанию для
sql_auto_is_nullравно 0. -
Для столбцов типа
DATEиDATETIME, объявленных какNOT NULL, можно найти специальную дату'0000-00-00', используя оператор такого вида:SELECT * FROM
tbl_nameWHEREdate_columnIS NULLЭто необходимо для работы некоторых приложений ODBC, поскольку ODBC не поддерживает значение даты
'0000-00-00'.См. , и описание опции
FLAG_AUTO_IS_NULLв .
-
-
Проверяет, не является ли значение
NULL.mysql>
SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;-> 1, 1, 0 -
Если
exprравноNULL,ISNULL()возвращает1, в противном случае —0.mysql>
SELECT ISNULL(1+1);-> 0 mysql>SELECT ISNULL(1/0);-> 1ISNULL()можно использовать вместо=для проверки, является ли значениеNULL. (Сравнение значения сNULLс помощью=всегда даётNULL.)Функция
ISNULL()имеет некоторые особенности, аналогичные оператору сравненияIS NULL. См. описаниеIS NULL. -
При двух или более аргументах возвращает наименьший (минимальное значение) аргумент. Аргументы сравниваются по следующим правилам:
Если какой-либо аргумент равен
NULL, результат равенNULL. Сравнение не требуется.Если все аргументы имеют целочисленное значение, они сравниваются как целые числа.
Если хотя бы один аргумент имеет двойную точность, они сравниваются как значения двойной точности. В противном случае, если хотя бы один аргумент имеет значение
DECIMAL, они сравниваются как значенияDECIMAL.Если аргументы представляют собой смесь чисел и строк, они сравниваются как строки.
Если какой-либо аргумент является строкой без двоичного представления (символьной), аргументы сравниваются как строки без двоичного представления.
Во всех остальных случаях аргументы сравниваются как двоичные строки.
Тип возвращаемого значения
LEAST()— агрегированный тип типов сравниваемых аргументов.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'
© 2025 Oracle
Licensed under the GPLv2 License.