語法

CannerFlow SQL Engine (ANSI SQL) 底層基於 Presto 去做優化以及設計,目前 CannerFlow SQL explorer 只支援 Presto 中的 SELECT statement。可以參考 Presto 官網的 SELECT statement 相關資料

所有操作都為 ANSI SQL compliant 的語法。ANSI SQL 相關介紹可以參考 W3School SQL Tutorial

SELECT

選擇特定欄位

SELECT column1, column2
FROM table_name;

選擇所有欄位

SELECT *
FROM table_name;

WHERE

依照條件選擇資料

SELECT *
FROM table_name
WHERE column1 > value1;

AND, OR

連接多個條件

SELECT *
FROM table_name
WHERE column1 > value1 AND column2 > value1 OR column3 > value1;

Operators

可允許的比較運算符號以及語法

  • < 小於

    SELECT *
    FROM table_name
    WHERE column1 < value1;
  • > 大於

    SELECT *
    FROM table_name
    WHERE column1 > value1;
  • <= 小於或是等於

    SELECT *
    FROM table_name
    WHERE column1 <= value1;
  • >= 大於或是等於

    SELECT *
    FROM table_name
    WHERE column1 >= value1;
  • = 等於

    SELECT *
    FROM table_name
    WHERE column1 = value1;
  • <> 不等於

    SELECT *
    FROM table_name
    WHERE column1 <> value1;
  • != 不等於

    SELECT *
    FROM table_name
    WHERE column1 != value1;
  • BETWEEN a AND b 介於 a 與 b

    SELECT *
    FROM table_name
    WHERE column1 BETWEEN value1 AND value2;
  • IN (a, b, c, ...) 為 a, b, c 其中之一

    SELECT *
    FROM table_name
    WHERE column IN (12, 15, 18)
  • IS NULL 判斷是否為 Null

    SELECT *
    FROM table_name
    WHERE column1 IS NULL;

Operators for Specified Types

以下是一些常見用法提供你針對不同型別的欄位做搜尋。

  • UUID

    使用 uuid 前綴轉型

    SELECT * FROM table
    WHERE id = uuid 'affa0ba3-2744-47c6-9f2a-35b8e2d56581'
  • Timestamp

    使用 timestamp 前綴轉型

    SELECT * FROM table
    WHERE create_at > timestamp '2019-08-01 00:00'

    使用 date 前綴轉型

    SELECT * FROM table
    WHERE create_at > date '2019-08-01'

    搭配 interval 取得其他時間

    SELECT * FROM table
    WHERE create_at > date '2019-08-01'
    AND create_at < date '2019-08-01' + interval '1' month
  • VARCHAR

    使用 LIKE 搭配 % 去匹配無或是任意字元

    SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS table_name (column1)
    WHERE column1 LIKE '%b%'
    --returns 'abc' AND 'bcd'

    使用 LIKE 搭配 _,匹配單一字元

    SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS table_name (column1)
    WHERE column1 like '_b%'
    --returns 'abc'

ORDER BY

由小至大排序

SELECT *
FROM table_name
ORDER BY column1 ASC

由大至小排序

SELECT *
FROM table_name
ORDER BY column1 DESC

NULL 排序在最前

SELECT *
FROM table_name
ORDER BY column1 ASC NULLS FIRST

NULL 排序在最後

SELECT *
FROM table_name
ORDER BY column1 ASC NULLS LAST

GROUP BY

依照特定欄位分組

SELECT *
FROM table_name
GROUP BY column1

依照特定欄位分組

SELECT count(*)
FROM table_name
GROUP BY column1

HAVING

篩選分組過後的資料。

SELECT count(column1), column2
FROM table_name
GROUP BY column2
HAVING count(column1) > value1

JOIN

依照特定欄位組合兩張表

SELECT *
FROM table1
JOIN table2
ON table1.column1 = table2.column1

UNION

合併兩張表

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

LIMIT, OFFSET

  • LIMIT number 最多取得幾筆資料
  • OFFSET number 忽略前幾筆資料

取得第 5 筆之後的 10 筆資料

SELECT *
FROM table_name
OFFSET 5
LIMIT 10