Las cláusulas siguientes, añadidas a la instrucción SELECT FROM, permiten organizar las filas por grupos:
a) La cláusula GROUP BY nos sirve para agrupar filas según las columnas que indique esta cláusula.
b) La cláusula HAVING especifica condiciones de búsqueda para grupos de filas; lleva a cabo la misma función que antes cumplía la cláusula WHERE para las filas de toda la tabla, pero ahora las condiciones se aplican a los grupos obtenidos.
Presenta el siguiente formato:
SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
[WHERE condiciones]
GROUP BY columnas_según_las_cuales_se_quiere_agrupar
[HAVING condiciones_por_grupos]
[ORDER BY columna_ordenación [DESC] [, columna [DESC]...]];
Factores de agrupación |
Los factores de agrupación de la cláusula GROUP BY deben ser, como mínimo, las columnas que figuran en SELECT, exceptuando las columnas afectadas, por funciones de agregación. |
Notemos que en las sentencias SQL se van añadiendo cláusulas a medida que la dificultad o la exigencia de la consulta lo requiere.
Consulta con agrupación de filas en BDUOC
Imaginemos que queremos saber el sueldo medio que ganan los empleados de cada departamento:
SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio
FROM empleados
GROUP BY nombre_dep, ciudad_dep;
El resultado de esta consulta sería:
nombre_dep | ciudad_dep | sueldo_dep |
---|---|---|
DIR | Barcelona | 90.000 |
DIR | Girona | 100.000 |
DIS | Lleida | 70.000 |
DIS | Barcelona | 70.000 |
PROD | Tarragona | 33.000 |
NULL | NULL | 40.000 |
num_proyec |
---|
4 |
Ejemplo de uso de la función de agregación SUM
DISTINCT Y GROUP BY |
---|
En este ejemplo no es necesario poner DISTINCT, a pesar de que la columna num_proyec no es atributo identificador. |
Veamos un ejemplo de uso de una función de agregación SUM del SQL que aparece en la cláusula HAVING de GROUP BY: “Queremos saber los códigos de los proyectos en los que la suma de los sueldos de los empleados es mayor que 180.000 euros”:
SELECT num_proyec
FROM empleados
GROUP BY num_proyec
HAVING SUM (sueldo) >1.8E+5;
El resultado de esta consulta sería el que se ve al margen.