Aulas do bloco

← Aulas

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

  1. Revisar SELECT com IN, LIKE e ORDER BY

    00:19:31

    A 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.

    SQL
    SELECT nome, plano
    FROM alunos
    WHERE plano IN ('Premium', 'Pro')
    ORDER BY nome ASC;
  2. DISTINCT para valores sem repetição

    00:24:20

    DISTINCT 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.

    SQL
    SELECT DISTINCT plano
    FROM alunos;
  3. GROUP BY com COUNT(*) e regra do agrupamento

    00:28:21

    GROUP 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.

    SQL
    SELECT plano, COUNT(*) AS total
    FROM alunos
    GROUP BY plano;
  4. COUNT DISTINCT e subquery para contar

    00:38:35

    COUNT(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.

    SQL
    SELECT COUNT(DISTINCT nivel) AS total_niveis
    FROM cursos;
  5. HAVING filtra grupo, WHERE filtra linha

    00:48:27

    WHERE 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.

    SQL
    SELECT status, SUM(valor_pago) AS total
    FROM matriculas
    GROUP BY status
    HAVING total > 2000;
  6. AVG e agregação com ou sem GROUP BY

    01:15:18

    AVG(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.

    SQL
    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

10 exercíciosComeçar →