recomendaciones - porque se dañan las tablas en mysql
SQL JOIN ¿dónde ubicar la condición WHERE? (3)
Tengo dos ejemplos siguientes.
1. Ejemplo (DONDE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2. Ejemplo (UNIRSE A)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
¿Cuál es la forma más rápida en términos de rendimiento? ¿Qué prefieres?
Creo que la forma más rápida es poner el filtro en la cláusula where, porque procederá ese filtro primero en donde, y luego en la cláusula join, por lo que no habrá necesidad de permutación de filtros.
Si un filtro ingresa en una condición JOIN
funcionalmente (es decir, es una condición de unión real, no solo un filtro), debe aparecer en la cláusula ON
de esa unión.
Digno de notar:
Si lo coloca en la cláusula
WHERE
, las interpretaciones son las mismas si la unión esINNER
, de lo contrario, difiere. Como se mencionó en los comentarios, realmente no importa ya que de todos modos el resultado es diferente.Colocar el filtro en la cláusula
WHERE
cuando realmente es una condiciónOUTER JOIN
cancela implícitamente la naturalezaOUTER
de la condición ("unir incluso cuando no hay registros") ya que estos filtros implican que debe haber registros existentes en primer lugar. Ejemplo:
... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5
es correcto
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
es incorrecto, ya que t2.column = 5
le dice al motor que se esperan registros de t2, lo que va en contra de la combinación externa. Excepción a esto sería un filtro IS NULL
, como WHERE t2.column IS (NOT) NULL
(que de hecho es una forma conveniente de construir combinaciones externas condicionales)
-
LEFT
unionesLEFT
yRIGHT
son implícitamente unionesOUTER
.
Espero que haya ayudado.
JOIN
condiciones de JOIN
normalmente deberían ser independientes de las condiciones del filtro. Usted define las reglas de su unión (el cómo ) con ON
. Usted filtra lo que quiere con WHERE
. En cuanto a rendimiento, no hay una regla general en todos los motores y diseños, por lo que su kilometraje variará mucho.