Cláusulas WHERE e ORDER BY

Autor

Douglas Braga

WHERE: Filtrando Linhas

A cláusula WHERE especifica quais linhas devem aparecer no resultado. Ela aceita expressões lógicas compostas por comparações, conectivos booleanos e predicados especiais.

Operadores de Comparação

Operador Significado Exemplo
= igual id_escola = 31
<> ou != diferente semestre <> 2
< menor que carga_horaria < 60
> maior que carga_horaria > 100
<= menor ou igual semestre <= 4
>= maior ou igual carga_horaria >= 60

Conectivos Lógicos: AND, OR, NOT

-- Disciplinas de ENS com carga horária acima de 150 horas
SELECT id_disciplina, nome_disciplina, carga_horaria
FROM   disciplina
WHERE  id_curso = 311
  AND  carga_horaria > 150;
2 records
id_disciplina nome_disciplina carga_horaria
3110401 Bases da Eng. de Software 4 180
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 160
-- Disciplinas de PED ou com carga horária acima de 150 horas
SELECT id_disciplina, nome_disciplina, id_curso, carga_horaria
FROM   disciplina
WHERE  id_curso = 211
   OR  carga_horaria > 150
ORDER BY carga_horaria DESC;
Displaying records 1 - 10
id_disciplina nome_disciplina id_curso carga_horaria
3110401 Bases da Eng. de Software 4 311 180
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 311 160
2110401 Eletiva I 211 80
2110402 Fundamentos e Orientações Metodológicas - Ed. Infantil - BNCC 211 80
2110601 Eletiva II 211 80
2110201 Desenvolvimento Humano 211 60
2110202 Didática Geral 211 60
2110801 Tecnologia Educacional - Design 211 60
2110802 Estatística Aplicada 211 50
2110602 Educação do Campo, Indígena e Quilombola 211 40
-- Disciplinas que NÃO são de ECO
SELECT id_disciplina, nome_disciplina, id_curso
FROM   disciplina
WHERE  NOT id_curso = 111
ORDER BY id_curso, id_disciplina;
Displaying records 1 - 10
id_disciplina nome_disciplina id_curso
2110201 Desenvolvimento Humano 211
2110202 Didática Geral 211
2110401 Eletiva I 211
2110402 Fundamentos e Orientações Metodológicas - Ed. Infantil - BNCC 211
2110601 Eletiva II 211
2110602 Educação do Campo, Indígena e Quilombola 211
2110801 Tecnologia Educacional - Design 211
2110802 Estatística Aplicada 211
3110201 Bases da Eng. de Software 2 311
3110202 Projeto Aplicado 2 - site WEB 311

BETWEEN

O predicado BETWEEN verifica se um valor está dentro de um intervalo fechado (inclusive os extremos):

-- Disciplinas com carga horária entre 100 e 160 horas (inclusive)
SELECT id_disciplina, nome_disciplina, id_curso, carga_horaria
FROM   disciplina
WHERE  carga_horaria BETWEEN 100 AND 160
ORDER BY carga_horaria;
8 records
id_disciplina nome_disciplina id_curso carga_horaria
3110801 Bases da Eng. de Software 8 311 100
1110801 Monografia 111 100
3110602 Projeto Aplicado 6 - Machine Learning 311 120
3110202 Projeto Aplicado 2 - site WEB 311 120
3110402 Projeto Aplicado 4 - blockchain 311 120
3110601 Bases da Eng. de Software 6 311 150
3110201 Bases da Eng. de Software 2 311 150
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 311 160

carga_horaria BETWEEN 100 AND 160 é equivalente a carga_horaria >= 100 AND carga_horaria <= 160. A versão com BETWEEN é mais legível.

O predicado NOT BETWEEN exclui o intervalo.

LIKE: Padrões em Strings

O predicado LIKE permite filtrar strings usando padrões. Dois caracteres especiais estão disponíveis:

Caractere Significado
% Qualquer sequência de zero ou mais caracteres
_ Exatamente um caractere qualquer
-- Disciplinas cujo nome começa com "Bases"
-- (corresponde às disciplinas de Bases da Eng. de Software dos semestres 2, 4, 6 e 8 de ENS)
SELECT id_disciplina, nome_disciplina, carga_horaria
FROM   disciplina
WHERE  nome_disciplina LIKE 'Bases%';
4 records
id_disciplina nome_disciplina carga_horaria
3110201 Bases da Eng. de Software 2 150
3110401 Bases da Eng. de Software 4 180
3110601 Bases da Eng. de Software 6 150
3110801 Bases da Eng. de Software 8 100
-- Disciplinas cujo nome contém a palavra "Projeto"
SELECT id_disciplina, nome_disciplina, id_curso
FROM   disciplina
WHERE  nome_disciplina LIKE '%Projeto%';
4 records
id_disciplina nome_disciplina id_curso
3110202 Projeto Aplicado 2 - site WEB 311
3110402 Projeto Aplicado 4 - blockchain 311
3110602 Projeto Aplicado 6 - Machine Learning 311
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 311
Nota

