Operações de comparação resultam em um valor
1
(VERDADEIRO), 0
(FALSO), ou NULL
. Estas funções funcionam
tanto para tipos numéricos quanto para tipos strings. Strings
são convertidas automaticamente para números e números para
strings quando necessário (como em Perl).
MySQL realiza comparações de acordo com as seguintes regras:
Se um ou ambos os argumentos são NULL
,
o resultado da comparação é NULL
,
exceto para o operador <=>
.
Se ambos os argumentos em uma comparação são strings, eles são comparados como strings.
Se ambos os argumentos são inteiros, eles são comparados como inteiros.
Valores hexadecimais são tratados como strings binárias se não comparadas a um número.
Se uma dos argumentos é uma coluna
TIMESTAMP
ou
DATETIME
e o outro argumento é uma
constante, a constante é convertida para um timestamp
antes da comparação ser realizada. Isto ocorre para ser
mais amigável ao ODBC.
Em todos os outros casos, os argumentos são coparados como números de ponto flutuante (real).
Por padrão, comparações de string são feita de modo independente do caso, usando o conjunto de caracteres atual (ISO-8859-1 Latin1 por padrão, o qual também funciona de forma excelente para o Inglês).
Se você está comparando strings em caso insensitivo com
qualquer dos operadores padrões (=
,
<>
..., mas não o
LIKE
) espaços em branco no fim da string
(espaços, tabs e quebra de linha) serão ignorados.
mysql> SELECT "a" ="A \n";
-> 1
Os seguintes exemplos ilustram a conversão de strings para números para operações de comparação:
mysql>SELECT 1 > '6x';
-> 0 mysql>SELECT 7 > '6x';
-> 1 mysql>SELECT 0 > 'x6';
-> 0 mysql>SELECT 0 = 'x6';
-> 1
Note que quando você está comparando uma coluna string com um número, o MySQL não pode usar índices para encontrar o valor rapidamente:
SELECT * FROM table_name WHERE string_key=1
A razão para isto é que existem muitas strings diferentes
que podem retornar o valor 1
:
"1"
, " 1"
,
"1a"
...
=
Igual:
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
<>
, !=
Diferente:
mysql>SELECT '.01' <> '0.01';
-> 1 mysql>SELECT .01 <> '0.01';
-> 0 mysql>SELECT 'zapp' <> 'zappp';
-> 1
<=
Menor que ou igual:
mysql> SELECT 0.1 <= 2;
-> 1
<
Menor que:
mysql> SELECT 2 < 2;
-> 0
>=
Maior que ou igual:
mysql> SELECT 2 >= 2;
-> 1
>
Maior que:
mysql> SELECT 2 > 2;
-> 0
<=>
Igual para NULL
:
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
IS NULL
, IS NOT NULL
Teste para saber se um valor é ou não
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
Para estar apto a funcionar bem com outros programas,
MySQL suporta os seguintes recursos extras quando
utiliza-se IS NULL
:
Você pode encontrar o último registro inserido com:
SELECT * FROM nome_tabela WHERE auto_col IS NULL
Isto pode ser desabilitado configurando
SQL_AUTO_IS_NULL=0
. See
Secção 5.5.6, “Sintaxe de SET
”.
Para colunas DATE
e
DATETIME
NOT
NULL
você pode encontrar a data especial
0000-00-00
utilizando:
SELECT * FROM nome_tabela WHERE coluna_data IS NULL
Isto é necessário para que algums aplicações
ODBC funcionem (já que ODBC não tem suporte a data
0000-00-00
)
expr BETWEEN min AND max
Se expr
é maior que ou igual a
min
e expr
é menor
que ou igual a max
,
BETWEEN
retorna 1
,
senão é retornado 0
. Isto é
equivalente a expressão (min <= expr AND expr
<= max)
se todos os argumentos são do mesmo
tipo. Senão os tipos são convertidos, conforme as regras
acima, e aplicadas a todos os três argumentos.
Note que antes da versão
4.0.5 argumentos eram convertidos para o tipo da
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
O mesmo que NOT (expr BETWEEN min AND
max)
.
expr IN (valor,...)
Retorna 1
se expr
é
qualquer dos valores na lista IN
,
senão retorna 0
. Se todos os valores
são constantes, então os valores são avaliados de
acordo com o tipo da expr
e ordenado. A
busca do item é então feita usando pesquisa binária.
Isto significa que IN
é muito rápido
se os valores da lista IN
forem todos
contantes. Se expr
é uma expressão
strig em caso-sensitivo, a comparação é realizadas no
modo caso-sensitvo:
mysql>SELECT 2 IN (0,3,5,'wefwf');
-> 0 mysql>SELECT 'wefwf' IN (0,3,5,'wefwf');
-> 1
O número de valores na lista IN
é
limitada apenas pelo valor
max_allowed_packet
.
Na versão 4.1 (para se adequar ao padrão SQL-99),
IN
returna NULL
não
apeans se a expressão a sua esquerda é
NULL
, mas também se nenhuma
correspondência é encontrada na lista e uma de suas
expressões é NULL
.
A partir do MySQL versão 4.1, uma cláusula IN() também
pode conter uma subquery. See
Secção 6.4.2.3, “Subqueries with ANY
, IN
, and
SOME
”.
expr NOT IN (valor,...)
O mesmo que NOT (expr IN (valor,...))
.
ISNULL(expr)
Se expr
é NULL
,
ISNULL()
retorna 1
,
senão retorna 0
:
mysql>SELECT ISNULL(1+1);
-> 0 mysql>SELECT ISNULL(1/0);
-> 1
Note que a compração de valores NULL
usando =
sempre será falso!
COALESCE(lista)
Retorna o primeiro elemento não NULL
na lista:
mysql>SELECT COALESCE(NULL,1);
-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...)
Retorna 0
se N
<
N1
, 1
se
N
< N2
e assim
por diante ou -1
se
N
é NULL
. Todos os
argumentos são tratados como inteiros. Isto exige que
N1
< N2
<
N3
< ...
<
Nn
para que esta função funcione
corretamente. Isto ocorre devido a utilização pesquisa
binária (muito rápida):
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
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.