Qual é a diferença entre onde e ter cláusulas?

neste artigo aprender quando usar onde e ter. Ambos desempenham funções semelhantes, mas para fins diferentes!

todos os exemplos deste artigo baseiam-se no Microsoft SQL Server Management Studio e na Base de dados AdventureWorks2012. Você pode começar a usar estas ferramentas gratuitas usando o meu guia começar a usar o servidor SQL.

como fazer onde e tendo diferido?

quando se trabalha com SQL mais avançado pode não ser claro quando faz sentido usar uma cláusula de onde versus uma cláusula de ter.

embora pareça que ambas as cláusulas fazem a mesma coisa, elas fazem-no de maneiras diferentes. De facto, as suas funções complementam-se.

  • A Quando é utilizada a cláusula é o registo dos filtros a partir de um resultado. O filtro ocorre antes de qualquer agrupamento ser feito.
  • utiliza-se uma cláusula HAVING para filtrar os valores de um grupo.

Antes de irmos mais longe vamos rever o formato de uma declaração SQL. É

SELECTFROMWHEREGROUP BYHAVING

para ajudar a manter as coisas direitas eu gosto de pensar na ordem de execução de declarações SQL de cima para baixo. Isso significa que a cláusula onde é primeiramente aplicada ao resultado e, em seguida, as linhas restantes resumidas de acordo com o grupo BY.

em que a cláusula

a cláusula em que é usada para filtrar as linhas dos resultados. Por exemplo,

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

Devolve 121,317 como da contagem, enquanto que, a pesquisa

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200

Devolve 48,159 como a contagem. Isto é devido à cláusula onde filtra os 73.158 SalesOrderDetails cujo preço unitário é inferior ou igual a 200 dos resultados.

tendo Cláusula

a cláusula de ter é usada para filtrar valores num grupo por. Você pode usá-los para filtrar grupos como

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000

mas seu verdadeiro poder reside em sua capacidade de comparar e filtrar com base nos resultados da função agregada. Por exemplo, você pode selecionar todas as ordens totalizando mais de $10,000

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

uma vez que a visibilidade da cláusula de WHERE é uma linha de cada vez, não há uma maneira de avaliar a soma em todos os vendedores. a cláusula de HAVING é avaliada após o agrupamento ser criado.

combinando os dois: Quando e tendo

quando as declarações SQL têm tanto uma cláusula de onde e de ter cláusula, tenha em mente a cláusula onde é aplicada primeiro, então os resultados agrupados, e, finalmente, os grupos filtrados de acordo com a cláusula de ter.

em muitos casos, você pode colocar a condição de onde na cláusula de ter, tais como

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND SalesOrderID > 50000

Versus

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE SalesOrderID > 50000GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

se você pode colocar a condição de onde na cláusula de ter, então por que mesmo se preocupar com o onde? Posso usar esta consulta?

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10

na verdade, essa consulta gera um erro. A coluna LineTotal não faz parte do grupo por lista de campos nem o resultado de um total agregado.

para ser válida a cláusula de ter só pode comparar resultados de funções agregadas ou coluna do grupo por.

para ser válida, a consulta tem de ser reescrita como

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

para resumir a diferença entre onde e tendo:

  • onde é utilizado para filtrar os registos antes de qualquer agrupamento ter lugar.
  • é utilizado para filtrar os valores após terem sido grupos. Apenas as colunas ou expressões do grupo podem ser incluídas nas condições da cláusula…

Deixe uma resposta

O seu endereço de email não será publicado.

More: