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::=expressionCatatan 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
WHEREharus 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.
Pastikan nama kolom dalam klausa
ORDER BYjuga muncul dalam klausa SELECT. Jika tidak, terjadi error pemeriksaan semantik.Klausa
ORDER BYtidak 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].
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
F07A1260pada 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
F07A1260dalam 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
F07A1260di 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
F07A1260atauF07A1261.
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, danST_DWithinSphere.Gunakan fungsi
ST_Containsuntuk 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_DWithinuntuk 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_DWithinSphereuntuk 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; Kueri SELECT dianggap tidak efisien jika memenuhi semua kondisi berikut:
Klausa
WHEREtidak menentukan batas atas dan bawah untuk kunci primer pertama tabel.Klausa
WHEREtidak menentukan batas atas dan bawah untuk kolom indeks pertama dari tabel indeks.Klausa
WHEREmengandung 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.