All Products
Search
Document Center

Lindorm:SELECT

Last Updated:Feb 12, 2026

Mengkueri data dari sebuah tabel.

Engine yang berlaku

Sintaks SELECT berlaku untuk LindormTable dan LindormTSDB.

Batasan

Pernyataan SELECT di Lindorm hanya mendukung kueri datar (flattened queries), dan tidak mendukung kueri penggabungan beberapa tabel (JOIN) atau kueri himpunan seperti UNION dan INTERSECT.

Sintaks

SELECT [hint_clause] ( select_clause | '*' )
    FROM table_name
    [ WHERE where_clause ]
    [ GROUP BY group_by_clause ]
    [ ORDER BY ordering_clause ]
    [ LIMIT integer [OFFSET integer] ] | [LIMIT integer, integer]
select_clause    ::=  selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector         ::=  column_name
                      | term
                      | function_name '(' [ selector ( ',' selector )* ] ')'
where_clause     ::=  relation ( AND|OR relation )*
relation         ::=  column_name operator term
                      |'(' column_name ( ',' column_name )* ')' operator tuple_literal
operator         ::=  '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKE
group_by_clause  ::=  column_name ( ',' column_name )*
ordering_clause  ::=  column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*

hint_clause::=/*+hint_items*/
hint_items::=hint_item(','hint_item)*
hint_item::=identifier('('hint_option(','hint_option)*')')
hint_option::=expression

Catatan penggunaan

Klausa SELECT

Klausa SELECT menentukan kolom, konstanta, dan ekspresi fungsi yang akan ditampilkan dalam kueri. Gunakan kata kunci AS untuk menetapkan alias sementara bagi kolom dalam set hasil.

Klausa WHERE

Klausa WHERE menentukan kondisi kueri.

Pertimbangkan hal berikut saat menggunakan klausa WHERE untuk mengkueri data dalam tabel lebar:

  • Untuk menghindari kueri yang tidak efisien, tetapkan kondisi kueri berdasarkan aturan berikut:

    • Gunakan hanya kolom kunci primer pertama dari tabel atau kolom indeks pertama dari tabel indeks sebagai kondisi kueri.

    • Jika kondisi kueri mencakup kolom selain kolom kunci primer pertama atau kolom indeks pertama, tentukan batas atas dan bawah untuk kolom kunci primer pertama dari tabel atau kolom indeks pertama dari tabel indeks.

    Jika kondisi kueri tidak mengikuti aturan ini, Anda harus menggunakan /*+ _l_allow_filtering_ */ untuk memaksa kueri yang tidak efisien dijalankan. Untuk contoh, lihat Memaksa kueri yang tidak efisien.

  • Jika kolom dinamis diaktifkan untuk tabel lebar:

    • Untuk memastikan performa kueri, sertakan kolom kunci primer atau kolom indeks dalam klausa WHERE.

    • Kondisi untuk kolom dinamis dalam klausa WHERE harus berupa HexStrings.

    Untuk informasi lebih lanjut tentang kolom dinamis, lihat Kolom dinamis.

Klausa GROUP BY

LindormTable dan LindormTSDB mendukung klausa GROUP BY untuk pengelompokan dan agregasi. Perhatikan bahwa fungsi spasial-temporal tidak mendukung klausa GROUP BY.

Klausa ORDER BY

Menentukan satu atau beberapa kolom untuk mengurutkan set hasil kueri.

Penting
  • Pastikan nama kolom dalam klausa ORDER BY juga muncul dalam klausa SELECT. Jika tidak, terjadi error pemeriksaan semantik.

  • Klausa ORDER BY tidak mendukung alias.

Klausa LIMIT

Klausa LIMIT digunakan untuk kueri terpaginasi. Jika diikuti satu angka, angka tersebut menunjukkan jumlah baris yang dikembalikan. Jika diikuti dua angka yang dipisahkan koma (,), seperti LIMIT n, m, pernyataan tersebut melewati n baris dan mengembalikan m baris data. Bentuk [LIMIT integer [OFFSET integer]] setara dengan [LIMIT integer, integer].

Penting
  • Jika Anda menentukan OFFSET dalam klausa LIMIT, kueri tetap mengambil data yang dilewati oleh OFFSET tersebut. Untuk menghindari muatan kueri yang berlebihan, atur nilai OFFSET maksimal 5.000.

  • Jika kolom dinamis diaktifkan untuk tabel lebar, perhatikan hal berikut:

    • Saat Anda menggunakan SELECT * untuk mengkueri tabel dengan kolom dinamis, Anda harus menambahkan klausa LIMIT ke dalam pernyataan tersebut. Hal ini memastikan kebenaran metadata dalam set hasil.

    • Untuk kueri SELECT * pada tabel dengan kolom dinamis, nilai maksimum default untuk LIMIT adalah 5.000. Error akan dilaporkan jika nilai melebihi batas maksimum tersebut.

HINT

LindormTable dan LindormTSDB mendukung HINT untuk mengoptimalkan rencana kueri atau mengaktifkan fitur kueri tertentu. Untuk informasi lebih lanjut, lihat Ikhtisar HINT.

Contoh

Contoh dalam topik ini didasarkan pada pernyataan sampel dari topik CREATE TABLE dan UPSERT.

CREATE TABLE sensor (
    device_id VARCHAR NOT NULL,
    region VARCHAR NOT NULL,
    time BIGINT NOT NULL,
    temperature DOUBLE,
    humidity BIGINT,
    PRIMARY KEY(device_id, region, time)
);

Kueri simple

  • Mengkueri tabel sensor.

    SELECT * FROM sensor; --Pilih semua kolom.
    SELECT device_id,region,humidity FROM senor;  --Pilih kolom tertentu.
    SELECT * FROM sensor WHERE device_id = 'F07A1260' LIMIT 20 OFFSET 5; --Setara dengan LIMIT 5,20.
    SELECT count(*) AS countRow FROM sensor; --Tentukan alias.
  • Panggil fungsi spasial-temporal untuk melakukan kueri simple. Untuk informasi lebih lanjut tentang kategori dan deskripsi fungsi spasial-temporal, lihat Fungsi spasial-temporal.

    SELECT id, ST_AsText(g) FROM gps_data;
    SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;

Kueri agregasi

  • Hitung jumlah total catatan data yang dilaporkan oleh perangkat dengan ID F07A1260 pada titik waktu tertentu.

SELECT count(*) FROM sensor WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';
  • Kueri suhu maksimum dari perangkat dengan ID F07A1260 dalam periode waktu tertentu.

SELECT max(temperature) AS max_temp FROM sensor WHERE device_id = 'F07A1260' AND time >= '2021-04-22 15:33:00' AND time < '2021-04-22 15:33:20';

Kueri kondisional

  • Kueri kelembapan dari perangkat dengan ID F07A1260 di mana region-nya 'north-cn' dan suhu lebih dari 15 derajat, atau region-nya 'south-cn' dan suhu lebih dari 10 derajat, serta kelembapan tidak null.

SELECT device_id, humidity FROM sensor WHERE ((region='north-cn' AND temperature >15) OR (region='south-cn' AND temperature >10)) 
AND device_id = 'F07A1260' AND humidity is not null;
  • Kueri data untuk perangkat dengan ID F07A1260 atau F07A1261.

SELECT * FROM sensor WHERE device_id IN ('F07A1260', 'F07A1261');
  • Panggil fungsi spasial-temporal untuk melakukan kueri kondisional. Eksekusi efisien didukung untuk tiga kondisi spasial berikut: ST_Contains, ST_DWithin, dan ST_DWithinSphere.

    • Gunakan fungsi ST_Contains untuk mengkueri data yang sesuai dengan titik-titik dalam rentang spasial tertentu.

      SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
    • Gunakan fungsi ST_DWithin untuk mengkueri data yang sesuai dengan titik-titik dalam jarak planar tertentu dari pusat. Satuan: derajat.

      SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);
    • Gunakan fungsi ST_DWithinSphere untuk mengkueri data yang sesuai dengan titik-titik dalam jarak bola tertentu dari pusat. Satuan: meter.

      SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);

Memaksa kueri yang tidak efisien

Ketika LindormTable mengidentifikasi pernyataan SELECT sebagai kueri yang tidak efisien, LindormTable tidak menjalankan kueri tersebut secara default dan melemparkan exception. Hal ini mencegah kueri memengaruhi performa dan stabilitas Lindorm.

Untuk melewati pemeriksaan kueri tidak efisien dan memaksa kueri dijalankan, tambahkan /*+ _l_allow_filtering_ */ ke dalam pernyataan kueri.

SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity=20; 
Catatan

Kueri SELECT dianggap tidak efisien jika memenuhi semua kondisi berikut:

  • Klausa WHERE tidak menentukan batas atas dan bawah untuk kunci primer pertama tabel.

  • Klausa WHERE tidak menentukan batas atas dan bawah untuk kolom indeks pertama dari tabel indeks.

  • Klausa WHERE mengandung kondisi pada kolom yang bukan kunci primer pertama atau kolom indeks pertama.

Untuk informasi tentang cara menyelesaikan masalah terkait kueri tidak efisien, lihat Cara menyelesaikan atau menghindari kueri tidak efisien.