コンテンツにスキップ

SQLリファレンス

SHOW TABLESステートメント

SHOW TABLESは、アカウント上のテーブルを一覧表示するために使用できます。テーブル名は、ワーカーのバインディングを設定する際にdatasetとして指定した名前です(詳細についてはWorkers Analytics Engineの始め方を参照してください)。テーブルは、ワーカーにイベントデータを書き込むと自動的に作成されます。

SHOW TABLES
[FORMAT <format>]

利用可能なFORMATオプションについては、FORMAT句を参照してください。

SHOW TIMEZONESステートメント

SHOW TIMEZONESは、SQL APIがサポートするすべてのタイムゾーンを一覧表示するために使用できます。最も一般的なタイムゾーンがサポートされています。

SHOW TIMEZONES
[FORMAT <format>]

SHOW TIMEZONEステートメント

SHOW TIMEZONEは、SQL APIで使用されている現在のデフォルトタイムゾーンを返します。これは常にEtc/UTCであるべきです。

SHOW TIMEZONE
[FORMAT <format>]

SELECTステートメント

SELECTは、テーブルをクエリするために使用されます。

使用法:

SELECT <expression_list>
[FROM <table>|(<subquery>)]
[WHERE <expression>]
[GROUP BY <expression>, ...]
[ORDER BY <expression_list>]
[LIMIT <n>|ALL]
[FORMAT <format>]

各句の構文は以下の通りです。いくつかの例のクエリについては、SQL APIドキュメントを参照してください。

SELECT句

SELECT句は、結果に含める列のリストを指定します。 列はASキーワードを使用してエイリアスを付けることができます。

使用法:

SELECT <expression> [AS <alias>], ...

例:

-- 名前付き列を返す
SELECT blob2, double3
-- すべての列を返す
SELECT *
-- 列により説明的な名前を付ける
SELECT
blob2 AS probe_name,
double3 AS temperature

さらに、サポートされている関数演算子を使用した式を列名の代わりに使用できます:

SELECT
blob2 AS probe_name,
double3 AS temp_c,
double3*1.8+32 AS temp_f -- 値を計算する
SELECT
blob2 AS probe_name,
if(double3 <= 0, 'FREEZING', 'NOT FREEZING') AS description -- 関数の使用
SELECT
blob2 AS probe_name,
avg(double3) AS avg_temp -- 集約関数

FROM句

FROMは、クエリのデータのソースを指定するために使用されます。

使用法:

FROM <table_name>|(subquery)

例:

-- "temperatures"というワーカーのデータセットに書き込まれたデータをクエリする
FROM temperatures
-- サブクエリを使用してテーブルを操作する
FROM (
SELECT
blob1 AS probe_name,
count() as num_readings
FROM
temperatures
GROUP BY
probe_name
)

クエリは単一のテーブルでのみ操作できることに注意してください。UNIONJOINなどは現在サポートされていません。

WHERE句

WHEREは、クエリによって返される行をフィルタリングするために使用されます。

使用法:

WHERE <condition>

<condition>は、真偽値に評価される任意の式です。

比較演算子を使用して値を比較し、論理演算子を使用して条件を組み合わせることができます。

関数演算子を含む式もサポートされています。

例:

-- 単純な比較
WHERE blob1 = 'test'
WHERE double1 = 4
-- 不等式
WHERE double1 > 4
-- 演算子の使用(サポートされている演算子のリストは下記参照)
WHERE double1 + double2 > 4
WHERE blob1 = 'test1' OR blob2 = 'test2'
-- 不等式、関数、演算子を使用した式
WHERE if(unit = 'f', (temp-32)/1.8, temp) <= 0

GROUP BY句

集約関数を使用する場合、GROUP BYは集約が実行されるグループを指定します。

使用法:

GROUP BY <expression>, ...

例えば、温度測定のテーブルがある場合:

-- 各プローブの平均温度を返す
SELECT
blob1 AS probe_name,
avg(double1) AS average_temp
FROM temperature_readings
GROUP BY probe_name

通常、<expression>は単に列名であることができますが、ここに複雑な式を提供することも可能です。複数の式や列名をカンマで区切って提供できます。

ORDER BY句

ORDER BYは、行が返される順序を制御するために使用できます。

