RECUPERACION DE DATOS & GRUPOS DE DATOS
Enviado por DirtyJhon • 25 de Mayo de 2013 • 794 Palabras (4 Páginas) • 437 Visitas
4. RECUPERACION DE DATOS & GRUPOS DE DATOS.
A veces necesitamos dividir la información de una tabla en grupos más pequeños a la hora de la recuperación de datos. Esto lo haremos con GROUP BY. El siguiente ejemplo muestra el número de departamento y el salario medio para cada uno de ellos.
SELECT departamento, AVG(salario) FROM EMPLEADOS GROUP BY departamento ;
Estas son una serie de reglas para el uso de GROUP BY y HAVING.
• Si se incluye una función de grupo en la sentencia SELECT, no se puede seleccionar resultados individuales a menos que la columna aparezca en la clausula GROUP BY.
• Con la clausula WHERE se pueden excluir filas antes de la división en grupos.
• No se puede usar un “alias” de campo ó columna en la clausula GROUP BY.
• Por defecto las filas se ordenan en forma ascendente de acuerdo a la lista GROUP BY. Esto se puede modificar con ORDER BY.
• La(s) columna(s) referenciada(s) por GROUP BY no es necesario seleccionarla(s) en la lista de campos a recuperar, aunque sin ella(s) los datos recuperados pueden no ser relevantes. SELECT MAX(salario) FROM EMPLEADOS GROUP BY departamento ;
• Se puede usar la función de grupo en la clausula ORDER BY. SELECT AVG(salario) FROM EMPLEADOS ORDER BY AVG(salario) ;
• Podemos agrupar por más de una columna, creando grupos dentro de grupos SELECT departamento, cargo, SUM(salario) FROM EMPLEADOS GROUP BY departamento, cargo ;
4.1 EXCLUSION DE RESULTADOS DE UN GRUPO. USO DE HAVING
De la misma forma que usamos WHERE para restringir los registros que seleccionamos, usaremos HAVING para restringir grupos de registros. Es decir: los grupos que se correspondan con la clausula HAVING serán los mostrados.
SELECT departamento, max(salario) FROM EMPLEADOS GROUP BY departamento HAVING MAX(salario)>3000 ;
Podemos utilizar la clausula GROUP BY sin utilizar una función de grupo en la SELECT:
SELECT departamento FROM EMPLEADOS GROUP BY DEPARTAMENTO HAVING MAX(salario) > 3000 ;
Por supuesto podemos ordenar los resultados:
SELECT cargo, SUM(salario) FROM EMPLEADOS WHERE cargo NOT LIKE 'VENDEDOR%' GROUP BY cargos HAVING SUM(salario) > 5000 ORDER BY SUM(salario) ;
En este último ejemplo vemos como la clausula WHERE restringe los registros antes de que se calculen los grupos y se excluyan resultados mediante HAVING. La clausula HAVING puede ponerse antes de la clausula GROUP BY pero no se recomienda por lógica. Los grupos se forman, y las funciones de grupo se calculan antes de que la clausula HAVING sea aplicada a los grupos.
...