Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Ejemplos de consultas SQL Server, Apuntes de Fundamentos de Administración y Gestión

Varios ejemplos de consultas sql server, incluyendo uniones, intersecciones, subconsultas y operaciones de agregación. También se explica cómo utilizar la cláusula where para filtrar los resultados de las consultas.

Tipo: Apuntes

2014/2015

A la venta desde 31/05/2024

leyber-panduro-alvarado
leyber-panduro-alvarado 🇵🇪

3 documentos

1 / 64

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
SQL SERVER
[MANUAL DE ADMINISTRACIÓN DE BASE DE DATOS]
Ing. Leyber Panduro Alvarado
1
Unidad 1. Consultas multitabla
1.1. Introducción
En este tema veremos cómo obtener datos de diferentes tablas.
En esta parte ampliaremos la cláusula FROM y descubriremos nuevas palabras
reservadas (UNION, EXCEPT e INTERSECT) que corresponden a operaciones
relacionales.
Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna
operación basada en el álgebra relacional.
El álgebra relacional define una serie de operaciones cuyos operandos son tablas y
cuyo resultado es también una tabla.
Las operaciones de álgebra relacional implementadas en Transact-Sql son:
La unión UNION
La diferencia EXCEPT
La intersección INTERSECT
El producto cartesiano CROSS JOIN
La composición interna INNER JOIN
La composición externa LEFT JOIN, RIGHT JOIN Y FULL JOIN
En todo el tema cuando hablemos de tablas nos referiremos tanto a las tablas que
físicamente están almacenadas en la base de datos como a las tablas temporales y a las
resultantes de una consulta o vista.
1.2. La unión de tablas UNION
La unión de tablas consiste en coger dos tablas y obtener una tabla con las filas de las
dos tablas, en el resultado aparecerán las filas de una tabla y, a continuación, las filas de
la otra tabla.
Para poder realizar la operación, las dos tablas tienen que tener el mismo esquema
(mismo número de columnas y tipos compatibles) y la tabla resultante hereda los
encabezados de la primera tabla.
La sintaxis es la siguiente:
{< consulta >|(< consulta >)}
UNION [ALL]
{< consulta >|(< consulta >)}
[{UNION [ALL] {< consulta >|(< consulta >)}}[ ...n ] ]
[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}
[ ,...n ]]
< consulta > representa la especificación de la consulta que nos devolverá la tabla a
combinar.
Puede ser cualquier especificación de consulta con la limitación de que no admite la
cláusula ORDER BY, los alias de campo se pueden definir pero sólo tienen efecto cuando
se indican en la primera consulta ya que el resultado toma los nombres de columna de
esta.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40

Vista previa parcial del texto

¡Descarga Ejemplos de consultas SQL Server y más Apuntes en PDF de Fundamentos de Administración y Gestión solo en Docsity!

Unidad 1. Consultas multitabla

1.1. Introducción

En este tema veremos cómo obtener datos de diferentes tablas.

En esta parte ampliaremos la cláusula FROM y descubriremos nuevas palabras reservadas (UNION, EXCEPT e INTERSECT) que corresponden a operaciones relacionales. Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna operación basada en el álgebra relacional.

El álgebra relacional define una serie de operaciones cuyos operandos son tablas y cuyo resultado es también una tabla.

Las operaciones de álgebra relacional implementadas en Transact-Sql son:

 La unión UNION  La diferencia EXCEPT  La intersección INTERSECT  El producto cartesiano CROSS JOIN  La composición interna INNER JOIN  La composición externa LEFT JOIN, RIGHT JOIN Y FULL JOIN

En todo el tema cuando hablemos de tablas nos referiremos tanto a las tablas que físicamente están almacenadas en la base de datos como a las tablas temporales y a las resultantes de una consulta o vista.

1.2. La unión de tablas UNION

La unión de tablas consiste en coger dos tablas y obtener una tabla con las filas de las dos tablas, en el resultado aparecerán las filas de una tabla y, a continuación, las filas de la otra tabla.