使用法:

ORDER BY <expression> [ASC|DESC], ...

<expression>は単に列名であることができます。

ASCまたはDESCは、順序が昇順か降順かを決定します。ASCがデフォルトであり、省略可能です。

例:

-- double2、次にdouble3で、両方とも昇順で並べる
ORDER BY double2, double3
-- double2を昇順で並べ、その後double3を降順で並べる
ORDER BY double2, double3 DESC

LIMIT句

LIMITは、返される最大行数を指定します。

使用法:

LIMIT <n>|ALL

返される最大行数を指定するか、制限なしの場合はALLを指定します。

例えば:

LIMIT 10 -- 最大10行を返す

FORMAT句

FORMATは、返されるデータのエンコード方法を制御します。

使用法:

FORMAT [JSON|JSONEachRow|TabSeparated]

フォーマット句が含まれていない場合、デフォルトのフォーマットはJSONが使用されます。

デフォルトをオーバーライドするには、フォーマットを設定します。例えば:

FORMAT JSONEachRow

以下のフォーマットがサポートされています:

JSON

データは、スキーマデータを含む単一のJSONオブジェクトとして返されます:

{
"meta": [
{
"name": "<column 1 name>",
"type": "<column 1 type>"
},
{
"name": "<column 2 name>",
"type": "<column 2 type>"
},
...
],
"data": [
{
"<column 1 name>": "<column 1 value>",
"<column 2 name>": "<column 2 value>",
...
},
{
"<column 1 name>": "<column 1 value>",
"<column 2 name>": "<column 2 value>",
...
},
...
],
"rows": 10
}

JSONEachRow

データは、各行ごとに別々のJSONオブジェクトとして返されます。行は改行で区切られ、ヘッダー行やスキーマデータはありません:

{"<column 1 name>": "<column 1 value>", "<column 2 name>": "<column 2 value>"}
{"<column 1 name>": "<column 1 value>", "<column 2 name>": "<column 2 value>"}
...

TabSeparated

データは、改行で区切られた行として返されます。列はタブで区切られます。ヘッダーはありません。

column 1 value column 2 value
column 1 value column 2 value
...

サポートされている関数

count

使用法:

count()
count(DISTINCT column_name)

Countは、各グループまたは結果セット内の行数を返す集約関数です。

Countは、各列内の異なる(ユニークな)値の数をカウントするためにも使用できます。

例:

-- 行の総数を返す
count()
-- 列内の異なる値の数を返す
count(DISTINCT column_name)

sum

使用法:

sum([DISTINCT] column_name)

Sumは、各グループまたは結果セット内のすべての行の列値の合計を返す集約関数です。SumはDISTINCTもサポートしますが、この場合は列内のユニークな値のみを合計します。

例:

-- すべてのアイテムの総コストを返す
sum(item_cost)
-- すべてのユニークなアイテムコストの合計を返す
sum(DISTINCT item_cost)

avg

使用法:

avg([DISTINCT] column_name)

Avgは、各グループまたは結果セット内のすべての行の列値の平均を返す集約関数です。AvgはDISTINCTもサポートしますが、この場合は列内のユニークな値のみを平均します。

例:

-- アイテムコストの平均を返す
avg(item_cost)
-- ユニークなアイテムコストの平均を返す
avg(DISTINCT item_cost)

min

使用法:

min(column_name)

Minは、すべての行の列の最小値を返す集約関数です。

例:

-- アイテムコストの最小値を返す
min(item_cost)

max

使用法:

max(column_name)

Maxは、すべての行の列の最大値を返す集約関数です。

例:

-- アイテムコストの最大値を返す
max(item_cost)

quantileWeighted

使用法:

quantileWeighted(q, column_name, weight_column_name)

quantileWeightedは、各グループまたは結果セット内の指定された列のqth分位数の値を返す集約関数です。各行はweight_column_nameの値によって重み付けされます。通常、これは_sample_intervalになります(詳細についてはサンプリングの仕組みを参照してください)。

例:

-- <double1>の中央値を推定する
quantileWeighted(0.5, double1, _sample_interval)
-- クエリ時間のテーブルで、95パーセンタイルのクエリ時間を推定する
quantileWeighted(0.95, query_time, _sample_interval)

