SQL e DadosAula 1617/09/20261h31
HAVING vs WHERE, agregações e cálculos
Retoma SELECT com WHERE, IN, LIKE e ORDER BY mais DISTINCT, GROUP BY com COUNT, SUM e AVG e HAVING das aulas do TP3 e da mini-faculdade. Destrava a diferença entre WHERE que filtra antes do grupo e HAVING que filtra depois da agregação. Libera cálculo direto no SELECT com multiplicação e divisão, como desconto e dias, mantendo a regra no banco para garantir integridade.
O que foi falado
00:15:30WHEREfiltra linha,HAVINGfiltra grupoWHERE filtra linhas antes do agrupamento; HAVING filtra os grupos resultantes. Uma condição sobre AVG() ou COUNT(*) calculado pelo mesmo SELECT vai no HAVING, não no WHERE. Aliases em filtros seguem regras do banco usado; repetir a expressão agregada no HAVING evita depender do alias.
SELECT categoria, AVG(preco) AS media FROM cursos GROUP BY categoria HAVING AVG(preco) > 100;Média e contagem por categoria com
00:22:41GROUP BYNos exemplos da aula, a coluna não agregada categoria aparece no GROUP BY, definindo um grupo por categoria. AVG(preco) calcula a média dos preços não nulos e COUNT(*) conta todas as linhas de cada grupo.
SELECT categoria, AVG(preco) AS media, COUNT(*) AS qtd FROM cursos GROUP BY categoria;
00:28:57DECIMALexato,FLOATeROUNDEm bancos com DECIMAL(p,s), p é o total de dígitos e s é a quantidade depois da vírgula. Assim, DECIMAL(10,2) reserva até 8 dígitos inteiros e 2 fracionários. FLOAT usa representação aproximada; o tipo do resultado de AVG() e SUM() depende do banco e da coluna. ROUND(valor, 2) arredonda para duas casas, mas o formato de exibição pode omitir zeros finais.
SELECT ROUND(AVG(preco), 2) AS media FROM cursos;Filtrar ano e mês com
00:40:20YEAR,MONTHeANDNo banco usado na aula, YEAR(data) e MONTH(data) extraem o ano e o mês de uma data. Para selecionar janeiro de 2025, combine MONTH(data) = 1 AND YEAR(data) = 2025; filtrar somente pelo mês incluiria janeiro de outros anos. Essas funções não são nomes universais em todos os bancos SQL.
SELECT * FROM matriculas WHERE MONTH(data) = 1 AND YEAR(data) = 2025;
00:50:33GROUP BYcom várias colunas eORDER BYGROUP BY estado, plano cria um grupo para cada combinação de estado e plano. Trocar a ordem dessas duas colunas não muda as combinações agrupadas. ORDER BY controla a exibição; com ORDER BY estado, qtd DESC, estado tem prioridade e qtd ordena os empates.
SELECT estado, plano, COUNT(*) AS qtd FROM alunos GROUP BY estado, plano ORDER BY estado, qtd DESC;Desconto e dias com cálculo no
00:58:22SELECTO SELECT pode calcular expressões, como preco * 0.9 para aplicar 10% de desconto e carga_horaria / 2 para estimar dias. O literal decimal usa ponto. O cálculo no SELECT não altera os valores armazenados nem garante, sozinho, integridade dos dados. A aula defende centralizar regras no banco; aplicá-las dessa forma exige também os mecanismos adequados à regra.
SELECT nome, preco * 0.9 AS com_desconto, carga_horaria / 2 AS dias FROM cursos;
Perguntas que valem a pena
O que significa COUNT(*)?00:27:20
COUNT(*) conta todos os registros linha a linha, e com GROUP BY conta após agrupar.
Qual a diferença entre DECIMAL(10,2) e DECIMAL(12,2)?00:28:49
O primeiro número é a precisão total e o segundo é a escala decimal. DECIMAL(10,2) permite até 8 dígitos antes da vírgula; DECIMAL(12,2), até 10. Ambos reservam 2 casas fracionárias.
Dá para usar 0.90 no cálculo de desconto?01:01:01
Dá, sem problema. Também dá para usar quebrado como 0.95.
A regra de desconto fica no back-end ou no banco no dia a dia?01:02:17
A aula expressa preferência por centralizar a regra no banco. A escolha prática depende da aplicação; calcular uma expressão no SELECT, por si só, não impõe uma regra de integridade.
Conceitos da aula
- WHERE
- HAVING
- GROUP BY
- COUNT
- AVG
- AND
- ORDER BY
- DECIMAL(p,s)
- FLOAT
- MONTH
- cálculo aritmético no SELECT
- regra de negócio no banco
Reforce este assunto
- Agregação com GROUP BY: SUM, COUNT, AVG, MIN e MAXSQL e Dados · trilha, etapa 8
- HAVING e DISTINCT com GROUP BYSQL e Dados · trilha, etapa 9
- WHERE: comparação, AND, OR, IN e NOT INSQL e Dados · trilha, etapa 6