Para poder realizar la operación, las dos tablas tienen que tener el mismo esquema (mismo número de columnas y tipos compatibles) y la tabla resultante hereda los encabezados de la primera tabla.

La sintaxis es la siguiente:

{< consulta >| ( < consulta > ) }

UNION [ALL] {< consulta >| ( < consulta > ) }

[{UNION [ALL] {< consulta >| ( < consulta > )} }[ ... n ] ]

[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}

[ ,... n ]]

< consulta > representa la especificación de la consulta que nos devolverá la tabla a combinar. Puede ser cualquier especificación de consulta con la limitación de que no admite la cláusula ORDER BY, los alias de campo se pueden definir pero sólo tienen efecto cuando se indican en la primera consulta ya que el resultado toma los nombres de columna de esta.

Ejemplo: Suponemos que tenemos una tabla Valencia con las nuevas oficinas de Valencia y otra tabla Madrid con las nuevas oficinas de Madrid y queremos obtener una tabla con las nuevas oficinas de las dos ciudades:

SELECT oficina as OFI, ciudad FROM Valencia

UNION ALL

SELECT oficina, ciudad FROM Madrid;

El resultado sería:

OFI ciudad 11 Valencia 28 Valencia 23 Madrid

El resultado coge los nombres de columna de la primera consulta y aparecen primero las filas de la primera consulta y después las de la segunda.

Si queremos que el resultado aparezca ordenado podemos incluir la cláusula ORDER BY, pero después de la última especificación de consulta, y expresion_columna será cualquier columna válida de la primera consulta.

SELECT oficina as OFI, ciudad FROM Valencia

UNION

SELECT oficina, ciudad FROM Madrid

ORDER BY ofi;

OFI ciudad 11 Valencia 23 Madrid 28 Valencia

Ahora las filas aparecen ordenadas por el número de oficina y hemos utilizado el nombre de columna de la primera consulta.

Cuando aparezcan en el resultado varias filas iguales, el sistema por defecto elimina las repeticiones. Si se especifica ALL, el sistema devuelve todas las filas resultante de la unión incluidas las repetidas El empleo de ALL también hace que la consulta se ejecute más rápidamente ya que el sistema no tiene que eliminar las repeticiones.

Se pueden combinar varias tablas con el operador UNION. Por ejemplo supongamos que tenemos otra tabla Pamplona con las oficinas nuevas de Pamplona:

SELECT oficina, ciudad FROM Valencia

UNION

SELECT oficina, ciudad FROM Madrid

UNION

SELECT cod FROM T EXCEPT

SELECT codigo FROM T2;

Devuelve:

Cod 1 6

Ejemplo:

Listar los productos que no aparezcan en ningún pedido.

SELECT idfab, idproducto

FROM productos EXCEPT

SELECT DISTINCT fab, producto

FROM pedidos;

Para practicar puedes realizar este Ejercicio La diferencia EXCEPT.

Unidad 1. Ejercicio paso a paso: La diferencia EXCEPT

Objetivo

Comparar dos tablas y crear un listado resultante de la comparación. Los registros mostrados serán los que estén en la primera, pero no estén en la segunda, es decir, los registros diferentes.

Ejercicio paso a paso

Listar las oficinas (sólo su código) que no tienen empleados, utilizando EXCEPT.

SELECT oficina

FROM oficinas

EXCEPT

SELECT oficina

FROM empleados;

Resultado:

oficina 23 24

Obtener los productos (código completo) que no aparecen en ningún pedido.

SELECT idfab, idproducto

FROM productos

EXCEPT

SELECT fab, producto FROM pedidos;

Resultado:

Idfab idproducto aci 41001 bic 41089 bic 41672 imm 775c imm 887h imm 887p imm 887x qsa xk qsa xk48a

1.4. La intersección INTERSECT

Tiene una sintaxis parecida a las anteriores pero en el resultado de la intersección aparecen las filas que están simultáneamente en las dos consultas.

Las condiciones son las mismas que las de la unión.

{ | ( ) }

INTERSECT

{<especificacion_consulta>| ( <especificacion_consulta> ) }