if

使用法:

if(<condition>, <true_expression>, <false_expression>)

<condition>が真である場合は<true_expression>を返し、そうでない場合は<false_expression>を返します。

例:

if(temp > 20, '暖かいです', 'ジャンパーを持ってきてください')

intDiv

使用法:

intDiv(a, b)

aをbで割り、答えを最も近い整数に切り下げます。

toUInt32

使用法:

toUInt32(<expression>)

任意の数値式、または小数の文字列表現を結果として持つ式を符号なし32ビット整数に変換します。

負の数に対する動作は未定義です。

length

使用法:

length({string})

文字列の長さを返します。この関数はUTF-8に対応しています。

例:

SELECT length('文字列') AS s;
SELECT length(blob1) AS s FROM your_dataset;

isEmpty

使用法:

isEmpty({string})

文字列が空であるかどうかを示す真偽値を返します。この計算は、バイナリ操作としても行うことができます: {string} = ''

例:

SELECT isEmpty('文字列') AS b;
SELECT isEmpty(blob1) AS b FROM your_dataset;

toLower

使用法:

toLower({string})

文字列を小文字に変換して返します。この関数はUnicodeに対応しています。すべての言語に対して完璧ではない場合があり、厳密なニーズを持つユーザーは、自分のコードで操作を行うべきです。

例:

SELECT toLower('大文字を小文字に') AS s;
SELECT toLower(blob1) AS s FROM your_dataset;

toUpper

使用法:

toUpper({string})

文字列を大文字に変換して返します。この関数はUnicodeに対応しています。結果はすべての言語に対して完璧ではない場合があり、厳密なニーズを持つユーザーは、自分のコードで操作を行うべきです。

例:

SELECT toUpper('小文字を大文字に') AS s;
SELECT toUpper(blob1) AS s FROM your_dataset;

startsWith

使用法:

startsWith({string}, {string})

最初の文字列が2番目の文字列で始まるかどうかの真偽値を返します。

例:

SELECT startsWith('接頭辞 ...', '接頭辞') AS b;
SELECT startsWith(blob1, '接頭辞') AS b FROM your_dataset;

endsWith

使用法:

endsWith({string}, {string})

最初の文字列が2番目の文字列で終わるかどうかの真偽値を返します。

例:

SELECT endsWith('接頭辞 接尾辞', '接尾辞') AS b;
SELECT endsWith(blob1, '接尾辞') AS b FROM your_dataset;

position

使用法:

position({needle:string} IN {haystack:string})

1つの文字列needleが別の文字列haystack内の位置を返します。SQLでは、インデックスは通常1から始まります。つまり、位置はneedlehaystackの先頭にある場合は1を返します。文字列が見つからない場合は0を返します。

例:

SELECT position(':' IN 'hello: world') AS p;
SELECT position(':' IN blob1) AS p FROM your_dataset;

substring

使用法:

substring({string}, {offset:integer}[. {length:integer}])

文字列の一部を抽出し、オフセットで示されたUnicodeコードポイントから始め、要求された長さのコードポイントを返します。前述のように、SQLではインデックスは通常1から始まります。つまり、substringに提供されるオフセットは少なくとも1である必要があります。

例:

SELECT substring('hello world', 6) AS s;
SELECT substring('hello: world', 1, position(':' IN 'hello: world')-1) AS s;

format

使用法:

format({string}[, ...])

この関数は、文字列、整数、浮動小数点数、日付時刻、間隔などのフォーマットをサポートしますが、NULLはサポートしていません。フォーマット文字列内のリテラル{および}文字はサポートされていません。

例:

SELECT format('blob1: {}', blob1) AS s FROM dataset;

また、formatDateTimeも参照してください。

toDateTime

使用法:

toDateTime(<expression>[, 'timezone string'])

toDateTimeは、式を日付時刻に変換します。この関数はISO 8601スタイルのタイムゾーンをサポートしていません。UTC以外の時間の場合は、2番目のオプション引数を使用してタイムゾーンを提供する必要があります。

例:

