La comprensión de las uniones está rota. Definitivamente, esta no es la intersección de los círculos, sinceramente

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 JOINcondition. -, , , - .


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/

Source: https://habr.com/ru/post/448072/


All Articles