Perbedaan antara bergabung kiri dan bergabung kanan di SQL Server


225

Saya tahu tentang bergabung dalam SQL Server.

Sebagai contoh. Ada dua tabel Table1, Table2.

Struktur tabel mereka adalah sebagai berikut.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tabel 1 data sebagai berikut:

    Id     Name     
    -------------
    1      A        
    2      B    

Tabel2 data sebagai berikut:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Jika saya menjalankan kedua pernyataan SQL yang disebutkan di bawah, kedua output akan sama

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Tolong jelaskan perbedaan antara bergabung kiri dan kanan dalam pernyataan SQL di atas.

Jawaban:


73
Select * from Table1 left join Table2 ...

dan

Select * from Table2 right join Table1 ...

memang sepenuhnya dapat dipertukarkan. Namun coba Table2 left join Table1(atau pasangan identiknya, Table1 right join Table2) untuk melihat perbedaan. Kueri ini akan memberi Anda lebih banyak baris, karena Table2 berisi baris dengan id yang tidak ada dalam Table1.


17
Jadi mengapa kita perlu RIGHT JOINjika kita dapat mencapai hasil yang diinginkan hanya dengan adil LEFT JOIN? : P
user1857492

1
@SilapAliyev Sebenarnya itu pertanyaan yang sangat bagus. Adakah yang bisa menjawab? : D
Ian Chu Te

21
Select * from Table1 left join Table 2akan mengembalikan SEMUA rekaman tabel 1 ditambah catatan kebetulan Tabel 2. Yang sebaliknya Select * from Table1 right join Table 2akan mengembalikan SEMUA catatan dari Tabel 2 dan catatan yang bersamaan dari Tabel 1. Berharap itu membantu.
Programador Adagal

3
jika Anda menggunakan lebih dari 2 tabel, menggunakan join kanan dapat bermakna dan dapat dibaca
ʞɔıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen Anda mengubah kalimat sederhana 7 kata. Ketika Anda memiliki kalimat 356 baris dengan banyak subsensi dan perlu mengubah logika Kiri Kanan, Anda tidak akan heran mengubahnya hanya dengan kata pengantar ...
Programador Adagal

1014

Codeproject memiliki gambar ini yang menjelaskan dasar-dasar sederhana gabungan SQL, diambil dari: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL bergabung menjelaskan


64
Tidak ada banyak 'detail' di sana. Kredit harus benar-benar pergi ke halaman proyek bukan ke saya. Tapi tentu saja saya tidak keberatan dengan perhatian :-)
Daan Timmer

6
@Daan Timmer tidak, pasti ada kredit untuk Anda juga! Anda mengemas ulang dan menjual kembali untuk memenuhi permintaan spesifik dan khusus. Pengecer melakukan hal yang sama dan mendapatkan $$ miliar
BKSpurgeon

Saya merasa kami mungkin memerlukan kondisi "DAN" di mana klausa angka terakhir "Luar Tidak Termasuk GABUNG". Saya merasa permintaan perlu diperbarui ke SELECT <select_list> DARI Table_A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL AND B.Key IS NULL
vinsinraw

@vinsinraw itu tidak diperlukan. Karena yang sudah dibahas oleh kondisi: JOIN Table_B b ON A.Key = B.Key. Kondisi ATAU berfungsi dengan baik.
Daan Timmer

Ini adalah penyalahgunaan yang umum dari diagram Venn. Lingkaran A & B tidak mewakili tabel A & B, lingkaran A adalah A LEFT JOIN B & cirlce B adalah A GABUNGAN YANG BENAR B. Juga tidak peduli apa kondisi ON & kunci tidak relevan & DI MANA tidak berfungsi setiap kasus. Lihat komentar saya & jawaban di halaman ini & bagian ini diagram Re Venn .
philipxy

37

