1
resposta

[Dúvida] Essas duas quere ,me dão o mesmo resultado,quando usar uma ou outra ,me de exemplos praticos e quando elas podem trazer pesquisas sem eficiências

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

1 resposta

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!