Pertama-tama, agar benar-benar setara, kueri pertama seharusnya ditulis
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT *
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
Sehingga mw.* dan nvs.* bersama-sama menghasilkan set yang sama dengan singular *. Kueri seperti yang Anda tulis dapat menggunakan INNER JOIN, karena menyertakan filter di nvs.correct.
Bentuk umum
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
untuk menemukan record TableB berdasarkan kondisi. Jika gagal, hasil dari TABLEA akan disimpan, dengan semua kolom dari TableB disetel ke NULL. Sebaliknya
TABLEA INNER JOIN TABLEB ON <CONDITION>
juga attempts
untuk menemukan record TableB berdasarkan kondisi. Namun , ketika gagal, record tertentu dari TableA dihapus dari kumpulan hasil keluaran.
Standar ANSI untuk CROSS JOIN menghasilkan Produk Cartesian antara dua tabel.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Maksud dari sintaks adalah bahwa SETIAP baris di TABLEA bergabung dengan SETIAP baris di TABLEB. Jadi 4 baris di A dan 3 baris di B menghasilkan 12 baris output. Ketika dipasangkan dengan kondisi dalam klausa WHERE, terkadang menghasilkan perilaku INNER JOIN yang sama, karena keduanya mengekspresikan hal yang sama (kondisi antara A dan B => keep atau tidak). Namun, jauh lebih jelas saat membaca maksud penggunaan INNER JOIN daripada koma.
Dari segi kinerja, sebagian besar DBMS akan memproses LEFT join lebih cepat daripada INNER JOIN. Notasi koma dapat menyebabkan sistem database salah menafsirkan maksud dan menghasilkan rencana kueri yang buruk - jadi nilai tambah lainnya untuk notasi SQL92.
Mengapa kita perlu LEFT JOIN? Jika penjelasan LEFT JOIN di atas masih belum cukup (simpan catatan di A tanpa kecocokan di B), maka pertimbangkan bahwa untuk mencapai hal yang sama, Anda memerlukan UNION kompleks antara dua set menggunakan notasi koma lama untuk mencapai efek yang sama . Tapi seperti yang dinyatakan sebelumnya , ini tidak berlaku untuk contoh Anda, yang sebenarnya adalah INNER JOIN yang bersembunyi di balik LEFT JOIN.
Catatan:
- RIGHT JOIN sama dengan LEFT, kecuali dimulai dengan TABLEB (sisi kanan), bukan A.
- RIGHT dan LEFT JOINS keduanya merupakan OUTER join. Kata OUTER bersifat opsional, yaitu dapat ditulis sebagai
LEFT OUTER JOIN
. - Jenis OUTER join yang ketiga adalah FULL OUTER join, tetapi itu tidak dibahas di sini.