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.