LEFT JOIN vs. LEFT OUTER JOIN di SQL Server

1595

Apa perbedaan antara LEFT JOINdan LEFT OUTER JOIN?

KG Sosa
sumber
213
Tidak ada! Kata OUTERkunci adalah opsional.
jarlh
9
Diagram Venn tidak sesuai untuk jawaban atas pertanyaan ini. Jawaban atas pertanyaan ini adalah Tidak Ada . Lihat komentar pertama.
philipxy
3
Diagram Venn menggambarkan perbedaan dalam baris keluaran untuk kasus-kasus khusus dari inner vs luar bergabung . Jika tidak ada baris nol atau duplikat yang dimasukkan (sehingga kita dapat menganggap tabel sebagai sekumpulan nilai yang bernilai baris & menggunakan persamaan matematika normal) maka lingkaran kiri & kanan menyimpan tabel output / set gabungan kiri & kanan . Tetapi jika baris nulls atau duplikat adalah input maka sangat sulit untuk menjelaskan apa saja lingkaran dari set & bagaimana set itu berhubungan dengan tabel input & output / tas yang diagram Venn tidak membantu. Lihat komentar saya di sini tentang pelanggaran diagram Venn lainnya.
philipxy

Jawaban:

2237

Sesuai dokumentasi: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Kata kunci OUTERditandai sebagai opsional (terlampir dalam tanda kurung siku). Dalam kasus khusus ini, apakah Anda menentukan OUTERatau tidak ada bedanya. Perhatikan bahwa sementara unsur-unsur lain dari bergabung klausa juga ditandai sebagai opsional, meninggalkan mereka keluar akan membuat perbedaan.

Misalnya, seluruh bagian-jenis JOINklausa adalah opsional, dalam hal ini defaultnya adalah INNERjika Anda hanya menentukan JOIN. Dengan kata lain, ini legal:

SELECT *
FROM A JOIN B ON A.X = B.Y

Berikut daftar sintaks yang setara:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Lihat juga jawaban yang saya tinggalkan pada pertanyaan SO lainnya ini: SQL left join vs multiple tables on FROM line? .

masukkan deskripsi gambar di sini

Lasse V. Karlsen
sumber
135
Tepat sekali. OUTER diperbolehkan untuk kompatibilitas ANSI-92.
Sean Reilly
11
@ LasseV.Karlsen tidak akan lebih baik untuk memiliki INNER JOINdi sebelah kanan dan JOINdi sebelah kiri dalam daftar setara?
nawfal
8
@ LasseV.Karlsen Saya hanya bermaksud bahwa sisi kiri memiliki bentuk yang ringkas dan sisi kanan memiliki bentuk yang diperluas. Saya pikir itu akan membuatnya masuk akal jika Anda mengikuti yang sama JOINjuga.
nawfal
30
@Outlier Itu hak prerogatif Anda, tetapi jelas 451 orang lain menganggap jawabannya baik. Sejujurnya, jika satu jawaban mengatakan X dan jawaban lain mengatakan X dan merujuk dokumentasi, serta menyalin bagian-bagian dokumentasi yang relevan ke dalam jawaban, suara saya masuk ke jawaban kedua dan itulah sebabnya saya menulis jawaban saya dengan cara Saya lakukan. Seseorang mengklaim X tidak baik. Jika Anda dapat membuktikan X, itu lebih baik (tidak sedikit jawaban sactiw). Tapi, itu hak prerogatif Anda untuk berpikir apa pun yang Anda inginkan. Saya mempertanyakan mengapa Anda berpikir itu tidak ada gunanya, apakah jawabannya salah?
Lasse V. Karlsen
7
@Otlier Dan sejujurnya, jika Anda tidak ingin membaca jawaban "panjang" saya, maka jawaban saya bukan untuk Anda. Ini untuk semua orang yang datang ke sini bertanya-tanya tentang hal yang sama dan ingin latar belakang mengapa itu, dan di mana menemukan informasi lebih lanjut, dll. Jelas Anda adalah tipe pria yang menginginkan jawaban ini: "Tidak ada", tapi sayangnya ini bukan jawaban hukum di sini di Stack Overflow, juga tidak seharusnya.
Lasse V. Karlsen
700