[{INTERSECT {| ( ) }} [ ... n ] ]

[ORDER BY {expression_columna|posicion_columna [ASC|DESC]}

[ ,... n ]]

Retomando el ejemplo anterior:

Resultado:

Numemp oficina 101 12 102 21 103 12 104 12 105 13 106 11 107 22 108 21 109 NULL 110 NULL 111 NULL 112 NULL 113 NULL

1.5. La composición de tablas

Hasta ahora hemos operado con tablas que tenían el mismo esquema, pero muchas veces lo que necesitamos es obtener una tabla que tenga en una misma fila datos de varias tablas, por ejemplo, obtener las facturas y que en la misma fila de factura aparezca el nombre y dirección del cliente. Pues en lo que queda del tema estudiaremos este tipo de consultas basadas en la composición de tablas. La composición de tablas consiste en obtener a partir de dos tablas cualesquiera una nueva tabla fusionando las filas de una con las filas de la otra, concatenando los esquemas de ambas tablas. Consiste en formar parejas de filas.

La sentencia SELECT permite realizar esta composición, incluyendo dos o más tablas en la cláusula FROM.

Es hora de ampliar la cláusula FROM que vimos en el tema anterior.

Empezaremos por estudiar la operación a partir de la cual están definidas las demás operaciones de composición de tabla, el producto cartesiano.

1.6. El producto cartesiano CROSS JOIN

El producto cartesiano obtiene todas las posibles concatenaciones de filas de la primera tabla con filas de la segunda tabla.

Se indica escribiendo en la cláusula FROM los nombres de las tablas separados por una coma o utilizando el operador CROSS JOIN.

FROM {<tabla_origen>} [ ,...n ]

|<tabla_origen> CROSS JOIN <tabla_origen>

Tabla_origen puede ser un nombre de tabla o de vista o una tabla derivada (resultado de una SELECT), en este último caso la SELECT tiene que aparecer entre paréntesis y la tabla derivada debe llevar asociado obligatoriamente un alias de tabla. También puede ser una composición de tablas.

Se pueden utilizar hasta 256 orígenes de tabla en una instrucción, aunque el límite varía en función de la memoria disponible y de la complejidad del resto de las expresiones de la consulta. También se puede especificar una variable table como un origen de tabla.

Ejemplo:

SELECT *

FROM empleados, oficinas;

Si ejecutamos esta consulta veremos que las filas del resultado están formadas por las columnas de empleados y las columnas de oficinas. En las filas aparece cada empleado combinado con la primera oficina, luego los mismos empleados combinados con la segunda oficina y así hasta combinar todos los empleados con todas las oficinas. Si ejecutamos:

SELECT *

FROM empleados CROSS JOIN oficinas;

Obtenemos lo mismo.

Este tipo de operación no es la que se utiliza más a menudo, lo más frecuente sería combinar cada empleado con los datos de SU oficina. Lo podríamos obtener añadiendo a la consulta un WHERE para filtrar los registros correctos:

SELECT *

FROM empleados, oficinas

WHERE empleados.oficina=oficinas.oficina;

Aquí nos ha aparecido la necesidad de cualificar los campos ya que el nombre oficina es un campo de empleados y de oficinas por lo que si no lo cualificamos, el sistema nos da error.

Hemos utilizado en la lista de selección *, esto nos recupera todas las columnas de las dos tablas.

SELECT empleados.*,ciudad, region

FROM empleados, oficinas

WHERE empleados.oficina=oficinas.oficina;

Recupera todas las columnas de empleados y las columnas ciudad y región de oficinas.

También podemos combinar una tabla consigo misma, pero en este caso hay que definir un alias de tabla, en al menos una, sino el sistema da error ya que no puede nombrar los campos.

SELECT *

FROM oficinas, oficinas as ofi2;

107 Jorge Gutiérrez 30000,00 22 24 25000, 107 Jorge Gutiérrez 3000 0,00 22 29 10000, 107 Jorge Gutiérrez 30000,00 22 30 20000, 108 Ana Bustamante 35000,00 21 22 30000, 108 Ana Bustamante 35000,00 21 24 25000, 108 Ana Bustamante 35000,00 21 29 10000, 108 Ana Bustamante 35000,00 21 30 20000,

