PDF de programación - 1. DML. Las consultas multitabla

<<>>
Imágen de pdf 1. DML. Las consultas multitabla

1. DML. Las consultas multitablagráfica de visualizaciones

Publicado el 14 de Abril del 2019
649 visualizaciones desde el 14 de Abril del 2019
81,6 KB
7 paginas
1. DML. Las consultas multitabla

1.1 Introducción


Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla, en este tema veremos

cómo obtener datos de diferentes tablas en una sola instrucción SELECT.

En esta parte ampliaremos la cláusula FROM y descubriremos nuevas palabras reservadas (UNION,

EXCEPT e INTERSECT).

basada en el álgebra relacional.

también una tabla.

Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna operación

El álgebra relacional define una serie de operaciones cuyos operandos son tablas y cuyo resultado es

Las operaciones de álgebra relacional implementadas en Transact-Sql son:
la unión UNION
la diferencia EXCEPT
la intersección INTERSECT
el producto cartesiano
la composición interna INNER JOIN
la composición externa LEFT JOIN, RIGHT JOIN Y OUTER 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 las tablas temporales y 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).



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

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



[ ...n ] ]



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


[ ,...n ]]

<especificacion_consulta> es 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)
FROM
(SELECT oficina, ciudad FROM Madrid);


El resultado sería:

OFI
11
28
23

ciudad
Valencia
Valencia
Madrid


1


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)
FROM
(SELECT oficina, ciudad FROM Madrid)
ORDER BY ofi;



OFI
11
23
28

ciudad
Valencia
Madrid
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 AS OFI, ciudad FROM Valencia)
union
(SELECT oficina, ciudad FROM Madrid)
UNION
(SELECT oficina, ciudad FROM Pamplona);


Combinamos las tres tablas.

1.3 La diferencia EXCEPT



Aparecen en la tabla resultante las filas de la primera consulta que no aparecen en la segunda.
Las condiciones son las mismas que las de la unión.


{<especificacion_consulta>|(<especificacion_consulta>)}
EXCEPT
{<especificacion_consulta>|(<especificacion_consulta>)}

{<especificacion_consulta>|(<especificacion_consulta>)}
EXCEPT



[ ...n ] ]



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


[ ,...n ]]


Por ejemplo tenemos las tablas T1 y T2
T1: Cod T2: Codigo
1
2
4
5
6



2
3
4
5



2





SELECT cod FROM T1
EXCEPT
SELECT cod FROM T2;

Devuelve:
Cod
1
6



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.


{<especificacion_consulta>|(<especificacion_consulta>)}
INTERSECT
{<especificacion_consulta>|(<especificacion_consulta>)}

{<especificacion_consulta>|(<especificacion_consulta>)}
INTERSECT



[ ...n ] ]



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


[ ,...n ]]


Retomando el ejemplo anterior:


SELECT cod FROM T1
INTERSECT
SELECT cod FROM T2;


Devuelve:

Cod
2
4
5

euros del producto.



Ejemplos:
Obtener todos los productos cuyo precio exceda de 20 o que se haya vendido en un pedido más de 300



SELECT idfab, idproducto
FROM productos
WHERE precio > 20
UNION
SELECT fab, producto
FROM pedidos
WHERE importe > 300;


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



SELECT idfab, idproducto
FROM productos
EXCEPT
SELECT DISTINCT fab, producto
FROM pedidos;


3

Obtener todos los productos que valen más de 20 euros y que además se haya vendido en un pedido

más de 300 euros de ese producto.



SELECT idfab, idproducto
FROM productos
WHERE precio > 20
INTERSECT
SELECT fab, producto
FROM pedidos
WHERE importe > 300;

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.5.1 El producto cartesiano



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

Se indica escribiendo en la cláusula FROM los nombres de las tablas separados por una coma o

de la segunda tabla.

utilizando el operador CROSS JOIN.

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


|<tabla_origen> CROSS JOIN <tabla_origen>


Por 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:



4

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, al menos una, sino el sistema da error ya que no puede nombrar los campos.



SELECT *
FROM oficinas, oficinas as ofi2;


No insistiremos más sobre el producto cartesiano porque no es la operación más utilizada, ya que
normalmente cuando queramos componer dos tablas lo haremos con una condición de selección basada en
campos de combinación y para este caso es más eficiente el JOIN que veremos a continuación.



1.5.2 La composición interna INNER JOIN


Una composición interna es aquélla 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 de igualdad.
Es la operación que más emplearemos ya que lo más frecuente es querer juntar los registros
  • Links de descarga
http://lwp-l.com/pdf15727

Comentarios de: 1. DML. Las consultas multitabla (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad