Unidad Didáctica 8. Consultas resumen
Apuntes de BD para DAW, DAM y ASIR
Curso 2023/2024
1 Consultas resumen
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:
- Cláusula
FROM
. - Cláusula
WHERE
(Es opcional, puede ser que no aparezca). - Cláusula
GROUP BY
(Es opcional, puede ser que no aparezca). - Cláusula
HAVING
(Es opcional, puede ser que no aparezca). - Cláusula
SELECT
. - Cláusula
ORDER BY
(Es opcional, puede ser que no aparezca). - Cláusula
LIMIT
(Es opcional, puede ser que no aparezca).
En esta unidad vamos a trabajar con dos nuevas cláusulas
GROUP BY
y HAVING
.
1.1 Funciones de agregación
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
.
1.1.1 Diferencia entre
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:
SELECT COUNT(teléfono)
FROM alumno;
devolverá:
COUNT(teléfono) |
---|
2 |
mientras que la consulta:
SELECT COUNT(*)
FROM alumno;
COUNT(*) |
---|
4 |
1.1.2 Contar valores distintos
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
.
SELECT COUNT(DISTINCT código_fabricante)
FROM producto;
Esta consulta devolverá:
COUNT(DISTINCT código_fabricante) |
---|
2 |
1.2 Agrupamiento de filas
(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
.
1.3 Condición de agrupamiento
(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.
1.4 Ejemplo de agrupamiento de
filas (GROUP BY
) con condición de agrupamiento
(HAVING
)
2 Errores comunes
2.1 Error al contar el número de filas distintas
Ejemplo: Cuenta el número fabricantes distintos que
aparecen en la tabla producto
.
Consulta incorrecta.
SELECT DISTINCT COUNT(codigo_fabricante)
FROM producto;
Consulta correcta.
SELECT COUNT(DISTINCT codigo_fabricante)
FROM producto;
2.2 Error al intentar utilizar una
función de agregación en la cláusula WHERE
Las funciones de agregación sólo se pueden usar en las cláusulas
SELECT
Y HAVING
, por lo tanto si intenta hacer
uso de una función de agregación en la cláusula WHERE
obtendrá un error.
Ejemplo: Devuelve un listado con los productos que
tienen un precio superior al precio medio de todos los artículos que
existen en la tabla productos
.
Consulta incorrecta.
SELECT *
FROM producto
WHERE precio > AVG(precio);
Consulta correcta.
SELECT *
FROM producto
WHERE precio > (SELECT AVG(precio) FROM producto);
2.3 Error al usar
COUNT(*)
y COUNT(columna)
al hacer un
LEFT JOIN
Ejemplo: Devuelve un listado con el número de
productos que tiene cada fabricante. El listado debe incluir aquellos
fabricantes que no tienen productos asociados indicando que tienen
0
productos.
En este caso es necesario realizar un LEFT JOIN
con las
tablas fabricante
y producto
. Por ejemplo, al
ejecutar la siguiente consulta podemos ver que los fabricantes
Huawei
y Xiaomi
no tienen productos
asociados.
SELECT fabricante.nombre, producto.codigo
FROM fabricante LEFT JOIN producto
ON producto.codigo_fabricante = fabricante.codigo
ORDER BY fabricante.codigo;
nombre | codigo |
---|---|
… | … |
Crucial | 2 |
Crucial | 5 |
Gigabyte | 4 |
Huawei | NULL |
Xiaomi | NULL |
Para contar el número de productos que tiene cada fabricante es
necesario realizar un GROUP BY
por el código del fabricante
y contar el número de filas que tiene cada uno de los grupos que hemos
creado. Pero debemos tener cuidado porque obtendremos resultados
diferentes al contar el número de filas de cada grupo con
COUNT(*)
y COUNT(producto.codigo)
. La opción
correcta es hacer uso de COUNT(producto.codigo)
porque
contará aquellas filas que tienen un valor distinto de NULL
en la columna producto.codigo
.
Consulta incorrecta.
SELECT fabricante.nombre, COUNT(*)
FROM fabricante LEFT JOIN producto
ON producto.codigo_fabricante = fabricante.codigo
GROUP BY fabricante.codigo
ORDER BY 2 DESC;
nombre | COUNT(*) |
---|---|
Lenovo | 2 |
Asus | 2 |
Crucial | 2 |
Hewlett-Packard | 2 |
Seagate | 1 |
Gigabyte | 1 |
Samsung | 1 |
Xiaomi | 1 |
Huawei | 1 |
Consulta correcta.
SELECT fabricante.nombre, COUNT(producto.codigo)
FROM fabricante LEFT JOIN producto
ON producto.codigo_fabricante = fabricante.codigo
GROUP BY fabricante.codigo
ORDER BY 2 DESC;
nombre | COUNT(*) |
---|---|
Lenovo | 2 |
Asus | 2 |
Crucial | 2 |
Hewlett-Packard | 2 |
Seagate | 1 |
Gigabyte | 1 |
Samsung | 1 |
Xiaomi | 0 |
Huawei | 0 |
3 Créditos
Algunas de las imágenes utilizadas en este documento han sido extraídas de las siguientes fuentes:
- SQL: The Complete Reference de James R. Groff y otros.
4 Referencias
- Wikibook SQL Exercises.
- Tutorial SQL de w3resource.
- MySQL Join Types by Steve Stedman.
- Bases de Datos. 2ª Edición. Grupo editorial Garceta. Iván López Montalbán, Manuel de Castro Vázquez y John Ospino Rivas.
- Consultas resumen.
5 Licencia
Esta
página forma parte del curso
Bases de Datos de
José Juan Sánchez Hernández y
su contenido se distribuye bajo una
licencia
Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0
Internacional.