1.7. La composición interna INNER JOIN

Una composición interna es aquella en la que los valores de las columnas que se están combinando se comparan mediante un operador de comparación. Es otra forma, mejor, de expresar un producto cartesiano con una condición. Es la operación que más emplearemos ya que lo más frecuente es querer juntar los registros de una tabla relacionada con los registros correspondientes en la tabla de referencia (añadir a cada factura los datos de su cliente, añadir a cada línea de pedido los datos de su producto, etc..,).

FROM

<tabla_origen> INNER JOIN <tabla_origen> ON <condicion_combi>

tabla_origen tiene el mismo significado que en el producto cartesiano. condicion_combi es cualquier condición que permite seleccionar las parejas de filas que aparecen en el resultado. Normalmente será una condición de igualdad.

SELECT *

FROM empleados INNER JOIN oficinas

ON empleados.oficina=oficinas.oficina;

Obtiene los empleados combinados con los datos de su oficina.

SELECT *

FROM pedidos INNER JOIN productos

ON producto = idproducto AND fab = idfab;

Obtiene los pedidos combinados con los productos correspondientes.

Normalmente la condición de combinación será una igualdad pero se puede utilizar cualquier operador de comparación (<>, >…).

Es fácil ver la utilidad de esta instrucción y de hecho se utilizará muy a menudo, pero hay algún caso que no resuelve. En las consultas anteriores, no aparecen las filas que no tienen fila correspondiente en la otra tabla.

SELECT numemp,nombre,empleados.oficina, ciudad

FROM empleados INNER JOIN oficinas

ON empleados.oficina=oficinas.oficina;

numemp nombre oficina ciudad 101 Antonio Viguer 12 Alicante 102 Alvaro Jaumes 21 Badajoz 103 Juan Rovira 12 Alicante 104 José González 12 Alicante 105 Vicente Pantalla 13 Castellón 106 Luis Antonio 11 Valencia 107 Jorge Gutiérrez 22 A Coruña 108 Ana Bustamante 21 Badajoz 109 María Sunta 11 Valencia

No aparecen los empleados que no tienen oficina, ni las oficinas que no tienen empleados, porque para que salga la fila, debe de existir una fila de la otra tabla que cumpla la condición.

Para resolver este problema debemos utilizar otro tipo de composición, la composición externa.

Para practicar puedes realizar este Ejercicio La composición interna INNER JOIN.

Unidad 1. Ejercicio paso a paso: La composición interna

INNER JOIN

Objetivo

Combinar datos de dos tablas que tienen algún dato en común, con la finalidad de ampliar la información en una única tabla.

Ejercicio paso a paso

Listar los códigos y nombres de los empleados de las oficinas del Este con su oficina y ciudad.

Como la ciudad donde se encuentra la oficina no viene incluida en el listado de empleados, deberemos enlazar ambas tablas (oficinas y empleados) , utilizando como enlace el código de la oficina, que sí que está en las dos.

SELECT numemp, nombre, empleados.oficina, ciudad

FROM oficinas INNER JOIN empleados ON oficinas.oficina = empleados.oficina

WHERE region ='Este';

Resultado:

Numemp Nombre Oficina ciudad 101 Antonio Viguer 12 Alicante 103 Juan Rovira 12 Alicante 104 José González 12 Alicante 105 Vicente Pantalla 13 Castellon 106 Luis Antonio 11 Valencia

1.8. La Composición externa LEFT, RIGHT y FULL OUTER JOIN

La composición externa se escribe de manera similar al INNER JOIN indicando una condición de combinación pero en el resultado se añaden filas que no cumplen la condición de combinación.

Sintaxis

FROM

<tabla_origen> {LEFT|RIGHT|FULL} [OUTER] JOIN <tabla_origen>

ON <condicion_combi>