Tabel tempat Anda mengambil data adalah 'KIRI'.
Tabel yang Anda ikuti adalah 'KANAN'.
LEFT JOIN: Ambil semua item dari tabel kiri DAN (hanya) item yang cocok dari tabel kanan.
BERGABUNG DENGAN BENAR: Ambil semua item dari tabel kanan DAN (hanya) item yang cocok dari tabel kiri.
Begitu:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

memberi:

Id     Name       
-------------  
1      A          
2      B      

tapi:

Select * from Table1 right join Table2 on Table1.id = Table2.id

memberi:

Id     Name       
-------------  
1      A          
2      B   
3      C  

Anda benar bergabung dengan tabel dengan lebih sedikit baris di atas meja dengan lebih banyak baris
DAN
sekali lagi, kiri bergabung dengan tabel dengan lebih sedikit baris di atas meja dengan lebih banyak baris
Coba:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(INNER) BERGABUNG: Mengembalikan catatan yang memiliki nilai yang cocok di kedua tabel.

LEFT (OUTER) BERGABUNG: Kembalikan semua catatan dari tabel kiri, dan catatan yang cocok dari tabel kanan.

KANAN (OUTER) BERGABUNG: Kembalikan semua catatan dari tabel kanan, dan catatan yang cocok dari tabel kiri.

FULL (OUTER) GABUNG: Kembalikan semua catatan saat ada kecocokan di tabel kiri atau kanan

Misalnya, mari kita anggap kita memiliki dua tabel dengan catatan berikut:

Tabel A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tabel B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Bergabunglah dengan Batin

Catatan: Ini memberi persimpangan dua tabel.

Bergabunglah dengan Batin

Sintaksis

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Terapkan dalam tabel sampel Anda:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Hasilnya adalah:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Kiri Gabung

Catatan: akan memberikan semua baris yang dipilih di TableA, ditambah baris yang dipilih umum di TableB.

Kiri gabung

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Terapkan dalam tabel sampel Anda

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Hasilnya adalah:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Bergabunglah dengan Benar

Catatan: akan memberikan semua baris yang dipilih di TableB, ditambah baris yang dipilih umum di TableA.

Bergabunglah dengan Benar

Sintaksis:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Terapkan di tabel samole Anda:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Hasil akan ditemukan:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Bergabung Penuh

Catatan: Ini sama dengan operasi gabungan, ini akan mengembalikan semua nilai yang dipilih dari kedua tabel.

Bergabung penuh

