Rumah > Soal Jawab > teks badan
P粉0227236062023-08-24 11:52:41
Jawapan yang diberikan oleh
Pablo Santa Cruz adalah betul; namun, jika sesiapa terjumpa halaman ini dan memerlukan penjelasan lanjut, berikut ialah pecahan terperinci.
Andaikan kita mempunyai jadual berikut:
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
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.
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
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
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
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
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
.
P粉1487820962023-08-24 10:04:47
Anda tidak mempunyai sambungan penuh dalam MySQL, tetapi anda pasti boleh mensimulasikannya.
Untuk kod contoh ditranskripsi daripada soalan Stack Overflow ini
anda ada:Terdapat dua jadual t1 dan t2:
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