right - Diferencia entre “on.. and” y “on.. where” en SQL Left Join?
outer join sql (6)
seleccione a. * de A a combinación izquierda B b en a.id = b.id y a.id = 2;
Esto solo usa a.id
en la condición de unión, por lo que los registros donde a.id <> 2
no se filtran. Puede obtener un resultado como este:
+------+------+ | a.id | b.id | +------+------+ | 1 | NULL | | 2 | 2 | | 3 | NULL | +------+------+
No selecciona ninguna de las columnas de b
, pero si lo hace, será más fácil de entender.
seleccione a. * de A a izquierda unir B b en a.id = b.id donde a.id = 2;
Ahora los registros donde a.id <> 2
se filtran.
+------+------+ | a.id | b.id | +------+------+ | 2 | 2 | +------+------+
Declaración Sql.
1.select a.* from A a left join B b on a.id =b.id and a.id=2;
2.select a.* from A a left join B b on a.id =b.id where a.id=2;
¿Cuál es la diferencia de esta declaración de dos sql?
Como dice @hvd , la cláusula "where" filtra las filas devueltas por la unión, por lo que la versión "where" no devolverá las filas unidas externas (que tienen a.id = null).
Sin embargo, hay otra diferencia significativa: incluso si las filas unidas externas no se filtraron, puede haber un aumento masivo del rendimiento al poner la condición en la cláusula "on", porque el conjunto de resultados se hace más pequeño antes.
Esto es particularmente pronunciado cuando una serie de otras tablas unidas a la izquierda siguen a la que tiene la condición "y": puede evitar que las uniones se realicen en las siguientes tablas para las filas inadecuadas y potencialmente cortar millones de filas para que no lleguen al filtro ("donde ") escenario.
Como se explica claramente en el @mr_eclair
Lo que sucede en ambos casos. Déjame decirte una manera fácil de recordar esto.
select a.*,b.*
from A a left join B b
**on** a.id =b.id ***and*** a.id=2;
Aquí el "Y" trabajó en el "ENCENDIDO" y proporciona una condición para los criterios de unión.
select a.*,b.*
from A a left join B b
on a.id =b.id
**where** a.id=2;
mientras que aquí "DONDE" proporcionó una condición para todo el resultado.
Para decirlo más claramente, "DÓNDE" filtra el conjunto de resultados después de encontrar el resultado de la declaración " SELECCIONAR ". "Y" es una condición para unir las dos tablas.
Intento algo de tiempo, y sé cuál es la razón, solo se relaciona con una prioridad.
select * from A a left join B b on a.id=b.id and b.id=2
esto significa una unión izquierda (donde b.id = 2) esta es la condición del filtro B primero
Select * from A a left join B b on a.id=b.id where a.id=2
esto significa que después de unir B, luego filtre por a.id = 2
Si piensa en la sintaxis de una consulta SQL, el ''AND'' extiende el bloque de unión (como si fuera un paréntesis) donde el ''WHERE'' define el inicio del bloque WHERE / filtering de la consulta.
create table A(id int);
create table B(id int);
INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);
INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);
SELECT * FROM A;
SELECT * FROM B;
id
-----------
1
2
3
id
-----------
1
2
3
Filtre en el JOIN para evitar que las filas se agreguen durante el proceso de JOIN.
select a.*,b.*
from A a left join B b
on a.id =b.id and a.id=2;
id id
----------- -----------
1 NULL
2 2
3 NULL
DONDE se filtrará después de que haya ocurrido la ÚLTIMA.
select a.*,b.*
from A a left join B b
on a.id =b.id
where a.id=2;
id id
----------- -----------
2 2