-- double1には秒単位のUnixタイムスタンプが含まれています
toDateTime(double1)
-- blob1には'YYYY-MM-DD hh:mm:ss'形式の日付時刻が含まれています
toDateTime(blob1)
-- リテラル値:
toDateTime(355924804) -- Unixタイムスタンプ
toDateTime('355924804') -- Unixタイムスタンプを含む文字列
toDateTime('1981-04-12 12:00:04') -- 'YYYY-MM-DD hh:mm:ss'形式の日付時刻を含む文字列
-- ニューヨーク時間に相対的な日付を解釈する
toDateTime('2022-12-01 16:17:00', 'America/New_York')

now

使用法:

now()

現在の時間をDateTimeとして返します。

toUnixTimestamp

使用法:

toUnixTimestamp(<datetime>)

toUnixTimestampは、日付時刻を整数のUnixタイムスタンプに変換します。

例:

-- 現在のUnixタイムスタンプを取得する
toUnixTimestamp(now())

formatDateTime

使用法:

formatDateTime(<datetime expression>, <format string>[, <timezone string>])

formatDateTime は、提供されたフォーマット文字列に従って日付時刻を文字列として出力します。サポートされているフォーマットオプションのリストについては、ClickHouseのドキュメントを参照してください。

例:

-- 現在のYYYY-MM-DDをUTCで出力
formatDateTime(now(), '%Y-%m-%d')
-- 日付時刻のタイムゾーンでYYYY-MM-DDを出力
formatDateTime(<a datetime with a timezone>, '%Y-%m-%d')
formatDateTime(toDateTime('2022-12-01 16:17:00', 'America/New_York'), '%Y-%m-%d')
-- UTCでYYYY-MM-DDを出力
formatDateTime(<a datetime with a timezone>, '%Y-%m-%d', 'Etc/UTC')
formatDateTime(toDateTime('2022-12-01 16:17:00', 'America/New_York'), '%Y-%m-%d', 'Etc/UTC')

toStartOfInterval

使用法:

toStartOfInterval(<datetime>, INTERVAL '<n>' <unit>[, <timezone string>])

toStartOfInterval は、提供された間隔の最も近いオフセットに日付時刻を切り下げます。これは、データを等しいサイズの時間範囲にグループ化するのに便利です。

例:

-- 現在の時間を最も近い15分に切り下げる
toStartOfInterval(now(), INTERVAL '15' MINUTE)
-- タイムスタンプを日単位に切り下げる
toStartOfInterval(timestamp, INTERVAL '1' DAY)
-- 各時間ウィンドウに記録されたデータポイントの数をカウント
SELECT
toStartOfInterval(timestamp, INTERVAL '1' HOUR) AS hour,
sum(_sample_interval) AS count
FROM your_dataset
GROUP BY hour
ORDER BY hour ASC

extract

使用法:

extract(<time unit> from <datetime>)

extract は、日付時刻から時間単位の整数を返します。YEARMONTHDAYHOURMINUTE、および SECOND をサポートしています。

例:

-- タイムスタンプから秒数を抽出(この例では15を返す)
extract(SECOND from toDateTime('2022-06-06 11:30:15'))

サポートされている演算子

以下の演算子がサポートされています:

算術演算子

演算子説明
+加算
-減算
*乗算
/除算
%剰余

比較演算子

演算子説明
=等しい
<より小さい
>より大きい
<=以下
>=以上
<> または !=等しくない
IN前の式の値がリストに含まれている場合は真
column IN ('a', 'list', 'of', 'values')
NOT IN前の式の値がリストに含まれていない場合は真
column NOT IN ('a', 'list', 'of', 'values')

また、値が包括的な範囲にあるかどうかを確認するために BETWEEN 演算子もサポートしています: a [NOT] BETWEEN b AND c

ブール演算子

演算子説明
ANDブール “AND”(両方が真の場合は真)
ORブール “OR”(いずれか一方または両方が真の場合は真)
NOTブール “NOT”(次の式が偽の場合は真、その逆もまた然り)

単項演算子

演算子説明
-否定演算子(例: -42

リテラル

構文
整数42, -42
倍精度浮動小数点4.2, -4.2
文字列'so long and thanks for all the fish'
ブールtrue または false
時間間隔INTERVAL '42' DAY
YEARMONTHDAYHOURMINUTE、および SECOND の間隔がサポートされています