Dio la casualidad de que realizo bastantes entrevistas para el puesto de programador web. Una de las preguntas requeridas que hago es en qué se diferencia INNER JOIN de LEFT JOIN.
La respuesta más común es algo como esto: "la unión interna es como una intersección de conjuntos, es decir, solo queda lo que queda en ambas tablas, y la unión izquierda es cuando la tabla izquierda permanece sin cambios, y la intersección de conjuntos se agrega desde la derecha. todas las demás líneas se agregan con nulo ". También sucede que dibujan círculos que se cruzan.
Estaba tan cansado de estas respuestas con intersecciones de conjuntos y círculos que incluso dejé de corregir a las personas.
El hecho es que esta respuesta es generalmente incorrecta. Bueno, o al menos no es exacto.
Veamos por qué y, al mismo tiempo, toquemos un par de sutilezas más de combinaciones.
En primer lugar, una mesa no es mucho. Por definición matemática, en el conjunto, todos los elementos son únicos, no se repiten, y en las tablas en el caso general, en realidad no es así. El segundo problema es que el término "intersección" solo confunde.
( Actualización . En los comentarios hay un acalorado debate sobre la teoría de conjuntos y la unicidad. Muy interesante, aprendí muchas cosas nuevas, gracias)
ÚNETE INTERIOR
Demos un ejemplo de inmediato.
Entonces, creemos dos tablas idénticas con una columna de identificación, en cada una de estas tablas habrá dos filas con un valor de 1 y algo más.
INSERT INTO table1
(id)
VALUES
(1),
(1)
(3);
INSERT INTO table2
(id)
VALUES
(1),
(1),
(2);
, , ,
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id;
" ", " ", .

:
| id | id |
| --- | --- |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |

??
, CROSS JOIN. - .
CROSS JOIN — . , , 3 , — 2:
select * from t1;
id
----
1
2
3
select * from t2;
id
----
4
5
CROSS JOIN 6 .
select *
from t1
cross join t2;
id | id
----+----
1 | 4
1 | 5
2 | 4
2 | 5
3 | 4
3 | 5
, .
t1 INNER JOIN t2 ON condition
— , ,
t1 CROSS JOIN t2 WHERE condition
.. INNER JOIN
— condition
. -, , , - .
disclaimer: inner join cross join , , , : . .
LEFT JOIN
, , null, , .
, :
insert into t1
(id)
values
(1),
(1),
(3);
insert into t2
(id)
values
(1),
(1),
(4),
(5);
LEFT JOIN:
SELECT *
FROM t1
LEFT JOIN t2
ON t1.id = t2.id;
5 , , .
| id | id |
| --- | --- |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 3 | |
, LEFT JOIN — INNER JOIN (.. , - ), , .
LEFT JOIN :
SELECT *
FROM t1
CROSS JOIN t2
WHERE t1.id = t2.id
UNION ALL
SELECT t1.id, null
FROM t1
WHERE NOT EXISTS (
SELECT
FROM t2
WHERE t2.id = t1.id
)
, , , ..
ON
, 99% , ON id id . .
, users_stats, ip .
SELECT s.id, c.city
FROM users_stats AS s
JOIN cities_ip_ranges AS c
ON c.ip_range && s.ip
&& — (. ip4r)
ON true, CROSS JOIN
"table1 JOIN table2 ON true" == "table1 CROSS JOIN table2"
, join- . " ". , join- . .. - - php.
, , .
, , . , . , , , .
O(n!), n — . , , , . CTE; , , , , , .
, . , , 'LEFT JOIN… WHERE… IS NULL', EXISTS. , .
, . , , "".
, , , . — , , . " ". .
Update. : https://habr.com/ru/post/450528/