Cálculos

Se pueden utilizar expresiones aritméticas tanto en la cláusula select, para obtener una nueva columna en la tabla resultado, como en la construcción de condiciones de selección de filas.

Suponiendo que el curso se divide en 2 semestres y que 3 créditos equivale a 1 hora de clase semanal durante el año completo, nombre de las asignaturas y número de horas de clase semanales de cada una en un único semestre.

select descripcion, (creditos/3)*2 horas
from asignaturas;

Los créditos de cada asignatura son anuales: divididos entre 3, obtenemos las horas a impartir durante un año lectivo cada semana; si lo reducimos a un único semestre, cada semana tendremos el doble de horas de clase.

Descripción de las asignaturas y número de horas semanales de las asignaturas con menos de 4 horas semanales de clase

select descripcion, creditos 
from asignaturas 
where (creditos/3)*2 < 4

Funciones

La lista completa de funciones disponibles en MySQL es mejor consultarla en su manual (https://dev.mysql.com/doc/refman/5.7/en/functions.html). Téngase en cuenta que cada SGBD puede proporcionar sus funciones que coincidirán o no con las que maneja MySQL.

Redondea 15.1297 a dos decimales

select round(15.1297,2) redondeo from dual;

Obviamente, para realizar y mostrar un cálculo como este no hace falta ninguna tabla. Dual es una tabla virtual que se utiliza en estos casos para mostrar datos no almacenados ni calculados a partir de ninguna tabla. En realidad, se mantiene por compatibilidad con otros SGBD (Oracle) ya que también se puede ejecutar select round(15.1297,2) con el mismo resultado.

Funciones de agregados

Se dispone de una serie de funciones de agregados que retornan valores calculados sobre una determinada columna o columnas.

La diferencia con las mostradas en la sección anterior es que estas funciones trabajan sobre conjuntos de valores, devuelven un único valor resultado de procesar varias tuplas seleccionadas mediante la condición de la cláusula where; si no se especifica ésta, el cálculo se realiza sobre la totalidad de la columna.

Las funciones de tipo estadístico precisan que la expresión que se evalúe se construya sobre columnas numéricas. La expresión expr puede contener el nombre de una columna o un cálculo sobre una o varias columnas.

Si se especifica la palabra clave distinct la expresión obligatoriamente ha de ser un nombre de columna, y se asume que la función se calcula únicamente sobre valores distintos de la expresión.

  • COUNT( * ) número de filas
  • COUNT( [DISTINCT] expr ) número de valores distintos en expr
  • SUM( [DISTINCT] expr ) suma de todos los valores en expr
  • AVG( [DISTINCT] expr ) promedio de todos los valores en expr
  • MIN( expr ) el más pequeño de todos los valores en expr
  • MAX( expr ) el mayor de todos los valores en expr

¿Cuántos profesores hay en nuestra base de datos?

select count(*) profes from profesores;

¿Cuántas asignaturas de más de 4 créditos tenemos?

select count(*) from asignaturas
where creditos > 4;

¿Cuantos valores de créditos distintos hay?

select count(distinct creditos) quecreditos 
from asignaturas;

Puedes comprobar que, efectivamente, hay 3 valores distintos de créditos en la tabla asignaturas: 6.0, 9.0 y 4.5.

Sobre el modificador DISTINCT

Todas las funciones de agregados (menos count(*)) ignoran los nulos (NULL). Por tanto, select count(creditos) from asignaturas devolvería la cantidad de filas en la tabla asignaturas que no tienen un nulo en la columna "creditos".

select count(*) filas, count(creditosp) valores, count(distinct creditosp) distintos from asignaturas;

El uso del modificador distinct implica, además, que no se tienen en cuenta los valores duplicados. Supongamos una tabla con cinco filas y una columna "colx" y que queremos obtener la media de los valores almacenados en ella, que son (NULL,1,1,1,3).

AVG(colx) nos devolvería 1.5, mientras que AVG(distinct colx) nos devolvería 2.

Por ejemplo:

select avg(creditosp) sinDis, avg(distinct creditosp) conDis from asignaturas;

En consultas anidadas

A veces, las condiciones de filtrado de tuplas o de cálculos de agregación son más complejas que la simple comparación con una constante o un valor almacenado en una tabla. Este dato intermedio, no un resultado final, ha de obtenerse mediante una consulta auxiliar, una subconsulta.

En la condición de filtrado de la orden select ... where también podemos:

  • comparar una expresión con el resultado de otra orden select
  • determinar si el valor de una expresión está incluido en los resultados de otra orden select

Descripción y créditos de las asignaturas con menos créditos.

select descripcion, creditos
from asignaturas
where creditos = ( select min(creditos) from asignaturas )

En primer lugar se calcula la select anidada (entre paréntesis) y se obtiene el valor mínimo para la columna créditos de la tabla asignaturas. Con ese valor se compara tupla a tupla y se obtiene la asignatura (o asignaturas) cuya cantidad de créditos es igual al mínimo.

Es importante darse cuenta de que la comparación creditos = ? espera un único valor, no un conjunto de filas. De ahí que debamos asegurarnos que el resultado de la consulta anidada contiene una fila y una columna. Aparte, el tipo de datos debe ser consistente.