ここでは、Select 構文の形式を説明します。また、Select 構文を使用して、ネスト化されたクエリ、ソート操作、グループ化されたクエリを実行する際の注意事項について説明します。

SELECT 構文の説明

コマンド形式:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY order_condition]
[DISTRIBUTE BY distribute_condition [SORT BY sort_condition] ]
[LIMIT number]
注:
  • Select 文でテーブルからデータを読み込む場合、列名を指定して読み込むか、アスタリスク (*) を使用してすべての列を読み込みます。 基本的な Select 文を以下に示します。
    select * from sale_detail;
    sale_detail から shop_name 列のみを読み込むには、次の文を使用します。
    select shop_name from sale_detail;
    フィルタリング条件を指定するには、where 句を使用します。 例:
    select * from sale_detail where shop_name like 'hang%';
    Select 文を実行すると、結果は最大で 10,000 行のみ表示されます。 ただし、Select 文が句の場合は、すべての結果が上位クエリに返されます。
  • パーティションテーブルを選択すると、フルテーブルスキャンは実行できません。

    2018 年 1 月 10 日 20:00 (UTC+8) 以降に作成された新規プロジェクトについては、SQL 実行時にパーティションテーブルに対してフルテーブルスキャンを実行できないようにデフォルト設定されています。 不必要な SQL I/O、コンピューティングリソース、コストを削減するために、パーティション条件でスキャン対象のパーティションを指定する必要があります。 注: 課金方法が従量課金の場合、データ入力量が課金パラメーターの 1 つになります。

    テーブル定義が t1(c1,c2) partitioned by(ds) の場合、新規プロジェクトで次の文を実行しないようにしてください。エラーが発生する可能性があります。
    Select * from t1 where c1=1;
    Select * from t1 where (ds=‘20180202’ or c2=3);
    Select * from t1 left outer join t2 on a.id =b.id and a.ds=b.ds and b.ds=‘20180101’);  
    --Join 文の実行時、パーティションのクリッピングが where 句に指定されている場合、パーティションのクリッピングは有効です。 このコマンドを on 句で指定すると、サブテーブルのパーティションがクリッピングされ、メインテーブルでフルテーブルスキャンが実行されます。
    パーティションテーブルでフルテーブルスキャンを実行する場合は、パーティションテーブル全体のスキャンを実行する SQL 文の前に、set odps.sql.allow.fullscan=true; 文を追加します。 set 文は、SQL 文と一緒に送信する必要があります。 sales_detail テーブルがパーティションテーブルとします。 フルテーブルスキャンを実行するには、次の基本的なクエリ文を一緒に送信します。
    set odps.sql.allow.fullscan=true;
    select * from sale_detail;
  • table_reference では、ネストしたサブクエリを使用できます。例:
    select * from (select region from sale_detail) t where region = 'shanghai';
  • where 句で使用できるフィルタリング条件は、次のとおりです。
    フィルタリング条件 説明
    > 、 < 、 =、 >=、 <=、 <> 関係演算子
    like、rlike like と rlike のソースパラメーターとパターンパラメーターは String 型にする必要があります。
    in、not in in や not in 条件にサブクエリを追加すると、1 つの列の値しか返されず、戻り値の数は 1000 を超えることはできません。
    テーブル全体をスキャンせずに、特定のパーティションをスキャンするには、次のように Select 文の where 句でパーティションの範囲を指定します。
    SELECT sale_detail. * FROM sale_detail WHERE sale_detail.sale_date >= '2008' AND sale_detail.sale_date <= '2014';
    MaxCompute SQL の where 句では、between…and 条件でのクエリを使用できません。 前述した SQL 文は、次のように書き換えることができます。
    SELECT sale_detail. * FROM sale_detail WHERE sale_detail.sale_date BETWEEN '2008' AND '2014';
  • distinct: 重複した行がある場合、フィールドの前に Distinct オプションを指定すると、重複行は取り除かれます。 この場合、1 つの行のみ返されます。 All オプションを使用する、または Distinct オプションを使用しない場合、フィールド内のすべての重複値が返されます。
    Distinct オプションを使用すると、1 行のレコードのみが返されます。以下に例を示します。
    select distinct region from sale_detail;
    select distinct region, sale_date from sale_detail;
    -- 複数の列に対して Distinct オプションを実行します。 Distinct オプションは、1つの 行ではなく、Select 列のセットに対して有効です。
  • group by: グループ化のクエリです。 通常、集約関数で使用されます。 Select 文に集約関数が含まれる場合、次のルールに従ってください。
    1. group by のキーは、入力テーブルの列名にすることができます。
    2. 入力テーブルの列から構成される式でも構いません。 Select 文の出力列の別名をキーにすることはできません。
    3. 優先度は、ルール 1 のほうが 2 よりも高いです。 ルール 1 と 2 が競合する場合、つまり group by のキーが、Select 文の入力テーブルの列または式、および Select 文の出力列の場合、ルール 1 の優先度が高くなります。
    例:
    select region from sale_detail group by region;
    -- グループ化列としてそのまま使用される入力テーブル内の列名を指定しており、正常に実行されます。
    select sum(total_price) from sale_detail group by region;
    -- region 値でグループ化したテーブルを指定しており、正常に実行されます。各グループの合計売上が返されます。
    Select region, sum (total_price) from sale_detail group by region;
    -- region 値でグループ化したテーブルを指定しており、正常に実行されます。region 値 (グループ内で一意) と各グループの合計売上が返されます。
    select region as r from sale_detail group by r;
    -- Select 列の別名を指定して実行すると、エラーが返されます。
    select 2 + total_price as r from sale_detail group by 2 + total_price;
    -- 列の完全な式が必要です。
    Select region, total_price from sale_detail group by region;
    -- エラーが返されます。Select 文で集計関数を使用していない列は、group by に存在しなければなりません。
    select region, total_price from sale_detail group by region, total_price;
    -- 正常に実行されます。
    Select 操作の前に group by があるので、SQL 解析時に制限事項が適用されます。 したがって、group by 文では、入力テーブルの列や式は、キーとしてのみ使用できます。
    詳細は、「集計関数 (Aggregate Functions)」をご参照ください。
  • order by: 特定の列に基づいて、すべてのデータがソートされます。 レコードを降順でソートするには、DESC キーワードを使用します。 全体をソートする場合、order by を limit と一緒に使用する必要があります。 ソートの際に order by を使用すると、NULL が最小値とみなされます。 この動作は、MySQL でも同じですが、Oracle では異なります。
    group by とは異なり、order by の後ろには Select 列の別名を指定する必要があります。 Select 操作を任意の列で実行する際に、列の別名が指定されていない場合は、列の別名として列名が使用されます。
    select * from sale_detail order by region;
    -- エラーが返されます。order by と一緒に limit を使用していません。
    select * from sale_detail order by region limit 100;
    select region as r from sale_detail order by region limit 100;
    -- エラーが返されます。ORDER BY の後ろに列の別名が指定されていません。
    select region as r from sale_detail order by r limit 100;
    limit number の数字は、出力行数を制限するための定数です。 limit オプションを指定せずに、Select 文の結果を画面に表示すると、最大 10000 行が表示されます。 画面表示の上限は、プロジェクトによって異なる場合があります。制限数は、setproject コンソールで制御できます。
  • Distribute by: 特定の列の値に基づき、データに対してハッシュベースのシャーディングを行います。 Select の出力列の別名を使用する必要があります。
    select region from sale_detail distribute by region;
    -- 列名が別名なので、正常に実行されます。
    select region as r from sale_detail distribute by region;
    -- エラーが返されます。DISTRIBUTE BY の後ろに列の別名が指定されていません。
    select region as r from sale_detail distribute by r;
  • Sort by: 部分的に並べ替えるには、distribute by を最初に追加する必要があります。sort by は、distribute by の結果を部分的にソートします。 Select 文の出力列の別名を使用する必要があります。
    select region from sale_detail distribute by region sort by region;
    select region as r from sale_detail sort by region;
    -- エラーが返され、終了します。distribute by が指定されていません。
  • order by と group by は、distribute by や sort by 句と同時に使用できません。 Select 出力列の別名を使用する必要があります。
  • order by、sort by、distribute by のキーは、Select 文の出力列 (列の別名)でなければなりません。
  • MaxCompute の SQL 解析では、order by、sort by、distribute by 操作は Select 操作より後に実行されます。 したがって、Select 文の出力列のみをキーとして指定できます。