Untuk menjawab pertanyaan Anda, tidak ada perbedaan antara LEFT JOIN dan LEFT OUTER JOIN, mereka persis sama yang mengatakan ...

Di tingkat teratas ada 3 jenis gabungan:

  1. BATIN
  2. LUAR
  3. MENYEBERANG

  1. INNER JOIN - mengambil data jika ada di kedua tabel.

  2. OUTER JOIN terdiri dari 3 jenis:

    1. LEFT OUTER JOIN - mengambil data jika ada di tabel sebelah kiri.
    2. RIGHT OUTER JOIN - mengambil data jika ada di tabel kanan.
    3. FULL OUTER JOIN - mengambil data jika ada di salah satu dari dua tabel.
  3. LINTAS BERGABUNG , seperti namanya, apakah [n X m]itu menggabungkan segalanya dengan segalanya.
    Mirip dengan skenario di mana kami cukup daftar tabel untuk bergabung (dalam FROMklausa SELECTpernyataan), menggunakan koma untuk memisahkan mereka.


Poin yang perlu diperhatikan:

  • Jika Anda hanya menyebutkan JOINmaka secara default itu adalah INNER JOIN.
  • Sebuah OUTERbergabung harus LEFT| RIGHT| FULLAnda tidak bisa begitu saja mengatakannya OUTER JOIN.
  • Anda dapat menjatuhkan OUTERkata kunci dan hanya mengatakan LEFT JOINatau RIGHT JOINatau FULL JOIN.

Bagi mereka yang ingin memvisualisasikan ini dengan cara yang lebih baik, silakan kunjungi tautan ini: Penjelasan Visual dari SQL Joins

sactiw
sumber
17
Jawaban yang sangat bagus Akan lebih jelas jika Anda mengatakan "LEFT OUTER JOIN - mengambil semua data dari tabel sebelah kiri dengan data yang cocok dari kanan, jika ditetapkan." untuk 2.1 (dan perubahan serupa untuk 2.2)
ssh
1
Anda juga dapat melakukan cross join dengan hanya 'pilih * dari TableA, TableB'
om471987
3
Maaf jika saya necrobumping, tetapi apakah CROSS JOINsama FULL JOIN?
TechnicalTophat
9
@RhysO no, CROSS JOIN adalah produk Cartesian yaitu CROSS JOIN dari sebuah tabel, memiliki n rows, dengan table, memiliki m rows, akan selalu memberikan (n * m) baris sementara FULL OUTER GABUNG dari sebuah tabel, memiliki n rows, dengan sebuah tabel, memiliki baris m, akan memberikan pada baris maks (n + m)
sactiw
1
@sactiw pertimbangkan untuk menambahkan catatan khusus dalam jawaban Anda yang berharga tentang perbedaan antara Cross Joindan Full Outer Join... dalam beberapa hal tampaknya serupa.
Manuel Jordan
356

Apa perbedaan antara join kiri dan join kiri?

Tidak ada . LEFT JOINdan LEFT OUTER JOINsetara.

Mitch Wheat
sumber
13
erm halo! siapa yang memilih ini? LEFT JOIN sama dengan LEFT OUTER JOIN.
Mitch Wheat
7
Ini adalah kasus di Microsoft SQL Server, dan RDBMS yang memenuhi SQL lainnya.
Bill Karwin
7
Akan lebih baik jika Anda menambahkan referensi atau penjelasan tentang mengapa OUTERini opsional.
Zero3
7
Jawaban paling ringkas dan akurat di sini.
Manachi
4
Terima kasih. Jawaban yang diterima memiliki terlalu banyak informasi yang membuat saya semakin bingung. Inilah yang perlu saya ketahui dan menjawab pertanyaan asli langsung ke intinya.
Bacon Brad
66

Saya seorang DBA PostgreSQL, sejauh yang saya bisa mengerti perbedaan antara luar atau tidak, perbedaan luar adalah topik yang memiliki banyak diskusi di seluruh internet. Sampai hari ini saya tidak pernah melihat perbedaan antara keduanya; Jadi saya melangkah lebih jauh dan saya mencoba untuk menemukan perbedaan di antara mereka. Pada akhirnya saya membaca seluruh dokumentasi tentang hal itu dan saya menemukan jawabannya,

