Perbedaan antara JOIN dan INNER JOIN

999

Kedua gabungan ini akan memberi saya hasil yang sama:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

vs.

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Apakah ada perbedaan antara pernyataan kinerja atau tidak?

Apakah perbedaan antara implementasi SQL berbeda ?

driis
sumber
2
Lihat pertanyaan ini: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn
6
Sebagai catatan: CROSS JOIN adalah tipe join yang bagus untuk mengetahui (berbeda dengan INNER JOIN).
Serge

Jawaban:

1093

Mereka secara fungsional setara, tetapi INNER JOINbisa sedikit lebih jelas untuk dibaca, terutama jika kueri memiliki tipe gabungan lainnya (yaitu LEFTatau RIGHTatau CROSS) termasuk di dalamnya.

kuda pucat
sumber
11
Apakah ini benar untuk semua basis data (misalnya SQL, postgres?) Apakah ada yang tahu tautan ke dokumentasi yang menjelaskan hal ini?
Chogg
4
Ini standar SQL ANSI. Lihat lebih lanjut: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
India
14
Permintaannya cukup jelas hanya dengan menulis GABUNG, INNER hanya berisik.
Ivanzinho
22
Mungkin saya seorang purist, tapi saya pikir lebih baik eksplisit daripada implisit saat menulis SQL. INNER BERGABUNG lebih mudah dibaca, terutama dalam pertanyaan kompleks.
bruceskyaus
3
@Ivanzinho: Stroke keyboard bukan ukuran kueri atau kompleksitas program. Kompleksitas kehidupan nyata berasal dari kemampuan pemeliharaan, di mana keterbacaan memainkan peran utama. Fakta bahwa ketika dikatakan INNER BERGABUNG, Anda dapat yakin apa yang dilakukannya dan bahwa itu seharusnya hanya itu, sedangkan BERGABUNG polos akan meninggalkan Anda, atau orang lain, bertanya-tanya apa yang dikatakan standar tentang implementasi dan adalah INNER / OUTER / KIRI ditinggalkan oleh kecelakaan atau dengan sengaja.
Tuukka Haapaniemi
243

Tidak, tidak ada perbedaan, gula sintaksis murni .

Quassnoi
sumber
22
Saya tidak akan menyebut ini gula sintaksis. "Default" bergabung dengan tipe, "steno," atau "alias," mungkin.
mk12
62
Dalam ilmu komputer, gula sintaksis adalah sintaksis dalam bahasa pemrograman yang dirancang untuk membuat segala sesuatu lebih mudah dibaca atau diungkapkan . Saya percaya kemampuan untuk menghilangkan INNERjatuh di bawah definisi ini.
Quassnoi
14
Jika Anda menerapkan definisi tersebut secara harfiah, ya, tetapi saya selalu melihatnya untuk jenis sintaksis yang lebih menarik, bukan hanya nama alternatif untuk banyak hal.
mk12
10
@Quassnoi fakta bahwa pertanyaan ini ditanyakan, menunjukkan yang absense dari INNERtidak tidak membuat permintaan lebih mudah dibaca. Yang saya tahu, JOINbisa berarti LEFT JOINjika tidak dijawab oleh jawaban di sini.
martennis
2
@Quassnoi Pernyataan wiki pengantar yang dikutip dari komentar Anda adalah benar dari gula sintaksis, tetapi tidak memadai sebagai definisi. Sugaring sintaksis adalah tentang sintaksis yang lebih sederhana untuk kasus khusus sintaksis kompleks. Lebih tepat untuk mengatakan bahwa INNER adalah "kata bising".
philipxy
143

INNER JOIN = BERGABUNG

INNER JOIN adalah default jika Anda tidak menentukan tipe ketika Anda menggunakan kata JOIN.

Anda juga dapat menggunakan JOIN LEFT OUTER atau RIGHT OUTER JOIN, dalam hal ini kata OUTER adalah opsional, atau Anda dapat menentukan CROSS JOIN.

ATAU

Untuk join dalam, sintaksnya adalah:

PILIH ...
DARI TableA
[INNER] GABUNG TableB

(dengan kata lain, kata kunci "INNER" adalah opsional - hasilnya sama dengan atau tanpanya)

net_prog
sumber
59

Apakah perbedaan antara implementasi SQL berbeda?

Ya, Microsoft Access tidak mengizinkan join. Itu membutuhkan inner join.

Michał Powaga
sumber
54

Demikian pula dengan OUTER JOINs, kata "OUTER"itu opsional. Itu kata kunci LEFTatau RIGHTyang membuat JOINsebuah "OUTER" JOIN.

Namun karena beberapa alasan saya selalu menggunakan "OUTER"seperti dalam LEFT OUTER JOINdan tidak pernah LEFT JOIN, tetapi saya tidak pernah menggunakan INNER JOIN, tetapi saya hanya menggunakan "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID
Kristen
sumber
23
Saya kebalikan dari Anda: Saya selalu mengatakan "INNER JOIN" tetapi saya tidak pernah menggunakan OUTER; jadi "LEFT JOIN" dan "RIGHT JOIN". Kira saya hanya menjaga agar jumlah karakter saya konstan!
Stephen Holt
10
@ Jonathan. Tidak ada konsep arah pada gabungan batin. Gabungan luar dapat menghasilkan set hasil yang tak tertandingi dan yang dapat bervariasi berdasarkan arah. Batin membutuhkan pencocokan sehingga arah tidak masalah.
Karl Kieninger
32

Karena jawaban lain sudah menyatakan tidak ada perbedaan dalam contoh Anda.

Bit tata bahasa yang relevan didokumentasikan di sini

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

Menunjukkan bahwa semua itu opsional. Halaman selanjutnya menjelaskan itu

INNERMenentukan semua pasangan baris yang cocok akan dikembalikan. Buang baris yang tidak cocok dari kedua tabel. Ketika tidak ada tipe gabungan yang ditentukan, ini adalah default .

Tata bahasa tidak juga menunjukkan bahwa ada satu waktu di mana INNER yang diperlukan sekalipun. Saat menentukan petunjuk bergabung.

Lihat contoh di bawah ini

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

masukkan deskripsi gambar di sini

Martin Smith
sumber