2010-07-01 12 views

Respuesta

17

En su ejemplo, ellos deben hacer lo mismo. Pero WHERE se procesa antes cualquier GROUP BY, por lo que no tiene acceso a los valores agregados (es decir, los resultados de Min(), Max(), etc. funciones). HAVING se procesa después deGROUP BY y, por lo tanto, se puede usar para limitar el conjunto de resultados a solo aquellos con valores agregados que coincidan con un determinado predicado.

+4

Para poner la respuesta de Daniel de otra manera, la cláusula where se aplica a todas las filas en el conjunto de resultados. La cláusula having se aplica a los grupos creados por una cláusula group by. Entonces, si su grupo consta de la columna 1 en su ejemplo y las condiciones estaban en la columna 1, entonces donde es lo mismo que tener, ya que una fila es igual que el "grupo". – Anon246

+0

@Strommy: Exactamente. Y si por alguna razón no quieres usar 'HAVING', puedes lograr lo mismo usando un' SELECT' anidado y usando la cláusula externa 'WHERE' para expresar tu predicado deseado. –

3

No, porque tener es para funciones de agregado o grupo por cláusula.

Por ejemplo:

SELECT COUNT(ID) 
FROM tablexpto 
where name = 'a' 
having count(ID) > 1 

La primera consulta no se presentaría.

6

HAVING es para su uso con los agregados, por ejemplo, HAVING SUM(column1) > 200, WHERE es sólo para las columnas, por ejemplo, WHERE column1 < 20.

1

Tener sólo funciona con una cláusula GROUP BY y limita los registros después de que se agrupan.

3

No, ellos son completamente diferentes.

Tener condiciones son para agrupar las funciones de agregado. Se computan después de que se calculó el valor agregado.

Ejemplo:

select id, count(1) 
    from table 
where COND1 
having count(1) > 1 

Aquí, la parte having se evalúa después de la consulta calcula el recuento de (1) el valor para cada grupo.

4

En su ejemplo, es el mismo porque no tienes GROUP BY

lo contrario, se aplicarán después de GROUP BY que se aplica después de ... DONDE

Decir que, habiendo con un filtro simple (x = 2) es exactamente lo mismo que DONDE porque x = 2 solo tiene significado si se ha agrupado en él. Normalmente utiliza HAVING en un agregado (COUNT(*) > 2 por ejemplo) que solo se puede aplicar después de GROUP BY

-1

hasta el uso que usted necesita una cláusula group by. obtendrá un error sin uno

+1

Incorrecto: si utiliza un valor literal (es decir, sin nombres de columna) en la cláusula 'SELECT' y omite una cláusula' GROUP BY', entonces la cláusula 'HAVING' se aplicará a toda la tabla (o filter resultset si' WHERE' cláusula se usa') y devuelve una fila si la cláusula 'HAVING' se evalúa como VERDADERO o de otra manera, cero filas. Ejemplo: encuentre si hay vacíos en una secuencia de números: 'SELECCIONE 1 DE LOS Números QUE TIENEN MAX (num) = COUNT (*);' – onedaywhen

+0

que fue furtivo, ¿alguien alguna vez usó esto en el mundo real? ¿cómo? – kacalapy

3

Como otros han (en su mayoría) declaró correctamente, en SQL se evalúa la cláusula WHERE antes de la cláusula SELECT, por lo tanto, el resultado de una función de conjunto es 'fuera de alcance' en la cláusula WHERE.

Por ejemplo, no se puede hacer esto:

SELECT Subject, MAX(Mark) AS TopScore 
    FROM Exam_Marks 
GROUP 
    BY Subject 
WHERE TopScore <= 70; 

debido a que el nombre de correlación columna TopScore no está en el ámbito de la cláusula WHERE.

Por supuesto, podríamos utilizar una subconsulta:

SELECT DT1.TopScore 
    FROM (
     SELECT Subject, MAX(Mark) AS TopScore 
      FROM Exam_Marks 
     GROUP 
      BY Subject 
     ) AS DT1 
WHERE DT1.TopScore <= 70; 

El problema era que las primeras implementaciones de SQL (comenzando con el Sistema R de IBM) carecían de soporte para tablas derivadas, de ahí el poco intuitivo HAVING nació.

Puede leer toda la historia triste en HAVING A Blunderful Time (or Wish You Were WHERE) por Hugh Darwen, de la que he tomado prestados los ejemplos anteriores.

Cuestiones relacionadas