рдЬреБрдбрд╝рдиреЗ рдХреА рд╕рдордЭ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд▓рдХреЛрдВ рдХрд╛ рдЪреМрд░рд╛рд╣рд╛ рдирд╣реАрдВ рд╣реИ, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ

рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореИрдВ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ 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/

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


All Articles