全部产品
Search
文档中心

PolarDB:SELECT

更新时间:Jul 02, 2025

Topik ini menjelaskan cara mengeksekusi pernyataan SELECT untuk mengambil data dari satu atau lebih tabel.

Sintaksis

SELECT
    [ALL | DISTINCT]
    select_expr [, select_expr ...]
    [FROM referensi_tabel
    [WHERE kondisi_where]
    [GROUP BY {nama_kolom | ekspresi | posisi}
    [HAVING kondisi_where]
    [ORDER BY {nama_kolom | ekspresi | posisi}
      [ASC | DESC], ...]
    [LIMIT {[offset,] jumlah_baris | jumlah_baris OFFSET offset}]
    [FOR UPDATE]
Penjelasan klausa dalam pernyataan SELECT:
  • select_expr menentukan kolom yang akan di-query. Setidaknya satu ekspresi select_expr harus ada dalam pernyataan SELECT.
  • referensi_tabel menentukan tabel dari mana data diambil.
  • Klausa WHERE menentukan kriteria query. Jika kondisi_where ditentukan, sistem hanya mengembalikan baris yang memenuhi persyaratan tersebut. Jika tidak, semua baris dikembalikan.
  • Klausa GROUP BY mendukung referensi ke nama kolom, ekspresi, dan posisi dalam kolom keluaran.
  • Klausa HAVING mirip dengan klausa WHERE, tetapi mendukung penggunaan fungsi agregat.
  • Klausa ORDER BY menentukan urutan pengurutan data. Klausa ini mendukung referensi ke nama kolom, ekspresi, dan posisi dalam kolom keluaran. Anda dapat menentukan arah pengurutan seperti ASC (naik) atau DESC (turun).
  • Klausa OFFSET menentukan offset hasil keluaran, sedangkan klausa LIMIT menentukan ukuran hasil keluaran. Klausa LIMIT dapat memiliki satu atau dua parameter numerik berupa konstanta integer. Jika dua parameter digunakan, parameter pertama menentukan offset baris pertama yang dikembalikan, dan parameter kedua menentukan jumlah maksimum baris yang dikembalikan. Offset awal adalah 0, bukan 1. Untuk kompatibilitas dengan PostgreSQL, MySQL juga mendukung LIMIT dan OFFSET.
  • Klausa FOR UPDATE memberlakukan kunci eksklusif pada setiap baris hasil query. Ini mencegah transaksi lain memperbarui atau membaca baris-baris tersebut jika tingkat isolasi tertentu ditentukan.

Catatan

  • Ekspresi dalam klausa WHERE tidak dapat digunakan dalam klausa HAVING. Sebagai contoh, Pernyataan SQL 1 harus ditulis ulang sebagai Pernyataan SQL 2.
    Pernyataan SQL 1:
    SELECT nama_kolom FROM nama_tabel HAVING nama_kolom > 0;
    Pernyataan SQL 2:
    SELECT nama_kolom FROM nama_tabel WHERE nama_kolom > 0;
  • Fungsi agregat dapat digunakan dalam klausa HAVING tetapi tidak dalam klausa WHERE.
    SELECT pengguna, MAX(gaji) FROM pengguna
      GROUP BY pengguna HAVING MAX(gaji) > 10; 
  • Jika klausa LIMIT memiliki dua parameter, parameter pertama menunjukkan offset baris pertama yang dikembalikan, dan parameter kedua menunjukkan jumlah baris yang dikembalikan. Jika hanya satu parameter digunakan, itu menunjukkan jumlah baris yang dikembalikan, dengan offset default 0.
  • Klausa GROUP BY tidak mendukung ASC atau DESC.
  • Jika baik GROUP BY maupun ORDER BY digunakan, ekspresi dalam ORDER BY harus disertakan dalam klausa SELECT atau GROUP BY. Contohnya, pernyataan SQL berikut tidak didukung:
    SELECT pengguna FROM pengguna GROUP BY usia ORDER BY gaji;     
  • Fungsi agregat dan ekspresi yang mengandung fungsi agregat tidak dapat digunakan dalam klausa ORDER BY. Untuk menggunakan ekspresi tersebut, definisikan sebagai select_expr, berikan alias, lalu referensikan alias dalam klausa ORDER BY.
  • String kosong tidak dapat digunakan sebagai alias.

JOIN

PolarDB-X 1.0 mendukung sintaksis JOIN berikut dalam referensi_tabel dari pernyataan SELECT:

referensi_tabel:
    referensi_tabel_escape [, referensi_tabel_escape] ...

referensi_tabel_escape:
    referensi_tabel
  | { OJ referensi_tabel }

referensi_tabel:
    faktor_tabel
  | tabel_join

faktor_tabel:
    [nama_skema.]nama_tabel [[AS] alias] [daftar_petunjuk_indeks]
  | subquery_tabel [AS] alias
  | ( referensi_tabel )

tabel_join:
    referensi_tabel [INNER | CROSS] JOIN faktor_tabel [kondisi_join]
  | referensi_tabel {LEFT|RIGHT} [OUTER] JOIN referensi_tabel kondisi_join

kondisi_join:
    ON ekspresi_kondisional
  | USING (daftar_kolom)

daftar_petunjuk_indeks:
    petunjuk_indeks [, petunjuk_indeks] ...

petunjuk_indeks:
    USE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] ([daftar_indeks])
  | IGNORE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (daftar_indeks)
  | FORCE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (daftar_indeks)

daftar_indeks:
    nama_indeks [, nama_indeks] ...
            

Untuk menggunakan pernyataan JOIN, pertimbangkan faktor-faktor berikut:

  • JOIN, CROSS JOIN, dan INNER JOIN memiliki ekuivalensi sintaksis, termasuk di MySQL.
  • INNER JOIN tanpa klausa ON setara dengan menggunakan koma (,). Keduanya menunjukkan CROSS JOIN. Contohnya, pernyataan SQL berikut setara:
    SELECT * FROM t1 INNER JOIN t2 WHERE t1.id > 10
    SELECT * FROM t1, t2 WHERE t1.id > 10      
  • USING(daftar_kolom) menentukan kolom yang ada di kedua tabel untuk digabungkan. PolarDB-X 1.0 membangun kondisi ekuivalen berdasarkan kolom-kolom tersebut. Contohnya, fragmen SQL berikut setara:
    a LEFT JOIN b USING(c1, c2)
    a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2
                
  • Operator JOIN memiliki prioritas lebih tinggi daripada operator koma (,). Ekspresi JOIN t1, t2 JOIN t3 diartikan sebagai (t1, (t2 JOIN t3)), bukan ((t1, t2) JOIN t3).
  • LEFT JOIN dan RIGHT JOIN harus mencakup kondisi ON.
  • petunjuk_indeks menentukan indeks yang digunakan oleh MySQL. PolarDB-X 1.0 mendorong petunjuk ke database MySQL yang mendasarinya.
  • STRAIGHT_JOIN dan NATURAL JOIN tidak didukung.

UNION

PolarDB-X 1.0 mendukung sintaksis UNION berikut:

SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]        
Catatan Dalam setiap klausa SELECT dari UNION, PolarDB-X 1.0 tidak mendukung beberapa kolom dengan nama yang sama. Pernyataan SQL berikut tidak didukung karena nama kolom dalam klausa SELECT duplikat.
SELECT id, id, nama FROM t1 UNION SELECT pk, pk, nama FROM t2;          

Referensi