Iver's web place

Navegador de Archivos

Calendario del Blog

February 2012
Sun Mon Tue Wed Thu Fri Sat
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 1 2 3

General

Tipos de Joins

Ya que últimamente me ha dado por escribir de SQL, se me antoja escribir de un tema que desconocía cuando programaba en ASP 3.0 pero que siempre era necesario conocer. Me refiero a las "juntas en SQL" (que ojalá fueran reuniones en un bar =/ ) osea los JOIN de SQL. Que si bien es muy necesario conocer que hace exactamente cada tipo de "JOIN", es común encontrarse con "desarrolladores" que hacen uso de los "JOIN" a lo wey!


Recuerdo que varias veces pregunté (obvio a las personas equivocadas) cual era la diferencia y entre los tipos de JOIN y me decían: un INNER JOIN te sirve para obtener el resultado de dos tablas en una consulta y un CROSS JOIN un producto cartesiano de las tablas (ahora que lo analizo bien puede ser que se quisieran deshacer de mi sin explicar mucho o_O!)


OK, la respuesta no está del todo mal, sin embargo creo que primero se debe conocer cuales son:



  • INNER JOIN
  • LEFT OUTER JOIN (o LEFT JOIN)
  • FULL OUTER JOIN
  • CROSS JOIN



El primero (INNER JOIN) es la unión de dos tablas a partir de uno más campos obteniendo como resultado los registros que cumplan la condición de unión ("ON"), su uso es el siguiente:



 
SELECT * FROM Employee E
          INNER JOIN Contact C
          ON E.ContactID = C.ContactID
 

En Oracle este ejemplo podría definirse como "EQUI JOIN" y también se emplea lo que se llama "NATURAL JOIN", de tal suerte que la consulta anterior se puede expresar como:


 
SELECT * FROM Employee E
          NATURAL JOIN Contact C
 

Esto nos permite omitir la condición de "ON", sin embargo hay que tener cuidado al usarlo ya que puede ocasionar resultados ambiguos cuando existen campos con el mismo nombre.



El LEFT OUTER JOIN (o LEFT JOIN): combina dos tablas con la diferencia que selecciona todas las filas de la primer tabla (LEFT -Izquierda) sin importar que tengan o no coincidencia en la segunda.

EL RIGHT OUTER JOIN (o RIGHT OUTER): combina las tablas a la inversa. Obtiene todos los registros de la segunda tabla (RIGHT -Derecha) dejando en NULL aquellos que no tengan coincidencia en la primera.


Un ejemplo más claro lo tenemos con la siguiente consulta:


 
SELECT C.Nombre, C.NomComercial, E.Entrada
        FROM Clientes C
        LEFT OUTER JOIN Entradas E
                ON C.EstadoCli = E.IdEntrada
 

La consulta anterior obtendrá todos los registros de la tabla Clientes agregando la columna Entrada de la tabla Entradas aunque en está última no existan datos que coincidan, regresando para los registros sin coincidencia datos de tipo NULL. Esto es muy útil ya que de esta forma podemos filtrar cuando el resultado sea NULL y actualizar/eliminar/copiar registros que no existan en la tabla Clientes. Por ejemplo:



 
SELECT C.Nombre, C.NomComercial
INTO ClientesSinEntradas
        FROM Clientes C
        LEFT OUTER JOIN Entradas E
                ON C.EstadoCli = E.IdEntrada
        WHERE E.Entrada IS NULL
 

La consulta anterior mandara el resultado a la tabla ClientesSinEntradas cuando no exista relación en la tabla de Entradas



El FULL OUTER JOIN: nos permite obtener todo el universo de las tablas seleccionadas regresando NULL cuando no exista coincidencia en alguna de ellas. De tal suerte que si existieran registros en dos tablas como las siguientes:


Productos
IdProductoProductoPrecioIdCategoria
10iPad499 USDNULL
12iPhone299 USD4
Categorias
IdCategoriaCategoria
4Teléfonos
5Teclados

La consulta sería:


 
SELECT P.IdProducto, P.Producto, P.Precio, C.IdCategoria, C.Categoria
    FROM Productos P
        FULL OUTER JOIN Categorias C
        ON P.IdCategoria = C.IdCategoria
 

Obteniendo como resultado:



IdProductoProductoPrecioIdCategoriaCategoria
10iPad499 USDNULLNULL
12iPhone299 USD4Teléfonos
NULLNULLNULL5Teclados

Por último tenemos el CROSS JOIN que nos da como resultado un producto cartesiano, osea, si tenemos dos tablas A y B, al hacer un CROSS JOIN, estamos haciendo A*B. La forma explicita de hacer esta consulta es:


 
SELECT *
FROM   employee CROSS JOIN department;
 

Y de forma implícita puede ser con:


 
SELECT *
FROM   employee, department;
 
A que cansado es esto de escribir, pero me ayuda para hacer de esto un hábito. Todo sea por mejorar. =P

Trackback URI: http://es.iver.com.mx/index.php/trackback/165

Dejar un comentario

Escribe el código Captcha que estás viendo

Fuentes XML de comentario: RSS | Atom

Estadísticas de visitantes

5
65
27403