Das Verständnis von Joins ist gebrochen. Dies ist definitiv nicht der Schnittpunkt von Kreisen, ehrlich

So kam es, dass ich einige Interviews fĂźr die Position eines Webprogrammierers fĂźhrte. Eine der erforderlichen Fragen, die ich stelle, ist, wie sich der INNER JOIN vom LEFT JOIN unterscheidet.


Die häufigste Antwort lautet ungefähr so: "Innerer Join ist wie ein Schnittpunkt von Mengen, dh es bleibt nur das ßbrig, was in beiden Tabellen ßbrig bleibt, und der linke Join ist, wenn die linke Tabelle unverändert bleibt und der Schnittpunkt von Mengen von dem rechten hinzugefßgt wird Alle anderen Zeilen werden mit null "angehängt. Es kommt auch vor, dass sie sich kreuzende Kreise zeichnen.


Ich hatte diese Antworten mit Schnittpunkten von Mengen und Kreisen so satt, dass ich sogar aufhĂśrte, Leute zu korrigieren.


Tatsache ist, dass diese Antwort im Allgemeinen falsch ist. Gut oder zumindest nicht genau.


Schauen wir uns an, warum und berĂźhren wir gleichzeitig ein paar weitere Feinheiten von Joins.


Erstens ist ein Tisch ßberhaupt nicht viel. Nach mathematischer Definition sind in der Menge alle Elemente eindeutig, sie werden nicht wiederholt, und in den Tabellen im allgemeinen Fall ist dies tatsächlich nicht der Fall. Das zweite Problem ist, dass der Begriff "Kreuzung" nur verwirrt.


( Update . In den Kommentaren wird heftig Ăźber Mengenlehre und Einzigartigkeit diskutiert. Sehr interessant, ich habe viele neue Dinge gelernt, danke.)


INNER JOIN


Lassen Sie uns gleich ein Beispiel geben.


Wir erstellen also zwei identische Tabellen mit einer ID-Spalte. In jeder dieser Tabellen befinden sich zwei Zeilen mit dem Wert 1 und etwas anderem.


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/

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


All Articles