¿Qué ocurre si combinamos dos o más tablas sin ninguna restricción? El resultado será un producto cartesiano.
El producto cartesianoProducto cartesianoEn teoría de conjuntos, el producto cartesiano es un producto directo de conjuntos. En particular, el producto cartesiano de dos conjuntos X e Y, denotado por X × Y, es el conjunto de todos los pares ordenados en los que el primer componente pertenece a X y el segundo a Y. entre dos tablas da como resultado todas las combinaciones de todas las filas de esas dos tablas.
Se indica poniendo en la cláusula FROM las tablas que queremos componer separadas por comas. Y puedes obtener el producto cartesiano de las tablas que quieras.
Como lo que se obtiene son todas las posibles combinaciones de filas, debes tener especial cuidado con las tablas que combinas. Si tienes dos tablas de 10 filas cada una, el resultado tendrá 10x10 filas, a medida que aumentemos el número de filas que contienen las tablas, mayor será el resultado final, con lo cual se puede considerar que nos encontraremos con una operación costosa.
Esta operación no es de las más utilizadas ya que coge una fila de una tabla y la asocia con todos y cada uno de las filas de la otra tabla, independientemente de que tengan relación o no. Lo más normal es que queramos seleccionar los registros según algún criterio.
Necesitaremos discriminar de alguna forma para que únicamente aparezcan filas de una tabla que estén relacionadas con la otra tabla. A esto se le llama asociar tablas (JOIN).
Para hacer una composición interna se parte de un producto cartesiano y se eliminan aquellas filas que no cumplen la condición de composición.
Lo importante en las composiciones internas es emparejar los campos que han de tener valores iguales.
Las reglas para las composiciones son:
- Pueden combinarse tantas tablas como se desee.
- El criterio de combinación puede estar formado por más de una pareja de columnas.
- En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no, la combinación.
- Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse especificando la tabla de procedencia o utilizando un alias de tabla.
Las columnas que aparecen en la cláusula WHERE se denominan columnas de emparejamiento ya que son las que permiten emparejar las filas de las dos tablas. Éstas no tienen por qué estar incluidas en la lista de selección. Emparejaremos tablas que estén relacionadas entres sí y además, una de las columnas de emparejamiento será clave principal en su tabla. Cuando emparejamos campos debemos especificar de la siguiente forma: NombreTabla1. Camporelacionado1 = NombreTabla2.Camporelacionado2.
Puedes combinar una tabla consigo misma pero debes poner de manera obligatoria un alias a uno de los nombres de la tabla que vas a repetir.
MySQL
Veamos un ejemplo, si queremos obtener el nombre y ciudad de los departamentos de los empleados, así como el código, nombre y fecha de ingreso, tendremos que utilizar alias o anteponer el nombre de la tabla a las columnas que se denominen igual en ambas tablas que se combian:
SELECT e.cdemp, e.nombre, e.fecha_ingreso, d.nombre, d.ciudad
FROM empleado e, departamento d
WHERE e.cddep= d.cddep;
Observa que ambas tablas, empleado y departamento están relacionadas por la columna cddep (código de departamento) y que en ambas tablas la columna se denomina igual, y lo mismo ocurre con el nombre del empleado y departamento, en ambas tablas se guarda en una columna denominada nombre. Por ello, es obligatorio anteponer al nombre de cada columna que se denomine igual, el nombre de la tabla de procedencia (tabla.columna) o bien, poner un alias a la tabla y utilizar el alias (alias.columna).
En el ejemplo, se ha optado por poner a empleado el alias e, y a departamento el alias d, de manera que todas las columnas quedan totalmente claras si le anteponemos ese alias.
Puedes combinar una tabla consigo misma pero debes poner de manera obligatoria un alias a uno de los nombres de la tabla que vas a repetir.
Por ejempo, la tabla empleado tiene una (inter)relación reflexiva, pues un empleado tiene como jefe a otro empleado. De hecho, ésto hace que aparezca dentro de la misma tabla la clave foránea cdjefe que hace referencia a la clave primaria cdemp.
Supongamos que nuestra consulta es para obtener el código y nombre de cada empleado con el nombre de su jefe ¿cómo la redactaríamos?. Observa que habrá que componer o combinar la tabla empleado con ella misma, desde el punto de vista de los empleados y el de los jefes. La consulta quedaría así:
SELECT e.cdemp, e.nombre, je.nombre
FROM empleado e, empleado je
WHERE e.cdjefe = je.cdemp;
Oracle
Veamos un ejemplo, si queremos obtener la referencia, el tema, el nombre de la sala en la que se celebra y la capacidad tendremos:
SELECT referencia, tema, nombre, capacidad FROM CONFERENCIA, SALA<br />WHERE CONFERENCIA.sala= SALA.Nombre;<br />
Ahora vamos a obtner el codigo y el nombre de los asistentes (sin repetirse) que asisten a alguna conferencia que tenga la palabra "datos" en su tema.
SELECT DISTINCT A.codigo, A.nombre FROM ASISTENTE A, <br />CONFERENCIA C, ASISTIR AT, WHERE A.codigo= AT.codasistente AND<br />C.referencia=AT.refconferencia AND C.Tema LIKE '%DATOS%';<br /><br />