Operadores de Comparação
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
ouDATETIME
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 MariaDB 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 0IS 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 0Para estar apto a funcionar bem com outros programas, MariaDB 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
. Leia "Sintaxe deSET
". - Para colunas
DATE
eDATETIME
NOT NULL
você pode encontrar a data especial0000-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
)
- Você pode encontrar o último registro inserido com:
expr BETWEEN min AND max
Se
expr
é maior que ou igual amin
eexpr
é menor que ou igual amax
,BETWEEN
retorna1
, senão é retornado0
. 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 daexpr
.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';
-> 0expr NOT BETWEEN min AND max
O mesmo que
NOT (expr BETWEEN min AND max)
.expr IN (valor,...)
Retorna
1
seexpr
é qualquer dos valores na listaIN
, senão retorna0
. Se todos os valores são constantes, então os valores são avaliados de acordo com o tipo daexpr
e ordenado. A busca do item é então feita usando pesquisa binária. Isto significa queIN
é muito rápido se os valores da listaIN
forem todos contantes. Seexpr
é 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');
-> 1O número de valores na lista
IN
é limitada apenas pelo valormax_allowed_packet
.Na versão 4.1 (para se adequar ao padrão SQL-99),
IN
returnaNULL
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 MariaDB versão 4.1, uma cláusula IN() também pode conter uma subquery. Leia "Subqueries with
ANY
,IN
, andSOME
".expr NOT IN (valor,...)
O mesmo que
NOT (expr IN (valor,...))
.ISNULL(expr)
Se
expr
éNULL
,ISNULL()
retorna1
, senão retorna0
:mysql>
SELECT ISNULL(1+1);
-> 0 mysql>SELECT ISNULL(1/0);
-> 1Note 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);
-> NULLINTERVAL(N,N1,N2,N3,...)
Retorna
0
seN
<N1
,1
seN
<N2
e assim por diante ou-1
seN
éNULL
. Todos os argumentos são tratados como inteiros. Isto exige queN1
<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