SQL e DadosAula 1410/09/20261h27
DISTINCT, GROUP BY, HAVING e funções de agregação
Retoma SELECT com WHERE, IN, NOT IN, LIKE e ORDER BY da aula do TP3 e da lista de filtros. Troca a base para a mini-faculdade com criação e carga prontas e destrava DISTINCT, GROUP BY com COUNT, SUM e AVG e o filtro de grupo com HAVING. A entrega do TP3 foi prorrogada para o dia 14.
O que foi falado
Revisar SELECT com IN, LIKE e ORDER BY
00:19:31A aula confere a base nova com SELECT * e filtra planos com WHERE plano IN (...) ou NOT IN (...). Para procurar um trecho de texto, usa LIKE com %, que representa uma sequência de caracteres. Em IN, o texto com % é um valor literal: não faz busca por padrão e não causa erro por esse motivo. ORDER BY controla a ordem da exibição com ASC ou DESC.
SELECT nome, plano FROM alunos WHERE plano IN ('Premium', 'Pro') ORDER BY nome ASC;DISTINCT para valores sem repetição
00:24:20DISTINCT elimina linhas repetidas do resultado nas colunas selecionadas. Em SELECT DISTINCT plano FROM alunos, mostra cada plano uma vez. Um SELECT comum devolve um resultado; não cria uma tabela, coluna permanente ou VIEW no banco.
SELECT DISTINCT plano FROM alunos;GROUP BY com COUNT(*) e regra do agrupamento
00:28:21GROUP BY reúne linhas por valores iguais nas colunas de agrupamento. COUNT(*) conta as linhas de cada grupo. Nos exemplos, toda coluna não agregada do SELECT também aparece no GROUP BY. Selecionar outras colunas pode ser rejeitado ou produzir valores arbitrários, conforme o banco e a configuração. Selecionar somente as colunas agrupadas, sem agregação, elimina duplicatas como DISTINCT.
SELECT plano, COUNT(*) AS total FROM alunos GROUP BY plano;COUNT DISTINCT e subquery para contar
00:38:35COUNT(DISTINCT nivel) conta os valores diferentes e não nulos de nivel. A aula também coloca SELECT DISTINCT nivel FROM cursos numa subconsulta e conta suas linhas com COUNT(*). Na base mostrada, os resultados coincidem; se existir NULL, a subconsulta pode manter uma linha nula que COUNT(*) conta e COUNT(DISTINCT nivel) ignora.
SELECT COUNT(DISTINCT nivel) AS total_niveis FROM cursos;HAVING filtra grupo, WHERE filtra linha
00:48:27WHERE filtra linhas antes do agrupamento; HAVING filtra os grupos resultantes, inclusive por COUNT, SUM ou AVG. A expressão agregada não pode ser usada no WHERE do mesmo SELECT. A aula usa o alias total no HAVING, aceito pelo banco utilizado; em outros bancos, pode ser necessário repetir a expressão, como HAVING SUM(valor_pago) > 2000. Os dois filtros podem aparecer na mesma consulta.
SELECT status, SUM(valor_pago) AS total FROM matriculas GROUP BY status HAVING total > 2000;AVG e agregação com ou sem GROUP BY
01:15:18AVG(valor_pago) calcula a média dos valores não nulos. Sem GROUP BY, calcula sobre todas as linhas que passaram pelos filtros; com GROUP BY status, calcula por status. Para conferir uma consulta, a aula recomenda montá-la por partes e observar os resultados. As regras para aliases e identificadores entre aspas variam entre bancos.
SELECT AVG(valor_pago) AS media FROM matriculas; SELECT status, AVG(valor_pago) AS media FROM matriculas GROUP BY status;
Perguntas que valem a pena
Busca com % só funciona com LIKE?00:27:10
No padrão mostrado pela aula, % é curinga com LIKE. Em IN e NOT IN, um texto como "%a%" é comparado literalmente; ele não vira uma busca por trecho nem causa erro só por conter %.
Posso usar no WHERE o apelido criado com AS para o total?01:09:41
Não para filtrar o resultado agregado do mesmo SELECT: WHERE filtra as linhas antes da agregação. Use HAVING com a expressão agregada, ou com seu alias quando o banco aceitar.
HAVING é uma extensão do WHERE?01:10:58
Não, é filtro próprio do agrupamento; pode usar sozinho ou combinado com WHERE.
Agregação exige GROUP BY, mas GROUP BY pode ir sem agregação?01:11:50
Agregações podem aparecer sem GROUP BY e então consideram as linhas como um grupo. GROUP BY pode aparecer sem agregação; ao selecionar somente as colunas agrupadas, elimina duplicatas como DISTINCT.
Conceitos da aula
- SELECT
- WHERE
- IN
- LIKE
- ORDER BY
- DISTINCT
- GROUP BY
- COUNT
- SUM
- HAVING
- AVG
- subquery
Reforce este assunto
- HAVING e DISTINCT com GROUP BYSQL e Dados · trilha, etapa 9
- Agregação com GROUP BY: SUM, COUNT, AVG, MIN e MAXSQL e Dados · trilha, etapa 8
- ORDER BY: ordenação com ASC e DESCSQL e Dados · trilha, etapa 7