Uma cláusula WHERE
no SQL especifica que uma instrução da linguagem de manipulação de dados (Data Manipulation Language - DML) SQL deve afetar apenas as linhas que atendem aos critérios especificados. Os critérios são expressos na forma de predicados. Cláusulas WHERE
não são cláusulas obrigatórias de instruções DML SQL, mas podem ser usadas para limitar o número de linhas afetadas por uma instrução ou retornadas por uma consulta. Em resumo, a cláusula SQL WHERE
é usada para extrair apenas aqueles resultados de uma instrução SQL, como: SELECT
, INSERT
, UPDATE
ou DELETE
.[1]
WHERE
é uma palavra reservada do SQL.
A cláusula WHERE
é usada em conjunto com as instruções DML SQL e assume o seguinte formato geral:
Instrução-DML-SQL
FROM nome_da_tabela
WHERE predicado
Todas as linhas para as quais o predicado na cláusula WHERE
for verdadeiro (True) são afetadas (ou retornadas) pela instrução ou consulta DML SQL. As linhas para as quais o predicado é avaliado como falso (False) ou desconhecido (NULL) não são afetadas pela instrução ou consulta DML.
A consulta a seguir retorna apenas as linhas da tabela minha_tabela, nas quais o valor na coluna minhacol é maior que 100:
SELECT *
FROM minha_tabela
WHERE minhacol > 100
A seguinte instrução DELETE
remove apenas as linhas da tabela minha_tabela em que a coluna minhacol é NULL ou possui um valor igual a 100.
DELETE
FROM minha_tabela
WHERE minhacol IS NULL OR minhacol = 100
Predicados simples usam um dos seguintes operadores: =
, <>
, >
, >=
, <
, <=
, IN
, BETWEEN
, LIKE
, IS NULL
ou IS NOT NULL
.
Os predicados podem ser colocados entre parênteses, se desejado. As palavras-chave AND
e OR
podem ser usadas para combinar dois predicados em um novo. Se várias combinações forem aplicadas, parênteses podem ser usados para agrupar combinações para indicar a ordem de avaliação. Sem parênteses, o operador AND
tem uma ligação mais forte que OR
.
O exemplo a seguir exclui linhas de minha_tabela, em que o valor de minhacol é maior que 100 e o valor de item é igual ao literal da string 'Martelo':
DELETE
FROM minha_tabela
WHERE minhacol > 100 AND item = 'Martelo'
IN
encontrará todos os valores existentes em um conjunto de candidatos.
SELECT nomec WHERE nomec IN ('Belém', 'Santarém')
Todas as linhas correspondem ao predicado se seu valor for um dos conjuntos de valores candidatos. Este é o mesmo comportamento que
SELECT nomec WHERE nomec='valor1' OR nomec='valor2'
exceto que o último poderia permitir a comparação de várias colunas, o que cada cláusula IN
não permite. Para um número maior de candidatos, o IN
é menos verboso.
BETWEEN
encontrará todos os valores dentro de um intervalo.
SELECT nomec WHERE nomec BETWEEN 'valor1' AND 'valor2'
SELECT salario FROM emp WHERE salario BETWEEN 5000 AND 10000
Todas as linhas correspondem ao predicado se seu valor estiver entre 'valor1' e 'valor2', inclusive.
LIKE
encontrará uma string que se ajusta a uma certa descrição.
SELECT nomec FROM emp WHERE nomec LIKE 'S%';
SELECT nomec FROM emp WHERE nomec LIKE '%S';
SELECT nomec FROM emp WHERE nomec LIKE '%S%';
SELECT nomec FROM emp WHERE nomec LIKE '%A_E%';
SELECT nomec FROM emp WHERE nomec LIKE '[a-zA-Z0-9_]%';
Os programadores SQL precisam estar cientes de que o predicado LIKE
normalmente realiza uma pesquisa sem o benefício de desempenho normal dos índices. Usar '=', '<>', etc., em vez dele, aumentará o desempenho. Os usuários do predicado LIKE
devem estar cientes de que a diferenciação de maiúsculas e minúsculas (por exemplo, 'S' versus 's') pode ser diferente com base no produto ou na configuração do banco de dados.