Jadi jika Anda melihat dokumentasi (setidaknya dalam PostgreSQL) Anda dapat menemukan frasa ini:

"Kata-kata INNERdan OUTERadalah opsional dalam segala bentuk. INNERAdalah default, LEFT, RIGHT, dan FULLmenyiratkan bergabung luar."

Dengan kata lain,

LEFT JOINdan LEFT OUTER JOINADALAH SAMA

RIGHT JOINdan RIGHT OUTER JOINADALAH SAMA

Saya harap ini bisa menjadi kontribusi bagi mereka yang masih berusaha menemukan jawabannya.

andrefsp
sumber
60

Left Joindan Left Outer Joinsatu dan sama . Yang pertama adalah singkatan untuk yang terakhir. Hal yang sama dapat dikatakan tentang Right Joindan Right Outer Joinhubungan. Demonstrasi akan menggambarkan kesetaraan. Contoh kerja dari setiap kueri telah disediakan melalui SQL Fiddle . Alat ini akan memungkinkan untuk manipulasi kueri.

Diberikan

masukkan deskripsi gambar di sini

Gabung Kiri dan Gabung Kiri Luar

masukkan deskripsi gambar di sini

Hasil

masukkan deskripsi gambar di sini


Gabung Kanan dan Gabung Luar Kanan

masukkan deskripsi gambar di sini

Hasil

masukkan deskripsi gambar di sini

WorkSmarter
sumber
43

Saya merasa lebih mudah untuk memikirkan Bergabung dalam urutan berikut:

  • CROSS JOIN - produk Cartesian dari kedua tabel. SEMUA bergabung mulai di sini
  • INNER JOIN - CROSS JOIN dengan filter ditambahkan.
  • OUTER JOIN - INNER JOIN dengan elemen yang hilang (baik dari tabel KIRI atau KANAN) ditambahkan sesudahnya.

Sampai saya menemukan model sederhana (relatif) ini, GABUNGAN selalu lebih merupakan seni hitam. Sekarang mereka masuk akal.

Semoga ini bisa membantu lebih dari yang membingungkan.

bekujim
sumber
Ini tidak menjawab pertanyaan.
philipxy
33

Mengapa LEFT / RIGHT dan LEFT OUTER / RIGHT OUTER sama? Mari kita jelaskan mengapa kosakata ini. Memahami bahwa bergabung dengan LEFT dan RIGHT adalah kasus khusus dari OUTER join, dan karenanya tidak bisa lain dari OUTER LEFT / OUTER RIGHT. Gabung OUTER juga disebut FULL OUTER sebagai kebalikan dari bergabung LEFT dan RIGHT yang merupakan hasil parsial dari join OUTER. Memang:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Sekarang jelas mengapa operasi-operasi tersebut memiliki alias, dan juga jelas hanya ada 3 kasus: INNER, OUTER, CROSS. Dengan dua sub-kasus untuk OUTER. Kosakata, cara guru menjelaskan hal ini, serta beberapa jawaban di atas, sering membuatnya terlihat seperti ada banyak jenis gabung yang berbeda. Tapi sebenarnya sangat sederhana.

Yugo Amaryl
sumber
1
"Jelas hanya ada 3 kasus": menarik tetapi cacat. Pertimbangkan bahwa gabungan dalam adalah gabungan khusus (yaitu, pindah, gabungkan predikat ke klausa where). Lebih lanjut menganggap bahwa gabungan luar bukanlah gabungan sama sekali, melainkan gabungan di mana digunakan nol sebagai pengganti kolom 'hilang'. Oleh karena itu, dapat dikatakan bahwa cross adalah satu-satunya join yang diperlukan. Perhatikan pemikiran saat ini dalam teori relasional adalah bahwa bergabung alami memenuhi semua persyaratan bergabung. Selain itu: dapatkah Anda menjelaskan apakah / bagaimana kosakata " JOINmenyiratkan INNER JOIN" cocok dengan alasan Anda untuk bergabung dengan vocab?
Jumat
27

Untuk menjawab pertanyaan Anda

Dalam Sql Server bergabung dengan sintaks OUTER adalah opsional

