CROSS JOIN = (INNER) JOIN = koma (",")
TL; DR Satu-satunya perbedaan antara SQL CROSS JOIN, (INNER) JOIN dan koma (",") (selain koma yang memiliki prioritas lebih rendah untuk urutan evaluasi) adalah bahwa (INNER) BERGABUNG dengan ON sementara CROSS JOIN dan koma tidak.
Kembali produk antara
Ketiganya menghasilkan produk "Cartesian" relasional konseptual SQL-style antara, alias gabungan silang, dari semua kemungkinan kombinasi baris dari setiap tabel. Ini HIDUP dan / atau DIMANA yang mengurangi jumlah baris. SQL Fiddle
SQL Standard mendefinisikan <comma> via produk (7.5 1.b.ii), <cross join> via <comma> (7.7 1.a) dan BERGABUNG DENGAN <kondisi pencarian> via <comma> ditambah WHERE (7.7 1.b ).
Seperti yang dikatakan Wikipedia:
Silang bergabung
CROSS JOIN mengembalikan produk Cartesian dari baris dari tabel dalam gabungan. Dengan kata lain, itu akan menghasilkan baris yang menggabungkan setiap baris dari tabel pertama dengan setiap baris dari tabel kedua.
Batin bergabung
[...] Hasil gabungan dapat didefinisikan sebagai hasil dari pertama mengambil produk Cartesian (atau Cross bergabung) dari semua catatan di tabel (menggabungkan setiap catatan di tabel A dengan setiap catatan di tabel B) dan kemudian kembali semua catatan yang memenuhi predikat gabung.
"Notasi gabungan implisit" hanya mencantumkan tabel untuk bergabung, dalam klausa FROM dari pernyataan SELECT, menggunakan koma untuk memisahkannya. Dengan demikian itu menentukan silang bergabung
Re OUTER bergabung dan menggunakan ON vs MANA di dalamnya melihat Kondisi di KIRI BERGABUNG (Outer JOIN) vs INNER JOIN .
Mengapa membandingkan kolom antar tabel?
Ketika tidak ada baris duplikat:
Setiap tabel memiliki baris yang membuat pernyataan benar dari templat pernyataan blank fill-in-the- [name-] tertentu. (Itu membuat proposisi yang benar dari-- memenuhi - predikat (karakteristik) tertentu .)
Tabel dasar menampung baris yang membuat pernyataan benar dari beberapa templat pernyataan yang diberikan DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Produk perantara join memegang baris yang membuat pernyataan benar dari DAN dari templat operandnya:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ON & WHERE ketentuan ANDed in untuk memberikan templat lebih lanjut. Nilai lagi baris yang memenuhi templat itu:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
Secara khusus, membandingkan kolom untuk (SQL) kesetaraan antar tabel berarti bahwa baris yang disimpan dari produk dari bagian templat tabel yang digabung memiliki nilai yang sama (non-NULL) untuk kolom tersebut. Itu hanya kebetulan bahwa banyak baris biasanya dihapus oleh perbandingan kesetaraan antara tabel - apa yang perlu dan cukup adalah untuk mencirikan baris yang Anda inginkan.
Cukup tulis SQL untuk templat untuk baris yang Anda inginkan!
Kembali makna kueri (dan tabel vs kondisi) lihat:
Bagaimana cara mendapatkan data yang cocok dari tabel SQL lain untuk dua kolom yang berbeda: Inner Join dan / atau Union?
Apakah ada aturan praktis untuk membangun query SQL dari deskripsi yang dapat dibaca manusia?
Overloading "gabung silang"
Sayangnya istilah "cross join" digunakan untuk:
- Produk antara.
- LINTAS BERGABUNG.
- (INNER) GABUNG dengan ON atau WHERE yang tidak membandingkan kolom mana pun dari satu tabel dengan kolom lainnya. (Karena itu cenderung mengembalikan begitu banyak baris produk antara.)
Berbagai makna ini dikacaukan. (Misalnya, seperti dalam jawaban dan komentar lain di sini.)
Menggunakan CROSS JOIN vs (INNER) JOIN vs koma
Konvensi umum adalah:
- Gunakan CROSS JOIN kapan dan hanya ketika Anda tidak membandingkan kolom antara tabel. Itu untuk menunjukkan bahwa kurangnya perbandingan itu disengaja.
- Gunakan (INNER) GABUNG dengan ON kapan dan hanya ketika Anda membandingkan kolom antara tabel. (Plus kemungkinan kondisi lainnya.)
- Jangan gunakan koma.
Biasanya juga kondisi tidak pada pasangan tabel disimpan untuk WHERE. Tetapi mereka mungkin harus dimasukkan ke dalam (n BATIN) BERGABUNG untuk mendapatkan baris yang sesuai untuk argumen untuk GABUNG KANAN, KIRI atau PENUH (OUTER).
Kembali "Jangan gunakan koma" Mencampur koma dengan JOIN eksplisit dapat menyesatkan karena koma memiliki prioritas lebih rendah. Tetapi mengingat peran produk antara dalam arti CROSS JOIN, (INNER) JOIN dan koma, argumen untuk konvensi di atas untuk tidak menggunakannya sama sekali goyah. GABUNG LINTAS atau koma sama seperti (INNER) GABUNG yang dalam kondisi BENAR. Produk antara, AKTIF dan DIMANA semuanya memperkenalkan DAN dalam predikat yang sesuai. Namun yang lain INNER JOIN ON dapat dipikirkan - katakanlah, menghasilkan baris output hanya ketika menemukan sepasang baris input yang memenuhi kondisi ON - namun demikian mengembalikan baris gabungan silang yang memenuhi kondisi tersebut. Satu-satunya alasan ON harus menambahkan koma dalam SQL adalah untuk menulis OUTERBERGABUNG. Tentu saja, ungkapan harus membuat maknanya jelas; tetapi apa yang jelas tergantung pada apa yang dianggap berarti.
Diagram Re Venn Diagram Venn dengan dua lingkaran berpotongan dapat menggambarkan perbedaan antara baris output untuk INNER, LEFT, RIGHT & FULL JOINs untuk input yang sama. Dan ketika ON benar tanpa syarat, hasil INNER JOIN sama dengan CROSS JOIN. Juga dapat menggambarkan baris input dan output untuk INTERSECT, UNION & EXCEPT. Dan ketika kedua input memiliki kolom yang sama, hasil INTERSECT sama dengan standar SQL NATURAL JOIN, dan hasil EXCEPT sama dengan idiom tertentu yang melibatkan LEFT & RIGHT JOIN. Tetapi itu tidak menggambarkan bagaimana (INNER) BERGABUNG secara umum. Itu hanya tampaknya masuk akal pada pandangan pertama . Ini dapat mengidentifikasi bagian input dan / atau output untukkasus khususON, PK (kunci utama), FK (kunci asing) dan / atau PILIH. Yang harus Anda lakukan untuk melihat ini adalah mengidentifikasi apa sebenarnya elemen set yang diwakili oleh lingkaran . (Presentasi yang kacau tidak pernah membuat jelas.) (Ingat bahwa secara umum untuk bergabung baris output memiliki judul yang berbeda dari baris input . Dan tabel SQL adalah tas tidak set baris dengan NULLs .)
CROSS JOIN
akan menghasilkan semua kemungkinan kombinasi tabel. mis. Table1 dengan 100 baris dan Table2 dengan 100 baris akan menghasilkan 10.000 catatan.