Ver Mensaje Individual
  #4 (permalink)  
Antiguo 20/10/2011, 10:42
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.