Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

INNER JOIN [ejemplos para aprender]

Estas en el tema de INNER JOIN [ejemplos para aprender] en el foro de Mysql en Foros del Web. Buenas...esto es supuestamente un aporte aunque se que es una bobada para muchos pero a mi me costo mucho entenderlo y la verdad hubiera querido ...
  #1 (permalink)  
Antiguo 18/10/2011, 12:26
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 2 meses
Puntos: 10
INNER JOIN [ejemplos para aprender]

Buenas...esto es supuestamente un aporte aunque se que es una bobada para muchos pero a mi me costo mucho entenderlo y la verdad hubiera querido ver algo como lo que expongo en algun tutorial.

La idea de los INNER JOINs es poder acceder a campos de una tabla Z relacionada con una tabla X, posiblemente tambien teniendo que pasar por una tercera (o hasta 4ta o...n-esima) tabla relacionada Y.

X---Y----Z

Casi siempre se relacionan por IDs ... asi que digamos que X son compradores, Y son mercaderias y Z son proveedores, como se puede pensar... debo poder conocer el proveedor de un producto que compro un comprador ante una reclamacion (por ejemplo). Por supuesto cada comprador tiene su ID (podria ser su DNI), cada producto su ID_producto y cada proveedor su ID_proveedor.

En general seria algo asi....
Código SQL:
Ver original
  1. SELECT __(campos)___ FROM ___(tabla1)___
  2. INNER JOIN _(tabla2)____
  3. ON (id_tabla1=id_tabla2)
  4. WHERE condiciones_para_cualquier_campo_de_cualquier_tabla

o para 3 tablas (como en el mini-ejemplo)

Código SQL:
Ver original
  1. SELECT __(campos)___ FROM ___(tabla1)___
  2. INNER JOIN _(tabla2)____
  3. ON (id_tabla1=id_tabla2)
  4. INNER JOIN _(tabla3)_  ON
  5. (id_tabla2=id_tabla3)
  6. WHERE condiciones_para_cualquier_campo_de_cualquier_tabla

donde las condiciones WHERE o cualquier LIMIT va al final y son opcionales.

Asi se puede hacer PERFECTAMENTE pero es mucho mas facil de seguir y evitar confundirse si usamos "alias" para los nombres de las tablas:

o... para 3 tablas

Código SQL:
Ver original
  1. SELECT t1.* FROM TTTT AS t1
  2. INNER JOIN  TTTT AS t2 ON
  3. t1.id_ = t2.id_
  4. INNER JOIN TTTT AS t3 ON
  5. t2.id_  = t3.id_


y... para 4 ...

Código SQL:
Ver original
  1. SELECT t1.* FROM TTTT AS t1
  2. INNER JOIN  TTTT AS t2 ON
  3. t1.id_ = t2.id_
  4. INNER JOIN TTTT AS t3 ON
  5. t2.id_  = t3.id_
  6. INNER JOIN TTTT AS t4 ON
  7. t3.id_  = t4.id_

Donde TTTT son los nombres de las distintas tablas. Puede verse como este tipo de estructura es totalmente predecible y se puede generar facilmente en cualquier ORM.

Saludos! y no se enojen los que saben.
__________________
The best powerful search engine for MSN messenger profiles I know is msn profile viewer. It's really good either if you have an e-mail address or not. Try it!

Última edición por gnzsoloyo; 25/03/2013 a las 18:49
  #2 (permalink)  
Antiguo 19/10/2011, 15:03
 
Fecha de Ingreso: septiembre-2011
Mensajes: 7
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: INNER JOIN [ejemplos para aprender]

yo si te lo agradezco,
  #3 (permalink)  
Antiguo 20/10/2011, 09:29
Avatar de jimylu  
Fecha de Ingreso: noviembre-2006
Ubicación: Perú
Mensajes: 274
Antigüedad: 17 años, 11 meses
Puntos: 5
Respuesta: INNER JOIN [ejemplos para aprender]

esta bien esa formula pero tambien podrian emplear otra forma mas rapida con el mismo resultado por ejm

Código SQL:
Ver original
  1. SELECT * FROM tabla1 t1, tabla2 t2 WHERE t1.id=t2.id AND "otra consulta"
__________________
Espero haberte sido de ayuda. :D
www.jminformatics.com

Última edición por gnzsoloyo; 25/03/2013 a las 18:49
  #4 (permalink)  
Antiguo 20/10/2011, 10:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 9 meses
Puntos: 447
Respuesta: INNER JOIN [ejemplos para aprender]

Hola compañer@s:

Temo no estar completamente de acuerdo con jimylu cuando dice:

