SELECT

テーブルのデータを返します。

1つのテーブルのデータを返します。WHERE句のないSELECT文は、すべてのパーティションのすべての行を返しますが、このような使用法は推奨されません。

注意: WHERE句を使用してクエリーを1つのパーティションに限定することを推奨します。複数のパーティションに及ぶクエリーはパフォーマンスに影響する場合があります。

構文

SELECT 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

完全なパーティション・キーの一意な値を返します。複合パーティション・キーには、コンマ区切りリストを使用します。

ヒント: 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
大文字または特殊文字を含むカラム名は、二重引用符で囲みます。
注: 文字列値は単一引用符で囲みます。
operator
DataStaxは、以下の演算子をサポートしています。
演算子 説明
= カラム値が指定した値と完全に一致する。
IN 値のコンマ区切りリスト内の任意の値に等しい。
>= 指定した値以上。
<= 指定した値以下。
> 指定した値よりも大きい。
< 指定した値よりも小さい。
CONTAINS 任意の種類のコレクションに含まれている値と一致する。インデックス付きのコレクションに対してのみ使用します。
CONTAINS KEY マップ内のキー名と一致する。インデックス付きのキーのあるマップに対してのみ使用します。
value
文字列値は単一引用符で囲みます。
注: 大文字または特殊文字を含むカラム名は、二重引用符で囲みます。

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

WHERE句を使用して、データの場所を特定することにより読み取り効率を最大限に高めます。データベースではWHEREロジック文を階層的に評価します。
  1. パーティション・キー・カラム:等価演算子を使用してすべてのパーティション・キー値(またはその欠落)を特定します。パフォーマンスの低下を回避するため、データ・モデルが単一パーティション・クエリーをサポートしていることを確認します。
    注: 通常、パーティションは大きなデータ・セットです。パーティショナーは、パーティション・キー・カラムのハッシュを作成してデータを分散させ、同じハッシュのすべての行を同じノードに格納します。パーティション・キーの日付カラム値の7/01/2017と7/02/2017のように、類似するデータが同じノードにない場合があります。
  2. クラスター化カラムは、パーティション内のソート順を決定します。データは、まず最初のクラスター化カラム、次に2番目のクラスター化カラムという順にクラスター化カラムでソートされます。
注: ALLOW FILTERINGは、パーティション・カラム、クラスター化カラムおよび通常のカラムのフィルターに対する制限をオーバーライドしますが、読み取りレイテンシーを生じてパフォーマンスが低下する可能性があります。テスト環境ではcqlsh TRACINGを使用してください。
partition_conditions

データベースでは、セカンダリ・インデックスまたは検索インデックスをクエリーする場合を除き、すべてのパーティションを制限する必要があります。次の演算子でパーティション・キー・カラムを特定するロジック文を使用します。

  • 等号(=):任意のパーティション・キー・カラム。
  • IN:複数のパーティションを検索するには、パーティション・キーの最後のカラムに制限します。
  • トークンの範囲(>=、<=、>および<):完全にトークン化されたパーティション・キー(TOKEN関数の引数として順番に指定されたすべてのPKカラム)。トークン範囲を使用して特定のノードに格納したデータをスキャンします。
注: セカンダリ・インデックス・クエリーでは、パーティション・キー・ロジック文で使用できる演算子は等価のみです。

使用例と手順については、「パーティション・キー」を参照してください。

clustering_conditions

クラスター化セグメントを特定するロジック文を使用します。クラスター化カラムは、複数のクラスター化カラムがある場合はネストされる、格納データのソート順を設定します。パーティション・キーの評価後、データベースは、1番目(最上位)、2番目、3番目などネストされた順序でクラスター化した文を評価します。

テーブルにクラスター化カラムが1つしかない場合、ロジック文ではすべての演算子がサポートされます。テーブルに複数のクラスター化カラムがある場合にテーブルのパーティション内のデータを効率よく見つけるには、次の制限を適用します。
  • 最上位のクラスター化カラム:
    • 等号(=)
    • IN
  • 最後のクラスター化カラムの文:すべての演算子および複数のカラムの比較

クラスター化カラムのロジック文では、複数のクラスター化セグメントに及ぶスライスを返すこともできます。

(column1, column2, ...) operator (value1, value2, ...)
[ AND (column1, column2, ...) operator (value1, value2, ...)]

スライスを使用すると、対応する値のある行を特定し、その前、後および間にあるすべての行を返すことができます(2つのスライス文が含まれている場合)。

使用例と手順については、「クラスター化カラム」を参照してください。

index_conditions

DataStax Enterpriseデータベースは、3種類のインデックスをサポートしています。

セカンダリ・インデックス
セカンダリ・インデックス・カラムのロジック文では、次の演算子がサポートされています。
  • =
  • インデックス・コレクション型に対するCONTAINS
  • インデックス・マップ型に対するCONTAINS KEY
Solrクエリー

DSE Searchクエリー式は、Solrのqパラメーターによってサポートされている構文を使用します。DSE Searchの「CQLクエリー構文」と「JSONクエリー構文」を参照してください。

SASIインデックス
SSTable Attached Secondary Index(SASI)を使用してデータを取得するには、「SASIの使用」を参照してください。

追加のオプション

クエリーで返されるデータのスコープと順序を変更します。

GROUP BY column_name
ターゲット・カラム名として一意の値を返します。集計関数とともに使用した場合、この関数は結果セットの各データ・グループに適用されます。
ORDER BY (ASC | DESC)
結果セットを昇順(ASC)または降順(DESC)にソートします。
注: 順序が指定されていない場合、結果は格納された順に返されます。
ALLOW FILTERING
プライマリ・キーを特定するロジック文を含めずにフィルター処理すること、またはプライマリ・キーでフィルター処理することができます。
注: 詳細については、「Allow Filtering explained」を参照してください。
LIMIT N | PER PARTITION LIMIT N
結果セットで返されるレコード数を制限します。

カラム別名の使用

選択項目リストに関数やその他の複雑な式が含まれている場合、別名を使用すると出力が読みやすくなります。次の例では、dateOf(created_at)関数とblobAsText(content)関数に別名を適用します。

SELECT event_id, 
  dateOf(created_at) AS creation_date,
  blobAsText(content) AS content 
  FROM timeline;

出力では、これらのカラムにわかりやすい名前のラベルを付けます。

event_id                | creation_date            | content
-------------------------+--------------------------+----------------
 550e8400-e29b-41d4-a716 | 2013-07-26 10:44:33+0200 | Some stuff

FROMを使用したソース・テーブルの指定

次のSELECT文の例では、systemキースペースのIndexInfoテーブルの行数が返されます

SELECT COUNT(*) 
FROM system.IndexInfo;

LIMITを使用した、返される行数の制御

LIMITオプションは、クエリーが返す最大行数を設定します。

SELECT lastname 
FROM cycling.cyclist_name 
LIMIT 50000;

たとえば、クエリーが105,291行と一致しても、データベースは最初の50,000行のみを返します。

cqlshシェルのデフォルトの行数は10,000に制限されています。DataStax Enterpriseサーバーとネイティブ・プロトコルでは、返される行の数は制限されませんが、誤った形式のクエリーによってシステムが不安定になるのを防ぐためにタイムアウトが適用されます。

パーティションの選択

単純なパーティション・キー。パーティションを1つ選択します。
partition_column = value
単純なパーティション・キー。複数のパーティションを選択します。
partition_column IN(value1,value2[,...])
複合パーティション・キーの場合は、ANDで区切って各キーの条件を作成します。
partition_column1 = value1 
AND partition_column2 = value2 [AND ...])

PER PARTITION LIMITを使用した、返される行数の制御

DataStax Enterprise 5.1以降では、PER PARTITION LIMITオプションを使用して、クエリーで各パーティションから返される行数の最大数を設定します。たとえば、複数のパーティションにデータをソートするテーブルを作成します。

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
      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

レースの年度と名前ごとに上位2名のレーサーを取得するには、SELECT文とPER PARTITION LIMIT 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
      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

WHEREを使用したデータのフィルター

WHERE句は、SELECTで返された行をフィルター処理する1つまたは複数の関係を示します。

カラム指定

関係のカラム指定は、以下のいずれかである必要があります。
  • テーブルのパーティション・キーの1つまたは複数のメンバー
  • クラスター化カラム(関係の前にパーティション・キー内のすべてのカラムを指定する他の関係がある場合)
  • CREATE INDEXを使用してインデックスが作成されたカラム。
制約事項: WHERE句では、別名ではなく実際の名前を使用してカラムを参照してください。

パーティション・キーでのフィルター

たとえば、次のテーブル定義は、テーブルのパーティション・キーとしてidを定義します。
CREATE TABLE cycling.cyclist_career_teams ( id UUID PRIMARY KEY, lastname text, teams set<text> );
この例では、SELECT文にパーティション・キーが含まれているため、WHERE句はidカラムを使用できます。
SELECT id, lastname, teams 
FROM cycling.cyclist_career_teams 
WHERE id=5b6962dd-3f90-4c93-8f61-eabfa4a803e2;

制限:パーティション・キーを参照する関係は、等価演算子=またはINしか使用できません。IN演算子の詳細については、以下の「」を参照してください。

クラスター化カラムでのフィルター

パーティション・キーのすべての要素を参照する関係がその前にある場合のみ、クラスター化カラムに対して関係を使用します。

例:

CREATE TABLE cycling.cyclist_points (
   id UUID, 
   firstname text, 
   lastname text, 
   race_title text, 
   race_points int, 
   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)

DataStax Enteprise 5.1以降では、インデックスなしのクラスター化カラムでのみフィルター処理するには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));
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 07:00:00.000000+0000 | 2015-06-13 07:00:00.000000+0000 | Tour de Suisse
     103 | 2015-06-13 07:00:00.000000+0000 | 2015-06-17 07:00:00.000000+0000 | Tour de France

パーティション・キーとクラスター化カラムを組み合わせて1つの関係にすることができます。 詳細については、「クラスター化カラムの比較」を参照してください。

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

インデックス付きテーブルのSELECTWHERE句には、インデックス付きカラムに対する等価関係を少なくとも1つ含める必要があります。詳細については、「カラムのインデックスの作成」を参照してください。

IN演算子の使用

等価条件演算子であるINは、可能性のある複数のカラム値をリストするために使用します。次の例では、従業員ID(プライマリ・キー)が105、107、または104である3つの行から、first_namelast_nameという2つのカラムを選択します。

SELECT first_name, last_name 
FROM emp 
WHERE empID IN (105, 107, 104);

リストは特定の範囲のコンマ区切りのカラム値で構成できます。

INを使用した、複合プライマリ・キーでのフィルター

その前にパーティション・キーのそれ以前のすべてのカラムに対して等価条件がある場合のみ、パーティション・キーの最後のカラムでIN条件を使用します。例:
CREATE TABLE parts (
   part_type text, 
   part_name text, 
   part_num int, 
   part_year text, 
   serial_num text, 
   PRIMARY KEY ((part_type, part_name), part_num, part_year));
SELECT * 
FROM parts 
WHERE part_type='alloy' AND part_name='hubcap' 
AND part_num=1249 AND part_year IN ('2010', '2015');
INを使用する場合、最後のカラム以外のクラスター化カラムに対する等価テストを省略できます。ただし、この使用法ではALLOW FILTERINGの使用が必要になる場合があるため、パフォーマンスを予想できないことがあります。例:
SELECT * 
FROM parts 
WHERE part_num=123456 AND part_year IN ('2010', '2015') 
ALLOW FILTERING;

CQLでは、IN句内に空の値リストを使用できるため、Javaドライバー・アプリケーションで空の配列を引数としてIN句に渡す場合に役立ちます。

INを使用すべきでない場合

ほとんどの条件下では、パーティション・キーの関係にINを使用することは推奨されません。値のリストを処理するには、SELECTで多数のノードをクエリーする必要がある場合があり、それによってパフォーマンスが低下します。たとえば、ノードが30、レプリケーション係数が3、整合性レベルがLOCAL_QUORUMの1つのローカル・データ・センター・クラスターがあるとします。パーティション・キーを1つ指定したクエリーは2つのノードに送られます。しかし、SELECTIN条件が使用されている場合、キーがトークン範囲のどこに位置するかにより、演算には最大で20のノードが含まれる可能性があります。

クラスター化カラムでINを使用する方が安全です。「Cassandra Query Patterns: Not using the “in” query for multiple partitions」でINの使用に関するその他のロジックの詳細を参照してください。

コレクションでのフィルター

クエリーはコレクション全体を取得できます。また、コレクション・カラムを対象としてインデックスを作成してから、WHERE句にCONTAINS条件を指定してコレクションに属する特定の値のデータをフィルター処理することも、CONTAINS KEYを使用してキーでフィルター処理することもできます。次の例では、playlistsテーブルのタグのコレクションを示します。クエリーによってタグのインデックスを作成し、次にタグ・セットの'blues'でフィルター処理できます。

SELECT album, tags 
FROM playlists 
WHERE tags CONTAINS 'blues';

演奏会場マップを対象にインデックスを作成したら、'The Fillmore'などのマップ値でフィルター処理します。
SELECT * 
FROM playlists 
WHERE venue 
CONTAINS 'The Fillmore';
会場マップのコレクション・キーを対象にインデックスを作成したら、マップ・キーでフィルター処理します。
SELECT * 
FROM playlists 
WHERE venue CONTAINS KEY '2014-09-22 22:00:00-0700';

マップのエントリーのフィルター

次のクエリー例に従って、マップ・エントリーに基づいて行を取得します。(この方法はマップにのみ使用できます。)
CREATE INDEX blist_idx 
ON cycling.birthday_list (ENTRIES(blist));
次のクエリーは、テーブルbirthday_listblistマップ内のエントリーに基づいて、23歳のサイクリスト全員を検索します。
SELECT * 
FROM cycling.birthday_list 
WHERE blist['age'] = '23';

frozenのフル・コレクションのフィルター

次の例は、FROZENコレクション(セット、リスト、またはマップ)を含むテーブルに対するクエリーを示しています。このクエリーは、コレクションの値と完全に一致する行を取得します。
CREATE INDEX rnumbers_idx 
ON cycling.race_starts (FULL(rnumbers));
次のSELECTは、39回のプロ優勝、7回のグランド・ツアー出場、および14回のクラシック出場の記録を持つサイクリストをfrozenリストから検索します。
SELECT * 
FROM cycling.race_starts 
WHERE rnumbers = [39,7,14];

範囲関係

DataStax Enterpriseは&gt;または&lt;比較をサポートしていますが、指定されたパーティション・キーのクラスター化カラムに対する条件は、連続した行のセットを選択できるフィルターに制限されます。

例:
CREATE TABLE ruling_stewards (
  steward_name text,
  king text,
  reign_start int,
  event text,
  PRIMARY KEY (steward_name, king, reign_start)
); 
次のクエリーは、reign(治世)が2,450年までに始まり2,500年より前に終わったstewards(執政)に関するデータを選択するフィルターを構築します。king(王)がプライマリ・キーのコンポーネントではなかった場合、以下のクエリーを使用するためにkingにインデックスを作成する必要があります。
SELECT * FROM ruling_stewards
WHERE king = 'Brego'
  AND reign_start >= 2450
  AND reign_start < 2500 
ALLOW FILTERING;
出力:
 steward_name | king  | reign_start | event
--------------+-------+-------------+--------------------
      Boromir | Brego |        2477 |   Attacks continue
       Cirion | Brego |        2489 | Defeat of Balchoth
       
(2 rows)

連続した行のセットを選択できるようにするには、WHERE句でプライマリ・キーのkingコンポーネントに等価条件を適用する必要があります。ALLOW FILTERING句も必要です。 ALLOW FILTERINGを使用すると、任意の条件を使用してクラスター化カラムをクエリーできます。

注意:

ALLOW FILTERINGは開発目的でのみ使用してください。特定範囲の行を検索するなど潜在的に高負荷のクエリーを実行しようとすると、以下のメッセージが表示されます。

Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING.

このようなクエリーを実行するには、ALLOW FILTERINGを使用し、LIMIT nを使用して出力をn行に制限します。例:

Select * 
FROM ruling_stewards
WHERE king = 'none'
  AND reign_start >= 1500
  AND reign_start < 3000 
LIMIT 10 
ALLOW FILTERING;

LIMITを使用しても、ALLOW FILTERINGによって生じる問題をすべて防げるわけではありません。次の例では、kingの値のないエントリーがない場合、LIMITの値にかかわらずSELECTはテーブル全体をスキャンします。

ALLOW FILTERINGとともにLIMITを使用する必要はなく、LIMITを単独で使用できます。しかし、LIMITを使用すると、クエリーがデータ・センター内のすべてのパーティションに及んだり、複数のデータ・センターにまたがったりすることを防ぐことができます。

複合プライマリ・キーの使用と結果のソート

ORDER BY句は単一のカラムにのみ使用できます。そのカラムは、複合PRIMARY KEYの2番目のカラムである必要があります。これは、プライマリ・キーに複数のカラム・コンポーネントがあるテーブルにも当てはまります。順序はASCキーワードまたはDESCキーワードを使用して昇順または降順に指定できます(デフォルトは昇順)。

