Esta operación se utiliza cuando tenemos dos          tablas con las mismas columnas          y queremos obtener una nueva tabla          con las filas de la primera y las filas de la          segunda. En este caso la tabla resultante tiene las mismas          columnas que la primera tabla (que son las mismas que las de la segunda          tabla).  
 Por ejemplo tenemos una tabla de libros nuevos y una          tabla de libros antiguos y queremos una lista con todos los libros que          tenemos. En este caso las dos tablas tienen las mismas columnas, lo único          que varía son las filas, además queremos obtener una lista          de libros (las columnas de una de las tablas) con las filas que están          tanto en libros nuevos como las que están en libros antiguos, en          este caso utilizaremos este tipo de operación.         
Cuando hablamos de tablas pueden ser tablas          reales almacenadas en la base de datos o          tablas lógicas (resultados          de una consulta), esto nos permite utilizar la operación con más          frecuencia ya que pocas veces tenemos en una base de datos tablas idénticas          en cuanto a columnas. El resultado          es siempre una tabla lógica.         
Por ejemplo queremos en un sólo listado los productos          cuyas existencias sean iguales a cero y también los productos que          aparecen en pedidos del año 90. En este caso tenemos unos productos          en la tabla de productos y los otros en la tabla de pedidos, las tablas          no tienen las mismas columnas no se puede hacer una union de ellas pero          lo que interesa realmente es el identificador del producto (idfab,idproducto),          luego por una parte sacamos los códigos de los productos con existencias          cero (con una consulta), por otra parte los códigos de los productos          que aparecen en pedidos del año 90 (con otra consulta), y luego          unimos estas dos tablas lógicas.          
El operador que permite realizar esta operación          es el operador UNION.                           
 
  Existen distintos tipos de composición, aprenderemos          a utilizarlos todos y a elegir el tipo más apropiado a cada caso.                 
Los tipos de composición          de tablas son:         
. El producto cartesiano         
. El INNER JOIN         
. El LEFT / RIGHT JOIN El          operador UNION sirve para obtener          a partir de dos tablas con las mismas          columnas, una nueva tabla con las filas          de la primera y          las filas de la segunda.  
 SELECT idfab,idproducto 
FROM productos 
WHERE existencias = 0 
UNION ALL  
SELECT fab,producto 
FROM pedidos 
WHERE year(fechapedido) = 1990 
ORDER BY idproducto   
 Se ha incluido la cláusula ALL          porque no nos importa que salgan filas repetidas.         
Se ha incluido ORDER          BY para que el resultado salga ordenado por idproducto, observar          que hemos utilizado el nombre de la columna de la primera SELECT,          también podíamos haber puesto ORDER          BY 2 pero no ORDER BY producto          (es el nombre de la columna de la segunda tabla).  
 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.   
 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.    
          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  
 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.  
   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:  SELECT * 
FROM pedidos INNER JOIN clientes ON pedidos.clie= clientes.numclie  
 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  
 El LEFT JOIN y RIGHT JOIN  
 El LEFT JOIN y RIGHT          JOIN son otro tipo de composición de tablas, también          denominada composición externa.          Son una extensión del INNER          JOIN.  Las composiciones vistas hasta ahora (el producto          cartesiano y el INNER JOIN)          son composiciones internas ya que          todos los valores de las filas del resultado son valores que están          en las tablas que se combinan.  
 Queremos combinar los empleados con las oficinas para          saber la ciudad de la oficina donde trabaja cada empleado, si utilizamos          un producto cartesiano tenemos: SELECT empleados.*,ciudad 
FROM empleados, oficinas 
WHERE empleados.oficina = oficinas.oficina 
 
Observar que hemos cualificado el nombre de columna oficina ya que ese          nombre aparece en las dos tablas de la FROM.          Con esta sentencia los empleados          que no tienen una oficina          asignada (un valor nulo en el campo oficina de la tabla empleados) no          aparecen en el resultado ya que la condición empleados.oficina          = oficinas.oficina será siempre nula para esos empleados. Si utilizamos el INNER          JOIN: SELECT empleados.*,          ciudad 
FROM empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina Nos pasa lo mismo, el empleado 110 tiene un valor nulo          en el campo oficina y no aparecerá en el resultado. Pues en los casos en que queremos          que también aparezcan las filas          que no tienen una fila coincidente en la otra tabla, utilizaremos          el LEFT o RIGHT          JOIN.  
 La sintaxis del LEFT JOIN          es la siguiente:    
SELECT * 
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina
  
 Con el ejemplo anterior obtenemos una lista de los empleados          con los datos de su oficina, y el empleado 110 que no tiene oficina aparece          con sus datos normales y los datos de su oficina a nulos.  
 La sintaxis es la misma que la del INNER          JOIN  lo único que cambia          es la palabra INNER por          RIGHT   
 sta operación consiste en añadir          al resultado del INNER JOIN          las filas de la tabla          de la derecha que no          tienen correspondencia en la otra tabla, y rellenar          en esas filas los campos de la tabla          de la izquierda con valores          nulos. Ejemplo: SELECT * 
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina  
 Una          operación LEFT JOIN o RIGHT          JOIN se puede anidar dentro          de una operación INNER JOIN, pero          una operación INNER JOIN no          se puede anidar dentro          de LEFT JOIN o RIGHT          JOIN. Los anidamientos de JOIN          de distinta naturaleza no funcionan siempre, a veces depende del orden          en que colocamos las tablas, en estos casos lo mejor es probar y si no          permite el anudamiento, cambiar el orden de las tablas ( y por tanto de          los JOINs) dentro de la          cláusula FROM. Por ejemplo podemos tener: SELECT * 
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON empleados.oficina          = oficinas.oficina) ON clientes.repclie = empleados.numclie  
  
  | 
chido
ResponderEliminar