Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre ordem em HAVING

Olá, durante a aula foi falado que o comando a seguir não seria válido, porém não compreendi muito bem.

SELECT ESTADO, SUM(LIMITE_DE_CREDITO) AS SOMA_LIMITE FROM tabela_de_clientes
WHERE SOMA_LIMITE > 900000
GROUP BY ESTADO;

Quando eu tentei realizar o exercício proposto vi que foi colocado um WHERE depois do FROM na resposta.

  SELECT CPF, COUNT(*) FROM notas_fiscais
  WHERE YEAR(DATA_VENDA) = 2016
  GROUP BY CPF
  HAVING COUNT(*) > 2000

Achei que isso não poderia ser realizado, qual seria o motivo?

Obrigado desde já pela resposta.

1 resposta
solução!

Olá Vinicius, tudo bem? A questão a sequência (precedência) das instruções, no SQL temos uma ordem de execução, onde uma instrução só é executada após outra instrução ter sido executada. A sequência de execução de um comando no SQL é a seguinte:

  • 1) FROM
  • 2) WHERE
  • 3) GROUP BY
  • 4) HAVING
  • 5) SELECT
  • 6) ORDER BY

Logo a query:

SELECT ESTADO, SUM(LIMITE_DE_CREDITO) AS SOMA_LIMITE FROM tabela_de_clientes
WHERE SOMA_LIMITE > 900000
GROUP BY ESTADO;

Não vai ser executada, porque você está usando o ALIAS ** SOMA_LIMITE dentro da instrução **WHERE porém esse ALIAS (SOMA_LIMITE) ainda não foi realmente criado, já que ainda estamos no número 2 de execução, e o ALIAS só é realmente criado no número 5.

O grande ponto é que nesse outra query:

SELECT CPF, COUNT(*) FROM notas_fiscais
  WHERE YEAR(DATA_VENDA) = 2016
  GROUP BY CPF
  HAVING COUNT(*) > 2000

É usado a instrução completa YEAR(DATA_VENDA) = 2016 e não um ALIAS.

Espero ter esclarecido sua dúvida!