Intro a SQL y MySQL - Tema 8 - Valores agrupados
8.1 Agrupando los resultados
Puede ocurrir que no nos interese un único valor agrupado para todos
los datos (el total, la media, la cantidad de datos), sino el resultado
para un grupo específico de datos. Por ejemplo: podemos desear saber no
sólo la cantidad de clientes que hay registrados en nuestra base de
datos, sino también la cantidad de clientes que viven en cada
ciudad.
La forma de obtener subtotales es creando grupos con la orden "GROUP
BY", y entonces pidiendo un valor agrupado (count, sum, avg, ...) para
cada uno de esos grupos. Como limitación, sólo se podrán pedir como
resultados los valores
agrupados (como la cantidad o la media) y el criterio de agrupamiento.
Por ejemplo, en nuestra tabla "personas",
podríamos saber cuantas personas aparecen de cada edad, con:
select count(*), edad from personas group by edad;
que daría como resultado
+----------+------+
| count(*) | edad |
+----------+------+
| 1 | 22 |
| 1 | 23 |
| 1 | 25 |
+----------+------+
8.2 Filtrando los datos agrupados
Pero podemos llegar más allá: podemos no trabajar con todos los
grupos posibles, sino sólo con los que cumplen alguna condición.
La condición que se aplica a los grupos no se indica con "where",
sino con "having" (que se podría traducir como "los que tengan..."). Un
ejemplo:
select count(*), edad from personas group by edad having edad > 24;
que mostraría
+----------+------+
| count(*) | edad |
+----------+------+
| 1 | 25 |
+----------+------+
8.3. Ejercicios propuestos
- 8.1. Crea una base de datos "ejercicio8", con una única tabla
"ordenadores". De cada ordenador se desea guardar un código (que
será la clave primaria), una marca (no nula), un modelo y un año de
lanzamiento (mira los datos de ejemplo para deducir los tipos de
datos necesarios).
- 8.2. Añade los ordenadores:
- IBM5150, IBM, PC (5150), 1981
- SPEC48, Sinclair, ZX Spectrum 48K, 1982
- CPC464, Amstrad, CPC464, 1984
- HB55, Sony, Hit-Bit 55 MSX, 1984
- QL, Sinclair, QL, 1984
- PPC640DD, Amstrad, PPC640 DD, 1988
- 8.3. Muestra la cantidad total de ordenadores que tenemos
registrados en nuestra base de datos.
- 8.4. Muestra la cantidad de ordenadores de cada marca.
- 8.5. Muestra la cantidad de ordenadores lanzados en 1984 o más tarde.
- 8.6. Muestra la cantidad de ordenadores por cada marca, pero
teniendo en cuenta sólo lanzados en 1984 o más tarde.
- 8.7. Muestra la cantidad de ordenadores de cada marca, pero
sólo para las marcas de las que tengamos 2 o más equipos.
- 8.8. Como verás con más detalle en el apartado 10, la función
SUBSTRING permite obtener una subcadena. Por ejemplo,
SUBSTRING(modelo,1,2) permitiría saber las dos primeras letras del
modelo de un ordenador. Usando esta función, deberás mostrar la
cantidad de ordenadores que tenemos cuya marca empieza con una
letra "S".
- 8.9. Muestra la cantidad de ordenadores, agrupados por la
inicial de su marca.
- 8.10. Muestra el nombre (modelo) del ordenador más moderno del que tenemos
constancia para cada marca.