Pemahaman tentang gabungan rusak. Ini jelas bukan persimpangan lingkaran, jujur

Kebetulan saya melakukan beberapa wawancara untuk posisi programmer web. Salah satu pertanyaan wajib yang saya tanyakan adalah bagaimana INNER JOIN berbeda dari LEFT JOIN.


Paling sering, jawabannya adalah seperti ini: "gabungan dalam seperti persimpangan set, yaitu, hanya apa yang tersisa di kedua tabel tetap, dan gabungan kiri adalah ketika tabel kiri tetap tidak berubah, dan persimpangan set ditambahkan dari yang kanan. Untuk semua baris lainnya ditambahkan dengan null ". Itu juga terjadi bahwa mereka menggambar lingkaran berpotongan.


Saya sangat bosan dengan jawaban ini dengan persimpangan set dan lingkaran sehingga saya bahkan berhenti mengoreksi orang.


Faktanya adalah bahwa jawaban ini umumnya salah. Ya, atau setidaknya tidak akurat.


Mari kita lihat alasannya, dan pada saat yang sama menyentuh beberapa seluk-beluk bergabung.


Pertama-tama, sebuah meja tidak banyak sama sekali. Menurut definisi matematika, dalam himpunan semua elemen unik, mereka tidak diulang, dan dalam tabel dalam kasus umum ini sebenarnya tidak begitu. Masalah kedua adalah bahwa istilah "persimpangan" hanya membingungkan.


( Pembaruan . Dalam komentar ada perdebatan sengit tentang teori set dan keunikan. Sangat menarik, saya belajar banyak hal baru, terima kasih)


INNER BERGABUNG


Mari kita beri contoh segera.


Jadi, mari kita buat dua tabel identik dengan satu kolom id, di masing-masing tabel ini akan ada dua baris dengan nilai 1 dan yang lainnya.


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/id448072/


All Articles