Kueri data dalam tabel pemetaan menggunakan sintaksis DQL yang kompatibel dengan MySQL, mencakup pernyataan SELECT, fungsi agregat, operasi JOIN, pencarian teks lengkap, pencarian vektor, serta fungsi JSON untuk indeks pencarian.
Prasyarat
Buat hubungan pemetaan sebelum menjalankan pernyataan SELECT. Untuk informasi selengkapnya, lihat Operasi DDL.
Kueri data
Pernyataan SELECT mengambil baris dari tabel pemetaan dengan opsi penyaringan, pengelompokan, pengurutan, dan paginasi.
Tabel pemetaan indeks pencarian mendukung kemampuan tambahan seperti pencarian teks lengkap, kueri array, kueri bersarang, pencarian vektor, dan fungsi JSON. Untuk informasi selengkapnya, lihat Operasi indeks pencarian.
Jika indeks sekunder dan indeks pencarian keduanya tersedia pada tabel data, mesin SQL secara otomatis memilih indeks yang paling sesuai. Untuk informasi selengkapnya, lihat Optimasi kueri.
Urutan eksekusi klausa: WHERE > GROUP BY > HAVING > ORDER BY > LIMIT/OFFSET.
Sintaksis
SELECT
[ALL | DISTINCT | DISTINCTROW]
select_expr [, select_expr] ...
[FROM table_references | join_expr]
[WHERE where_condition]
[GROUP BY groupby_condition]
[HAVING having_condition]
[ORDER BY order_condition]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]Parameter
Parameter | Wajib | Deskripsi |
ALL | DISTINCT | DISTINCTROW | Tidak | Mode deduplikasi. ALL (default) mengembalikan semua baris. DISTINCT menghapus baris duplikat dari set hasil. DISTINCTROW setara dengan DISTINCT. |
select_expr | Ya | Nama kolom atau ekspresi dalam format |
table_references | Ya | Tabel target. Tentukan nama tabel atau subkueri SELECT dalam format |
where_condition | Tidak | Klausa WHERE. Mendukung kondisi kesetaraan dan rentang kunci primer, operator logika (AND/OR/NOT), operator perbandingan (=, >, <, >=, <=, !=), IN, LIKE, IS NULL, dan BETWEEN. |
groupby_condition | Tidak | Klausa GROUP BY. Mengelompokkan baris berdasarkan kolom yang ditentukan, biasanya digunakan bersama fungsi agregat. |
having_condition | Tidak | Klausa HAVING. Menyaring hasil yang telah dikelompokkan oleh GROUP BY. |
order_condition | Tidak | Klausa ORDER BY. Mengurutkan hasil berdasarkan kolom yang ditentukan. Mendukung ASC (ascending, default) dan DESC (descending). |
LIMIT / OFFSET | Tidak | Membatasi jumlah baris yang dikembalikan. |
Contoh
Kueri semua data dari exampletable, mengembalikan maksimal 20 baris:
SELECT * FROM exampletable LIMIT 20;Kueri dengan kondisi dan pengurutan:
SELECT pk, col_long, col_keyword FROM exampletable WHERE col_long > 100 ORDER BY col_long DESC LIMIT 10;Deduplikasi hasil:
SELECT DISTINCT col_keyword FROM exampletable;Kelompokkan dan hitung:
SELECT col_keyword, COUNT(*) AS cnt FROM exampletable GROUP BY col_keyword HAVING cnt > 1;Paginasi hasil (lewati 10 baris pertama dan kembalikan 5 baris):
SELECT * FROM exampletable LIMIT 10, 5;Fungsi agregat
Fungsi agregat menghitung satu nilai tunggal dari beberapa baris. Gunakan bersama GROUP BY untuk menghasilkan statistik terkelompok.
Fungsi | Tipe kembalian | Deskripsi |
COUNT() | BIGINT | Mengembalikan jumlah baris yang sesuai dengan kondisi yang ditentukan. |
COUNT(DISTINCT) | BIGINT | Mengembalikan jumlah nilai unik dalam kolom yang ditentukan. |
SUM() | DOUBLE | Mengembalikan jumlah total kolom numerik. |
AVG() | DOUBLE | Mengembalikan rata-rata kolom numerik. |
MAX() | Sama dengan tipe kolom | Mengembalikan nilai maksimum dalam kolom. |
MIN() | Sama dengan tipe kolom | Mengembalikan nilai minimum dalam kolom. |
Contoh
SELECT COUNT(*) FROM exampletable;
SELECT SUM(col_long), AVG(col_long) FROM exampletable;
SELECT col_keyword, COUNT(*) AS cnt, MAX(col_long) FROM exampletable GROUP BY col_keyword;Join
Gabungkan dua atau lebih tabel untuk mengembalikan baris gabungan di mana kolom yang ditentukan cocok.
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 | Wajib | Deskripsi |
table_references | Ya | Tabel yang akan digabungkan. Tentukan nama tabel dengan alias opsional, atau subkueri SELECT. Tabel di sisi kiri kata kunci JOIN adalah tabel kiri, dan tabel di sisi kanan adalah tabel kanan. |
join_type | Ya | Jenis join:
|
join_condition | Ya | Menentukan kolom join. Gunakan |
Algoritma join
Tablestore menggunakan INDEX JOIN secara default dan beralih ke HASH JOIN ketika kolom join pada tabel kanan tidak memenuhi kondisi indeks.
Algoritma | Kondisi berlaku | Deskripsi |
INDEX JOIN | Kolom join tabel kanan memenuhi kondisi indeks | Membaca data dari tabel kiri dan menggunakan indeks atau kunci primer tabel kanan untuk mencari baris yang cocok. Kolom join tabel kanan harus memenuhi salah satu kondisi berikut:
|
HASH JOIN | Kolom join tidak memenuhi kondisi INDEX JOIN | Membaca data dari tabel kiri untuk membangun tabel hash, lalu mencocokkan dengan baris dari tabel kanan untuk menemukan kecocokan. Tidak memerlukan indeks. |
Tanpa indeks yang sesuai pada tabel kanan, INDEX JOIN akan turun menjadi pemindaian tabel penuh. Tambahkan indeks pada kolom join dan kolom filter untuk meningkatkan performa kueri.
INNER JOIN memberikan performa lebih baik untuk set hasil yang lebih kecil, sedangkan HASH JOIN lebih unggul untuk set hasil yang lebih besar. Tempatkan tabel yang lebih kecil di sisi kiri untuk performa optimal.
Contoh
Asumsikan dua tabel, orders dan customers:
-- orders table
+----------+-------------+------------+--------------+
| 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 |
+----------+-------------+------------+--------------+
-- customers table
+-------------+---------------+----------------+
| customer_id | customer_name | customer_phone |
+-------------+---------------+----------------+
| 1 | Alice | 11111111111 |
| 2 | Bob | 22222222222 |
| 3 | Carol | 33333333333 |
| 4 | David | 44444444444 |
| 5 | Eve | 55555555555 |
+-------------+---------------+----------------+INNER JOIN hanya mengembalikan baris di mana customer_id cocok di kedua tabel. Pesanan 1005 (customer_id=6) dikecualikan karena tidak ada baris yang cocok di tabel kanan.
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;
-- Equivalent:
SELECT * FROM orders JOIN customers USING(customer_id);LEFT JOIN mengembalikan semua baris dari tabel kiri (orders). Kolom dari tabel kanan diisi dengan NULL jika tidak ada kecocokan.
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id;CROSS JOIN mengembalikan Produk Kartesius dari kedua tabel.
SELECT * FROM orders CROSS JOIN customers;