Funciones de agrupación

Funciones de agrupación
Información sobre la plantilla
Aggregation.JPG
Concepto:Son funciones que toman una colección de valores como entrada y producen un único valor de salida. SQL proporciona cinco funciones de agregación primitivas.

Las funciones de agrupación son utilizadas por Sistemas Gestores de Bases de Datos de manera que operen sobre conjuntos de filas para dar un resultado por grupo. Existen dos tipos de funciones: funciones de fila única (single row functions) y funcionesde agrupación (aggregate functions). La diferencia fundamental es que mientras las primeras realizan la acción sobre una única fila cada vez, las de agrupación obtienen un resultado a partir de un conjunto de elementos. Se trata de seleccionar un conjunto de elementos, filtrarlos por las condiciones que creamos oportunas y obtener un resultado a partir de él.

Funciones de agregación primitivas

  • avg: calcula la media aritmética de un atributo o una expresión numérica.
  • min: devuelve el mínimo de un atributo o expresión numérica.
  • max: calcula el valor máximo de un atributo o expresión numérica.
  • sum: devuelve la suma total de atributos o expresiones numéricas.
  • count (*): contador de tuplas.
  • count(distinct): es un contador de tuplas parcial, no tiene en cuenta valores nulos ni duplicados.

Consultas múltiples

Es más que habitual necesitar en una consulta datos que se encuentran distribuidos en varias tablas. Las bases de datos relacionales se basan en que los datos se distribuyen en tablas quese pueden relacionar mediante un campo. Ese campo es el que permite integrar los datos delas tablas.


Por ejemplo si disponemos de una tabla de empleados cuya clave es el ID y otra tabla de tareas que se refiere a tareas realizadas por los empleados, es seguro (si el diseño está bien hecho) que en la tabla de tareas aparecerá el ID del empleado para saber quién fue el empleado realizó la tarea. Si quiere obtener una lista de los datos de las tareas y los empleados, se podría hacer de esta forma:

SELECT cod_tarea, descripcion_tarea, id_empleado, nombre_empleado FROM tareas,empleados;

La sintaxis es correcta ya que, efectivamente, en el apartado FROM se pueden indicar varias tareas separadas por comas. Pero eso produce un producto cruzado, aparecerán todos los registros de las tareas relacionados con todos los registros de empleados. El producto cartesiano a veces es útil para realizar consultas complejas, pero en el caso normal no lo es, necesitamos discriminar ese producto para que solo aparezcan los registros de las tareas relacionadas con sus empleados correspondientes. A eso se le llama asociar (JOIN) tablas.

Ejemplo

