SELECT nome,preco FROM produtos p GROUP BY nome,preco HAVING preco > (SELECT AVG(preco) FROM produtos p2)
SELECT nome,preco FROM produtos p WHERE preco > (SELECT AVG(preco) FROM produtos p2) GROUP BY nome,preco
SELECT nome,preco FROM produtos p GROUP BY nome,preco HAVING preco > (SELECT AVG(preco) FROM produtos p2)
SELECT nome,preco FROM produtos p WHERE preco > (SELECT AVG(preco) FROM produtos p2) GROUP BY nome,preco
Oi, Christian. Como vai?
Essas duas consultas são, de fato, muito semelhantes. A diferença crucial está no momento em que o filtro é aplicado.
Na primeira consulta, você está agrupando os produtos por nome e preço e, em seguida, aplicando o filtro HAVING
para mostrar apenas os grupos cujo preço é maior que a média, ou seja: filtro é aplicado após a agregação dos dados.
Na segunda consulta, o filtro WHERE
é aplicado antes da agregação dos dados: você está removendo os produtos cujo preço é menor que a média antes de agrupar os dados restantes.
Em termos de eficiência, ambas as consultas têm suas vantagens e desvantagens. A primeira consulta pode ser mais eficiente se você tiver muitos produtos com o mesmo nome, mas preços diferentes, pois ela agrupa os produtos antes de aplicar o filtro. A segunda consulta pode ser mais eficiente se a maioria dos seus produtos tiver um preço menor que a média, pois ela remove esses produtos antes de agrupar os dados restantes.
Espero ter que tenha ficado mais claro! Conforme você pratica, tem contato com bases de dados diversas, e conhece as particularidades da linguagem, saber em qual momento aplicar cada um dos filtros vai ficando um pouco mais claro.
Bem legal que você tenha reparado nessa semelhança e trazido para o fórum. :)
Abraços!