Pablo Santa Cruz adalah betul; namun, jika sesiapa terjumpa halaman ini dan memerlukan penjelasan lanjut, berikut ialah pecahan terperinci.
Contoh jadual
Andaikan kita mempunyai jadual berikut:
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
Sambungan dalaman
Sambungan dalaman, seperti yang ditunjukkan di bawah:
SELECT *
FROM `t1`
INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
hanya akan membenarkan kami melihat rekod yang muncul dalam kedua-dua jadual, seperti yang ditunjukkan di bawah:
1 Tim 1 Tim
Sambungan dalam tidak mempunyai arah (cth. kiri atau kanan) kerana ia adalah dua hala secara eksplisit - kita memerlukan kedua-dua belah untuk dipadankan.
SERTAI LUAR
Cambahan luar, sebaliknya, digunakan untuk mencari rekod yang mungkin tidak sepadan dalam jadual lain. Oleh itu, anda mesti menyatakan bahagian mana sambungan yang dibenarkan mempunyai rekod yang hilang.
Singkatan untuk
; Saya akan menggunakan nama penuh mereka di bawah untuk mengukuhkan konsep cantuman luar dan cantuman dalam. LEFT JOIN和RIGHT JOIN是LEFT OUTER JOIN和RIGHT OUTER JOIN
Sambung luar kiri
Sambungan luar kiri, seperti yang ditunjukkan di bawah:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...akan mendapat semua rekod dari meja kiri tidak kira sama ada mereka mempunyai perlawanan di jadual kanan, seperti ini:
1 Tim 1 Tim
2 Marta NULL NULL
Sambung luar kanan
Sambungan luar kanan, seperti yang ditunjukkan di bawah:
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...akan mendapat semua rekod dari jadual kanan tidak kira sama ada mereka mempunyai perlawanan di jadual kiri, seperti ini:
1 Tim 1 Tim
NULL NULL 3 Katarina
Sambungan luar penuh
Gabungan luar yang lengkap akan memberikan kita semua rekod dari kedua-dua jadual tidak kira sama ada ia mempunyai padanan dalam jadual lain, atau NULL pada kedua-dua belah pihak jika tidak. Hasilnya kelihatan seperti ini:
1 Tim 1 Tim
2 Marta NULL NULL
NULL NULL 3 Katarina
Walau bagaimanapun, seperti yang ditunjukkan oleh Pablo Santa Cruz, MySQL tidak menyokong perkara ini. Kita boleh mensimulasikannya dengan UNION gabungan kiri dan kanan seperti ini:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
Anda boleh menganggap
sebagai "jalankan kedua-dua pertanyaan ini dan kemudian susun hasilnya"; UNION
Perhatikan bahawa
dalam MySQL menghapuskan pendua tepat: Tim akan muncul dalam kedua-dua pertanyaan di sini, tetapi keputusan untuk UNION 会消除精确的重复项:Tim 会出现在此处的两个查询中,但 UNION 的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个 WHERE hanya menyenaraikannya sekali. Rakan pakar pangkalan data saya percaya tingkah laku ini tidak boleh dipercayai. Jadi, untuk menjadikannya lebih jelas, kita boleh menambah klausa WHERE pada pertanyaan kedua:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
WHERE `t1`.`id` IS NULL;
Sebaliknya, jika atas sebab tertentu anda mahu melihat pendua, anda boleh menggunakan UNION ALL.
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
Pertanyaan di atas sesuai untuk kes khas di mana operasi sambung luar yang lengkap tidak akan menghasilkan sebarang baris pendua. Pertanyaan di atas bergantung pada operator set UNION untuk mengalih keluar baris pendua yang diperkenalkan oleh corak pertanyaan. Kita boleh mengelak daripada memperkenalkan baris pendua dengan menggunakan corak anti-join
pada pertanyaan kedua, dan kemudian menggunakan operator set UNION ALL untuk menggabungkan dua set. Dalam kes yang lebih umum di mana gabungan luar penuh akan mengembalikan baris pendua, kita boleh melakukan ini: 🎜
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
Jawapan yang diberikan oleh
Pablo Santa Cruz adalah betul; namun, jika sesiapa terjumpa halaman ini dan memerlukan penjelasan lanjut, berikut ialah pecahan terperinci.
Contoh jadual
Andaikan kita mempunyai jadual berikut:
Sambungan dalaman
Sambungan dalaman, seperti yang ditunjukkan di bawah:
hanya akan membenarkan kami melihat rekod yang muncul dalam kedua-dua jadual, seperti yang ditunjukkan di bawah:
Sambungan dalam tidak mempunyai arah (cth. kiri atau kanan) kerana ia adalah dua hala secara eksplisit - kita memerlukan kedua-dua belah untuk dipadankan.
SERTAI LUAR
Cambahan luar, sebaliknya, digunakan untuk mencari rekod yang mungkin tidak sepadan dalam jadual lain. Oleh itu, anda mesti menyatakan bahagian mana sambungan yang dibenarkan mempunyai rekod yang hilang. Singkatan untuk
; Saya akan menggunakan nama penuh mereka di bawah untuk mengukuhkan konsep cantuman luar dan cantuman dalam.
Sambung luar kiriLEFT JOIN
和RIGHT JOIN
是LEFT OUTER JOIN
和RIGHT OUTER JOIN
sebagai "jalankan kedua-dua pertanyaan ini dan kemudian susun hasilnya";
Perhatikan bahawaUNION
dalam MySQL menghapuskan pendua tepat: Tim akan muncul dalam kedua-dua pertanyaan di sini, tetapi keputusan untuk
UNION
会消除精确的重复项:Tim 会出现在此处的两个查询中,但UNION
的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个WHERE
hanya menyenaraikannya sekali. Rakan pakar pangkalan data saya percaya tingkah laku ini tidak boleh dipercayai. Jadi, untuk menjadikannya lebih jelas, kita boleh menambah klausaWHERE
pada pertanyaan kedua:Sebaliknya, jika atas sebab tertentu anda mahu melihat pendua, anda boleh menggunakan
UNION ALL
.Anda tidak mempunyai sambungan penuh dalam MySQL, tetapi anda pasti boleh mensimulasikannya.
Untuk kod contoh ditranskripsi daripada soalan Stack Overflow ini
anda ada:Pertanyaan di atas sesuai untuk kes khas di mana operasi sambung luar yang lengkap tidak akan menghasilkan sebarang baris pendua. Pertanyaan di atas bergantung pada operator set UNION untuk mengalih keluar baris pendua yang diperkenalkan oleh corak pertanyaan. Kita boleh mengelak daripada memperkenalkan baris pendua dengan menggunakan corak anti-join
pada pertanyaan kedua, dan kemudian menggunakan operator set UNION ALL untuk menggabungkan dua set. Dalam kes yang lebih umum di mana gabungan luar penuh akan mengembalikan baris pendua, kita boleh melakukan ini: 🎜