Explicación visual de los SQL Join - Unir tablas con SQL

12 de Octubre del 2007 Escrito por Alex Barros

Me ha parecido muy interesante el artículo escrito por Jeff Atwood titulado A Visual Explanation of SQL Joins.

Tanto es así que he decidido traducir este artículo al español. Disfrutad:

Autor Original: Jeff Atwood
Fecha: 11/10/07
Traductor: Alex Barros

Pensé que el post de Ligaya Turmelle sobre SQL joins era una genial introducción para los desarrolladores primerizos. Dado que los SQL joins están basados fundamentalmente en conjuntos relacionados, el uso de diagramas de Venn para explicarlo parece lo más acertado. De todas formas, igual que los comentaristas de su post, opino que sus diagramas de Venn no encajaban con la sintaxis de SQL join en mis pruebas.

Aún así me encanta el concepto, así que veamos si podemos hacerlo funcionar. Supongamos que tenemos las dos siguientes tablas. La tabla A está a la izquierda, y la tabla B está a la derecha. Las rellenaremos con cuatro registros cada una.

tabla A y B muestra

Ahora unamos estas dos tablas por el campo nombre de algunas formas distintas, y veamos si podemos obtener unas representaciones conceptuales con los ingeniosos diagramas de Venn.

Inner join sólo produce los registros que coinciden en las dos tablas A y B.

  1. SELECT * FROM TablaA
  2. INNER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Inner Join Join Inner

Full outer join produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendrá null.

  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Full Outer Join Join Cartesian

Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null.

  1. SELECT * FROM TablaA
  2. LEFT OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Left Outer Join Join Left

Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo Left Outer Join, y luego excluimos los registros que no queremos del lado derecho mediante una cláusula Where.

  1. SELECT * FROM TablaA
  2. LEFT OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre
  4. WHERE TablaB.id IS NULL

Resultado de Left Outer Join con exclusión Join Left Outer

Para producir el conjunto de registros únicos de la tabla A y la tabla B, usamos el mismo Full Outer Join, y luego excluimos los registros que no queremos de los dos lados mediante una cláusula Where.

  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre
  4. WHERE TablaA.id IS NULL
  5. OR TablaB.id IS NULL

Resultado de Full Outer Join con exclusión Join Outer

También hay un cross join, el cuál no puede ser expresado con un diagrama de Venn:

  1. SELECT * FROM TablaA
  2. CROSS JOIN TablaB

Esto une “todo con todo”, dando como resultado 4 x 4 = 16 filas, muchas más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes.

Categorias: MySQL, Web | 35 comentarios »

INNER JOIN para unir Tablas

15 de Marzo del 2006 Escrito por Alex Barros

Muy bien, aprendices del Sql, hoy hablaremos de la instrucción INNER JOIN. Muy útil para casos concretos.

Primero de todo vamos a crear una situación hipotética:

Imaginemos que tenemos que hacer una web que contiene unos artículos en referencia a comentarios de novelas, y que son doce escritores de prestigio los que van introduciendo esas críticas.

Lo normal y más básico para un programador sería pensar en base de datos y lenguaje dinámico. Una buena elección podría ser trabajar con PHP y MySql (aunque para lo que voy a decir basta con una base de datos de tipo Sql).

Lo primero que nos viene a la mente es: haré una tabla, llamémosla criticas. En ella almacenaríamos cada artículo. Los campos básicos serían ID, Libro, Escritor (del libro, nunca confundir con el autor de la crítica), Editorial, año … y Autor de la crítica.

Pero y si quisiéramos, como es normal, poner en la misma crítica una referencia al autor de la critica, aúnque sólo sea un pequeño texto biográfico? Tendríamos que repetir un mismo texto repetidas veces en la base (la biografia de doce autores en, pongamos 150 registros) y si quisieramos modificarlo y hubiera 70 entradas con ese autor… eso sería un desastre.

http://modulos.zumbe.net/imagenes/inner_join_criticas.gif

Entonces queda claro que hay que hacer una referencia a otra tabla que contenga a los autores, con sus respectivos datos. La tabla autores. Cada autor tendría su ID, su nombre y su biografía, además de otros datos como webpage, e-mail, bibliografía…

Algunos dirían: pues fácil, haces dos querys a la base. en uno le dices

  1. SELECT * FROM criticas WHERE ID =‘37′

y en otra

  1. SELECT * FROM autores WHERE

where qué? tendrías que sacar una variable de sql a php, otra vez a sql…
Nada! Si alguien sugiere eso desconfiad de él y de su familia (es broma ;D) existe un método sencillo y eficaz: el INNER JOIN

Tan sencilla es la sentencia como:

  1. SELECT * FROM criticas INNER JOIN autores ON criticas.autor = autores.id WHERE criticas.id=‘7′

De esta forma estamos uniendo las dos tablas, cada vez que en criticas el autor sea n, en autores se unirá su correspondiente fila, con id=n.

Traduciendo al español la sentencia dice exactamente:

SELECCIONA TODOS LOS CAMPOS UNIENDO criticas CON autores DONDE el campo autor de la tabla criticas SEA IGUAL A el campo id de la tabla autores EN EL REGISTRO EN QUE el id de criticas sea 7

En definitiva, el inner join une dos tablas, donde encajan un campo de una con el mismo de la otra.

A partir de ahora las tablas se hacen más manejables y flexibles.

Y recordad!:

  • Para seleccionar campos de cada tabla : tabla.campo universal en sql, dato importante.
  • Estructura del inner join: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
  • Antes de hacer barbaridades con vuestras bases de datos documentaos un poco, lo digo por experiencia ;)

Lee también: Explicación visual de los SQL Join

Categorias: Código, HOWTO/CóMO, MySQL | 4 comentarios »

del.icio.us meneame.net RSS

Buscar:



Tagcloud

Entradas Recientes

Meta: