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 ] ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'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 )
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;
ヒント: データベースは論理和(OR)を含むクエリーをサポートしていません。
column_name
大文字または特殊文字を含むカラム名は、二重引用符で囲みます。
注: 文字列値は単一引用符で囲みます。
演算子
演算子 説明
= カラム値が指定した値と完全に一致する。
IN 値のコンマ区切りリスト内の任意の値に等しい。
>= 指定した値以上。
<= 指定した値以下。
> 指定した値よりも大きい。
< 指定した値よりも小さい。
CONTAINS 任意の種類のコレクションに含まれている値と一致する。インデックス付きのコレクションに対してのみ使用します。
CONTAINS KEY マップ内のキー名と一致する。インデックス付きのキーのあるマップに対してのみ使用します。
value
文字列値は単一引用符で囲みます。
注: 大文字または特殊文字を含むカラム名は、二重引用符で囲みます。

データの場所の特定とクラスター化カラムによるフィルター

データの場所を特定し読み取り効率を最大限に高めるには、WHERE句を使用します。データベースではWHEREロジック文を階層的に評価します。
  1. パーティション・キー・カラム:等価演算子を使用してすべてのパーティション・キー値(またはその欠落)を特定します。パフォーマンスの低下を回避するため、データ・モデルが単一パーティション・クエリーをサポートしていることを確認します。
    注: 通常、パーティションは大きなデータ・セットです。パーティショナーは、パーティション・キー・カラムのハッシュを作成してデータを分散させ、同じハッシュのすべての行を同じノードに格納します。パーティション・キーの日付カラム値の7/01/2017と7/02/2017のように、類似するデータが同じノードにない場合があります。
  2. クラスター化カラムは、パーティション内のソート順を決定します。データは、最初のクラスター化カラム、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サーバーとネイティブ・プロトコルでは、返される行の数は制限されませんが、誤った形式のクエリーによってシステムが不安定になるのを防ぐためにタイムアウトが適用されます。

パーティションの選択

単純なパーティション・キー。パーティションを1つ選択します。
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;
制約事項: パーティション・キーを参照する関係は、等価演算子=またはINしか使用できません。IN演算子の詳細については、以下の「」を参照してください。

この例のテーブルには、より複雑なプライマリ・キーが含まれています。

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)

インデックス付きカラムでのフィルター

セカンダリ・インデックス付きのカラムがあるテーブルのSELECTWHERE句には、インデックス付きカラムに対する等価関係を少なくとも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が必要になることがあるため、プロダクション環境では使用しないでください。

このテーブルは、raceカラムが最後のクラスター化カラムである例を示しています。
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つのノードに送られます。しかし、SELECTIN条件が使用されている場合、キーがトークン範囲のどこに位置するかにより、演算には最大で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_listblistマップ内のエントリーに基づいて、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では、&gt;または&lt;比較をサポートしています。しかし、指定されたパーティション・キーの場合、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句を複合プライマリ・キーとともに使用する場合に適用されます。
  1. ORDER BY句にはクラスター化カラムのみを含めます。
  2. WHERE句では、ORDER BY句のカラムの前にあるすべてのパーティション・キー値とクラスター化カラム値を指定します。
  3. 複数のカラムをソートする場合、カラムは、テーブル定義のPRIMARY KEY句のカラムのリストと同じ順序でORDER BY句にリストする必要があります。
  4. ソートの順序指定は制限されます。たとえば、テーブル定義でCLUSTERING ORDER BY (start_month ASC, start_day ASC)を使用すると、クエリーでORDER BY start_day, raceを使用できます(デフォルトはASC)。すべてのカラムに適用する場合は、ソートを逆順にすることもできます(例:ORDER BY start_day DESC, race DESC)。
  5. 別名ではなく実際の名前を使用してカラムを参照してください。
複合プライマリ・キーを使用する「cyclist_categoryテーブル」を参照してください。このクエリーは、ポイントについて降順にサイクリスト・カテゴリーを取得します。
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以外の値のカウントの取得

SELECTCOUNT(column_name)を使用すると、カラムに含まれるNULL以外の値の数を返します。COUNTはNULL値を無視します。

このクエリーは、cyclist_nameテーブル内の姓の数をカウントします。

SELECT COUNT(lastname)
FROM cycling.cyclist_name;

COUNT()を使用した、条件に一致する行と集計値の取得

SELECTCOUNT(*)を使用すると、クエリーに一致した行の数を返します。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;
次の出力では、カラムがNULLであり、1行が返されることに注意してください:
 start_month | system.max(start_day)
-------------+-----------------------
        null |                  null

(1 rows)

カラムの最大値および最小値の取得

SELECTMAX(column_name)を使用すると、カラム内の最大値を返します。カラムのデータ型が数値(bigintdecimaldoublefloatint、または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値がある場合、MAXMINはNULL値を無視します。行のセット全体のカラムにNULLが含まれている場合、MAXおよびMINはNULLを返します。

クエリーにWHERE句(推奨)が含まれている場合、MAXWHERE条件を満たす行から最大値を返し、MINWHERE条件を満たす行から最小値を返します。

数値のカラムの平均または合計の取得

この例では、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」を参照してください。