Cita:
esta bien esa formula pero tambien podrian emplear otra forma mas rapida con el mismo resultado por ejm

select * from tabla1 t1, tabla2 t2 where t1.id=t2.id and "otra consulta"
Hasta donde recuerdo, las operaciones con JOIN (INNER, LEFT, O RIGTH) son más rápidas que hacer las uniones explicitas en el where. Por experiencia propia he comprobado que así es... aunque existe un fuerte debate sobre cual de las dos maneras es más rápida. Sin embargo, siempre he pensado que utilizando INNER JOINS en lugar de WHERE, las consultas quedan más "limpias" o legibles, sobre todo cuando intervienen muchas tablas o condiciones, sobre todo por el hecho de que no mezclas condiciones de unión con condiciones de filtrado y como ejemplo dos consultas:

Código MySQL:
Ver original
  1. SELECT tabla1.campo, tabla2.campo, tabla3.campo, tabla5.campo, tabla.campo
  2. FROM tabla1 T1, tabla2 T2, tabla3 T3, tabla4 T4, tabla5 T5
  3. T1.campo = T2.campo and
  4. T1.campo2 = 'algo' and
  5. T2.campo2 = 4 and
  6. T2.campo = T3.campo and
  7. T3.fecha > '2011-10-20' and
  8. T4.campo4 in (1, 4, 5) and
  9. T3.campo = T5.campo and
  10. T5.campo5 between 3 and 9;
  11.  
  12.  
  13. SELECT tabla1.campo, tabla2.campo, tabla3.campo, tabla5.campo, tabla.campo
  14. FROM tabla1 T1
  15. INNER JOIN Tabla2 T2 ON T1.campo = T2.campo
  16. INNER JOIN tabla3 T3 ON T2.campo = T3.campo
  17. INNER JOIN tabla3 T4 ON T3.campo = T4.campo
  18. INNER JOIN tabla3 T5 ON T4.campo = T5.campo
  19. tabla1.campo2 = 'algo' and
  20. tabla2.campo2 = 4 and
  21. tabla3.fecha > '2011-10-20' and
  22. tabla4.campo4 in (1, 4, 5) and
  23. tabla3.campo = tabla5.campo and
  24. tabla5.campo5 between 3 and 9;

Ambas consultas pretenden ser lo mismo, pero en la segunda se distinguen perfectamente las condiciones de unión (ON) con las condiciones de filtrado (WHERE) mientras que en la primera las condiciones están mezcladas... Además, otra ventaja sería que puedes observar perfectamente si te hace falta definir alguna relación entre tus tablas y así evitar productos cartesianos, pues en la primer consulta observen que la tabla4 no se une con ninguna tabla ¿lo notaron a primer vista?

Finalmente, a diferencia de otros DBMS, MySQL no permite hacer LEFT JOINS O RIGHT JOINS implicitos, como lo hace SQL Server y ORACLE

Código:
SQL Server
FROM tabla1, tabla2 WHERE tabla1.campo *= Tabla2.campo

ORACLE
FROM tabla1, tabla2 WHERE (+)tabla1.campo = Tabla2.campo
Por lo que si tuvieras necesidad de mezclar este tipo de JOIN's no podrías hacer utilizando WHERE

Finalmente, la decisión de usar uno u otro depende de la persona que hace la consulta.

Saludos
Leo.
  #5 (permalink)  
Antiguo 20/10/2011, 15:16
Avatar de jimylu  
Fecha de Ingreso: noviembre-2006
Ubicación: Perú
Mensajes: 274
Antigüedad: 17 años, 11 meses
Puntos: 5
Respuesta: INNER JOIN [ejemplos para aprender]

me parece bien tu explicacion leonardo y estoy de acuerdo, cuando yo puse ese ejemplo era para hacer consultas simples sin mucho tramite que digamos ya que el usuario que abrio este tema es un usuario basico, es obvio que si se requiere una consulta mas compleja se tiene que ver cual le resulta mas facil de realizar personalmente esto lo uso solo para unir 2 tablas luego para arriba eh logrado relacionar hasta 12 tablas a la vez y el resultado es mucho mejor cuando lo realizo con los join y no colocandolo en el where ya que asi me evito complicaciones y me arroja el resultado que deseo.

Esta explicacion que haces esta bien para consultas mas complejas pero si de consultas sencillas se trata siempre uso la forma mas corta, lo que un programador o administrador de base de datos busca es la rapidez y eficiencia de la consulta y depende de el y sus conocimientos cual usar.
__________________
Espero haberte sido de ayuda. :D
www.jminformatics.com

Última edición por jimylu; 20/10/2011 a las 15:17 Razón: :)

Etiquetas: campos, ejemplos, join, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:58.