Ver Mensaje Individual
  #4 (permalink)  
Antiguo 08/03/2010, 05:40
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Mejorar rendimiento SQL

Como te dice Valery-net, eso depende estrictamente de lo que necesites hacer.
LEFT JOIN y RIGHT JOIN hacen una junta apoyándose sobre la tabla izquierda y derecha, respectivamente. No son más o menos eficientes: depende de lo que desees lograr.
En general esos dos casos se usan principalmente cuando se sabe que puede haber falta de coincidencias entre ambas tablas y se desea operar incluso sobre los datos que no existe,
Un caso ejemplo podría ser averiguar cuántos pedidos se ha realizado a cada proveedor, tomando toda la lista de proveedores.
Código MySQL:
Ver original
  1. SELECT idProveedor, COUNT() pedidos
  2. FROM proveedor LEFT JOIN pedido USING(idProveedor)
  3. GROUP BY idProveedor;
Esto te devolvería todos los proveedores, poniendo cero (0) en la cantidad de pedidos en aquellos a los que no se les han realizado pedidos.

Código MySQL:
Ver original
  1. SELECT idProveedor, COUNT(*) pedidos
  2. FROM proveedor RIGHT JOIN pedido USING(idProveedor)
  3. GROUP BY idProveedor;
Esto solamente te mostraría sólo a aquellos aquellos a los que se les hizo pedidos.

Para los efectos de las consultas, en ciertas circunstancias, se puede requerir obtener los que no tienen registros relacionados:

Código MySQL:
Ver original
  1. SELECT v.idProveedor, v.nomProveedor
  2. FROM proveedor V LEF JOIN pedido p USING(idProveedor)
  3. WHERE P.idProveedor IS NULL;
Este modo solamente se puede usar con LEFT o RIGHT JOIN.

INNER JOIN hace que sólo devuelva las que tienen relación, sin importar si están a derecha o izquierda. Es mucho más eficiente porque el descarte no requiere lecturas independientes al parser para resolver la consulta.

Como te decíamos, depende de qué es lo que deseas hacer.
En el caso de tus ejemplos, el uso de INNER JOIN es lo que más corresponde, porque no estás realizando una tarea en que una tabla prevalezca sobre la otra.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)