結果のソートと制限
単純なクエリーの場合のSELECTコマンドの使用。
データを選択するテーブルにクエリーするのは、データがデータベースに格納されているためです。CQLは、SQLと同様に、単純または複雑な修飾子を使用してデータを選択(SELECT)できます。最も単純な場合、クエリーは、テーブルにあるデータをすべて選択します。最も複雑な場合では、クエリーは、どのデータを取得して表示するかを記述し、ユーザー定義関数に基づいて新しい値の計算も行います。
SASIのインデックス作成については、「SASIの使用」のクエリーの説明を参照してください。
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名のサイクリストを取得するには、次のコマンドと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
手順
-
テーブルのデータをすべて表示するには、単純な
SELECT
クエリーを使用します。SELECT * FROM cycling.cyclist_category;
-
以下の例は、categoryをフィルターとして使用するクエリーを作成する方法を示しています。
SELECT * FROM cycling.cyclist_category WHERE category = 'SPRINT';
categoryがパーティション・キーまたはクラスター化カラムでない場合、このクエリーは拒否されることに注意してください。クエリーは、cyclist_categoryテーブル全体の連続取得を必要とします。DataStax Enterpriseではこれは重要な概念として理解しておく必要があり、すべてのノードのデータをすべてスキャンするのは非常に時間がかかるため、その実行はブロックされます。パーティション・キーとクラスター化カラムを
WHERE
句で使用すると、連続した行のセットを選択することになります。クエリーはセカンダリ・インデックスを使用してフィルター処理することができます。「インデックスの作成と維持」を参照してください。lastnameに基づいたクエリーは、lastnameカラムのインデックスが作成されている場合には満足のいく結果が得られます。
-
DataStax Enterprise 5.1以降では、セカンダリ・インデックスが作成されていない場合でも、
ALLOW FILTERING
も使用すればクラスター化カラムをWHERE
句内で定義できます。テーブル定義、SELECT
コマンドの順に指定します。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;
-
すべてのデータを選択する代わりに、カラムを選択して表示することもできます。
SELECT category, points, lastname FROM cycling.cyclist_category;
-
大きなテーブルの場合は、
LIMIT
を使用して取得する行の数を制限します。デフォルトの制限は10,000行です。データをサンプリングするには、小さい数を選択します。10,000行を超えるデータを取得するには、LIMIT
を大きな値に設定します。SELECT * From cycling.cyclist_name LIMIT 3;
-
ORDER BY
句を使用すると、表示順を微調整できます。 パーティション・キーは、WHERE
句で定義する必要があります。また、ORDER BY
句は、順序指定に使用するクラスター化カラムを定義します。CREATE TABLE cycling.cyclist_cat_pts ( category text, points int, id UUID,lastname text, PRIMARY KEY (category, points) ); SELECT * FROM cycling.cyclist_cat_pts WHERE category = 'GC' ORDER BY points ASC;
-
タプルは、全体で取得されます。この例では、
AS
を使用してタプル名のヘッダーを変更します。SELECT race_name, point_id, lat_long AS CITY_LATITUDE_LONGITUDE FROM cycling.route;
-
DataStax Enterprise 5.1以降では、
PER PARTITION LIMIT
オプションを使用して、クエリーで各パーティションから返される行数の最大数を設定します。これは、パーティションが正しく分割されていればクエリーで「上位3位」を選択できるので、興味深い手法です。データを複数のパーティションにソートし、データを挿入するテーブルを作成します。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
-
次に、
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