12.4.2 Функции и операторы сравнения
Таблица 12.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. Эти операции работают как для чисел, так и для строк. Строки автоматически преобразуются в числа, а числа — в строки при необходимости.
Следующие операторы сравнения могут использоваться для сравнения не только скалярных операндов, но и операндов строк:
= > < >= <= <> !=
Описания этих операторов далее в этом разделе подробно описывают, как они работают с операндами строк. Дополнительные примеры сравнений строк в контексте подзапросов строк см. в Разделе 13.2.10.5 «Подзапросы строк».
Некоторые функции в этом разделе возвращают значения, отличные от 1 (TRUE), 0 (FALSE) или NULL. LEAST() и GREATEST() являются примерами таких функций; Раздел 12.3 «Преобразование типов в выражениях» описывает правила для операций сравнения, выполняемых этими и подобными функциями для определения их возвращаемых значений.
Для преобразования значения в определенный тип для целей сравнения можно использовать функцию CAST(). Строковые значения могут быть преобразованы в другой набор символов с помощью CONVERT(). См. Раздел 12.10 «Функции и операторы приведения типов».
По умолчанию, сравнение строк не учитывает регистр и использует текущий набор символов. По умолчанию используется набор символов latin1 (cp1252 Западноевропейский), который также хорошо подходит для английского языка.
-
Равно:
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. Это эквивалентно выражению(, если все аргументы одного типа. В противном случае преобразование типов происходит в соответствии с правилами, описанными в Разделе 12.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(ложь).Преобразование типов происходит в соответствии с правилами, описанными в Разделе 12.3, «Преобразование типов при вычислении выражений», применяется ко всем аргументам. Если преобразование типов не требуется для значений в списке
IN(), они являются константами одного типа, и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()также может использоваться для записи определенных типов подзапросов. См. Раздел 13.2.10.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(). Подробности, включая возвращаемое значение после вставки нескольких строк, смотрите в Разделе 12.15, «Функции информации». Если успешная вставкаAUTO_INCREMENTзначения не произошла, то запросSELECTне вернет ни одной строки.Поведение по получению значения
AUTO_INCREMENTс помощью сравненияIS NULLможно отключить, установивsql_auto_is_null = 0. См. Раздел 5.1.7, «Системные переменные сервера».Значение по умолчанию для
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.