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/