Disebutkan dalam artikel msdn: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Jadi daftar berikut ini menunjukkan bergabung dengan sintaks yang setara dengan dan tanpa OUTER

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Sintaks setara lainnya

INNER JOIN => JOIN
CROSS JOIN => ,

Sangat Merekomendasikan Dotnet Mob Artice: Bergabung di Sql Server masukkan deskripsi gambar di sini

massa
sumber
2
Re penyalahgunaan diagram Venn di sini lihat komentar saya pada pertanyaan.
philipxy
20

Hanya ada 3 bergabung:

  • A) Cross Join = Cartesian (Misalnya: Tabel A, Tabel B)
  • B) Bergabung Gabung = GABUNG (Contoh: Tabel A Bergabung / Bergabung Gabung Dalam B)
  • C) Outer join:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Semoga ini bisa membantu.

Delickate
sumber
1
Jadi 5 bergabung bersama.
Zeek2
19

Ada terutama tiga jenis GABUNG

  1. Batin: mengambil data, yang ada di kedua tabel
    • Hanya JOIN berarti INNER JOIN
  2. Luar: ada tiga jenis

    • LEFT OUTER - - mengambil data yang ada hanya di tabel kiri & kondisi yang cocok
    • RIGHT OUTER - - mengambil data yang ada hanya di tabel kanan & kondisi yang cocok
    • FULL OUTER - - mengambil data yang menyajikan salah satu atau kedua tabel
    • (KIRI atau KANAN atau FULL) OUTER GABUNG dapat ditulis tanpa menulis "OUTER"
  3. Cross Join: gabungkan semuanya dengan segalanya

Keras
sumber
16

Gula sintaksis, membuatnya lebih jelas bagi pembaca biasa bahwa bergabung bukan batin.

Tidak berbelit-belit
sumber
2
Jadi ... lalu apa itu FULL OUTER JOIN?
Amy B
5
tableA FULL OUTER JOIN tableB akan memberi Anda tiga jenis catatan: semua catatan di tableA tanpa catatan yang cocok di tableB, semua catatan di tableB tanpa catatan yang cocok di tableA, dan semua catatan di tableA dengan catatan yang cocok di tableB.
Dave DuPlantis
4

Hanya dalam konteks pertanyaan ini, saya ingin memposting 2 operator 'BERLAKU' juga:

BERGABUNG :

  1. INNER JOIN = BERGABUNG

  2. OUTER BERGABUNG

    • LEFT OUTER JOIN = LEFT JOIN

    • BERGABUNG DENGAN BENAR = BERGABUNG DENGAN BENAR

    • FULL OUTER JOIN = FULL JOIN

  3. LINTAS BERGABUNG

BERGABUNG DIRI : Ini bukan tipe gabungan yang terpisah. Ini pada dasarnya bergabung dengan tabel untuk dirinya sendiri menggunakan salah satu gabungan di atas. Tapi saya merasa perlu disebutkan dalam konteks GABUNG diskusi karena Anda akan mendengar istilah ini dari banyak di komunitas Pengembang SQL.

BERLAKU :

  1. LINTAS BERLAKU - Mirip dengan INNER JOIN (Tetapi telah menambahkan keuntungan karena dapat menghitung sesuatu di tabel Kanan untuk setiap baris dari tabel Kiri dan hanya akan mengembalikan baris yang cocok)
  2. OUTER BERLAKU - Mirip dengan LEFT OUTER JOIN (Tetapi telah menambahkan keuntungan karena dapat menghitung sesuatu di tabel Kanan untuk setiap baris tabel Kiri dan akan mengembalikan semua baris dari tabel Kiri terlepas dari pertandingan di tabel Kanan)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

Contoh kehidupan nyata, kapan harus menggunakan OUTER / CROSS BERLAKU dalam SQL

Saya menemukan operator BERLAKU sangat bermanfaat karena mereka memberikan kinerja yang lebih baik daripada harus melakukan perhitungan yang sama dalam subquery. Mereka juga penggantian banyak fungsi analitik dalam versi SQL Server yang lebih lama. Itu sebabnya saya percaya bahwa setelah merasa nyaman dengan BERGABUNG, satu pengembang SQL harus mencoba mempelajari operator BERLAKU selanjutnya.

san
sumber