Topik ini menjelaskan sintaksis query dari plug-in aliyun-sql. Plug-in ini mendukung query dasar, query dengan kursor, query berformat JSON, query terjemahan, query khusus, fungsi yang ditentukan pengguna (UDF), serta fungsi dan ekspresi lainnya.
Query Dasar
- Query umum
POST /_alisql?pretty { "query": "select * from monitor where host='100.80.xx.xx' limit 5" } - Query dengan jumlah entri data yang telah ditentukan
POST /_alisql?pretty { "query": "select * from monitor", "fetch_size": 3 } - Query dengan parameter tertentu
POST /_alisql?pretty { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }Tipe Parameter Diperlukan Contoh Deskripsi Parameter URL pretty Tidak Tidak ada. Memformat hasil query. Parameter body permintaan query Ya select * from monitor where host='100.80.xx.xx' limit 5Menentukan pernyataan SQL yang ingin Anda jalankan. fetch_size Tidak 3Menentukan jumlah entri data yang akan dikembalikan. Nilai default adalah 1000. Nilai maksimum adalah 10000. Jika Anda menetapkan parameter ini ke nilai lebih dari 10000, sistem tetap menganggap nilainya sebagai 10000. null Kedua limit dan fetch_size dapat membatasi rentang query, namun memiliki perbedaan berikut:- limit: mendukung full query atau range query.
- fetch_size: mirip dengan Scroll.
params Tidak [{"type":"STRING","value":"100.80.xx.xx"}]Mengimplementasikan fitur antarmuka PreparedStatement. - Hasil query Saat menjalankan pernyataan SQL untuk meminta sejumlah besar data untuk pertama kalinya, jumlah entri data yang dikembalikan ditentukan oleh parameter fetch_size. Hasil query juga mencakup kursor.
{ "columns": [ { "name": "times", "type": "integer" }, { "name": "value2", "type": "float" }, { "name": "host", "type": "keyword" }, { "name": "region", "type": "keyword" }, { "name": "measurement", "type": "keyword" }, { "name": "timestamp", "type": "date" } ], "rows": [ [ 572575, 4649800.0, "100.80.xx.xx", "china-dd", "cpu", "2018-08-09T08:18:42.000Z" ] ], "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }Parameter Deskripsi columns namatipe dataNama dan tipe data dari bidang yang Anda kueri. rows Hasil query. cursor Kursor yang digunakan untuk query selanjutnya. null Secara default, jumlah maksimum entri data yang dikembalikan adalah 1.000. Jika jumlah entri data yang diminta melebihi 1.000, Anda dapat menggunakan kursor untuk meminta entri tambahan hingga tidak ada kursor atau entri data yang tersisa.
Query dengan kursor
- Permintaan query
POST /_alisql? pretty { "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }Tipe Parameter Diperlukan Deskripsi Parameter URL pretty Tidak Memformat hasil query. Parameter body permintaan cursor Ya Kursor yang digunakan untuk meminta data tertentu. - Hasil query
{ "rows": [ [ 572547, 3.327459E7, "100.80.xx.xx", "china-dd", "cpu", "2018-08-09T08:19:12.000Z" ] ], "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }Hasil query tidak mencakup bidang columns, sehingga mengurangi latensi transmisi jaringan. Bidang lain dalam hasil query serupa dengan bidang dalam hasil query dari query dasar.
Query berformat JSON
- Permintaan query (pernyataan JOIN tidak didukung)
POST /_alisql? format=org { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }format=orgmenunjukkan bahwa hasil query berada dalam format JSON. Parameter lainnya sama dengan yang digunakan dalam query dasar. Untuk informasi lebih lanjut, lihat Query Dasar. - Hasil query
{ "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAsWYXNEdlVJZzJTSXFfOGluOVB4Q3Z****", "took": 18, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.0, "hits": [ { "_index": "monitor", "_type": "_doc", "_id": "2", "_score": 1.0, "_source": { "times": 572575, "value2": 4649800, "host": "100.80.xx.xx", "region": "china-dd", "measurement": "cpu", "timestamp": "2018-08-09T16:18:42+0800" } } ] } }Hasil query memiliki format yang sama dengan pernyataan bahasa domain-spesifik (DSL). Parameter
_scroll_iddalam hasil query digunakan untuk query halaman.
Query Terjemahan
Anda dapat menggunakan query terjemahan untuk mengonversi pernyataan SQL menjadi pernyataan DSL yang didukung oleh Elasticsearch.
- Permintaan query (pernyataan JOIN tidak didukung)
POST _alisql/translate { "query": "select * from monitor where host= '100.80.xx.xx' " } - Hasil query
{ "size": 1000, "query": { "constant_score": { "filter": { "term": { "host": { "value": "100.80.xx.xx", "boost": 1.0 } } }, "boost": 1.0 } }, "_source": { "includes": [ "times", "value2", "host", "region", "measurement", "timestamp" ], "excludes": [] } }
Query Khusus
Plug-in aliyun-sql memungkinkan Anda meminta data berdasarkan bidang bertipe nested dan text.
- Buat skema tabel.
PUT user_info/ { "mappings":{ "_doc":{ "properties":{ "addr":{ "type":"text" }, "age":{ "type":"integer" }, "id":{ "type":"integer" }, "name":{ "type":"nested", "properties":{ "first_name":{ "type":"keyword" }, "second_name":{ "type":"keyword" } } } } } } } - Masukkan sejumlah besar data sekaligus.
PUT user_info/_doc/_bulk? refresh {"index":{"_id":"1"}} {"addr":"467 Hutchinson Court","age":80,"id":"1","name":[{"first_name":"lesi","second_name" : "Adams"},{"first_name":"chaochaosi","second_name" : "Aams"}]} {"index":{"_id":"2"}} {"addr":"671 Bristol Street","age":21,"id":"2","name":{"first_name":"Hattie","second_name" : "Bond"}} {"index":{"_id":"3"}} {"addr":"554 Bristol Street","age":23,"id":"3","name":{"first_name":"Hattie","second_name" : "Bond"}} - Minta informasi pengguna berdasarkan bidang
second_namebertipe nested.POST _alisql { "query": "select * from user_info where name.second_name='Adams'" }Hasil berikut dikembalikan:{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 1, "467 Hutchinson Court", "lesi", 80, "Adams" ] ] } - Minta informasi pengguna berdasarkan bidang
addrbertipe text.POST _alisql { "query": "select * from user_info where addr='Bristol'" }Hasil berikut dikembalikan:{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 2, "671 Bristol Street", "Hattie", 21, "Bond" ], [ 3, "554 Bristol Street", "Hattie", 23, "Bond" ] ] }
UDF
UDF hanya dapat ditambahkan selama inisialisasi plug-in aliyun-sql. Berikut adalah langkah-langkah untuk menambahkan UDF date_format:
- Definisikan kelas
DateFormat./** * DateFormat. */ public class DateFormat extends UDF { public String eval(DateTime time, String toFormat) { if (time == null || toFormat == null) { return null; } Date date = time.toDate(); SimpleDateFormat format = new SimpleDateFormat(toFormat); return format.format(date); } } - Tambahkan kelas
DateFormatke metode inisialisasi plug-in.udfTable.add(KeplerSqlUserDefinedScalarFunction .create("date_format" , DateFormat.class , (JavaTypeFactoryImpl) typeFactory)); - Gunakan UDF date_format untuk meminta data.
select date_format(date_f,'yyyy') from date_test
Fungsi dan Ekspresi Lainnya
| Tipe | Nama | Contoh | Deskripsi |
| Fungsi Numerik | ABS | SELECT ABS(num_field) FROM table | Mengembalikan nilai absolut dari sebuah angka. |
| ACOS | SELECT ACOS(num_field) FROM table | Mengembalikan arccosinus dari sebuah angka. | |
| ASIN | SELECT ASIN(num_field) FROM table | Mengembalikan arcsinus dari sebuah angka. | |
| ATAN | SELECT ATAN(num_field) FROM table | Mengembalikan arctangent dari sebuah angka. | |
| ATAN2 | SELECT ATAN2(num_field1,num_field2) FROM table | Mengembalikan arctangent dari dua angka. | |
| CEIL | SELECT CEIL(num_field) FROM table | Mengembalikan bilangan bulat terkecil yang lebih besar dari atau sama dengan sebuah angka. | |
| CBRT | SELECT CBRT(num_field) FROM table | Mengembalikan akar pangkat tiga presisi ganda dari sebuah angka. | |
| COS | SELECT COS(num_field) FROM table | Mengembalikan cosinus dari sebuah angka. | |
| COT | SELECT COT(num_field) FROM table | Mengembalikan cotangen dari sebuah angka. | |
| DEGREES | SELECT DEGREES(num_field) FROM table | Mengonversi radian menjadi derajat. | |
| EXP or EXPM1 | SELECT EXP(num_field) FROM table | Mengembalikan nilai e dipangkatkan sebuah angka. | |
| FLOOR | SELECT FLOOR(num_field) FROM table | Mengembalikan bilangan bulat terbesar yang kurang dari atau sama dengan sebuah angka. | |
| SIN | SELECT SIN(num_field) FROM table | Mengembalikan sinus dari sebuah angka. | |
| SINH | SELECT SINH(num_field) FROM table | Mengembalikan sinus hiperbolik dari sebuah angka. | |
| SQRT | SELECT SQRT(num_field) FROM table | Mengembalikan akar kuadrat positif dari sebuah angka. | |
| TAN | SELECT TAN(num_field) FROM table | Mengembalikan arctangent dari sebuah angka. | |
| ROUND | SELECT ROUND(num_field,2) FROM table | Membulatkan angka ke tempat desimal tertentu. | |
| RADIANS | SELECT RADIANS (num_field) FROM table | Mengonversi sudut dalam derajatke dalam radian yang setara. | |
| RAND | SELECT RAND() FROM table | Mengembalikan angka presisi ganda dengan tanda positif. Angka tersebut harus lebih besar dari atau sama dengan 0,0 dan kurang dari 1,0. | |
| LN | SELECT LN (num_field) FROM table | Mengembalikan logaritma natural dari sebuah angka. | |
| LOG10 | SELECT LOG10 (num_field) FROM table | Mengembalikan logaritma basis 10 dari sebuah angka. | |
| PI | SELECT PI() FROM table | Mengembalikan nilai PI. | |
| POWER | SELECT POWER (num_field,2) FROM table | Mengembalikan hasil dari sebuah angka yang dipangkatkan. | |
| TRUNCATE | SELECT TRUNCATE (num_field,2) FROM table | Memotong angka ke tempat desimal tertentu. | |
| Operasi Aritmatika | + | SELECT (v1 + v2) as v FROM table | Mengembalikan jumlah dari dua angka. |
| - | SELECT(v1 - v2) as v FROM table | Mengembalikan selisih dari dua angka. | |
| * | SELECT(v1 * v2) as v FROM table | Mengembalikan produk dari dua angka. | |
| / | SELECT(v1 / v2) as v FROM table | Mengembalikan hasil bagi dari satu angka dibagi oleh angka lainnya. | |
| % | SELECT(v1 % v2) as v FROM table | Mengembalikan sisa dari satu angka dibagi oleh angka lainnya. | |
| Operasi Logika | AND | SELECT * FROM table WHERE condition AND condition | Mengembalikan data untuk query di mana operasi AND dilakukan pada dua kondisi. |
| OR | SELECT * FROM table WHERE condition OR condition | Mengembalikan data untuk query di mana operasi OR dilakukan pada dua kondisi. | |
| NOT | SELECT * FROM table WHERE NOT condition | Mengembalikan data untuk query di mana suatu kondisi dikecualikan. | |
| IS NULL | SELECT * FROM table WHERE field IS NULL | Mengembalikan data untuk query di mana nilai bidang tertentu adalah null. | |
| IS NOT NULL | SELECT * FROM table WHERE field IS NOT NULL | Mengembalikan data untuk query di mana nilai bidang tertentu bukan null. | |
| Fungsi String | ASCII | SELECT ASCII(str_field) FROM table | Mengembalikan nilai ASCII dari sebuah karakter. |
| LCASE or LOWER | SELECT LCASE(str_field) FROM table | Mengonversi string menjadi huruf kecil. | |
| UCASE or UPPER | SELECT UCASE(str_field) FROM table | Mengonversi string menjadi huruf besar. | |
| CHAR_LENGTH or CHARACTER_LENGTH | SELECT CHAR_LENGTH(str_field) FROM table | Mengembalikan panjang string dalam byte. | |
| TRIM | SELECT TRIM(str_field) FROM table | Memotong string dengan menghapus spasi di awal dan akhir string. | |
| SPACE | SELECT SPACE(num_field) FROM table | Mengembalikan string yang mencakup sejumlah spasi tertentu. | |
| LEFT | SELECT LEFT(str_field, 3) FROM table | Mengembalikan sejumlah karakter paling kiri dari sebuah string. | |
| RIGHT | SELECT RIGHT(str_field, 3) FROM table | Mengembalikan sejumlah karakter paling kanan dari sebuah string. | |
| REPEAT | SELECT REPEAT(str_field, 3) FROM table | Mengulangi string sejumlah kali tertentu dan mengembalikan string hasilnya. | |
| REPLACE | SELECT REPLACE(str_field, "SQL", "HTML") FROM table | Mengganti substring dengan substring baru dalam sebuah string. | |
| POSITION | SELECT POSITION("test" IN str_field) FROM table | Mengembalikan posisi di mana substring muncul dalam sebuah string untuk pertama kalinya. | |
| REVERSE | SELECT REVERSE(str_test) from table | Membalikkan string dan mengembalikan string hasilnya. | |
| LPAD | SELECT LPAD(str_field, 20, "ABC") FROM table | Menambahkan karakter tertentu ke string berdasarkan panjang tertentu. | |
| CONCAT | SELECT CONCAT(str_field,'test') FROM table | Menggabungkan dua atau lebih string dan mengembalikan string hasilnya. | |
| SUBSTRING | SELECT SUBSTRING(str_field, 5, 3) FROM table | Mengembalikan substring yang diekstraksi dari string berdasarkan posisi karakter yang ditentukan. | |
| Fungsi Tanggal | CURRENT_DATE | SELECT CURRENT_DATE() FROM table | Mengembalikan tanggal saat ini. |
| CURRENT_TIME | SELECT CURRENT_TIME() FROM table | Mengembalikan waktu saat ini. | |
| CURRENT_TIMESTAMP | SELECT CURRENT_TIMESTAMP() FROM table | Mengembalikan tanggal dan waktu saat ini. | |
| DAYNAME | SELECT DAYNAME(date_field) FROM table | Mengembalikan hari dalam seminggu untuk sebuah tanggal. | |
| DAYOFMONTH | SELECT DAYOFMONTH(date_field) FROM table | Mengembalikan indeks hari dalam sebulan untuk sebuah tanggal. | |
| DAYOFYEAR | SELECT DAYOFYEAR(date_field) FROM table | Mengembalikan indeks hari dalam setahun untuk sebuah tanggal. | |
| DAYOFWEEK | SELECT DAYOFWEEK(date_field) FROM table | Mengembalikan indeks hari dalam seminggu untuk sebuah tanggal. | |
| HOUR | SELECT HOUR(date_field) FROM table | Mengembalikan bagian jam dari sebuah tanggal. | |
| MINUTE | SELECT MINUTE(date_field) FROM table | Mengembalikan bagian menit dari waktu atau datetime. | |
| SECOND | SELECT SECOND(date_field) FROM table | Mengembalikan bagian detik dari waktu atau datetime. | |
| YEAR | SELECT YEAR(date_field) FROM table | Mengembalikan bagian tahun dari sebuah tanggal. | |
| MONTH | SELECT MONTH(date_field) FROM table | Mengembalikan bagian bulan dari sebuah tanggal. | |
| WEEK | SELECT WEEK(date_field) FROM table | Mengembalikan indeks minggu di mana sebuah tanggal jatuh. Nilai valid untuk plug-in aliyun-sql: 1 hingga 54. Nilai valid untuk MySQL: 0 hingga 53. | |
| MONTHNAME | SELECT MONTHNAME(date_field) FROM table | Mengembalikan nama bulan untuk sebuah tanggal. | |
| LAST_DAY | SELECT LAST_DAY(date_field) FROM table | Mengembalikan hari terakhir dalam bulan untuk sebuah tanggal. | |
| QUARTER | SELECT QUARTER(date_field) FROM table | Mengembalikan kuartal dalam setahun untuk sebuah tanggal. | |
| EXTRACT | SELECT EXTRACT(MONTH FROM date_field) FROM table | Mengembalikan satu atau lebih bagian terpisah dari tanggal atau waktu. Misalnya, fungsi ini dapat mengembalikan bagian tahun, bulan, hari, jam, atau menit dari tanggal atau waktu. | |
| DATE_FORMAT | SELECT DATE_FORMAT(date_field,'yyyy') from date_test | Memformat tanggal atau waktu. | |
| Fungsi Agregasi | MIN | SELECT MIN(num_field) FROM table | Mengembalikan nilai minimum di antara sekumpulan nilai. |
| MAX | SELECT MAX(num_field) FROM table | Mengembalikan nilai maksimum di antara sekumpulan nilai. | |
| AVG | SELECT AVG(num_field) FROM table | Mengembalikan rata-rata dari sekumpulan nilai. | |
| SUM | SELECT SUM(num_field) FROM table | Mengembalikan jumlah dari sekumpulan nilai. | |
| COUNT | SELECT COUNT(num_field) FROM table | Mengembalikan jumlah rekaman yang memenuhi kondisi tertentu. | |
| Fungsi Lanjutan | CASE | SELECT * FROM table ORDER BY(CASE WHEN exp1 THEN exp2 ELSE exp3 END) | Sintaksnya adalah CASE WHEN THEN ELSE END. Jika kondisi yang ditentukan dalam klausa WHEN terpenuhi, nilai yang ditentukan dalam klausa THEN dikembalikan. Jika kondisi tidak terpenuhi, nilai yang ditentukan dalam klausa ELSE dikembalikan. Sintaks pernyataan CASE serupa dengan pernyataan IF THEN ELSE. |