Bases de datos en la enseñanza

6 / Iniciación al lenguaje estructurado de consultas (SQL)

Consultas de agrupación y totales con SQL

En el apartado anterior tratamos la forma de relacionar varias tablas en una sentencia SQL, pero aún hay más. Mediante la cláusula GROUP BY puedes utilizar uno o varios campos para agrupar registros y realizar determinadas operaciones con ellos. Algunas de estas funciones son las mismas que ya tratamos en el capítulo de consultas y permiten:

A continuación, diseñemos una nueva consulta donde el objetivo será contar el número total de alumnos que componen cada grupo (1A, 1B, 1C, 2A…):

  1. Selecciona la opción Crear consulta en vista SQL y empieza escribiendo: SELECT.
  2. A continuación indica los campos de la tabla que deseas mostrar en la consulta. En primer lugar indica el nombre del grupo.
  3. En segundo lugar, debes escribir la sentencia que calcule el total de alumnos: COUNT (Alumnos.Expediente).
  4. Ahora añade la cláusula FROM y escribe el nombre de las dos tablas implicadas: Alumnos y Cursos.
  5. Toca el turno de vincular los campos de ambas tablas que te permitirán obtener los resultados correctos. En este caso es necesario relacionar el campo Grupo de la tabla Alumnos con el campo IdCurso de la tabla Curso. Escribe en primer lugar la cláusula WHERE y después Alumnos.Grupo=Cursos.IdGrupo.
  6. Por último debes indicar el campo que utilizarás como elemento de agrupación. Escribe GROUP BY Cursos.Curso.
  7. La instrucción SQL queda del siguiente modo:
    SELECT Cursos.Curso, COUNT(Alumnos.Expediente)
    FROM Alumnos, Cursos
    WHERE Alumnos.Grupo=Cursos.IdCurso
    GROUP BY Cursos.Curso
  8. Ejecútala y comprueba que los resultados sean similares a los que puedes ver en la figura 6.16.
Consulta de agrupación, cláusula GROUP BY

Figura 6.16

Una buena idea podría ser añadir un alias al campo calculado y así mejorar la compresión de los resultados:

SELECT Cursos.Curso, COUNT(Alumnos.Expediente) AS "Total Alumnos por Grupo"
FROM Alumnos, Cursos
WHERE Alumnos.Grupo=Cursos.IdCurso
GROUP BY Cursos.Curso

Recuerda las dobles comillas en el nombre de alias cuando se trata de más de una palabra.

Criterios de filtrado en consultas de agrupación y totales, cláusula HAVING

Cuando se trata de consultas de agrupación y totales, la forma de utilizar criterios de ordenación es algo distinta de lo que has visto hasta ahora. La diferencia se encuentra en que debes utilizar una nueva cláusula: HAVING (figura 6.17). Por ejemplo, si sólo deseas contar los alumnos de 1A, la consulta quedaría del siguiente modo:

SELECT Cursos.Curso, COUNT (Alumnos.Expediente)
FROM Alumnos, Cursos
WHERE Alumnos.Grupo=Cursos.IdCurso
GROUP BY Cursos.Curso HAVING Cursos.Curso = '1A'

Consulta de agrupación con criterio

Figura 6.17

Si lo deseas puedes complicar los criterios añadiendo nuevos filtrados mediante los operadores AND y OR. La siguiente consulta es idéntica a la anterior pero obtiene el total de alumnos de los grupos 1A y 1B.

SELECT Cursos.Curso, COUNT(Alumnos.Expediente)
FROM Alumnos, Cursos
WHERE Alumnos.Grupo=Cursos.IdCurso
GROUP BY Cursos.Curso HAVING Cursos.Curso = '1A'
OR Cursos.Curso = '1B'

Es posible que llegados a este punto te estés planteando, por qué debes complicarte tanto la vida con SQL si lo puedes hacer de forma mucho más sencilla con el diseñador de consultas. La explicación la encuentras por una parte en las limitaciones que aún presenta OpenOffice Base y que únicamente se pueden suplir mediante sentencias SQL. También es necesario tener ciertas nociones de SQL ya que al tratarse de un lenguaje universal y estándar puedes utilizar las consultas en cualquier otra base de datos.