LIKE aplica-se a colunas do tipo texto (VARCHAR, CHAR, TEXT). Como id_disciplina é agora um INTEGER, padrões de código de disciplina devem ser expressos via atributos textuais, como nome_disciplina, ou filtrando pela coluna id_curso.

Por padrão, LIKE é sensível a maiúsculas e minúsculas na maioria dos SGBDs. Para buscas sem distinção de caixa, use ILIKE (PostgreSQL) ou a função LOWER().

ORDER BY: Ordenando o Resultado

A cláusula ORDER BY especifica a ordem em que as linhas são retornadas. Por padrão, a ordem é crescente (ASC); para ordem decrescente, usa-se DESC.

-- Disciplinas ordenadas por carga horária, da maior para a menor
SELECT id_disciplina, nome_disciplina, id_curso, carga_horaria
FROM   disciplina
ORDER BY carga_horaria DESC;
Displaying records 1 - 10
id_disciplina nome_disciplina id_curso carga_horaria
3110401 Bases da Eng. de Software 4 311 180
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 311 160
3110601 Bases da Eng. de Software 6 311 150
3110201 Bases da Eng. de Software 2 311 150
3110202 Projeto Aplicado 2 - site WEB 311 120
3110602 Projeto Aplicado 6 - Machine Learning 311 120
3110402 Projeto Aplicado 4 - blockchain 311 120
3110801 Bases da Eng. de Software 8 311 100
1110801 Monografia 111 100
1110402 Macroeconomia 2 111 95

É possível ordenar por múltiplas colunas. O critério secundário é aplicado quando há empate no critério primário:

-- Disciplinas ordenadas por curso e, dentro do mesmo curso, por carga horária decrescente
SELECT id_disciplina, nome_disciplina, id_curso, carga_horaria
FROM   disciplina
ORDER BY id_curso ASC, carga_horaria DESC;
Displaying records 1 - 10
id_disciplina nome_disciplina id_curso carga_horaria
1110801 Monografia 111 100
1110402 Macroeconomia 2 111 95
1110802 Desenvolvimento Econômico 111 90
1110602 Orçamento e Finanças Públicas 111 75
1110601 Economia Brasileira 111 75
1110401 Microeconomia 2 111 75
1110201 História Econômica Geral 111 75
1110202 Culturas Digitais 111 60
2110601 Eletiva II 211 80
2110401 Eletiva I 211 80

Para Praticar

-- NOT BETWEEN: disciplinas fora do intervalo central de carga horária
SELECT id_disciplina, nome_disciplina, id_curso, carga_horaria
FROM   disciplina
WHERE  carga_horaria NOT BETWEEN 60 AND 120
ORDER BY carga_horaria;
6 records
id_disciplina nome_disciplina id_curso carga_horaria
2110602 Educação do Campo, Indígena e Quilombola 211 40
2110802 Estatística Aplicada 211 50
3110201 Bases da Eng. de Software 2 311 150
3110601 Bases da Eng. de Software 6 311 150
3110802 Projeto Aplicado 8 - Sistema em Tempo Real 311 160
3110401 Bases da Eng. de Software 4 311 180
-- LIKE com sublinhado: nomes com exatamente uma letra após "Bases d"
-- Demonstra o uso do caractere curinga _ (um único caractere qualquer)
SELECT id_disciplina, nome_disciplina, semestre
FROM   disciplina
WHERE  nome_disciplina LIKE 'Bases d_'
ORDER BY id_disciplina;
0 records
id_disciplina nome_disciplina semestre
-- IN com lista literal: cursos específicos sem usar LIKE
SELECT sigla_curso, nome_curso, tipo_curso
FROM   curso
WHERE  tipo_curso IN ('bacharelado', 'licenciatura')
ORDER BY tipo_curso, sigla_curso;
3 records
sigla_curso nome_curso tipo_curso
ECO Ciências Econômicas bacharelado
ENS Engenharia de Software bacharelado
PED Pedagogia licenciatura
-- Combinação de AND/OR com parênteses: a precedência importa!
-- Sem parênteses, AND tem precedência sobre OR
SELECT nome, id_escola, salario
FROM   professor
WHERE  (id_escola = 31 OR id_escola = 21)
  AND  salario > 5000
ORDER BY id_escola, salario DESC;
2 records
nome id_escola salario
Felipe Araujo 21 6400
Helena Carvalho 31 6700
Aviso

Atenção à precedência: AND tem precedência sobre OR. A expressão a OR b AND c é interpretada como a OR (b AND c), não (a OR b) AND c. Use parênteses sempre que combinar AND e OR para garantir a intenção correta.