Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
Podemos limitar la cantidad de resultados que nos regresa una consulta...
SELECT
multa.numero,
DATE(multa.fecha) AS fecha,
TIME(multa.fecha) AS hora,
multa.lugar,
multa.monto,
multa.descripcion
FROM multa
WHERE multa.monto >= 500.00
AND multa.monto <= 5000.00
LIMIT 10
... o, también, podemos pedir que no empiecen a contar desde la primera fila
SELECT
multa.numero,
DATE(multa.fecha) AS fecha,
TIME(multa.fecha) AS hora,
multa.lugar,
multa.monto,
multa.descripcion
FROM multa
WHERE multa.monto >= 500.00
AND multa.monto <= 5000.00
LIMIT 5, 10
Básicamente las mismas funciones de agregación que ya conocíamos
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
¿Cuál es la diferencia entre esta consulta y la anterior?
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo
Ojo: Las cláusulas de agrupamiento (GROUP BY) deben coincidir con los atributos naturales (no agregados, pues) que soliciten
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo
¿Cuál es el resultado esperado de esta consulta?
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo
WHERE monto_promedio >= 1500.00
No se puede usar WHERE con los atributos obtenidos de funciones de agregación, la cláusula que se debe usar en esos casos es HAVING
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo
HAVING monto_promedio >= 1500.00
También podemos ordenar los resultados con base en alguno, o algunos, atributos
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo
HAVING monto_promedio >= 1500.00
ORDER BY monto_promedio ASC
Básicamente lo mismo que en los lenguajes de programación
SELECT
persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo,
AVG(multa.monto) AS monto_promedio,
CASE
WHEN AVG(multa.monto) < 500.00 THEN "baja"
WHEN AVG(multa.monto) BETWEEN 500.00 AND 3500.00 THEN "media"
ELSE "alta"
END AS prioridad
FROM multa
INNER JOIN vehiculo
ON multa.vehiculo_numero_serie = vehiculo.numero_serie
INNER JOIN persona
ON vehiculo.persona_numero_licencia = persona.numero_licencia
GROUP BY persona.numero_licencia,
persona.nombre,
persona.apellido,
vehiculo.numero_serie,
vehiculo.marca,
vehiculo.modelo;
Las cuatro tipos de consultas, y las aplicaciones que dependen de ellas, generalmente son conocidas bajo el acrónimo CRUD (Create, Read, Update, Delete)
By Gilberto 🦁
Más SQL
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales