Lección 6 - Totalizar datos / Alias de campos (SQL AS)

Curso SQL para principiantes


Dejemos de lado por ahora los tipos de dato y sus operaciones para abordar un recurso del SQL de gran potencia que resulta muy interesante: Totalizar datos.
Tal como esta planteado este curso, no podría exponerse este concepto de otro modo que no fuese mediante ejemplos prácticos. Supongamos entonces que nos piden lo siguiente:

¿Cuál es el salario medio de los empleados?


Bien, si recuperamos las preguntas de construcción que tanto nos ayudan para construir nuestras consultas SQL:
  • ¿Qué datos nos piden?
  • ¿Dónde están los datos?
  • ¿Qué requisitos deben cumplir los registros?
A la pregunta: ¿Dónde están los datos?, se nos plantea una duda. El dato que nos piden es: “el salario medio de los empleados”, pero este dato no está en ninguna tabla, entonces ¿Cómo resolvemos el problema? Afortunadamente el SQL nos permite calcularlo, para calcular el salario medio basta con sumar todos los salarios y dividirlo por el número de empleados. Esto es posible hacerlo mediante la funciones SUM(suma) y COUNT(contar) de SQL.

Obtengamos primero la suma de salarios, para ello nos hacemos las preguntas de construcción:

¿Qué datos nos piden?
La suma de los salarios.

¿Dónde están los datos?
En la tabla empleados.

¿Qué requisitos deben cumplir los registros?
Ninguno, queremos sumar todos los salarios por lo tanto no hemos de filtrar registros, los seleccionaremos todos, o lo que es lo mismo, omitiremos la cláusula WHERE de la consulta SQL.

La consulta la construiríamos así:

Código: Seleccionar todo
select sum(SALARIO)
  from EMPLEADOS


Resultado:

Fíjese que el resultado de esta consulta SQL devuelve una sola fila. Obsérvese también que el motor SQL debe recorrer toda la tabla para obtener el resultado, puesto que debe sumar todos los salarios.


Análogamente contamos el número de empleados, es decir, el número de registros de la tabla empleados.

Código: Seleccionar todo
select count(*)
  from EMPLEADOS


Resultado:

El asterisco que encontramos en "COUNT(*)" equivale a decir: cualquier campo, fíjese que en este caso queremos contar registros, por lo tanto lo mismo nos da contar nombres, que apellidos, que cualquier otro campo. Veremos en otra lección las particularidades de la función COUNT aplicada a un solo campo, por ahora entandamos que "COUNT(*)" cuenta los registros seleccionados.

Ahora ya podemos resolver la cuestión planteada, basta con dividir el primer resultado por el segundo, pero... vallamos más allá. De entrada estamos recorriendo la tabla dos veces, una para sumar los salarios, y otra para contar los empleados, es de esperar que recorriéndola una sola vez el motor SQL sea capaz de reunir ambos datos. Y así es, para ello construimos la siguiente consulta SQL:

Código: Seleccionar todo
select sum(SALARIO) , count(*)
  from EMPLEADOS


Resultado:


Vallamos todavía un poco más allá. En la lección anterior se mencionó, a modo de apunte, que el SQL permite calcular algunas operaciones matemáticas en la cláusula SELECT. No parece descabellado esperar entonces, que pueda dividir estas dos columnas obteniendo, en única columna, el resultado de la división:

Código: Seleccionar todo
select sum(SALARIO) / count(*)
  from EMPLEADOS


Resultado:


Efectivamente funciona. Con esto queda resuelta la cuestión planteada.

* * *

Alias de campo
Este es un buen momento para hacer un paréntesis y explicar los Alias de campo de SQL.

Usted, como informático que además de construir la anterior consulta conoce bien el lenguaje SQL, no tendrá dificultades en interpretar la cabecera de la columna del resultado anterior: “sum(SALARIO) / count(*)”. Pero… estaremos de acuerdo en que no podría entregar a su jefe un informe con semejante encabezamiento. Para solucionar esto el SQL pone a su disposición la palabra clave AS, que permite rebautizar con un alias o sobrenombre las cabeceras de las columnas de resultado:

Código: Seleccionar todo
select sum(SALARIO) / count(*) as MEDIA_SALARIOS
  from EMPLEADOS


Resultado:


Con ello usted ha conseguido un título mucho más explícito, además de ahorrarse una bronca de su jefe.

En general podemos rebautizar cualquier campo o expresión de la cláusula SELECT, para ello basta con colocar seguido del campo que interese la palabra clave AS, precediendo al ALIAS que se quiere aplicar. Pongamos otro ejemplo: nos piden una consulta que devuelva el nombre, apellidos y sueldo de todos los empleados, pero con los encabezamientos de cada columna en inglés:

Código: Seleccionar todo
select NOMBRE as NAME, APELLIDOS as SURNAMES, SALARIO as SALARY
  from EMPLEADOS


Resultado:

En realidad la palabra clave AS es solo un modo de enfatizar que se está renombrando el campo de tabla, puede omitirla y el resultado será el mismo. El motor SQL entiende que si después de un campo en la cláusula SELECT, colocamos una palabra y ambas están separados por un espacio en lugar de una coma, la primera es un campo de tabla y la segunda es su alias o sobrenombre. Pruebe a llevar la anterior consulta al banco de pruebas eliminando antes de ejecutarla las palabras claves AS, dejando como mínimo un espacio entre los campos de tabla y sus alias .


* * *

Sigamos con la totalización de datos. Acabábamos de explicar como calcular la media de salarios de la tabla EMPLEADOS. El asunto ha quedado resuelto, pero en realidad nos hemos complicado la vida sobremanera. Se ha hecho así adrede, con el propósito de ver más recursos del lenguaje y explicar mejor la totalización de datos. En SQL existe un modo más simplificado para calcular la media de un campo mediante la función AVG (average, término en inglés que significa promedio) Es de hecho una función como SUM o COUNT, pero con distinta funcionalidad. La consulta es equivalente a la que construimos anteriormente y quedaría de la siguiente manera:

Código: Seleccionar todo
select avg(SALARIO) as MEDIA_SALARIOS
  from EMPLEADOS


Resultado:


Antes de finalizar debo insistir en que estas funciones no devuelven un dato de la tabla, sino que devuelven un cálculo en función de los datos que contienen los registros seleccionados, dando como resultado una única fila. Por lo que no tiene sentido mezclar en la clausula SELECT campos de la tabla con funciones de totalización. Una consulta como la siguiente no tiene sentido, y el SGBD devolverá un error:

Código: Seleccionar todo
select NOMBRE, avg(SALARIO)
  from EMPLEADOS

Si estoy obteniendo un dato calculado sobre un grupo de registros, ¿qué sentido tiene acompañarlo de un dato singular de un solo registro? En la próxima lección abordaremos esto con más detalle pero, veamos como estas situación puede darse fácilmente al malinterpretar este recurso, por ejemplo, supongamos que a usted le piden: ¿qué porcentaje del dinero que desembolsa la empresa percibe cada empleado?

el porcentaje de un empleado = (salario_empleado / total_salarios) x 100

Usted puede pensar incorrectamente en crear la siguiente consulta:
Código: Seleccionar todo
select SALARIO / sum(SALARIO) * 100 as PORCENTAJE
  from EMPLEADOS

Pero fíjese lo que usted pretende que haga el motor SQL, primero debe obtener la suma de salarios, para ello debe recorrer toda la tabla, acto seguido, con el total de la suma resuelto, debe volver a recorrer la tabla para aplicar la formula a cada registro y obtener así los porcentajes de todos los empleados. Bien, esto no funciona así. Puede ayudarle a no caer en este error el saber que: con una consultas SQL donde sólo interviene una tabla, el motor SQL jamas recorrerá la tabla dos veces para brindarle el resultado.

Resolvamos por partes esta cuestión:

Primero obtenemos el total de sueldos:
Código: Seleccionar todo
select sum(SALARIO)
  from EMPLEADOS


Resultado:


Y aplicado a cada empleado obtenemos los porcentajes:
Código: Seleccionar todo
select NOMBRE , APELLIDOS , SALARIO / 5525.5 * 100 as PORCENTAJE
  from EMPLEADOS


Resultado:


Para concluir veamos las funciones MAX (máximo) y MIN (mínimo), que intuitivamente ya se ve que se utilizan para obtener el valor máximo y mínimo de un campo de entre todos los registros seleccionados. Pero... no voy a poner ejemplos esta vez, le propongo a usted que intente resolver el ejercicio sobre las funciones MAX y MIN que encontrará al final de la lección, puede tomar como patrón las consultas de ejemplo vistas anteriormente donde aparecen las funciones SUM, COUNT o AVG, ya que las funciones MAX y MIN se aplican de igual modo a una consulta SQL.

Usted puede pensar que en este caso la funciones de totalización MAX y MIN sí devuelven un dato de la tabla, y es verdad, devolverán el valor máximo o mínimo del campo que indiquemos a cada una de ellas pero, en realidad no deja de ser un cálculo. El resultado no tiene porque estar vinculado a un solo registro. El motor SQL calcula el valor máximo o mínimo sobre un grupo de registros y usted no puede saber de entrada si ese dato está en uno, dos, o más registros.



* * *

Resumen
Las funciones de totalización SUM (suma), COUNT (contar), AVG (promedio), MAX (máximo) y MIN (mínimo), devuelven en una sola fila el cálculo sobre un campo aplicado a un grupo de registros. Los registros que intervienen para el cálculo dependen de los filtros establecidos en la clausula WHERE, interviniendo todos los registros de la tabla si la omitimos.

Podemos realizar varios cálculos sobre el mismo grupo de registros de una sola vez indicando varias funciones separadas por comas en la cláusula SELECT, pero no podemos mezclar en dicha cláusula campos de la tabla con funciones de totalización, puesto que carece de sentido.

El SQL nos permite rebautizar cualquier campo de la consulta por un alias o sobrenombre mediante la palabra clave AS:
select CAMPO1 as ALIAS1 , CAMPO2 as ALIAS2 , ....

* * *

Ejercicio 1
En todos los ejemplos de esta lección se ha omitido la clausula WHERE, construya una consulta, donde necesitará establecer una condición en la clausula WHERE, que devuelva el salario medio de los empleados que son hombres. Renombre la cabecera del resultado con un titulo que deje claro que dato se está mostrando.

Ejercicio 2
Construya una consulta que devuelva en la misma fila el salario máximo y mínimo de entre todos los empleados. Renombre las cabeceras de resultados con un titulo que deje claro que datos se están mostrando.

Ejercicio 3
Construya una consulta que responda a lo siguiente: ¿Que cuesta pagar a todas las mujeres en total? Renombre la cabecera del resultado con un titulo que deje claro que dato se está mostrando.




    Lección 5 - Operadores (SQL WHERE)
  • Lección 7 - Agrupación de datos (SQL GROUP BY)

Creative Commons License Creative Commons License

Este curso está sujeto a la licencia Reconocimiento-NoComercial-SinObraDerivada 3.0 de Creative Commons. Usted puede copiarla, distribuirla y comunicarla públicamente siempre que especifique su autor y deletesql.com; no la utilice para fines comerciales; y no haga con ella obra derivada. Puede usted consultar la licencia completa aquí.




Volver a Curso SQL desde cero

¿Quién está conectado?

Usuarios navegando por este Foro: Google Adsense [Bot] y 8 invitados