MySQL: Rincian jenis-jenis penggabungan

157

Saya ingin uraian singkat tentang tipe-tipe gabungan MySQL. Saya tahu ini, sisanya saya tidak yakin apa artinya.

  • dipisahkan koma (apa tepatnya yang singkat ini untuk?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • tampilkan informasi dari a, meskipun tidak ada kecocokan di b: SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

Saya telah melihat bergabung lainnya, tetapi ingin tahu apa yang membuat mereka berbeda, apa INNER/ OUTERtidak menambahkan LEFTperubahan

Saya sudah tahu bagaimana cara kerja joins, saya hanya ingin tahu apakah ada tipe joins yang lain, atau apakah mereka hanya cara yang berbeda untuk mendapatkan hasil yang sama.

Bryan Field
sumber
Apakah ini menjawab pertanyaan Anda? Apa perbedaan antara "INNER JOIN" dan "OUTER JOIN"?
philipxy

Jawaban:

463

Ditemukan di G +
(c) Ditemukan di G + "Visualisasi Data"

atau lihat tautan berikut untuk ikhtisar yang bagus:

http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Rufinus
sumber
3
+1 tetapi keduanya hilang cross join, yang merupakan produk kartesius.
Denis de Bernardy
11
@denis: perhatikan tautan codinghorror.com:There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Rufinus
1
Saya kagum, Mencetak diagram ini dan meletakkannya di dinding kantor saya. kamu mengubah hidupku!
Yossico
41
Pertanyaannya adalah tentang MySQL secara khusus. MySQL tidak mendukung join FULL OUTER.
Mike Baranczak
4
dan tentu saja ini harus menjadi alasan untuk tidak memposting grafik ini. desahan
Rufinus
27

Berdasarkan komentar Anda, definisi sederhana dari masing-masing paling baik ditemukan di W3Schools . Baris pertama dari setiap jenis memberikan penjelasan singkat tentang tipe bergabung

  • BERGABUNG: Mengembalikan baris saat setidaknya ada satu kecocokan di kedua tabel
  • LEFT JOIN: Kembalikan semua baris dari tabel kiri, bahkan jika tidak ada kecocokan di tabel kanan
  • BERGABUNG KANAN: Kembalikan semua baris dari tabel kanan, bahkan jika tidak ada kecocokan di tabel kiri
  • GABUNG LENGKAP: Kembalikan baris ketika ada kecocokan di salah satu tabel

AKHIR EDIT

Singkatnya, contoh dipisahkan koma yang Anda berikan

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

memilih setiap record dari tabel a dan b dengan koma yang memisahkan tabel, ini dapat digunakan juga dalam kolom seperti

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

Kemudian mendapatkan informasi yang diinstruksikan di baris di mana kolom b.id dan kolom a.beeId memiliki kecocokan dalam contoh Anda. Jadi pada contoh Anda, ia akan mendapatkan semua informasi dari tabel a dan b di mana b.id sama dengan a.beeId. Dalam contoh saya ini akan mendapatkan semua informasi dari tabel b dan hanya informasi dari kolom a.beeName ketika b.id sama dengan a.beeId. Perhatikan bahwa ada klausa AND juga, ini akan membantu mempersempit hasil Anda.

Untuk beberapa tutorial dan penjelasan sederhana tentang mySQL bergabung dan bergabung kiri lihat tutorial mySQL Tizag. Anda juga dapat memeriksa situs web Keith J. Brown untuk informasi lebih lanjut tentang gabungan yang cukup bagus.

Saya harap ini membantu Anda

Ryan
sumber
Kebetulan saya sudah tahu semua itu. Saya sebenarnya mencari tipe-tipe join yang ada. Maaf saya tidak jelas tentang apa yang saya ketahui. Tetapi saya tidak mencari dokumentasi panjang hanya untuk mendapatkan ringkasan cepat.
Lapangan Bryan
Referensi lain dalam jawabannya ... mungkin lebih dari apa yang Anda inginkan jodoh.
Ryan
+1 untuk hasil edit itu. Saya tidak bias terhadap W3Schools seperti beberapa orang tampaknya. Mungkin saya belum sering melihat sisi buruknya atau mungkin itu hanya "perang suci". Juga, saya mengedit dalam konten dari W3Schools, saya harap Anda tidak keberatan, tetapi merasa bebas untuk mengedit apa pun yang Anda suka. Semua visual dalam jawaban yang diterima bagus, tetapi beberapa sebenarnya adalah variasi dari gabungan yang sama. Ini adalah alternatif yang bagus.
Lapangan Bryan
Terima kasih George, saya tidak keberatan sama sekali, asal suntingannya benar! Saya berkeyakinan bahwa orang perlu menemukan sumber yang tepat untuk mereka, kurang lebih informasi, banyak contoh atau tidak sama sekali. W3Schools memiliki akurat dan ringkas, mereka cenderung memiliki contoh yang bagus juga, Tizag serupa. Santai sobat
Ryan
1
tidak ada FULL JOIN di mysql, jadi tautan ini tidak terlalu berguna.
Eter
13

Saya punya 2 tabel seperti ini:

> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

INNER BERGABUNG peduli tentang kedua tabel

INNER BERGABUNG peduli tentang kedua tabel, sehingga Anda hanya mendapatkan baris jika kedua tabel memiliki satu. Jika ada lebih dari satu pasangan yang cocok, Anda mendapatkan beberapa baris.

> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

Tidak ada bedanya dengan INNER BERGABUNG jika Anda membalikkan pesanan, karena itu peduli dengan kedua tabel:

> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

Anda mendapatkan baris yang sama, tetapi kolom berada dalam urutan yang berbeda karena kami menyebutkan tabel dalam urutan yang berbeda.

KIRI BERGABUNG hanya peduli tentang tabel pertama

LEFT JOIN peduli tentang tabel pertama yang Anda berikan, dan tidak terlalu peduli tentang tabel kedua, jadi Anda selalu mendapatkan baris dari tabel pertama, bahkan jika tidak ada baris yang sesuai di tabel kedua:

> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

Di atas Anda dapat melihat semua baris table_a meskipun beberapa dari mereka tidak cocok dengan apa pun di tabel b, tetapi tidak semua baris table_b - hanya baris yang cocok dengan sesuatu di table_a.

Jika kami membalik urutan tabel, LEFT JOIN berperilaku berbeda:

> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

Sekarang kita mendapatkan semua baris table_b, tetapi hanya mencocokkan baris table_a.

BERGABUNG DENGAN BENAR hanya peduli tentang tabel kedua

a RIGHT JOIN bmemberi Anda baris yang persis sama dengan b LEFT JOIN a. Satu-satunya perbedaan adalah urutan default kolom.

> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

Ini adalah baris yang sama dengan table_b LEFT JOIN table_ayang kita lihat di bagian LEFT JOIN.

Demikian pula:

> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

Apakah baris yang sama dengan table_a LEFT JOIN table_b.

Tidak bergabung sama sekali memberi Anda salinan segalanya

Klausa Tidak Gabung: Jika Anda menulis tabel tanpa klausa GABUNG sama sekali, hanya dipisahkan oleh koma, Anda mendapatkan setiap baris tabel pertama yang ditulis di sebelah setiap baris tabel kedua, dalam setiap kombinasi yang mungkin:

> SELECT * FROM table_b, table_a;        
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(Ini dari posting blog saya Contoh-contoh tipe join SQL )

Andy Balaam
sumber
@Anu Tolong jangan melakukan pengubahan sepele seperti itu ketika reputasi rendah Anda berarti pengeditan Anda harus ditinjau oleh orang lain, Anda hanya membuang-buang waktu. Hasil edit itu seharusnya ditolak karena tidak ada perbedaan. Kode yang Anda ubah sebenarnya tidak salah & Anda bisa berkomentar.
philipxy
@ philipxy Oke. Tercatat dengan itu. Sementara saya mencoba memahami penjelasannya, saya melihat kesalahan ketik dan itulah sebabnya diedit untuk membuatnya lebih jelas. Memang ini adalah jawaban yang bagus dan niat saya adalah untuk membuatnya lebih benar.
Anu
@ Ain Jawaban ini memiliki uraian tidak lengkap yang terpecah-pecah sama seperti pada sebagian besar jawaban. Itu tidak benar-benar mengatakan apa output sebagai fungsi input. Lihat juga hampir setiap jawaban di duplikat yang diusulkan & komentar saya di kedua halaman. Lihat juga jawaban saya di sana. PS Saya kebetulan baru saja melihat ini dari kemarin edit ukuran edit (Tentu saja ada banyak posting terkait lainnya di Meta Stack Overflow & Meta Stack Exchange .)
philipxy
11

Gabung Luar Penuh tidak ada di mysql, Anda mungkin perlu menggunakan kombinasi gabung kiri dan kanan.

IBEANS
sumber