Spec-Zone.ru › MySQL 8.4

14.4.2 Функции и операторы сравнения

Таблица 14.4 Операторы сравнения

Таблица 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.

    Оператор <=> эквивалентен стандартному оператору SQL IS 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 BETWEEN min AND max

    Если expr больше или равно min и expr меньше или равно max, BETWEEN возвращает 1, в противном случае возвращает 0. Это эквивалентно выражению (min <= expr AND expr <= max), если все аргументы одного типа. В противном случае преобразование типов происходит в соответствии с правилами, описанными в Разделе 14.3, «Преобразование типов при вычислении выражений», но применяется ко всем трём аргументам.

    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.

  • expr NOT BETWEEN min AND max

    Это то же самое, что и NOT (expr BETWEEN min AND max).

  • COALESCE(value,...)

    Возвращает первое не-NULL значение в списке или NULL, если нет не-NULL значений.

    Тип возвращаемого значения COALESCE() является агрегированным типом типов аргументов.

    mysql> SELECT COALESCE(NULL,1);
            -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
            -> NULL
    
  • EXISTS(query)

    Содержит ли результат запроса какие-либо строки.

    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
    
  • NOT EXISTS(query)

    Содержит ли результат запроса строки:

    SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'c%');
            -> 0
    
    SELECT NOT EXISTS (SELECT * FROM t WHERE col LIKE 'd%');
            -> 1
    
  • GREATEST(value1,value2,...)

    С двумя или более аргументами возвращает наибольший (максимальный) аргумент. Аргументы сравниваются по тем же правилам, что и для 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.

  • expr IN (value,...)

    Возвращает 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');
            -> 1
    

    IN() может использоваться для сравнения конструкторов строк:

    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».

  • expr NOT IN (value,...)

    Это то же самое, что и NOT (expr IN (value,...)).

  • INTERVAL(N,N1,N2,N3,...)

    Возвращает 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
    
  • IS boolean_value

    Проверяет значение на соответствие булеву значению, где boolean_value может быть TRUE, FALSE или UNKNOWN.

    mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
            -> 1, 1, 1
    
  • IS NOT boolean_value

    Проверяет значение на соответствие булевому значению, где boolean_value может быть TRUE, FALSE или UNKNOWN.

    mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
            -> 1, 1, 0
    
  • IS NULL

    Проверяет, является ли значение 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_name WHERE auto_col IS 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_name WHERE date_column IS NULL
      

      Это необходимо для работы некоторых приложений ODBC, поскольку ODBC не поддерживает значение даты '0000-00-00'.

      См. , и описание опции FLAG_AUTO_IS_NULL в .

  • IS NOT NULL

    Проверяет, не является ли значение NULL.

    mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
            -> 1, 1, 0
    
  • ISNULL(expr)

    Если expr равно NULL, ISNULL() возвращает 1, в противном случае — 0.

    mysql> SELECT ISNULL(1+1);
            -> 0
    mysql> SELECT ISNULL(1/0);
            -> 1
    

    ISNULL() можно использовать вместо = для проверки, является ли значение NULL. (Сравнение значения с NULL с помощью = всегда даёт NULL.)

    Функция ISNULL() имеет некоторые особенности, аналогичные оператору сравнения IS NULL. См. описание IS NULL.

  • LEAST(value1,value2,...)

    При двух или более аргументах возвращает наименьший (минимальное значение) аргумент. Аргументы сравниваются по следующим правилам:

    • Если какой-либо аргумент равен 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/comparison-operators.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API