Bases de datos

Más SQL

SQL - LIMIT

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

SQL - LIMIT

... 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

SQL - Funciones de agregación

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

SQL - Funciones de agregación

¿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

SQL - Funciones de agregación

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

SQL - Funciones de agregación

¿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

SQL - Having

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

SQL - Order by

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

SQL - Case

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;

SQL

Las cuatro tipos de consultas, y las aplicaciones que dependen de ellas, generalmente son conocidas bajo el acrónimo CRUD (Create, Read, Update, Delete)

Bases de datos: Más SQL

By Gilberto 🦁

Bases de datos: Más SQL

Más SQL

  • 140