La forma de realizar correctamente la consulta anterior (asociado las tareas con los empleados que la realizaron sería:

SELECT cod_tarea, descripcion_tarea, id_empleado, nombre_empleado FROM tareas,empleados WHERE tareas.id_empleado = empleados.id;

Nótese que se utiliza la notación tabla columna para evitar la ambigüedad, ya que el mismo nombre de campo se puede repetir en ambas tablas. Para evitar repetir continuamente el nombre de la tabla, se puede utilizar un alias de tabla:

SELECT a.cod_tarea, a.descripcion_tarea, b.id_empleado, b.nombre_empleado FROM tareas a,empleados b WHERE a.id_empleado = b.id;

Al apartado WHERE se le pueden añadir condiciones encadenándolas con el operador AND: SELECT a.cod_tarea, a.descripcion_tarea FROM tareas a,empleados b WHERE a.id_empleado = b.id AND b.nombre_empleado = 'Javier';

Finalmente indicar que se pueden enlazar más de dos tablas a través de sus campos relacionados: SELECT a.cod_tarea, a.descripcion_tarea, b.nombre_empleado, c.nombre_utensilio FROM tareas a,empleados b, utensilios_utilizados c WHERE a.dni_empleado = b.dni AND a.cod_tarea=c.cod_tarea;

A las relaciones descritas anteriormente se las llama relaciones en igualdad (equijoins), ya que las tablas se relacionan a través de campos que contienen valores iguales en dos tablas.

En dicho ejemplo podríamos averiguar la categoría a la que pertenece cada empleado, pero estas tablas poseen una relación que ya no es de igualdad. La forma sería:         
       

SELECT a.empleado, a.sueldo, b.categoria FROM empleados a, categorias b WHERE a.sueldo between b.sueldo_minimo and b.sueldo_maximo;

En el ejemplo visto anteriormente de las tareas y los empleados. Podría ocurrir que un empleado no hubiera realizado una tarea todavía, con lo que habría empleados que noaparecerían en la consulta al no tener una tarea relacionada. La forma de conseguir que salgan todos los registros de una tabla aunque no estén relacionados con las de otra es realizar una asociación lateral o unión externa (también llamada outer join). En esas asociaciones, el signo (+) indica que se desean todos los registros de la tabla estén o no relacionados.

SELECT tabla1.columna1, tabla1.columna2, … tabla2.columna1, tabla2.columna2,...FROM tabla1, tabla2 WHERE tabla1 .columnaRelacionada(+) = tabla2.columnaRelacionada

Eso obtiene los registros relacionados entre las tablas y además los registros no relacionados de la tabla2. Se podría usar esta otra forma:

SELECT tabla1.columna1, tabla1.columna2, … tabla2.columna1, tabla2.columna2,...FROMtabla1, tabla2 WHEREtab la1 .columnaRelacionada = tabla2.columnaRelacionada(+)

En ese caso salen los relacionados y los de la primera tabla que no estén relacionados con ninguno de la primera.

Otras sintaxis

En la versión SQL de 1999 se ideó una nueva sintaxis para consultar varias tablas. La razónfue separar las condiciones de asociación respecto de las condiciones de selección deregistros. La sintaxis completa es:

SELECT tabla1.columna1, tabl1.columna2, … tabla2.columna1, tabla2.columna2, …FROM tabla1 [CROSS JOIN tabla2] | [NATURAL JOIN tabla2] | [JOIN tabla2 USING(columna)] | [JOIN tabla2 ON (tabla1.columa = tabla2.columna)] | [LEFT | RIGHT | FULL OUTER JOIN tabla2 ON (tabla1.columa = tabla2.columna)]

Descripción de posibilidades

  • CROSS JOIN: Utilizando la opción CROSS JOIN se realiza un producto cruzado entre las tablas indicada.
  • NATURAL JOIN: Establece una relación de igualdad entre las tablas a través de los campos que tengan el mismo nombre en ambas tablas:

SELECT * FROM piezas NATURAL JOIN existencias; En el ejemplo anterior se obtienen los registros de piezas relacionados en existencias a través de los campos que tengan el mismo nombre en ambas tablas.

  • JOIN USING: Permite establecer relaciones indicando qué campo (o campos) común a las dos tablas hay que utilizar: SELECT * FROM piezas JOIN existencias USING(tipo,modelo);
  • JOIN ON: Permite establecer relaciones cuya condición se establece manualmente, lo que permite realizar asociaciones más complejas o bien asociaciones cuyos campos en las tablasno tienen el mismo nombre: SELECT * FROM piezas JOIN existencias ON(piezas.tipo=existencias.tipo AND piezas.modelo=existencias.modelo);

La última posibilidad es obtener relaciones laterales o externas (outer join). Para ello se utiliza la sintaxis: SELECT * FROM piezas LEFT OUTER JOIN existencias ON(piezas.tipo = existencias.tipo AND piezas.modelo=existencias.modelo);

En esta consulta además de las relacionadas, aparecen las piezas no relacionadas enexistencias. Si el LEFT lo cambiamos por un RIGHT, aparecerán las existencias no presentesen piezas. La condición FULL OUTER JOIN produciría un resultado en el que aparecen los registros no relacionados de ambas tablas.

Fuentes