La palabra OUTER es opcional y no añade ninguna función. Las palabras LEFT, RIGHT y FULL indican la tabla de la cual se van a añadir las filas sin correspondencia.

SELECT numemp,nombre,empleados.oficina, ciudad

FROM empleados LEFT JOIN oficinas

ON empleados.oficina=oficinas.oficina;

numemp nombre oficina ciudad 101 Antonio Viguer 12 Alicante 102 Alvaro Jaumes 21 Badajoz 103 Juan Rovira 12 Alicante 104 José González 12 Alicante 105 Vicente Pantalla 13 Castellón 106 Luis Antonio 11 Valencia 107 Jorge Gutiérrez 22 A Coruña 108 Ana Bustamante 21 Badajoz 109 María Sunta 11 Valencia 110 Juan Victor NULL NULL

Ahora sí aparece el empleado 110 que no tiene oficina

Obtiene los empleados con su oficina y los empleados (tabla a la izquierda LEFT del JOIN) que no tienen oficina aparecerán también en el resultado con los campos de la tabla oficinas rellenados a NULL.

SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina

FROM empleados RIGHT JOIN oficinas

ON empleados.oficina=oficinas.oficina;

numemp nombre oficina ciudad oficina 106 Luis Antonio 11 Valencia 11 109 María Sunta 11 Valencia 11 101 Antonio Viguer 12 Alicante 12 103 Juan Rovira 12 Alicante 12

104 José González 12 Alicante 12 105 Vicente Pantalla 13 Castellón 13 102 Alvaro Jaumes 21 Badajoz 21 108 Ana Bustamante 21 Badajoz 21 107 Jorge Gutiérrez 22 A Coruña 22 NULL NULL NULL Madrid 23 NULL NULL NULL Aranjuez 24 NULL NULL NULL Pamplona 26 NULL NULL NULL Valencia 28

Las oficinas 23,24,26 y 28 no tienen empleados.

Obtiene los empleados con su oficina y las oficinas (tabla a la derecha RIGHT del JOIN) que no tienen empleados aparecerán también en el resultado con los campos de la tabla empleados rellenados a NULL.

SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina

FROM empleados FULL JOIN oficinas

ON empleados.oficina=oficinas.oficina;

numemp nombre oficina ciudad oficina 101 Antonio Viguer 12 Alicante 12 102 Alvaro Jaumes 21 Badajoz 21 103 Juan Rovira 12 Alicante 12 104 José González 12 Alicante 12 105 Vicente Pantalla 13 Castellón 13 106 Luis Antonio 11 Valencia 11 107 Jorge Gutiérrez 22 A Coruña 22 108 Ana Bustamante 21 Badajoz 21 109 María Sunta 11 Valencia 11 110 Juan Victor NULL NULL NULL NULL NULL NULL Madrid 23 NULL NULL NULL Aranjuez 24 NULL NULL NULL Pamplona 26 NULL NULL NULL Valencia 28

Aparecen tanto los empleados sin oficina como las oficinas sin empleados.

SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina

FROM empleados FULL OUTER JOIN oficinas

ON empleados.oficina=oficinas.oficina;

Es equivalente, la palabra OUTER como hemos dicho no añade ninguna funcionalidad y se utiliza si se quiere por cuestiones de estilo.

NOTA : Cuando necesitamos obtener filas con datos de dos tablas con una condición de combinación utilizaremos un JOIN, os aconsejo empezar por escribir el JOIN con la

104 José González 33 dir ventas 19/05/87 106 12 Alicante este

105 Vicente Pantalla 37 representante 12/02/88 104 13 Castellon este

106 Luis Antonio 52 director general 14/06/88 NULL 11 Valencia este

107 Jorge Gutiérrez 49 representante 14/11/88 108 22 A Coruña oeste

108 Ana Bustamante 62 dir ventas 12/10/89 106 21 Badajoz oeste

109 María Sunta 31 representante 12/10/99 106 NULL NULL NULL

110 Juan Victor 41 representante 13/01/90 104 NULL NULL NULL

111 Juan Gris 50 representante 01/05/05 110 21 Badajoz oeste

