EL PRODUCTO CARTESIANO El producto cartesiano es un tipo de composición de tablas, aplicando el producto cartesiano a d
Views 88 Downloads 0 File size 851KB
EL PRODUCTO CARTESIANO
El producto cartesiano es un tipo de composición de tablas, aplicando el producto cartesiano a dos tablas se obtiene una tabla con las columnas de la primera tabla unidas a las columnas de la segunda tabla, y las filas de la tabla resultante son todas las posibles concatenaciones de filas de la primera tabla con filas de la segunda tabla. La sintaxis es la siguiente:
El producto cartesiano se indica poniendo en la FROM las tablas que queremos componer separadas por comas, podemos obtener así el producto cartesiano de dos, tres, o más tablas. nbtabla puede ser un nombre de tabla o un nombre de consulta. Si todas las tablas están en una base de datos externa, añadiremos la cláusula IN base datos externa después de la última tabla. Pero para mejorar el rendimiento y facilitar el uso, se recomienda utilizar una tabla vinculada en lugar de la cláusula IN. Hay que tener en cuenta que el producto cartesiano obtiene todas las posibles combinaciones de filas por lo tanto si tenemos dos tablas de 100 registros cada una, el resultado tendrá 100x100 filas, si el producto lo hacemos de estas dos tablas con una tercera de 20 filas, el resultado tendrá 200.000 filas (100x100x20) y estamos hablando de tablas pequeñas. Se ve claramente que el producto cartesiano es una operación costosa sobre todo si operamos con más de dos tablas o con tablas voluminosas. Se puede componer una tabla consigo misma, en este caso es obligatorio utilizar un nombre de alias por lo menos para una de las dos.
Por ejemplo: SELECT * FROM empleados, empleados emp En este ejemplo obtenemos el producto cartesiano de la tabla de empleados con ella misma. Todas las posibles combinaciones de empleados con empleados.
Para ver cómo funciona el producto cartesiano cogemos las consultas [existencias cero] y [pedidos 90] creadas en la página anterior, y creamos una consulta que halle el producto cartesiano de las dos.
SELECT * FROM [existencias cero],[pedidos 90] Obtenemos la siguiente tabla:
Se observa que tenemos las dos filas de la primera consulta combinadas con las dos filas de la segunda.
Esta operación no es de las más utilizadas, normalmente cuando queremos componer dos tablas es para añadir a las filas de una tabla, una fila de la otra tabla, por ejemplo añadir a los pedidos los datos del cliente correspondiente, o los datos del representante, esto equivaldría a un producto cartesiano con una selección de filas:
SELECT * FROM pedidos,clientes WHERE pedidos.clie=clientes.numclie Combinamos todos los pedidos con todos los clientes pero luego seleccionamos los que cumplan que el código de cliente de la tabla de pedidos sea igual al código de cliente de la tabla de clientes, por lo tanto nos quedamos con los pedidos combinados con los datos del cliente correspondiente. Las columnas que aparecen en la cláusula WHERE de nuestra consulta anterior se denominan columnas de emparejamiento ya que permiten emparejar las filas de las dos tablas. Las columnas de emparejamiento no tienen por qué estar incluidas en la lista de selección. Normalmente emparejamos tablas que están relacionadas entre sí y una de las columnas de emparejamiento es clave principal, pues en este caso, cuando una de las columnas de emparejamiento tienen un índice definido es más eficiente utilizar otro tipo de composición, el INNER JOIN.
EJEMPLO Ejemplo de producto cartesiano El producto cartesiano de las relaciones DESPACHOS y EDIFICIOS_EMP del ejemplo se puede hacer como se indica (es necesario redenominar atributos previamente): EDIFICIOS(nombreedificio, supmediadesp).
supmediadesp)
:=
EDICIOS_EMP(edificio,
R := EDIFICIOS x DESPACHOS. Entonces, la relación R resultante será:
Conviene señalar que el producto cartesiano es una operación que raramente se utiliza de forma explícita, porque el resultado que da no suele ser útil para resolver las consultas habituales. A pesar de ello, el producto cartesiano se incluye en el álgebra relacional porque es una operación primitiva; a partir de la cual se define otra operación del álgebra, la combinación, que se utiliza con mucha frecuencia.
EJEMPLO Producto cartesiano X
Producto cruz o solo producto R X S, los esquemas de ambas relaciones se mezclan y unen. Dados
A
B
1
2
3
4
B
C
D
2
5
6
4
7
8
9
10
11
R
S
A
R.B
S.B
C
D
1
2
2
5
6
1
2
4
7
8
1
2
9
10
11
3
4
2
5
6
3
4
4
7
8
3
4
9
10
11
RXS Producto natural |X|
Es un producto cartesiano donde nos interesan únicamente algunas tuplas que hacen "match" en algun criterio. A
R.B
S.B
C
D
1
2
2
5
6
1
2
4
7
8
1
2
9
10
11
3
4
2
5
6
3
4
4
7
8
3
4
9
10
11
A
B
C
D
1
2
5
6
3
4
7
8
R |X| S
El INNER JOIN El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas tablas de forma más eficiente que con el producto cartesiano cuando una de las columnas de emparejamiento está indexada. Ya que en vez de hacer el producto cartesiano completo y luego seleccionar la filas que cumplen la condición de emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condición, con lo cual se emparejan sólo las filas que luego aparecen en el resultado. La sintaxis es la siguiente: Ejemplo: SELECT * FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos registros se van a combinar. Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla. col1, col2 son las columnas de emparejamiento. Observar que dentro de la cláusula ON los nombres de columna deben ser nombres cualificados (llevan delante el nombre de la tabla y un punto). Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha etc... los campos numéricos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumérico y Long puesto que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Además las columnas no pueden ser de tipo Memo ni OLE. comp representa cualquier operador de comparación ( =, , =, o ) y se utiliza para establecer la condición de emparejamiento.
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condición entre paréntesis. Ejemplo: SELECT * FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto = productos.idproducto) Se pueden combinar más de dos tablas En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo. Por ejemplo: SELECT * FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp En vez de tabla1 hemos escrito un INNER JOIN completo, también podemos escribir: SELECT * FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie En este caso hemos sustituido tabla2 por un INNER JOIN completo. OPERADORES DERIVADOS
Los operadores derivados son aquellos que se pueden expresar siempre en función de operadores primitivos, pero su introducción tiene por fin la simplificación de las consultas. Combinación o join La combinación de dos relaciones respecto de sus columnas d y k es otra relación constituida por todos los pares de tuplas concatenadas, tales que, en cada par, las columnas d y k de las correspondientes tuplas satisfacen la condición especificada. Si la condición es de igualdad se denomina combinación por igualdad (también se denomina equijoin o join). Los operadores derivados son aquellos que se pueden expresar siempre en función de operadores primitivos, pero su introducción tiene por fin la simplificación de las consultas. DIVISIÓN (:) La división de dos relaciones es otra relación cuya extensión estará constituida por las tuplas que al completarse con las tuplas de la segunda relación permiten obtener la primera.
Formalmente: Sean dos relaciones con esquemas R y R’, la división de ambos, denotada R : R’ será una relación de grado n-n’ cuyo esquema estará formado por los n-n’ atributos A A’ es decir: (Ai:Di,...,An-n’:Dn-n’) y cuya extensión será: < vi1,...,vi(n-n’) > / < vi(n-n’+1),..., vin > r’ < vi1,...,vi(n-n’) , vi(nn’+1),..., vin > AUTOR NOMBRE
NACIONALIDAD
EDITORIAL
Date C.J.
Norteamericana
Addison
De Miguel
Española
Rama
Saltor F.
Española
Paraninfo
Ceri S.
Italiana
Club
Costilla C.
Española
Diaz de Santos
Codd E.
Norteamericana
Prentice Hall
De Miguel
Española
Addison
AUTOR : EDITORIAL (saber los autores que han publicado en Addison y Rama) NOMBRE
NACIONALIDAD
De Miguel
Española
EDITORIAL EDITORIAL Addison Rama
División
Sean A
B
C
D
a
b
c
d
a
b
e
f
C
D
b
c
e
f
c
d
e
d
c
d
e
f
e
d
e
f
a
b
d
e
S
R
A
B
a
b
e
d
R/S Ejemplo: Estudiantes que han tomado todos los cursos de "IS" ID,num ( depto='IS' (estudiante_cursos)) / depto='IS'(cursos))
num(
LA COMBINACIÓN O REUNIÓN (join) permite cruzar los valores de tablas relacionadas La combinación toma dos relaciones y devuelve una relación con las tuplas que resultan de concatenar tuplas de la primera con tuplas de la segunda y después seleccionar las que cumplen una condición de combinación C. Una combinación entre las relaciones R y Q mediante la condición C se denota como R[C]Q. Si la condición es la de igualdad, se denomina combinación por igualdad (equi_join). La llamada combinación natural es una combinación por igualdad donde se ha eliminado en la relación resultante uno de los atributos idénticos. Es el caso más común para relaciones que tienen un atributo común. AUTOR NOMBRE
NACIONALIDAD
INSTITUCION
Date C.J.
Norteamericana
Relational Ins.
De Miguel
Española
FIM
Saltor F.
Española
FI de UPB
Ceri S.
Italiana
Polit.Milan
LIBRO
AUTOR
EDITORIAL
DB Systems
Date C.J.
Addison
Basi di Dati
Ceri S.
Clup
SQL stan.
Date C.J.
Addison
Diseño BD
De Miguel
Rama
LIBROS
AUTOR * LIBROS (autor.nombre = libros.autor) NOMBRE
NACIONALIDAD INSTITUCION LIBRO
EDITORIAL
Date C.J.
Norteamericana
Relational Ins.
DB Systems
Addison
De Miguel
Española
FIM
Diseño BD
Rama
Date C.J.
Norteamericana
Relational Ins.
SQL stan
Addison
Ceri S.
Italiana
Polit.Milan
Basi di Dati
Clup
http://www.aulaclic.es/sql/t_3_3.htm http://www.dataprix.com/514-producto-cartesiano http://equipo22compu.blogspot.com/2012/06/operadores-derivados.html https://www.fing.edu.uy/tecnoinf/mvd/cursos/bd2/material/teo/bd2-teorico01.pdf http://guillerendon.blogspot.com/2012/03/142-operadores-derivados.html http://ict.udlap.mx/people/carlos/is341/bases04.html