Cuando una base de datos devuelve registros uniendo dos o más tablas, siempre genera una tabla temporal intermedia y luego la devuelve al usuario.
Al usarleft join,onywherela diferencia entre las condiciones es la siguiente:
1, onLa condición on es la condición que se usa al generar la tabla temporal, no importa sionla condición en él es verdadera o no, devolverá los registros de la tabla izquierda.
2. La condición where es la condición que se usa para filtrar la tabla temporal una vez generada. En este momento ya no hayleft joinel significado de (devolver los registros de la tabla izquierda); los que no cumplan la condición se filtran por completo.
Supongamos que hay dos tablas:
Tabla 1: tab1
id size 1 10 2 20 3 30
Tabla 2: tab2
size name 10 AAA 20 BBB 20 CCC
Dos consultas SQL:
1、select * from tab1 left join tab2 on tab1.size = tab2.size where tab2.name='AAA' 2、select * from tab1 left join tab2 on tab1.size = tab2.size and tab2.name='AAA'
El proceso de la primera consulta SQL:
1. Tabla intermedia
condición on:
tab1.size = tab2.size tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA 2 20 20 BBB 2 20 20 CCC 3 30 (null) (null)
2. Luego filtrar la tabla intermedia
condición where:
tab2.name='AAA'
tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA
El proceso de la segunda consulta SQL:
1. Tabla intermedia
condición on:
tab1.size = tab2.size and tab2.name='AAA' (条件不为真也会返回左表中的记录) tab1.id tab1.size tab2.size tab2.name 1 10 10 AAA 2 20 (null) (null) 3 30 (null) (null)
En realidad, la razón clave de los resultados anteriores esleft join,right join,full joinsu particularidad.
No importa si la condición en on es verdadera o no, devolverá los registros de la tabla left o right; full tiene la unión de las características de left y right.
Mientras que inner join no tiene esta particularidad, poner la condición en on o en where devuelve el mismo conjunto de resultados.