112 Julián Martorell 50 representante 01/05/06 NULL NULL NULL NULL

113 Juan Gris 18 representante 01/01/07 NULL NULL NULL NULL

Listar todas las oficinas y los nombres y títulos de sus directores.

SELECT oficinas.*, nombre AS director, titulo

FROM oficinas LEFT JOIN empleados ON dir = numemp;

Resultado:

Oficina Ciudad Region Dir Objetivo Ventas Director Titulo

11 Valencia este 106 57500,00 69300,00 Luis Antonio director general

12 Alicante este 104 80000,00 73500,00 José González dir ventas

13 Castellon este 105 35000,00 36800,00 Vicente Pantalla representante

21 Badajoz oeste 108 72500,00 84400,00 Ana Bustamante dir ventas

22 A Coruña oeste 108 30000,00 18600,00 Ana Bustamante dir ventas

23 Madrid centro 108 NULL NULL Ana Bustamante dir ventas

24 Aranjuez centro 108 25000,00 15000,00 Ana Bustamante dir ventas

25 Valencia NULL NULL NULL NULL NULL NULL

26 Pamplona norte NULL NULL 200000,00 NULL NULL

27 Móstoles Centro NULL NULL 0,00 NULL NULL

28 Valencia este NULL 90000,00 0,00 NULL NULL

29 Valencia este NULL 10000,00 2100,00 NULL NULL

30 pamplona norte NULL 20000,00 NULL NULL NULL

31 Elx NULL NULL NULL 0,00 NULL NULL

Listar las oficinas con objetivo superior a 60.000 euros indicando para cada una el nombre de su director.

SELECT oficinas.*, nombre AS director

FROM oficinas LEFT JOIN empleados ON dir = numemp

WHERE objetivo > 60000;

Resultado:

Oficina Ciudad Region Dir Objetivo Ventas Director 12 Alicante este 104 80000,00 73500,00 José González

21 Badajoz oeste 108 72500,00 84400,00 Ana Bustamante 28 Valencia este NULL 90000,00 0,00 NULL

1.9. Combinar varias operaciones

En las operaciones anteriores tabla_origen puede ser a su vez una composición de tablas, en este caso aunque sólo sea obligatorio cuando queramos cambiar el orden de ejecución de las composiciones, es recomendable utilizar paréntesis para delimitar las composiciones.

Por ejemplo:

SELECT numemp, nombre, empleados.oficina, ciudad, oficinas.oficina, pedidos.* FROM (oficinas RIGHT JOIN empleados

ON empleados.oficina = oficinas.oficina)

INNER JOIN pedidos on rep=numemp;

O bien:

SELECT numemp, nombre, empleados.oficina, ciudad, oficinas.oficina, pedidos.*

FROM oficinas RIGHT JOIN (empleados INNER JOIN pedidos on rep = numemp)

ON empleados.oficina = oficinas.oficina);

Ejercicios unidad 1: Consultas multitabla

Ejercicio 1: La composición de tablas

  1. Listar todos los pedidos, mostrando el precio y la descripción del producto.
  2. Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tomó el pedido y el nombre del cliente que lo solicitó.
  3. Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente que solicitó el pedido y el nombre del vendedor asignado a ese cliente.
  4. Listar los pedidos superiores a 250 euros, mostrando además el nombre del cliente que solicitó º el pedido y el nombre del vendedor asignado a ese cliente y la ciudad de la oficina donde el vendedor trabaja.
  5. Hallar los pedidos recibidos los días en que un nuevo empleado fue contratado.
  6. Hallar los empleados que realizaron su primer pedido el mismo día que fueron contratados.
  7. Mostrar de cada empleado su código, nombre, ventas, oficina y ciudad en la que está ubicada su oficina.
  8. Listar los empleados con una cuota superior a la de su jefe, los campos a obtener son el número, nombre y cuota del empleado y número, nombre y cuota de su jefe.

Unidad 2. Consultas de resumen

2.1. Introducción

