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
TIMESTAMPouDATETIMEe 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
DATEeDATETIMENOT NULLvocê pode encontrar a data especial0000-00-00utilizando:
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 maxSe
expré maior que ou igual amineexpré menor que ou igual amax,BETWEENretorna1, 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 maxO mesmo que
NOT (expr BETWEEN min AND max).expr IN (valor,...)Retorna
1seexpré 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 daexpre ordenado. A busca do item é então feita usando pesquisa binária. Isto significa queINé muito rápido se os valores da listaINforem 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),
INreturnaNULLnã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
NULLusando=sempre será falso!COALESCE(lista)
Retorna o primeiro elemento não
NULLna lista:mysql>
SELECT COALESCE(NULL,1);-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);-> NULLINTERVAL(N,N1,N2,N3,...)Retorna
0seN<N1,1seN<N2e assim por diante ou-1seNéNULL. Todos os argumentos são tratados como inteiros. Isto exige queN1<N2<N3<...<Nnpara 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