Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

6.3.1.3 Логические операторы

В SQL, все логические операторы возвращают TRUE (ИСТИНА), FALSE (ЛОЖЬ) или NULL (UNKNOWN, неизвестно). В MySQL это реализовано как 1 (TRUE, ИСТИНА), 0 (FALSE, ЛОЖЬ) или NULL. Это справедливо для большинства SQL СУБД, однако некоторые возвращают любое положительное значение как значение TRUE.

NOT
!
Логическое НЕ. Возвращает 1, если операнд равен 0, 0 если операнд - ненулевая величина, и NOT NULL возвращает NULL.
mysql> SELECT NOT 10;
        -> 0
mysql> SELECT NOT 0;
        -> 1
mysql> SELECT NOT NULL;
        -> NULL
mysql> SELECT ! (1+1);
        -> 0
mysql> SELECT ! 1+1;
        -> 1
Последний пример дает 1, поскольку данное выражение вычисляется тем же способом, что и (!1)+1.
AND
&&
Логическое И. Дает 1 если все операнды ненулевые и не NULL, 0 если один или более операндов равны 0, или NULL в остальных случаях.
mysql> SELECT 1 && 1;
        -> 1
mysql> SELECT 1 && 0;
        -> 0
mysql> SELECT 1 && NULL;
        -> NULL
mysql> SELECT 0 && NULL;
        -> 0
mysql> SELECT NULL && 0;
        -> 0
Обратите внимание, что версии MySQL до 4.0.5 прекращали вычисление, встретив первый NULL, вместо того, чтобы продолжать вычисление выражений с целью нахождения возможных значений 0. Это означает, что в этих версиях выражение SELECT (NULL AND 0) возвращает NULL вместо 0. В 4.0.5 код был переписан так, чтобы оптимизация сохранилась, но результат всегда был таков, как требует того ANSI.
OR
||
Логическое ИЛИ. Возвращает 1, если любой из операндов не 0, NULL если один из операндов NULL, в остальных случаях возвращает 0.
mysql> SELECT 1 || 1;
        -> 1
mysql> SELECT 1 || 0;
        -> 1
mysql> SELECT 0 || 0;
        -> 0
mysql> SELECT 0 || NULL;
        -> NULL
mysql> SELECT 1 || NULL;
        -> 1
XOR
Логический XOR (побитовое сложение по модулю 2) Возвращает NULL если любой из операндов - NULL. Для не-NULL операндов, возвращает 1 если нечетное количество операндов - не 0.
mysql> SELECT 1 XOR 1;
        -> 0
mysql> SELECT 1 XOR 0;
        -> 1
mysql> SELECT 1 XOR NULL;
        -> NULL
mysql> SELECT 1 XOR 1 XOR 1;
        -> 1
a XOR b математически эквалиентно (a AND (NOT b)) OR ((NOT a) and b). XOR был реализован в 4.0.2.

User Comments

Posted by Chris Lacy-Hulbert on June 2 2003 10:52am[Delete] [Edit]

XOR is useful for throwing a boolean switch with just a single query. For example:

mysql> update mytable set mytable.switch=1 XOR mytable.switch where [condition];

will toggle a boolean field 'switch' from 1 to 0 or 0 to 1.


Hope that's useful,
christo

Posted by Matt on September 19 2003 4:35pm[Delete] [Edit]

An alternative to your use of XOR is ABS(x-1) if you are using 0 and 1 switches.

Posted by JoКl Larose on October 20 2003 4:40pm[Delete] [Edit]

Or you could just use the NOT operator, as in

update mytable set mytable.switch=NOT mytable.switch where [condition];

Posted by Matthias Fripp on February 17 2004 2:11pm[Delete] [Edit]

When evaluating expressions, MySQL (4.0.17) seems to give XOR the same precedence as LIKE, while it gives OR a lower precedence. That is,
1 LIKE 2 XOR 2 LIKE 1 is evaluated as
((1 LIKE 2) XOR 2) LIKE 1) and comes out true, instead of being evaluated as
(1 LIKE 2) XOR (2 LIKE 1), which is false, or even as
1 LIKE (2 XOR 2) LIKE 1, which is also false.

However, 1 LIKE 2 OR 2 LIKE 1 is evaluated as (1 LIKE 2) OR (2 LIKE 1), and comes out false.

This should be resolved in a later build. Until then, if you combine LIKE and XOR in a query, make sure to use parentheses to make the priority clear.

Add your own comment.