Apuntes de BD para DAW, DAM y ASIR
José Juan Sánchez Hernández
Curso 2023/2024
Vamos a recordar la sintaxis para realizar una consulta con la
sentencia SELECT
en MySQL:
SELECT [DISTINCT] select_expr [, select_expr ...]
[FROM table_references]
[WHERE where_condition]
[GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC], ...]
[LIMIT {[offset,] row_COUNT | row_COUNT OFFSET offset}]
Es muy importante conocer en qué orden se ejecuta cada una de
las cláusulas que forman la sentencia SELECT
. El
orden de ejecución es el siguiente:
FROM
.WHERE
(Es opcional, puede ser que no
aparezca).GROUP BY
(Es opcional, puede ser que no
aparezca).HAVING
(Es opcional, puede ser que no
aparezca).SELECT
.ORDER BY
(Es opcional, puede ser que no
aparezca).LIMIT
(Es opcional, puede ser que no
aparezca).En esta unidad vamos a trabajar con dos nuevas cláusulas
GROUP BY
y HAVING
.
Estas funciones realizan una operación específica sobre todas las filas de un grupo.
Las funciones de agregación más comunes son:
Función | Descripción |
---|---|
MAX(expr) |
Valor máximo del grupo |
MIN(expr) |
Valor mínimo del grupo |
AVG(expr) |
Valor medio del grupo |
SUM(expr) |
Suma de todos los valores del grupo |
COUNT(*) |
Número de filas que tiene el resultado de la consulta |
COUNT(columna) |
Número de valores no nulos que hay en esa columna |
En la documentación oficial de MySQL puede encontrar una lista completa de todas las funciones de agregación que se pueden usar.
Importante: Las funciones de agregación
sólo se pueden usar en las cláusulas SELECT
Y
HAVING
.
COUNT(*)
y COUNT(columna)
COUNT(*)
: Calcula el número de filas que tiene el
resultado de la consulta.COUNT(columna)
: Cuenta el número de valores no nulos
que hay en esa columna.Importante: Tenga en cuenta la
diferencia que existe entre las funciones COUNT(*)
y
COUNT(columna)
, ya que devolverán resultados diferentes
cuando haya valores nulos en la columna que estamos usando en la
función.
Ejemplos:
Supongamos que tenemos los siguientes valores en la tabla
alumno
:
id | nombre | apellido1 | apellido2 | fecha_nacimiento | es_repetidor | teléfono |
---|---|---|---|---|---|---|
1 | María | Sánchez | Pérez | 1990/12/01 | no | NULL |
2 | Juan | Sáez | Vega | 1998/04/02 | no | 618253876 |
3 | Pepe | Ramírez | Gea | 1988/01/03 | no | NULL |
4 | Lucía | López | Ruiz | 1993/06/13 | sí | 678516294 |
La consulta:
devolverá:
COUNT(teléfono) |
---|
2 |
mientras que la consulta:
COUNT(*) |
---|
4 |
COUNT(DISTINCT columna)
Supongamos que tenemos los siguientes valores en la tabla
producto
:
id | nombre | precio | código_fabricante |
---|---|---|---|
1 | Disco duro SATA3 1TB | 86 | 5 |
2 | Memoria RAM DDR4 8GB | 120 | 4 |
3 | Disco SSD 1 TB | 150 | 5 |
4 | GeForce GTX 1050Ti | 185 | 5 |
Y nos piden calcular el número de valores distintos de código de
fabricante que aparecen en la tabla producto
.
Esta consulta devolverá:
COUNT(DISTINCT código_fabricante) |
---|
2 |
GROUP BY
)La cláusula GROUP BY
nos permite crear grupos de
filas que tienen los mismos valores en las columnas por las que
se desea agrupar.
Imagen: Imagen extraída del libro SQL: The Complete Reference de James R. Groff y otros.
En la documentación
oficial de MySQL puede consultar la lista de modificadores
que puede utilizar con GROUP BY
.
HAVING
)La cláusula HAVING
nos permite crear
filtros sobre los grupos de filas que tienen los mismos
valores en las columnas por las que se desea agrupar.
Imagen: Imagen extraída del libro SQL: The Complete Reference de James R. Groff y otros.
GROUP BY
) con condición de agrupamiento
(HAVING
)