Sintaksis:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Terapkan di samp [le table Anda:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Hasilnya adalah:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Beberapa fakta

Untuk INNER bergabung pesanan tidak masalah

Untuk OUTER (KIRI, KANAN atau LENGKAP) bergabung, urutannya penting

Temukan Lebih Banyak di w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Tabel di fromdalam contoh ini tableA, berada di sisi kiri relasi.

tableA <- tableB
[left]------[right]

Jadi, jika Anda ingin mengambil semua baris dari tabel kiri ( tableA), bahkan jika tidak ada kecocokan di tabel kanan ( tableB), Anda akan menggunakan "join kiri".

Dan jika Anda ingin mengambil semua baris dari tabel kanan ( tableB), bahkan jika tidak ada kecocokan di tabel kiri ( tableA), Anda akan menggunakan right join.

Dengan demikian, permintaan berikut ini setara dengan yang digunakan di atas.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Anda sepertinya bertanya, "Jika saya bisa menulis ulang RIGHT OUTER JOINmenggunakan LEFT OUTER JOINsintaks maka mengapa memiliki RIGHT OUTER JOINsintaks sama sekali?" Saya pikir jawaban untuk pertanyaan ini adalah, karena perancang bahasa tidak ingin membatasi pengguna (dan saya pikir mereka akan dikritik jika melakukannya), yang akan memaksa pengguna untuk mengubah urutan tabel dalam FROMklausa dalam beberapa keadaan ketika hanya mengubah tipe join.


kadang-kadang gabungan luar kiri dan kanan benar-benar dapat dipertukarkan, benar?
ア レ ッ ク ス

4
@Alex: gabungan luar memang kiri dan kanan selalu dapat dipertukarkan.
onedaywhen

8

Dua pernyataan Anda setara.

Kebanyakan orang hanya menggunakan LEFT JOINkarena tampaknya lebih intuitif, dan itu sintaksis universal - Saya tidak berpikir semua dukungan RDBMS RIGHT JOIN.


"Saya rasa semua RDBMS tidak mendukung RIGHT JOIN" - tentu saja, tidak semua RDBMS mendukung SQL. Tetapi jika Anda menyiratkan bahwa beberapa produk SQL mendukung LEFTtetapi tidak, RIGHTsilakan sebutkan yang mana.
onedaywhen

10
@onedaywhen Misalnya, SQLite 3 tidak menerapkan RIGHTdan FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

Saya merasa kami mungkin memerlukan ANDkondisi dalam whereklausa angka terakhir Outer Excluding JOINsehingga kami mendapatkan hasil yang diinginkan A Union B Minus A Interaction B. Saya merasa permintaan perlu diperbarui

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Jika kita menggunakan OR, maka kita akan mendapatkan semua hasilA Union B


0

pilih * dari Table1 kiri bergabung dengan Table2 di Table1.id = Table2.id

Dalam kueri pertama Gabung kiri membandingkan tabel sisi kiri table1 dengan tabel sisi kanan2 .

Di mana semua properti dari table1 akan ditampilkan, sedangkan di table2 hanya properti yang akan ditampilkan di mana kondisi menjadi kenyataan.

pilih * dari Table2 gabung kanan Table1 di Table1.id = Table2.id

Dalam kueri pertama Gabung kanan membandingkan tabel sisi kanan table1 ke tabel sisi kiri2 .

Di mana semua properti dari table1 akan ditampilkan, sedangkan di table2 hanya properti yang akan ditampilkan di mana kondisi menjadi kenyataan.

Kedua kueri akan memberikan hasil yang sama karena urutan deklarasi tabel dalam kueri berbeda seperti Anda mendeklarasikan table1 dan table2 di kiri dan kanan masing-masing di kueri gabung kiri pertama , dan juga menyatakan table1 dan table2 di kanan dan kiri masing-masing di gabung kanan kedua pertanyaan.

Ini adalah alasan mengapa Anda mendapatkan hasil yang sama di kedua kueri. Jadi jika Anda ingin hasil yang berbeda maka jalankan masing-masing dua pertanyaan ini,

pilih * dari Table1 kiri bergabung dengan Table2 di Table1.id = Table2.id

pilih * dari Table1 bergabung dengan Table2 di Table1.id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Menurut definisi: Gabung Kiri memilih semua kolom yang disebutkan dengan kata kunci "pilih" dari Tabel 1 dan kolom dari Tabel 2 yang cocok dengan kriteria setelah kata kunci "on".

Demikian pula, menurut definisi: Gabung Kanan memilih semua kolom yang disebutkan dengan kata kunci "pilih" dari Tabel 2 dan kolom dari Tabel 1 yang cocok dengan kriteria setelah kata kunci "on".

Mengacu pada pertanyaan Anda, id di kedua tabel dibandingkan dengan semua kolom yang perlu dilemparkan ke output. Jadi, id 1 dan 2 adalah umum di kedua tabel dan sebagai hasilnya, Anda akan memiliki empat kolom dengan kolom id dan nama dari tabel pertama dan kedua secara berurutan.

*select * from Table1 left join Table2 on Table1.id = Table2.id

Ekspresi di atas, ini mengambil semua catatan (baris) dari tabel 1 dan kolom, dengan id yang cocok dari tabel 1 dan tabel 2, dari tabel 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Demikian pula dari ungkapan di atas, dibutuhkan semua catatan (baris) dari tabel 1 dan kolom, dengan id yang cocok dari tabel 1 dan tabel 2, dari tabel 2. (ingat, ini adalah hak bergabung jadi semua kolom dari table2 dan tidak dari table1 akan dipertimbangkan).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.