Fungsi JOIN menggabungkan dua tabel atau lebih dan mengembalikan data yang memenuhi kondisi penggabungan serta kueri.
Catatan Penggunaan
Dalam topik ini, tabel kiri adalah tabel di sisi kiri kata kunci JOIN, sedangkan tabel kanan adalah tabel di sisi kanan kata kunci JOIN.
Sebagai contoh, dalam pernyataan SQL berikut, table_1 adalah tabel kiri dan table_2 adalah tabel kanan.
SELECT * FROM table_1 JOIN table_2 on ......;Sintaksis
table_references join_type table_references [ ON join_condition | USING ( join_column [, ...] ) ]
table_references : {
table_name [ [ AS ] alias_name ]
| select_statement
}
join_type : {
[ INNER ] JOIN
| LEFT [ OUTER ] JOIN
| RIGHT [ OUTER ] JOIN
| CROSS JOIN
}Parameter
Parameter | Diperlukan | Deskripsi |
table_references | Ya | Informasi tentang tabel yang ingin Anda gabungkan. Nilainya bisa berupa nama tabel atau pernyataan SELECT. Tabel kiri dan tabel kanan dibedakan berdasarkan apakah tabel tersebut berada di sisi kiri atau kanan dari kata kunci JOIN. |
join_type | Ya | Jenis fungsi JOIN. Nilai yang valid:
|
join_condition | Ya | Kolom berdasarkan mana Anda ingin menggabungkan dua tabel. Pernyataan SQL berikut menunjukkan bahwa table_1 dan table_2 digabungkan dengan mencocokkan kolom col_A di table_1 dan kolom col_B di table_2. Jika nama kolom yang ditentukan dalam kondisi penggabungan sama di kedua tabel, Anda dapat menggunakan Pernyataan SQL yang disederhanakan: |
Algoritma JOIN
Tablestore menyediakan algoritma berikut untuk operasi JOIN: INDEX JOIN dan HASH JOIN. INDEX JOIN merupakan algoritma JOIN default. Jika kolom yang ditentukan di tabel kanan tidak memenuhi syarat untuk menggunakan INDEX JOIN, sistem akan menggunakan HASH JOIN.
INDEX JOIN (default): Membaca data dari tabel kiri, menggunakan indeks atau kunci utama tabel kanan untuk membaca baris di tabel kanan yang cocok dengan data di tabel kiri, lalu menggabungkan kedua tabel. Untuk informasi lebih lanjut, lihat INDEX JOIN.
HASH JOIN: Membaca data dari tabel kiri untuk membuat tabel hash, membaca data dari tabel kanan untuk menentukan apakah baris di tabel kanan cocok dengan data di tabel hash, lalu menggabungkan kedua tabel. Untuk informasi lebih lanjut, lihat HASH JOIN.
INDEX JOIN
Untuk menggunakan INDEX JOIN, pastikan bahwa kolom yang ditentukan di tabel kanan memenuhi kondisi tertentu untuk menggunakan indeks. Tidak ada persyaratan tambahan untuk tabel kiri.
Jika Anda menggunakan indeks sekunder atau kunci utama tabel kanan untuk membaca data dari tabel kanan, kolom yang ditentukan di tabel kanan harus mematuhi prinsip pencocokan paling kiri.
Jika Anda menggunakan indeks pencarian tabel kanan untuk membaca data dari tabel kanan, pastikan bahwa kolom yang ditentukan di tabel kanan termasuk dalam indeks pencarian dan bahwa kondisi penyaringan yang ditentukan dapat didorong ke indeks pencarian tersebut.
Jika jumlah baris di tabel yang ingin digabungkan kecil, jumlah data di tabel kiri kecil, atau jumlah data setelah difilter kecil, INDEX JOIN dapat meningkatkan kinerja selama tabel kanan memenuhi kondisi untuk menggunakan INDEX JOIN. Dalam skenario di mana INDEX JOIN digunakan, jika parameter join_type diatur ke INNER JOIN dan kedua tabel memenuhi kondisi untuk menggunakan INDEX JOIN, disarankan untuk menetapkan tabel dengan jumlah data lebih kecil atau yang memiliki jumlah data lebih kecil setelah difilter sebagai tabel kiri.
HASH JOIN
Tablestore tidak memberlakukan batasan pada skenario penggunaan HASH JOIN. Jika kondisi untuk menggunakan INDEX JOIN tidak terpenuhi, sistem akan menggunakan HASH JOIN.
Jika jumlah baris di tabel yang ingin digabungkan besar, HASH JOIN dapat memberikan kinerja yang lebih baik.
Dalam skenario di mana HASH JOIN digunakan, jika parameter join_type diatur ke INNER JOIN, disarankan untuk menetapkan tabel dengan jumlah data lebih kecil atau yang memiliki jumlah data lebih kecil setelah difilter sebagai tabel kiri.
Saran
Jika Anda ingin menggunakan INDEX JOIN, pastikan bahwa kolom yang ditentukan di tabel kanan memenuhi kondisi tertentu untuk menggunakan indeks. Tablestore tidak memberlakukan persyaratan pada tabel kiri.
Jika Anda menggunakan indeks sekunder atau kunci utama tabel kanan untuk membaca data dari tabel kanan, kolom yang ditentukan di tabel kanan harus mematuhi prinsip pencocokan paling kiri.
Jika Anda menggunakan indeks pencarian tabel kanan untuk membaca data dari tabel kanan, pastikan bahwa kolom yang ditentukan di tabel kanan termasuk dalam indeks pencarian dan bahwa kondisi penyaringan yang ditentukan dapat didorong ke indeks pencarian.
Jika sejumlah besar kondisi penyaringan ditentukan untuk tabel kanan dan tidak ada indeks yang digunakan, kinerja pembacaan akan terganggu.
Ketika parameter join_type diatur ke INNER JOIN, tabel di sisi kiri kata kunci JOIN adalah tabel eksternal, dan tabel di sisi kanan kata kunci JOIN adalah tabel internal. Disarankan untuk menetapkan tabel dengan jumlah baris lebih sedikit atau yang memiliki jumlah baris lebih sedikit setelah difilter sebagai tabel eksternal, yang berada di sisi kiri kata kunci JOIN.
Jika jumlah baris di tabel yang ingin digabungkan kecil atau tabel eksternal memiliki jumlah baris lebih sedikit atau memiliki jumlah baris lebih sedikit setelah difilter, INDEX JOIN memberikan kinerja yang lebih baik daripada HASH JOIN. Namun, jika jumlah data atau jumlah baris di tabel yang ingin digabungkan besar, kinerja INDEX JOIN terganggu. Dalam hal ini, HASH JOIN memberikan kinerja yang lebih baik.
Jika sejumlah besar kondisi penyaringan digunakan untuk tabel yang ditentukan dalam pernyataan SQL di mana klausa JOIN digunakan, kinerja pembacaan terganggu ketika tidak ada indeks yang digunakan. Dalam hal ini, Anda dapat menggunakan indeks untuk mempercepat operasi pembacaan data, yang mungkin membantu meningkatkan kecepatan eksekusi pernyataan SQL.
Contoh
Contoh berikut menggunakan dua tabel bernama orders dan customers:
SELECT * FROM orders;
+----------+-------------+------------+--------------+
| order_id | customer_id | order_date | order_amount |
+----------+-------------+------------+--------------+
| 1001 | 1 | 2023-01-01 | 50 |
| 1002 | 2 | 2023-01-02 | 80 |
| 1003 | 3 | 2023-01-03 | 180 |
| 1004 | 4 | 2023-01-04 | 220 |
| 1005 | 6 | 2023-01-05 | 250 |
+----------+-------------+------------+--------------+
SELECT * FROM customers;
+-------------+---------------+----------------+
| customer_id | customer_name | customer_phone |
+-------------+---------------+----------------+
| 1 | Alice | 11111111111 |
| 2 | Bob | 22222222222 |
| 3 | Carol | 33333333333 |
| 4 | David | 44444444444 |
| 5 | Eve | 55555555555 |
+-------------+---------------+----------------+Contoh 1: INNER JOIN
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;Pernyataan INNER JOIN di atas setara dengan pernyataan SQL berikut di mana USING digunakan:
SELECT * FROM orders JOIN customers USING(customer_id);Keluaran berikut dikembalikan:
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | +----------+-------------+------------+--------------+-------------+---------------+----------------+Contoh 2: LEFT JOIN
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id;Pernyataan LEFT JOIN di atas setara dengan pernyataan SQL berikut di mana USING digunakan:
SELECT * FROM orders LEFT JOIN customers USING(customer_id);Keluaran berikut dikembalikan:
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | | 1005 | 6 | 2023-01-05 | 250 | NULL | NULL | NULL | +----------+-------------+------------+--------------+-------------+---------------+----------------+Contoh 3: CROSS JOIN
SELECT * FROM orders CROSS JOIN customers;Keluaran berikut dikembalikan:
+----------+-------------+------------+--------------+-------------+---------------+----------------+ | order_id | customer_id | order_date | order_amount | customer_id | customer_name | customer_phone | +----------+-------------+------------+--------------+-------------+---------------+----------------+ | 1001 | 1 | 2023-01-01 | 50 | 1 | Alice | 11111111111 | | 1002 | 2 | 2023-01-02 | 80 | 1 | Alice | 11111111111 | | 1003 | 3 | 2023-01-03 | 180 | 1 | Alice | 11111111111 | | 1004 | 4 | 2023-01-04 | 220 | 1 | Alice | 11111111111 | | 1005 | 6 | 2023-01-05 | 250 | 1 | Alice | 11111111111 | | 1001 | 1 | 2023-01-01 | 50 | 2 | Bob | 22222222222 | | 1002 | 2 | 2023-01-02 | 80 | 2 | Bob | 22222222222 | | 1003 | 3 | 2023-01-03 | 180 | 2 | Bob | 22222222222 | | 1004 | 4 | 2023-01-04 | 220 | 2 | Bob | 22222222222 | | 1005 | 6 | 2023-01-05 | 250 | 2 | Bob | 22222222222 | | 1001 | 1 | 2023-01-01 | 50 | 3 | Carol | 33333333333 | | 1002 | 2 | 2023-01-02 | 80 | 3 | Carol | 33333333333 | | 1003 | 3 | 2023-01-03 | 180 | 3 | Carol | 33333333333 | | 1004 | 4 | 2023-01-04 | 220 | 3 | Carol | 33333333333 | | 1005 | 6 | 2023-01-05 | 250 | 3 | Carol | 33333333333 | | 1001 | 1 | 2023-01-01 | 50 | 4 | David | 44444444444 | | 1002 | 2 | 2023-01-02 | 80 | 4 | David | 44444444444 | | 1003 | 3 | 2023-01-03 | 180 | 4 | David | 44444444444 | | 1004 | 4 | 2023-01-04 | 220 | 4 | David | 44444444444 | | 1005 | 6 | 2023-01-05 | 250 | 4 | David | 44444444444 | | 1001 | 1 | 2023-01-01 | 50 | 5 | Eve | 55555555555 | | 1002 | 2 | 2023-01-02 | 80 | 5 | Eve | 55555555555 | | 1003 | 3 | 2023-01-03 | 180 | 5 | Eve | 55555555555 | | 1004 | 4 | 2023-01-04 | 220 | 5 | Eve | 55555555555 | | 1005 | 6 | 2023-01-05 | 250 | 5 | Eve | 55555555555 | +----------+-------------+------------+--------------+-------------+---------------+----------------+