Una de las funcionalidades de la sentencia SELECT es el permitir obtener resúmenes de los datos contenidos en las columnas de las tablas.

Para poder llevarlo a cabo la sentencia SELECT consta de una serie de cláusulas específicas (GROUP BY, HAVING), y Transact-SQL tiene definidas unas funciones para poder realizar estos cálculos, las funciones de agregado (también llamadas funciones de columna). La diferencia entre una consulta de resumen y una consulta de las que hemos visto hasta ahora es que en las consultas normales las filas del resultado se obtienen directamente de las filas del origen de datos y cada dato que aparece en el resultado tiene su dato correspondiente en el origen de la consulta mientras que las filas generadas por las consultas de resumen no representan datos del origen sino un total calculado sobre estos datos. Esta diferencia hará que las consultas de resumen tengan algunas limitaciones que veremos a lo largo del tema.

Un ejemplo sería:

A la izquierda tenemos una consulta simple que nos saca las oficinas con sus ventas ordenadas por región, y a la derecha una consulta de resumen que obtiene la suma de las ventas de las oficinas de cada región

2.2. Las funciones de agregado

Una función de agregado SQL acepta un grupo de datos (normalmente una columna de datos) como argumento, y produce un único dato que resume el grupo. Por ejemplo la función AVG() acepta una columna de datos numéricos y devuelve la media aritmética (average) de los valores contenidos en la columna.

El mero hecho de utilizar una función de agregado en una consulta, convierte ésta en una consulta de resumen.

Todas las funciones de agregado tienen una estructura muy parecida:

Función ( [ALL|DISTINCT] expression )

El grupo de valores sobre el que actúa la función lo determina el resultado de la expresión que será un nombre de columna o una expresión basada en una columna o varias del origen de datos. En la expresión nunca puede aparecer una función de agregado ni una subconsulta.

La palabra ALL indica que se tiene que tomar en cuenta todos los valores de la columna. Es el valor por defecto.

La palabra DISTINCT hace que se consideren todas las repeticiones del mismo valor como uno sólo (considera valores distintos).

Todas las funciones de agregado se aplican a las filas del origen de datos una vez ejecutada la cláusula WHERE (si la hubiera).

Si exceptuamos la función COUNT, todas las funciones de agregado ignoran los valores NULL.

Una función de agregado puede aparecer en la lista de selección en cualquier lugar en el que puede aparecer un nombre de columna. Puede, por ejemplo, formar parte de una expresión pero no se pueden anidar funciones de agregado.

Tampoco se pueden mezclar funciones de columna con nombres de columna ordinarios. Hay excepciones a esta regla pero cuando definimos agrupaciones y subconsultas que veremos más adelante.

2.3. La función COUNT

COUNT ( {[ALL|DISTINCT] expresion | ***** } )

Expresion puede ser de cualquier tipo excepto text , image o ntext. No se permite utilizar funciones de agregado ni subconsultas. El tipo de dato devuelto es int. Si el número de valores devueltos por expresion es superior a 231-1, COUNT genera un error, en ese caso hay que utilizar la función COUNT_BIG.

La función cuenta los valores distintos de NULL que hay en la columna. La palabra ALL indica que se tienen que tomar todos los valores de la columna, mientras que DISTINCT hace que se consideren todas las repeticiones del mismo valor como uno solo. Estos parámetros son opcionales, por defecto se considera ALL.

Por ejemplo:

SELECT COUNT(region) FROM oficinas;

Devuelve 9 porque tenemos nueve valores no nulos en la columna region. A la hora de interpretar un COUNT es conveniente no olvidar que cuenta valores no nulos, por ejemplo si interpretáramos la sentencia tal cual se lee, “cuántas regiones tenemos en oficinas” sería erróneo, realmente estamos obteniendo cuántas oficinas tienen una región asignada.

SELECT COUNT(DISTINCT region) FROM oficinas;

Devuelve 4 porque tenemos cuatro valores distintos, no nulos, en la columna región, los valores repetidos los considera sólo una vez. Ahora sí nos devuelve cuántas regiones tenemos en oficinas.