ORDER BY句では、別名ではなく実際の名前を使用してカラムを参照してください。

たとえば、複合プライマリ・キーを使用するplaylistsテーブルを設定し、以下のクエリーを使用してsong_orderで順序が指定された特定のプレイリストに関する情報を取得します。select式にORDER BYカラムを含める必要はありません。

SELECT * FROM playlists 
WHERE id = 62c36092-82a1-3a00-93d1-46196ee77204
ORDER BY song_order DESC 
LIMIT 50;

出力:

または、プレイリストのアーティストにインデックスを作成し、以下のクエリーを使用してそのプレイリストでFu Manchuの曲のタイトルを取得します。

CREATE INDEX ON playlists(artist);
SELECT album, title 
FROM playlists 
WHERE artist = 'Fu Manchu';

出力:

集計の計算

DataStax Enterpriseは、SELECT文に集計値を返す標準の組み込み関数を備えています。

COUNT()を使用した、カラムのNULL以外の値のカウントの取得

SELECT式でCOUNT(column_name)を使用すると、カラムに含まれるNULL以外の値の数を返します。

たとえば、cyclist_nameテーブル内の姓の数をカウントします。

SELECT COUNT(lastname) 
FROM cycling.cyclist_name;

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

SELECT式でCOUNT(*)を使用すると、クエリーに一致した行の数を返します。COUNT(1)を使用しても同じ結果を得ることができます。他の集計関数またはカラムと組み合わせてCOUNT(*)またはCOUNT(1)を使用できます。

次の例は、usersテーブルの行数を返します。

SELECT COUNT(*) 
FROM users;

次の例は、usersテーブルの行数をカウントし、pointsの最大値を計算します。

SELECT name, max(points), COUNT(*) 
FROM users; 

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

SELECT式でMAX(column_name)を使用すると、カラム内の最大値を返します。カラムのデータ型が数値(bigintdecimaldoublefloatintsmallint)である場合、これが最大値になります。
SELECT MAX(points) 
FROM cycling.cyclist_category;

出力:

MINは最小値を返します。クエリーにWHERE句が含まれている場合、MAXまたはMINはそのWHERE条件を満たす行の最大値または最小値を返します。
SELECT category, MIN(points) 
FROM cycling.cyclist_category 
WHERE category = 'GC';

出力:

注: MAXまたはMINが参照するカラムがasciiデータ型またはtextデータ型の場合、これらの関数はアルファベット順にソートしたカラム値の最後または最初の項目を返します。指定したカラムのデータ型がdate型またはtimestamp型の場合、これらの関数は最も新しいまたは最も古い日時を返します。指定したカラムにNull値がある場合、MIN関数はこれを無視します。
注: DataStax EnterpriseはMINとしてNull値を返しません。

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

SELECT文でSUMまたはAVGを使用した場合、DataStax Enterpriseではカラム内のすべての値の合計または平均が計算されます。
注: 返された行にAVG集計で参照されるカラムのNull値が含まれている場合、その行は行数に含まれますが、平均の計算には0値が使用されます。
注: sum関数とavg関数はtext型、uuid型またはdate型のフィールドには使用できません。

書き込みが発生した日時の取得

カラムにWRITETIME関数が適用されると、カラムがデータベースに書き込まれた日時がマイクロ秒単位で返されます。

たとえば、姓がJonesというユーザーのfirst_nameカラムに書き込みが発生した日時を取得するには、次のように入力します。

SELECT WRITETIME (first_name) 
FROM users 
WHERE last_name = 'Jones';
 writetime(first_name)
-----------------------
 1353010594789000

マイクロ秒単位のWRITETIME出力を変換すると、「November 15, 2012 at 12:16:34 GMT-8」になります。

カラムのTime To Liveの取得

セルのTime To Live(TTL)値は、セルにトゥームストーンのマークが付くまでの秒数です。たとえば、1つのセル、カラム、またはカラム・ファミリーのTTLを設定するには、次のように入力します。
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;
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';
TTLを挿入したら、SELECT文を使用して現在値を確認します。
SELECT TTL(race_name) 
FROM cycling.calendar 
WHERE race_id=200;
出力:
 ttl(race_name)
----------------
            276

(1 rows)

JSON形式の値の取得

このオプションは、DataStax Enterprise 5.0以降で使用できます。詳細については、「JSONを使用した取得」を参照してください。