WHERE permite filtrar os dados que vêm da cláusulaFROM de SELECT.
Se houver uma cláusula WHERE, ela deve ser seguida de uma expressão do tipo UInt8.
As linhas para as quais essa expressão resulta em 0 são excluídas de transformações posteriores ou do resultado.
A expressão que segue a cláusula WHERE costuma ser usada com operadores de comparação e operadores lógicos, ou com uma das muitas funções regulares.
A expressão na cláusula WHERE é avaliada considerando a possibilidade de usar índices e poda de partições, se o engine de tabela subjacente oferecer suporte a isso.
PREWHERETambém há uma otimização de filtragem chamada
PREWHERE.
PREWHERE é uma otimização para aplicar a filtragem com mais eficiência.
Ela é habilitada por padrão mesmo que a cláusula PREWHERE não seja especificada explicitamente.Testando NULL
NULL, use:
IS NULLouisNullIS NOT NULLouisNotNull
NULL nunca será avaliada como verdadeira.
Filtrando dados com operadores lógicos
WHERE para combinar várias condições:
Usando colunas UInt8 como condição
UInt8 podem ser usadas diretamente como condições booleanas, em que 0 é false e qualquer valor diferente de zero (geralmente 1) é true.
Um exemplo disso é mostrado na seção abaixo.
Usando operadores de comparação
| Operador | Função | Descrição | Exemplo |
|---|---|---|---|
a = b | equals(a, b) | Igual a | price = 100 |
a == b | equals(a, b) | Igual a (sintaxe alternativa) | price == 100 |
a != b | notEquals(a, b) | Diferente de | category != 'Electronics' |
a <> b | notEquals(a, b) | Diferente de (sintaxe alternativa) | category <> 'Electronics' |
a < b | less(a, b) | Menor que | price < 200 |
a <= b | lessOrEquals(a, b) | Menor que ou igual a | price <= 200 |
a > b | greater(a, b) | Maior que | price > 500 |
a >= b | greaterOrEquals(a, b) | Maior que ou igual a | price >= 500 |
a LIKE s | like(a, b) | Correspondência de padrões (diferencia maiúsculas de minúsculas) | name LIKE '%top%' |
a NOT LIKE s | notLike(a, b) | Não corresponde ao padrão (diferencia maiúsculas de minúsculas) | name NOT LIKE '%top%' |
a ILIKE s | ilike(a, b) | Correspondência de padrões (sem diferenciar maiúsculas de minúsculas) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c | a >= b AND a <= c | Verificação de intervalo (inclusive) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c | a < b OR a > c | Verificação fora do intervalo | price NOT BETWEEN 100 AND 500 |
Correspondência de padrões e expressões condicionais
WHERE.
| Recurso | Sintaxe | Sensível a maiúsculas e minúsculas | Desempenho | Melhor para |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | Sim | Rápido | Correspondência exata de padrão |
ILIKE | col ILIKE '%pattern%' | Não | Mais lento | Busca sem diferenciar maiúsculas de minúsculas |
if() | if(cond, a, b) | N/A | Rápido | Condições binárias simples |
multiIf() | multiIf(c1, r1, c2, r2, def) | N/A | Rápido | Múltiplas condições |
CASE | CASE WHEN ... THEN ... END | N/A | Rápido | Lógica condicional padrão SQL |
Expressão com literais, colunas ou subconsultas
WHERE também pode incluir literais, colunas ou subconsultas, que são instruções SELECT aninhadas que retornam valores usados em condições.
| Tipo | Definição | Avaliação | Desempenho | Exemplo |
|---|---|---|---|---|
| Literal | Valor constante fixo | No momento da escrita da consulta | Mais rápido | WHERE price > 100 |
| Coluna | Referência aos dados da tabela | Por linha | Rápido | WHERE price > cost |
| Subconsulta | SELECT aninhado | No momento da execução da consulta | Varia | WHERE id IN (SELECT ...) |
Exemplos
Verificando NULL
NULL:
Filtrando dados com operadores lógicos
AND - ambas as condições devem ser atendidas:
OR - pelo menos uma condição deve ser atendida:
NOT - Nega uma condição:
XOR - Exatamente uma condição deve ser verdadeira (mas não ambas):
AND, OR, NOT, XOR) geralmente é mais legível, mas a sintaxe de função pode ser útil em expressões complexas ou ao criar consultas dinâmicas.
Usando colunas UInt8 como condição
Usando operadores de comparação
= 1 ou = true):
false (= 0 ou = false):
!= 0 ou != false):
IN:
No exemplo abaixo, (1, true) é uma tupla.