Olá, Carlos. Como vai?
Excelente resolução! Você fechou esse bloco de exercícios com uma das estruturas mais sofisticadas quando falamos de Common Table Expressions (CTEs): o encadeamento de múltiplas tabelas temporárias (MediaIdadeClientes e ClientesAbaixoMediaIdade) separadas por vírgula dentro de um único bloco WITH.
O resultado no seu Result Grid (Roberto Lima com 30 anos e Fernanda Rocha com 25 anos) comprova que o script funcionou perfeitamente e cumpriu a regra de negócio proposta de forma dinâmica.
Vamos analisar alguns dos grandes destaques lógicos da sua solução e uma sacada técnica muito inteligente que você utilizou:
1. Cálculo Preciso de Idade Dinâmica
A combinação de funções de data que você usou para calcular a idade dos clientes está impecável:
FLOOR(DATEDIFF(CURRENT_DATE(), c.DataNascimento) / 365)
- O
DATEDIFF calcula a diferença bruta em dias entre a data atual e o nascimento. - Ao dividir por 365 e envelopar com a função
FLOOR() (que arredonda o número sempre para baixo), você garante que o banco de dados retorne a idade exata da pessoa. Isso evita problemas de arredondamento precoce que aconteceriam com funções como ROUND().
2. A Estratégia do INNER JOIN ON 1=1 (Cross Join)
A forma como você cruzou a tabela de listagem de clientes com a tabela da média foi muito perspicaz.
Como a CTE MediaIdadeClientes realiza uma agregação (AVG) sem nenhuma cláusula de agrupamento, ela devolve uma tabela de uma única linha e uma única coluna.
Para conseguir comparar a idade de cada cliente individual com esse valor global, você utilizou um INNER JOIN ON 1=1. Na engenharia de dados, essa condição sempre verdadeira (1=1) atua como um Cross Join, acoplando essa única linha da média em todas as linhas da listagem de clientes. Isso permitiu que você fizesse o filtro condicional WHERE idade < media_idade logo em seguida de maneira direta.
3. Uma Dica de Simplificação de Código
A sua lógica está correta e performática. Apenas como uma dica de estilo e legibilidade (o famoso "açúcar sintático"), o SQL possui uma cláusula nativa chamada CROSS JOIN que serve exatamente para esse cenário de cruzar tabelas sem chaves correspondentes, dispensando a necessidade de usar o truque do ON 1=1 e o WHERE 1=1.
Veja como a sua consulta final externa ficaria um pouco mais limpa e direta para a leitura de outros desenvolvedores:
SELECT
cam.nome,
cam.idade
FROM ClientesAbaixoMediaIdade AS cam
-- O Cross Join anexa a linha da média automaticamente em todos os registros
CROSS JOIN MediaIdadeClientes AS mic
WHERE cam.idade < mic.media_idade;
Essa mudança é puramente estética, pois o plano de execução que o banco de dados cria para o CROSS JOIN e para o INNER JOIN ON 1=1 costuma ser exatamente o mesmo.
Parabéns, Carlos! Sua sequência de respostas no fórum demonstra um nível de senioridade e domínio técnico altíssimo na manipulação de dados estruturados com SQL.
Espero que possa ter lhe ajudado!