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 ?



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.


11
Apakah ini benar untuk semua basis data (misalnya SQL, postgres?) Apakah ada yang tahu tautan ke dokumentasi yang menjelaskan hal ini?
Chogg


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 .


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)



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

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

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.