рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ INNER JOIN LEFT JOIN рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИред
рд╕рдмрд╕реЗ рдЖрдо рдЙрддреНрддрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ: "рднреАрддрд░ рдХрд╛ рдЬреБрдбрд╝рд╛рд╡ рд╕реЗрдЯ рдХреЗ рдПрдХ рдЕрдВрддрд░рдЪреНрдЫреЗрджрди рдХреА рддрд░рд╣ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдХреЗрд╡рд▓ рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЬреЛ рдмрдЪрд╛ рд╣реИ, рдФрд░ рдмрд╛рдИрдВ рдЬреБрдбрд╝рд╛рд╡ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдмрд╛рдИрдВ рддрд╛рд▓рд┐рдХрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИ, рдФрд░ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рджрд╛рдИрдВ рдУрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрд╢рдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ "ред рдРрд╕рд╛ рднреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдВрддрд░рд╛рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред
рдореИрдВ рдЗрди рдЙрддреНрддрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдФрд░ рд╕рд░реНрдХрд▓ рдХреЗ рдЪреМрд░рд╛рд╣реЛрдВ рд╕реЗ рдЗрддрдирд╛ рдердХ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдирд╛ рднреА рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдерд╛ред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддреНрддрд░ рдЖрдо рддреМрд░ рдкрд░ рдЧрд▓рдд рд╣реИред рдареАрдХ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпреЛрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬреБрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдПрд╕ рдХреА рдХреБрдЫ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдореЗрдЬ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реЗрдЯ рдореЗрдВ рд╕рднреА рддрддреНрд╡ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рд╢рдмреНрдж "рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди" рдХреЗрд╡рд▓ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
( рдЕрдкрдбреЗрдЯ ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗрдЯ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд░реНрдо рдмрд╣рд╕ рд╣реИред рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реА рдирдИ рдЪреАрдЬреЗрдВ рд╕реАрдЦреАрдВ, рдзрдиреНрдпрд╡рд╛рдж)
INNER JOIN рдХрд░реЗрдВ
рдЪрд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рддреБрд░рдВрдд рджреЗрддреЗ рд╣реИрдВред
рддреЛ, рд╣рдо рдПрдХ рдЖрдИрдбреА рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рджреЛ рд╕рдорд╛рди рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВрдЧреЗ, рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓ рдореЗрдВ 1 рдФрд░ рдХреБрдЫ рдФрд░ рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреАред
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/