Search the MySQL manual:
MySQL Manual

Buy this Reference Manual in softcover from Barnes & Noble!

/ Next / Up / Table of Contents

6.3.1.2 Операторы сравнения

Операторы сравнения дают в результате величину 1 (истина, TRUE), 0 (ложь, FALSE) или NULL. Эти функции работают как с числами, так и со строками. Строки при необходимости автоматически преобразуются в числа, а числа - в строки (как в Perl).

Операции сравнения в MySQL выполняются по следующим правилам:

По умолчанию сравнение строк производится без учета регистра символов с использованием текущего набора символов (по умолчанию 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 section 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), в котором все аргументы представлены одним и тем же типом данных. Способ выполнения сравнения определяется первым аргументом (expr):
  • Если expr представляет собой столбец типа TIMESTAMP, DATE или DATETIME, а величины MIN() и MAX() являются константами, то последние приводятся к тому же формату, что и столбец.
  • Если expr является независимым от регистра символов строковым выражением, то производится сравнение строк без учета регистра.
  • Если expr является зависимым от регистра символов строковым выражением, то производится сравнение строк с учетом регистра.
  • Если 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
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 ";
        -> 1

User Comments

Posted by on Friday July 5 2002, @3:20am [Delete] [Edit]

Is there a null-safe version of the "!=" operator?
It's not terribly clear from TFM. It's also not
terribly clear if you can "NOT" anything, or only
the things specificially listed above.

Posted by Carl Troein on Friday May 17 2002, @6:24am [Delete] [Edit]

Just like with IN and NOT IT, BETWEEN has the
variant NOT BETWEEN, which is equivalent to NOT
... BETWEEN ...

Posted by Peter on Friday May 17 2002, @6:24am [Delete] [Edit]

ASP users: if you're getting empty recordset
returned when using COALESCE, add "OPTION=16384"
to your connectionstring, or check "Change Bigint
to Int" in the DSN manager!

Posted by [name withheld] on Friday May 17 2002, @6:24am [Delete] [Edit]

I have a TIMESTAMP (YYYYMMDDHHMMSS) field in my
table. How'd I find entries 1,3,5,10 days old
(from the current day)?
Thanks!

Posted by Bastian S. on Wednesday December 18 2002, @5:27pm [Delete] [Edit]

You can make an modulo-operation: convert the day
(only the day; not the time !!) into a unix-
timestamp [unix_timestamp(YY-MM-DD)] and select
only that results where the difference between
now and them is modulo = 0;

SELECT * FROM tbl where ((unix_timestamp() -
unix_timestamp(1999-07-04)) % 259200) = 0;

- 259200 are the secound for tree days
(60*60*24*3=259200)
- these select build the difference between now
[unix_timestamp() - unix_timestamp()] and look if
modulo with the second-value for the days you
need ist 0
- see '6.3.4 Date and Time Functions' for some
functions to extract the day from a datetime

Posted by [name withheld] on Friday May 17 2002, @6:24am [Delete] [Edit]

If you are looking for something like:
SELECT id,name,perm_list FROM users WHERE 'write'
IN perm_list
where 'perm_list' contains a comma separated list
of privileges, you would try to use:
SELECT id,name FROM users WHERE FIND_IN_SET
('write',perm_list)>0;

Posted by jdpipe on Monday June 10 2002, @3:07am [Delete] [Edit]

How many items can be put in an expr IN (value,
value, value ...) list?

Posted by Ahmed Al-Adaileh on Tuesday June 11 2002, @7:43am [Delete] [Edit]

The follwoing SQL statment is not working in
MySql, anybody has an idea?

SELECT * FROM table_1
WHERE col_1 IN (SELECT col_2 FROM table_2)

The problem that I can't get the result of the
second SELECT separated by commas!!

Posted by on Monday June 24 2002, @1:49pm [Delete] [Edit]

Ahmed Al-Adaileh, what you're trying to do is a
subselect, which mysql doesn't support right now.

the only "subselect" type thing you can do is use
IN(), but only with values:

SELECT bar FROM foo WHERE column IN
('value','whee','anothervalue',11,53,'value2')

you cannot put another SELECT statement in there.

Posted by on Wednesday September 4 2002, @5:43am [Delete] [Edit]

On using ranges & BETWEEN for selecting data:

Selecting item_name FROM item WHERE item_name
BETWEEN 'A' and 'D' will not return all of 'D' items.
To ensure all lower-bound items are included set
the lower-bound to 'Dz'

All the upper bound items are returned as one would
expect.

Not sure why one wouldn't make the change to
upper bound as well.

Posted by Lanhui Ou on Sunday October 27 2002, @1:46am [Delete] [Edit]

How to use exists clause?
like
select * from table_a where pp not in (select pp
from table_b)?

Posted by on Thursday November 14 2002, @9:31am [Delete] [Edit]

I solve the issue of select * from table where col in
(select col from table2 where [condition]) by using a
JOIN; i made something like SELECT * FROM TABLE
JOIN TABLE2 WHERE TABLE.COL=TABLE2.COL AND
[CONDITION] (te condition of the subset); wich had
the same results of the IN() sentence avoiding a
process to add commas to the subset.

Posted by on Monday February 24 2003, @6:48am [Delete] [Edit]

I want to audit my database and find records which have no or wrong reference into another table.
How to use exists clause?
like
select * from table_a where field_id not in (select field_id from table_b)?

Posted by on Monday February 24 2003, @8:14am [Delete] [Edit]

Using BETWEEN can cause problems if you are not careful about types. For instance, the Perl DBD module for MySQL wraps integers in quotes when it replaces parameters. But "SELECT * FROM foo WHERE '1' BETWEEN a AND b" does not necessarily yield the same results as "SELECT * FROM foo WHERE (a <= '1') AND ('1' <= b)". It seems like where BETWEEN is used a string comparison is made, while an integer comparison is made using the <= symbols.

Add your own comment.

Top / / Next / Up / Table of Contents