SELECT
テーブルのデータを返します。
1つのテーブルのデータを返します。すべてのパーティションからすべての行が返されるため、WHERE
句を指定しないでSELECT
文を使用することは推奨されません。
WHERE
句を使用してクエリーを1つのパーティションに限定することを推奨します。クエリーが複数のパーティションにまたがっていると、パフォーマンスに影響を与える可能性があります。構文
SELECT [ JSON ] selectors FROM [keyspace_name.]table_name [ WHERE [ primary_key_conditions ] [ AND ] [ index_conditions ] [ GROUP BY column_name [ , ... ] ] [ ORDER BY PK_column_name [ , ... ] ( ASC | DESC ) ] [ ( LIMIT N | PER PARTITION LIMIT N ) ] [ ALLOW FILTERING ] ;
構文規則 | 説明 |
---|---|
大文字 | リテラル・キーワード。 |
小文字 | リテラル以外。 |
イタリック体 |
変数値。ユーザー定義値と置き換えます。 |
[] |
任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。 |
( ) |
グループ。丸かっこ(( ) )は、選択肢を含むグループを示します。丸かっこは入力しないでください。 |
| |
または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。 |
... |
繰り返し可能。省略記号(... )は、構文要素を必要な回数だけ繰り返すことができることを示します。 |
'Literal string' |
単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。 |
{ key : value } |
マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。 |
<datatype1,datatype2> |
セット、リスト、マップ、またはタプル。山かっこ(< > )で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。 |
cql_statement; |
CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。 |
[--] |
コマンドライン・オプションとコマンド引数は、2つのハイフン(-- )。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。 |
' <schema> ... </schema> ' |
検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。 |
@xml_entity='xml_entity_type' |
検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。 |
- selectors
-
結果セットで返されるカラムを指定します。
column_list | DISTINCT partition_key [ AS output_name ]
制約事項: カラム・リストまたはDISTINCT
partition_keyを使用します。 - column_list
-
結果セットで返されるカラムとその順序を指定します。カラムのコンマ区切りリストを指定するか、アスタリスクを使用して格納順にすべてのカラムを取得します。
column_name | function_name( argument_list )
- column_name:結果セットに1つのカラムを含めます。
- function_name( arguments ):結果セットの行ごとに指定した引数に対して関数を実行します。「CQLネイティブ関数」および「ユーザー定義関数の作成(UDF)」を参照してください。
- aggregate_name( arguments ):条件が一致するデータに対して集計を実行し、1つの結果を返します。「CQLネイティブの集計」および「CREATE AGGREGATE」を参照してください。
- DISTINCT partition_key
-
完全なpartition keyの一意な値を返します。複合パーティション・キーには、カラムのコンマ区切りのリストを使用します。
ヒント:DESC TABLE table_name
を実行してPRIMARY KEY
定義を取得してから、SELECT DISTINCT partition_key FROM table_name
を実行してテーブル・パーティション値を取得します。 - AS output_name
- たとえば以下のように、結果セットのカラム名を新しい出力名に変更します。
COUNT(id) AS "Cyclist Count"
注: 名前に特殊文字やスペースが含まれている場合、または大文字と小文字の区別を維持する場合は、新しい名前を二重引用符で囲んでください。
keyspace_name.table_name
FROM "TestTable"
primary_key_conditions
partition_conditions
[ AND clustering_conditions ] | [ AND index_conditions ]
ロジック文の構文
カラム値をテストするロジック文を作成するには、次の構文を使用します。
column_name operator value
AND
で区切ります。すべての条件を満たす行が返されます。例を次に示します。SELECT rank, cyclist_name AS name FROM cycling.rank_by_year_and_name WHERE "race_name" = 'Tour of Japan - Stage 4 - Minami > Shinshu' AND race_year = 2014;
- column_name
- 大文字または特殊文字を含むカラム名は、二重引用符で囲みます。注: 文字列値は単一引用符で囲みます。
- 演算子
-
演算子 説明 =
カラム値が指定した値と完全に一致する。 IN
値のコンマ区切りリスト内の任意の値に等しい。 >=
指定した値以上。 <=
指定した値以下。 >
指定した値よりも大きい。 <
指定した値よりも小さい。 CONTAINS
任意の種類のコレクションに含まれている値と一致する。インデックス付きのコレクションに対してのみ使用します。 CONTAINS KEY
マップ内のキー名と一致する。インデックス付きのキーのあるマップに対してのみ使用します。 - value
- 文字列値は単一引用符で囲みます。 注: 大文字または特殊文字を含むカラム名は、二重引用符で囲みます。
データの場所の特定とクラスター化カラムによるフィルター
WHERE
句を使用します。データベースではWHERE
ロジック文を階層的に評価します。 - パーティション・キー・カラム:等価演算子を使用してすべてのパーティション・キー値(またはその欠落)を特定します。パフォーマンスの低下を回避するため、データ・モデルが単一パーティション・クエリーをサポートしていることを確認します。注: 通常、パーティションは大きなデータ・セットです。パーティショナーは、パーティション・キー・カラムのハッシュを作成してデータを分散させ、同じハッシュのすべての行を同じノードに格納します。パーティション・キーの日付カラム値の7/01/2017と7/02/2017のように、類似するデータが同じノードにない場合があります。
- クラスター化カラムは、パーティション内のソート順を決定します。データは、最初のクラスター化カラム、2番目のクラスター化カラムのように順にソートされます。
ALLOW FILTERING
は、パーティション・カラム、クラスター化カラム、および通常のカラムのフィルターに対する制限をオーバーライドしますが、読み取りレイテンシーを生じてパフォーマンスが低下する可能性があります。プロダクション環境では、ALLOW FILTERING
を使用しないでください。テスト環境では、cqlsh TRACINGを使用してパフォーマンスの問題を分析してください。- partition_conditions
-
データベースでは、セカンダリ・インデックスまたは検索インデックスをクエリーする場合を除き、すべてのパーティションを制限する必要があります。次の演算子でパーティション・キー・カラムを特定するロジック文を使用します。
- 等号(=):パーティション・キー・カラム。
- IN:複数のパーティションを検索するには、パーティション・キーの最後のカラムに制限します。
- トークンの範囲(>=、<=、>、および<):パーティション・キーを完全にトークン化します(token関数の引数として順番に指定されたすべてのパーティション・キー・カラム)。トークン範囲を使用して特定のノードに格納したデータをスキャンします。
注: セカンダリ・インデックス・クエリーでは、パーティション・キー・ロジック文で使用できる演算子は等価のみです。例と手順については、「パーティション・キー」を参照してください。
- clustering_conditions
-
クラスター化セグメントを特定するロジック文を使用します。クラスター化カラムは、複数のクラスター化カラムがある場合はネストされる、格納データのソート順を設定します。パーティション・キーの評価後、データベースは、1番目(最上位)、2番目、3番目などネストされた順序でクラスター化した文を評価します。
テーブルにクラスター化カラムが1つしかない場合、ロジック文ではすべての演算子がサポートされます。テーブルに複数のクラスター化カラムがある場合にテーブルのパーティション内のデータを効率よく見つけるには、次の制限を適用します。- 最後のクラスター化カラムを除くすべてのクラスター化カラム:
- 等号(=)
- IN
- 最後のクラスター化カラム:すべての等価演算子、非等価演算子、および複数のカラムの比較
クラスター化カラムのロジック文では、複数のクラスター化セグメントに及ぶスライスを返すこともできます。
( column1, column2, ... ) operator ( value1, value2, ... ) [ AND ( column1, column2, ... ) operator ( value1, value2, ... ) ]
スライスを使用すると、対応する値のある行を特定し、その前、後および間にあるすべての行を返すことができます(2つのスライス文が含まれている場合)。
例と手順については、「クラスター化カラム」を参照してください。
- 最後のクラスター化カラムを除くすべてのクラスター化カラム:
index_conditions
DSEでは、次のインデックスの種類をサポートしています。
- セカンダリ・インデックス
- セカンダリ・インデックス・カラムのロジック文では、次の演算子がサポートされています。
- =
- インデックス・コレクション型に対するCONTAINS
- インデックス・マップ型に対するCONTAINS KEY
- Solrクエリー
- Solr式を作成し、
solr_query
オプションを使用してクエリをフィルター処理します。「検索インデックス・フィルターの構文」を参照してください。 - SASIインデックス
- SSTable Attached Secondary Index(SASI)を使用してデータを取得するには、「SASIの使用」を参照してください。
その他のオプション
クエリーで返されるデータのスコープと順序を変更します。
- GROUP BY column_name | function_name( argument_list )
- 関数で返されるカラムまたは値のセットについて同じ値を共有する選択した行を1つのグループにまとめます。
- ORDER BY ( ASC | DESC )
- 結果セットを昇順(ASC)または降順(DESC)にソートします。 注: 順序が指定されていない場合、結果は格納された順に返されます。
- ALLOW FILTERING
- プライマリ・キーを特定するロジック文を適用せずにフィルター処理を有効にします。クラスターのフルスキャンが行われるため、プロダクション環境では
ALLOW FILTERING
を使用しないでください。注: 「Allow Filtering explained」を参照してください。 - LIMIT N | PER PARTITION LIMIT N
- 結果セットで返されるレコード数を制限します。
例
カラム別名の使用
MIN(rank)
に別名best_rank
を使用します。SELECT MIN(rank) AS best_rank, cyclist_name FROM cycling.rank_by_year_and_name WHERE "race_name" = 'Tour of Japan - Stage 4 - Minami > Shinshu' AND race_year = 2014;
best_rank | cyclist_name
-----------+---------------
1 | Daniel MARTIN
(1 rows)
FROMを使用したソース・テーブルの指定
次のSELECT文の例では、rank_by_year_and_name
テーブルの行数が返されます。
SELECT COUNT(*) FROM cycling.rank_by_year_and_name;
LIMITを使用した、返される行数の制御
LIMIT
オプションは、クエリーが返す最大行数を設定します。
SELECT lastname FROM cycling.cyclist_name LIMIT 50000;
たとえば、クエリーが105,291行と一致しても、データベースは最初の50,000行のみを返します。
cqlsh
シェルのデフォルトの行数は10,000に制限されています。DSEサーバーとネイティブ・プロトコルでは、返される行の数は制限されませんが、誤った形式のクエリーによってシステムが不安定になるのを防ぐためにタイムアウトが適用されます。
パーティションの選択
WHERE partition_column = value
WHERE partition_column IN ( value1, value2 [ ,... ] )
AND
で区切られたパーティション・キー・カラムごとに条件を作成します。WHERE partition_column1 = value1 AND partition_column2 = value2 [ AND ... ] )
PER PARTITION LIMITを使用した、返される行数の制御
PER PARTITION LIMIT
オプションを使用して、クエリーで各パーティションから返される行数の最大数を設定します。
たとえば、cyclingキースペースには次のテーブルが含まれます。
CREATE TABLE cycling.rank_by_year_and_name ( race_year int, race_name text, cyclist_name text, rank int, PRIMARY KEY ((race_year, race_name), rank) );
このテーブルには次の行が含まれます。
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT
2014 | 4th Tour of Beijing | 2 | Daniel MARTIN
2014 | 4th Tour of Beijing | 3 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Benjamin PRADES
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
(11 rows)
このクエリーは、PER PARTITION LIMIT 2
を使用して、レース年とレース名の組み合わせごとに上位2名のレーサーを返します。
SELECT * FROM cycling.rank_by_year_and_name PER PARTITION LIMIT 2;
出力:
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT
2014 | 4th Tour of Beijing | 2 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN
(8 rows)
WHEREを使用したデータのフィルター
WHERE
句には、SELECTで返された行をフィルター処理する1つまたは複数の関係が含まれます。
カラムの仕様
- テーブルのパーティション・キーの1つまたは複数のメンバー。
- クラスター化カラム(関係の前にパーティション・キー内のすべてのカラムを指定する他の関係がある場合)。
- CREATE INDEXを使用してインデックスが作成されたカラム。
WHERE
句では、別名ではなく実際の名前を使用してカラムを参照してください。パーティション・キーでのフィルター
id
があります(これは、プライマリ・キーの唯一のカラムであるため、デフォルトのパーティション・キーになります)。CREATE TABLE cycling.cyclist_career_teams ( id UUID PRIMARY KEY, lastname text, teams set<text> );このクエリーでは、WHERE句にパーティション・キー
id
値が含まれています。SELECT id, lastname, teams FROM cycling.cyclist_career_teams WHERE id = 5b6962dd-3f90-4c93-8f61-eabfa4a803e2;
この例のテーブルには、より複雑なプライマリ・キーが含まれています。
CREATE TABLE cycling.events ( year int, start_month int, start_day int, end_month int, end_day int, race text, discipline text, location text, uci_code text, PRIMARY KEY ( (year, discipline), start_month, start_day, race ) );このクエリーには、
race
カラムの前にあるプライマリ・キー・カラムの値を指定するWHERE
句が含まれています。SELECT * FROM cycling.events WHERE year = 2017 AND discipline = 'Cyclo-cross' AND start_month = 1 AND start_day = 1;
出力:
year | discipline | start_month | start_day | race | end_day | end_month | location | uci_code
------+-------------+-------------+-----------+----------------------------------------+---------+-----------+----------+----------
2017 | Cyclo-cross | 1 | 1 | DVV verzekeringen trofee - GP Sven Nys | null | null | Baal | C1
(1 rows)
クラスター化カラムでのフィルター
パーティション・キーのすべての要素を参照する関係がその前にある場合のみ、クラスター化カラムに対して関係を使用します。
cyclingキースペースのテーブル例(パーティション・キーはidカラム、クラスター化カラムはrace_points):
CREATE TABLE cycling.cyclist_points ( id UUID, race_points int, firstname text, lastname text, race_title text, PRIMARY KEY (id, race_points) );
クエリーの例:
SELECT SUM(race_points) FROM cycling.cyclist_points WHERE id = e3b19ec4-774a-4d1c-9e5a-decec1e30aac AND race_points > 7;
出力:
system.sum(race_points)
-------------------------
195
(1 rows)
ALLOW FILTERING
を追加して、インデックスなしのクラスター化カラムをフィルター処理できます。 ALLOW FILTERING
を使用しないでください。race_start_date
という名前のクラスター化カラムが含まれていますが、セカンダリ・インデックスはありません。CREATE TABLE cycling.calendar ( race_id int, race_name text, race_start_date timestamp, race_end_date timestamp, PRIMARY KEY ( race_id, race_start_date, race_end_date ) ) WITH CLUSTERING ORDER BY ( race_start_date DESC, race_end_date DESC );
ALLOW FILTERING
を使用したクエリーの例:SELECT * FROM cycling.calendar WHERE race_start_date = '2015-06-13' ALLOW FILTERING;
出力:
race_id | race_start_date | race_end_date | race_name
---------+---------------------------------+---------------------------------+----------------
102 | 2015-06-13 00:00:00.000000+0000 | 2015-06-21 00:00:00.000000+0000 | Tour de Suisse
(1 rows)
インデックス付きカラムでのフィルター
セカンダリ・インデックス付きのカラムがあるテーブルのSELECTのWHERE句には、インデックス付きカラムに対する等価関係を少なくとも1つ含める必要があります。「カラムのインデックスの作成」を参照してください。
IN演算子の使用
等価条件演算子であるIN
は、WHERE句内の複数のカラム値をリストするために使用します。
この例では、値のリストにrace_id
がある行を選択します。
SELECT * FROM cycling.calendar WHERE race_id IN (101, 102, 103);
リスト内の値はカンマで区切られます。
INを使用した複合プライマリ・キーでのフィルター処理
その前にプライマリ・キーのそれ以前のすべてのカラムに対して等価条件がある場合のみ、複合プライマリ・キーの最後のカラムでIN
条件を使用します。
CREATE TABLE cycling.cyclist_id ( lastname text, firstname text, age int, id UUID, PRIMARY KEY ((lastname, firstname), age) );
このクエリーには、プライマリ・キーの最初の2つのカラムの等価条件と、プライマリ・キーの最後のカラムのIN
条件を含む適切なWHERE
句が記述されています。
SELECT * FROM cycling.cyclist_id WHERE lastname = 'EENKHOORN' AND firstname = 'Pascal' AND age IN (17, 18);
IN
を使用する場合、最後のクラスター化カラム以外のクラスター化カラムに対する等価テストを省略できます。これにはALLOW FILTERING
が必要になることがあるため、プロダクション環境では使用しないでください。
CREATE TABLE cycling.events ( year int, start_month int, start_day int, end_month int, end_day int, race text, discipline text, location text, uci_code text, PRIMARY KEY ( (year, discipline), start_month, start_day, race ) );このクエリーには、
race
カラム(最後のクラスター化カラム)の等価条件を持つWHERE
句、start_month
カラムのIN
句、およびALLOW FILTERING
(プロダクション環境では使用しないこと)が含まれています。SELECT * FROM cycling.events WHERE race = 'Superprestige - Hoogstraten -2017' AND start_month IN (1, 2) ALLOW FILTERING;
CQLでは、IN
句内に値の空のリストを使用できるため、ドライバー・アプリケーションで空の配列を引数としてIN
句に渡す場合に役立ちます。「Connecting to DSE clusters using DSE drivers」を参照してください。
INを使用すべきでない場合
通常、パーティション・キーの関係にIN
を使用することは推奨されません。値のリストを処理するには、SELECTで多数のノードをクエリーする必要がある場合があり、それによってパフォーマンスが低下します。
たとえば、ノードが30、レプリケーション係数が3、整合性レベルがLOCAL_QUORUM
の1つのローカル・データ・センター・クラスターがあるとします。パーティション・キーを1つ指定したクエリーは2つのノードに送られます。しかし、SELECTでIN
条件が使用されている場合、キーがトークン範囲のどこに位置するかにより、演算には最大で20のノードが含まれる可能性があります。
クラスター化カラムにIN
を使用すると、すべてのクエリー・アクションが1つのパーティションで実行されるため、パフォーマンスのレイテンシーが低下します。
「Cassandra Query Patterns: Not using the “in” query for multiple partitions」を参照してください。
コレクションでのフィルター
クエリーによりコレクション全体を取得できます。また、コレクション・カラムを対象としてインデックスを作成してから、WHERE
句にCONTAINS
条件を指定してコレクションに属する特定の値のデータをフィルター処理することも、CONTAINS KEY
を使用してキーでフィルター処理することもできます。
この例は、cyclist_career_teams
テーブルのteams
という名前のテキスト値のセットを示しています。このクエリーは、teams
セット内の値でフィルター処理します。
SELECT * FROM cycling.cyclist_career_teams WHERE teams CONTAINS 'Rabobank-Liv Giant';
id | lastname | teams
--------------------------------------+----------+----------------------------------------------------------------------------------------------------
1c9ebc13-1eab-4ad5-be87-dce433216d40 | BRAND | {'AA Drink - Leontien.nl', 'Leontien.nl', 'Rabobank-Liv Giant', 'Rabobank-Liv Woman Cycling Team'}
(1 rows)
cyclist_teams
テーブルには、teams
という名前のint
キーおよびtext
値のマップが含まれています。teams
マップ・キーにはインデックスが付いています。CREATE INDEX team_year_idx ON cycling.cyclist_teams ( KEYS (teams) );
SELECT * FROM cycling.cyclist_teams WHERE teams CONTAINS KEY 2015;
「コレクションのインデックス作成」および「cqlCreateIndex.html#cqlCreateIndex__CreatIdxCollKey」を参照してください。
マップのエントリーのフィルター
CREATE INDEX blist_idx ON cycling.birthday_list ( ENTRIES(blist) );
birthday_list
のblist
マップ内のエントリーに基づいて、23歳のサイクリスト全員を検索します。SELECT * FROM cycling.birthday_list WHERE blist['age'] = '23';
frozenのフル・コレクションのフィルター
rnumbers
という名前のFROZEN list
コレクションを含むテーブルを使用しています。この文は、クエリーに必要なインデックスを作成します。CREATE INDEX rnumbers_idx ON cycling.race_starts ( FULL(rnumbers) );
rnumbers
から、39回のプロ優勝、7回のグランド・ツアー出場、および14回のクラシック出場の記録を持つサイクリストを取得します。SELECT * FROM cycling.race_starts WHERE rnumbers = [39, 7, 14];
範囲関係
DataStax Enterpriseでは、>または<比較をサポートしています。しかし、指定されたパーティション・キーの場合、clustering columnに対する条件は、連続した行のセットを選択できるフィルターに制限されます。
race_id
が101であるcycling calendarデータを選択するフィルターを構築します(race_id
がプライマリ・キーのコンポーネントではなかった場合、以下のクエリーを使用するためにrace_id
にインデックスを作成する必要があります)。SELECT * FROM cycling.calendar WHERE race_id = 101 AND race_start_date >= '2014-05-27' AND race_start_date < '2017-06-16';
race_id | race_start_date | race_end_date | race_name
---------+---------------------------------+---------------------------------+-----------------------
101 | 2015-06-07 00:00:00.000000+0000 | 2015-06-14 00:00:00.000000+0000 | Criterium du Dauphine
101 | 2014-06-06 00:00:00.000000+0000 | 2014-06-13 00:00:00.000000+0000 | Criterium du Dauphine
(2 rows)
連続した行のセットを選択できるようにするには、WHERE句でプライマリ・キーのrace_id
コンポーネントに等価条件を適用する必要があります。
複合プライマリ・キーの使用と結果のソート
ORDER BY
句を複合プライマリ・キーとともに使用する場合に適用されます。 ORDER BY
句にはクラスター化カラムのみを含めます。WHERE
句では、ORDER BY
句のカラムの前にあるすべてのパーティション・キー値とクラスター化カラム値を指定します。- 複数のカラムをソートする場合、カラムは、テーブル定義の
PRIMARY KEY
句のカラムのリストと同じ順序でORDER BY
句にリストする必要があります。 - ソートの順序指定は制限されます。たとえば、テーブル定義で
CLUSTERING ORDER BY (start_month ASC, start_day ASC)
を使用すると、クエリーでORDER BY start_day, race
を使用できます(デフォルトはASC
)。すべてのカラムに適用する場合は、ソートを逆順にすることもできます(例:ORDER BY start_day DESC, race DESC
)。 - 別名ではなく実際の名前を使用してカラムを参照してください。
SELECT * FROM cycling.cyclist_category WHERE category = 'Time-trial' ORDER BY points DESC;
出力:
category | points | id | lastname
------------+--------+--------------------------------------+------------
Time-trial | 182 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO
Time-trial | 3 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK
(2 rows)
次の例は、より複雑な複合プライマリ・キーを持つテーブルを示しています。CREATE TABLE cycling.events ( year int, start_month int, start_day int, end_month int, end_day int, race text, discipline text, location text, uci_code text, PRIMARY KEY ( (year, discipline), start_month, start_day, race ) );
このクエリーには、race
カラムの前にあるすべてのプライマリ・キー・カラムの値を指定し、race
によって結果を順序指定するWHERE
句が含まれています。
SELECT * FROM cycling.events WHERE year = 2017 AND discipline = 'Cyclo-cross' AND start_month = 1 AND start_day = 1 ORDER BY race;
出力:
year | discipline | start_month | start_day | race | end_day | end_month | location | uci_code
------+-------------+-------------+-----------+----------------------------------------+---------+-----------+----------+----------
2017 | Cyclo-cross | 1 | 1 | DVV verzekeringen trofee - GP Sven Nys | null | null | Baal | C1
(1 rows)
このクエリーでは、ORDER BY
句に複数のクラスター化カラムがあります。SELECT * FROM cycling.events WHERE year = 2017 AND discipline = 'Cyclo-cross' AND start_month = 1 ORDER BY start_day, race;
結果のグループ化
GROUP BY
句は、カラムのセットについて同じ値を共有する選択した行を1つのグループにまとめます。GROUP BY
句には、次のものを含めることができます。
- パーティション・キーのカラムとクラスター化カラム。
GROUP BY
句で指定された最後のクラスター化カラムでのユーザー定義関数(UDF)を含む、決定論的単調関数。継続時間パラメーターと開始時間パラメーターが定数の場合、FLOOR()
関数は単調関数です。- 決定性集計。
race_times_summary
テーブルを使用します。CREATE TABLE cycling.race_times_summary ( race_date date, race_time time, PRIMARY KEY (race_date, race_time) );このテーブルには次の行が含まれます。
race_date | race_time
------------+--------------------
2019-03-21 | 10:01:18.000000000
2019-03-21 | 10:15:20.000000000
2019-03-21 | 11:15:38.000000000
2019-03-21 | 12:15:40.000000000
2018-07-26 | 10:01:18.000000000
2018-07-26 | 10:15:20.000000000
2018-07-26 | 11:15:38.000000000
2018-07-26 | 12:15:40.000000000
2017-04-14 | 10:01:18.000000000
2017-04-14 | 10:15:20.000000000
2017-04-14 | 11:15:38.000000000
2017-04-14 | 12:15:40.000000000
(12 rows)
このクエリーは、race_date
カラム値によって行をグループ化します。SELECT race_date, race_time FROM cycling.race_times_summary GROUP BY race_date;
race_date
カラム値を持つ行の各セットは、クエリー出力に1行にグループ化されます。同じrace_date
カラム値を持つ行のグループが3個あるため、3行が返されます。返される値は、グループについて最初に見つかった値です。 race_date | race_time
------------+--------------------
2019-03-21 | 10:01:18.000000000
2018-07-26 | 10:01:18.000000000
2017-04-14 | 10:01:18.000000000
(3 rows)
race_date
と時間を返すFLOOR (race_time,1h)
で行をグループ化します。各グループの行数はCOUNT(*)
によって返されます。SELECT race_date, FLOOR(race_time, 1h), COUNT(*) FROM cycling.race_times_summary GROUP BY race_date, FLOOR(race_time, 1h);同じ
race_date
およびFLOOR(race_time, 1h)
の値を持つ行のグループが9個あるため、9行が返されます。 race_date | system.floor(race_time, 1h) | count
------------+-----------------------------+-------
2019-03-21 | 10:00:00.000000000 | 2
2019-03-21 | 11:00:00.000000000 | 1
2019-03-21 | 12:00:00.000000000 | 1
2018-07-26 | 10:00:00.000000000 | 2
2018-07-26 | 11:00:00.000000000 | 1
2018-07-26 | 12:00:00.000000000 | 1
2017-04-14 | 10:00:00.000000000 | 2
2017-04-14 | 11:00:00.000000000 | 1
2017-04-14 | 12:00:00.000000000 | 1
(9 rows)
集計の計算
DSEは、集計値をSELECT
文に返す組み込み関数COUNT()
、MIN()
、MAX()
、SUM()
、およびAVG()
を提供します。ユーザー定義集計(UDA)を作成することもできます。次のセクションでは、例を示します。
COUNT()を使用した、カラムのNULL以外の値のカウントの取得
SELECT
でCOUNT(column_name)
を使用すると、カラムに含まれるNULL以外の値の数を返します。COUNT
はNULL値を無視します。
このクエリーは、cyclist_name
テーブル内の姓の数をカウントします。
SELECT COUNT(lastname) FROM cycling.cyclist_name;
COUNT()を使用した、条件に一致する行と集計値の取得
SELECT
でCOUNT(*)
を使用すると、クエリーに一致した行の数を返します。COUNT(1)
を使用しても同じ結果を得ることができます。他の集計関数またはカラムと組み合わせてCOUNT(*)
またはCOUNT(1)
を使用できます。
このクエリーは、cyclist_name
テーブルの行数を返します。
SELECT COUNT(*) FROM cycling.cyclist_name;
このクエリーは、events
テーブルの行数をカウントし、start_day
の最大値を計算します。
SELECT start_month, MAX(start_day), COUNT(*) FROM cycling.events WHERE year = 2017 AND discipline = 'Cyclo-cross';
この例は、イベント・テーブルに格納されていない年を示します。
SELECT start_month, MAX(start_day) FROM cycling.events WHERE year = 2022 ALLOW FILTERING;
start_month | system.max(start_day)
-------------+-----------------------
null | null
(1 rows)
カラムの最大値および最小値の取得
SELECT
でMAX(column_name)
を使用すると、カラム内の最大値を返します。カラムのデータ型が数値(bigint
、decimal
、double
、float
、int
、またはsmallint
)、MAX(column_name)
である場合は最大値を返します。
SELECT MAX(race_points) FROM cycling.cyclist_points WHERE id = e3b19ec4-774a-4d1c-9e5a-decec1e30aac;
system.max(race_points)
-------------------------
120
(1 rows)
WHERE
句を含めないと、警告メッセージが表示されます。Warnings :
Aggregation query used without partition key
MIN
関数は最小値を返します。 system.min(race_points)
-------------------------
6
(1 rows)
MAX
またはMIN
関数が参照するカラムがascii
データ型またはtext
データ型の場合、これらの関数はアルファベット順にソートしたカラム値の最後または最初の項目を返します。指定したカラムのデータ型がdate
型またはtimestamp
型の場合、これらの関数は最も新しいまたは最も古い日時を返します。
カラムにNULL値がある場合、MAX
とMIN
はNULL値を無視します。行のセット全体のカラムにNULLが含まれている場合、MAX
およびMIN
はNULLを返します。
クエリーにWHERE
句(推奨)が含まれている場合、MAX
はWHERE
条件を満たす行から最大値を返し、MIN
はWHERE
条件を満たす行から最小値を返します。
数値のカラムの平均または合計の取得
この例では、AVG
を使用してカラム内のすべての値の平均を計算します。
SELECT AVG(race_points) FROM cycling.cyclist_points WHERE id = e3b19ec4-774a-4d1c-9e5a-decec1e30aac;
system.avg(race_points)
-------------------------
67
(1 rows)
SUM
を使用して合計を取得します。
SELECT SUM(race_points) FROM cycling.cyclist_points WHERE id = e3b19ec4-774a-4d1c-9e5a-decec1e30aac AND race_points > 7;
system.sum(race_points)
-------------------------
195
(1 rows)
返された行にAVG
関数で参照されるカラムのNULL値が含まれている場合、その行は行数に含まれますが、平均の計算にはNULL値の代わりに0値が使用されます。SUM
関数とAVG
関数はtext
型、uuid
型またはdate
型のフィールドには使用できません。
このクエリーは、ユーザー定義集計(UDA)を使用してサイクリスト・チームの平均タイムを返します。
SELECT cycling.average(cyclist_time_sec) FROM cycling.team_average WHERE team_name = 'UnitedHealthCare Pro Cycling Womens Team' AND race_title = 'Amgen Tour of California Women''s Race presented by SRAM - Stage 1 - Lake Tahoe > Lake Tahoe';「ユーザー定義集計関数(UDA)の作成」および「CREATE AGGREGATE」を参照してください。
書き込みが発生した日時の取得
カラムにWRITETIME関数が適用されると、カラムがデータベースに書き込まれた日時がマイクロ秒単位で返されます。
このクエリーは、cyclistのfirstname
カラムに書き込みが行われた日時を取得します。
SELECT WRITETIME (firstname) FROM cycling.cyclist_points WHERE id = e3b19ec4-774a-4d1c-9e5a-decec1e30aac;
writetime(firstname)
----------------------
1538688876521481
1538688876523973
1538688876525239
マイクロ秒単位の最終書き込み日時「1538688876525239
」のWRITETIME
出力を変換すると、「Thursday, October 4, 2018 4:34:36.525 PM GMT-05:00 DST
」になります。
カラムのTime To Liveの取得
カラム値のTime To Live(TTL)値は、値にトゥームストーンのマークが付くまでの秒数です。
INSERT
を使用してカラム値のTTLを200秒に設定します。INSERT INTO cycling.calendar ( race_id, race_name, race_start_date, race_end_date ) VALUES ( 200, 'placeholder', '2015-05-27', '2015-05-27' ) USING TTL 200;
この例では、UPDATE
を使用して1つのrace_name
カラム値のTTLを200秒に設定します。
UPDATE cycling.calendar USING TTL 300 SET race_name = 'dummy' WHERE race_id = 200 AND race_start_date = '2015-05-27' AND race_end_date = '2015-05-27';
race_name
カラム値の最新のTTLを取得します。SELECT TTL(race_name) FROM cycling.calendar WHERE race_id = 200;
ttl(race_name)
----------------
276
(1 rows)
JSON形式の値の取得
「Retrieval using JSON」を参照してください。