このトピックでは、高度な検索で使用されるSELECTステートメントの基本的な構文について説明します。
クエリ構文
クエリは、クエリ文を使用してデータベース内のデータを検索するプロセスです。 SQL構文では、SELECTステートメントを使用してクエリを指定します。 次のコードは、SELECTステートメントの基本的な構文を示しています。
SELECT [DISTINCT] column1 [AS column_name], column2, function
FROM table_name
[JOIN table_name ON join_condition]
[WHERE search_condition]
[GROUP BY column1, column2, ...]
[HAVING search_condition]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[LIMIT number_of_rows OFFSET start_row]SQL構文のキーワード
SELECT: データをクエリするフィールドを指定します。 1つ以上のフィールドを指定できます。 複数のフィールドを指定する場合は、フィールド名をコンマ (,) で区切ります。
DISTINCT: オプションのキーワード。 このキーワードは重複排除に使用され、クエリ結果に重複行が含まれないようにすることができます。
AS: オプションのキーワード。 このキーワードは、クエリ結果のフィールドの名前を変更するために使用されます。
FROM: データを照会するテーブルの名前を指定します。
JOIN: オプションのキーワード。 このキーワードは、複数のテーブルを結合するために使用されます。 ほとんどの場合、このキーワードを結合条件と共に使用する必要があります。
ON: 結合条件を指定します。
WHERE: オプションのキーワード。 このキーワードは、フィルター条件を指定するために使用されます。 ANDまたはorに基づく複数のフィルタ条件の組み合わせがサポートされています。
GROUP BY: オプションのキーワード。 このキーワードは、クエリ結果のフィールドをグループ化するための基礎を指定するために使用されます。
HAVING: オプションのキーワード。 このキーワードは、グループ化されたフィールドのフィルタ条件を指定するために使用されます。
ORDER BY: オプションのキーワード。 このキーワードは、クエリ結果をソートする順序を指定するために使用されます。 複数のフィールドに基づくソートがサポートされています。 複数のフィールドを指定する場合は、フィールド名をコンマ (,) で区切ります。 ASCは昇順を示し、DESCは降順を示す。 デフォルトでは、クエリ結果は昇順でソートされます。
LIMIT: オプションのキーワード。 このキーワードは、クエリ結果で返される行の最大数を制限するために使用されます。
OFFSET: オプションのキーワード。 このキーワードは、クエリ結果の開始行を指定するために使用されます。
キーワードの説明
SELECT リスト
SELECTステートメントでは、SELECTリストはキーワードSELECTとFROMの間にあります。SELECTリストは、クエリ結果で返される必要があるフィールドを指定します。 理解を容易にするために、エイリアスを使用してフィールドの名前を変更できます。 文字列演算に関数、演算子、式などの式を使用して、フィールドに対してコンピューティングやその他の演算を実行することもできます。 このクエリ方法では、ビジネス要件に基づいてクエリ結果の出力を柔軟に制御できます。
次のコードは、SELECTステートメントの構文を示しています。
SELECT
column1, column2, ... , columnN
FROM
table_name;column1、column2、... columnNは、テーブル内のフィールドの名前を示します。table_nameは、テーブルの名前を示します。
次のSELECTステートメントを使用して、ビジネス要件に基づいてテーブル内のデータをクエリできます。
テーブル内のすべてのフィールドのデータを照会します。
SELECT
*
FROM
table_name;テーブル内の特定のフィールドのデータを照会します。
SELECT
column1, column2, ...columnN
FROM
table_name;エイリアスを使用して、テーブル内のフィールドの名前を変更します。
SELECT
column1 AS alias_name
FROM
table_name; 式を使用して、テーブル内のフィールドに対して操作を実行します。
SELECT
column1 + column2 AS expression
FROM
table_name;FROM
FROM句は、SELECTステートメントの1つ以上のテーブルを宣言します。 FROM句がSELECTステートメントの複数のテーブルを宣言している場合、クエリスコープはテーブルのデカルト積 (クロス結合) になります。 ほとんどの場合、WHERE句を指定して、デカルト積の小さなサブセットに返すことができる行を制限できます。
FROM句には、次の要素を含めることができます。
table_name: 既存のテーブルの名前。alias: テーブルに指定するエイリアス。 エイリアスは、テーブルの名前を単純化し、あいまいさを排除するために使用されます。 エイリアスを指定すると、テーブルの実際の名前は非表示になります。 たとえば、SELECTステートメントでFROM resources AS aを指定した場合、SELECTステートメント内の残りのすべての句は、リソーステーブルにアクセスするためにエイリアスaを参照する必要があります。select: FROM句の内部クエリ。 FROM句でselect要素を指定した場合、SELECTステートメントはネストされたクエリ構造になります。 内部クエリによって返されたクエリ結果に基づいて一時テーブルが生成され、外部クエリが一時テーブルで実行されます。 内部クエリのコードを括弧 () で囲み、内部クエリのエイリアスを指定する必要があります。join_type: joinのタイプ。 詳細については、「JOIN」をご参照ください。
高度な検索では、リソーステーブルはコアデータテーブルであり、リソースのプロパティに関する情報が格納されます。 リソーステーブルの構造については、「概要」の「クエリに使用されるテーブル」をご参照ください。
JOIN
JOIN句は、テーブルの共通フィールドに基づいて2つ以上のテーブルの行を結合するために使用されます。
5つの結合タイプがサポートされています。 取得するデータセットとデータ関係に基づいて結合タイプを選択できます。 ビジネス要件に基づいて次のいずれかの結合タイプを選択して、テーブルを結合し、必要なデータを取得できます。
CROSS JOIN: クロス結合。 このタイプの結合は、2つのテーブルのデカルト積を返します。 これは、一方のテーブルの各行が他方のテーブルの各行と結合されていることを示します。 ほとんどの場合、このタイプの結合はデータの組み合わせを生成するために使用されます。
INNER JOIN: 内部結合。 このタイプの結合は、2つのテーブルの共通フィールドと一致し、共通フィールドに基づいてテーブルの行を結合し、一致した行のみを返します。
左外側結合: 左外側結合。 このタイプの結合は、左側のテーブルのすべての行と、左側のテーブルの行と一致する右側のテーブルの行を返します。 右側のテーブルに一致する行が存在しない場合、NULLが返されます。
右外側の結合: 右外側の結合。 このタイプの結合は、右側のテーブルのすべての行と、右側のテーブルの行と一致する左側のテーブルの行を返します。 左側のテーブルに一致する行が存在しない場合、NULLが返されます。
FULL OUTER JOIN: 完全な外部結合。 このタイプの結合は、左側のテーブルのすべての行と右側のテーブルのすべての行を返します。 2つのテーブルの行が一致しない場合、NULLが返されます。
WHERE
WHERE句は、指定されたフィルター条件を満たす行のデータを返すために使用されます。 次のコードは、構文を示しています。
SELECT
column1, column2, ... , columnN
FROM
table_name
WHERE
[condition]WHERE句で異なるフィルタ条件を指定して、データをフィルタリングできます。 WHERE句には、比較演算子、論理演算子、LIKEやINなどの特殊なリレーショナル演算子、およびNULL演算子を含めることができます。 比較演算子は、等しい (=) 、より大きい (>) 、およびより小さい (<) を含みます。 論理演算子は、AND、OR、およびNOTを含みます。 NULL演算子は、IS NULLおよびIS NOT NULLを含みます。
比較演算子:
WHERE句でequal to (=) 演算子を使用すると、完全に一致した行のデータが返されます。 たとえば、次のSELECTステートメントを使用して、Elastic Compute Service (ECS) インスタンスのリソースを照会できます。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE resource_type = 'ACS::ECS::Instance';WHERE句で、より大きい (>) 、より小さい (<) 、より大きいか等しい (>=) 、より小さいか等しい (<=) 、または等しくない (!=) 演算子を指定した場合、指定されたフィルター条件を満たすリソースが返されます。 たとえば、次のSELECTステートメントを使用して、指定した日付より後に作成されたリソースを照会できます。
SELECT resource_id, resource_name, region_id, resource_type, account_id, create_time FROM resources WHERE create_time > '20230607';論理演算子:
論理演算子は、複数のフィルタ条件を接続するために使用されます。 一般的な論理演算子には、AND、OR、およびNOTがあります。
AND演算子を使用してWHERE句で複数のフィルター条件を接続すると、指定されたすべてのフィルター条件を満たす行のみが返されます。 たとえば、次のSELECTステートメントを使用して、中国 (杭州) リージョンにあるECSインスタンスを照会できます。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE region_id = 'cn-hangzhou' AND resource_type = 'ACS::ECS::Instance';OR演算子を使用してWHERE句で複数のフィルター条件を接続すると、いずれかのフィルター条件を満たす行が返されます。 たとえば、次のSELECTステートメントを使用して、ECSインスタンスとECSインスタンスにアタッチされているディスクを照会できます。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE resource_type = 'ACS::ECS::Disk' OR resource_type = 'ACS::ECS::Instance';オペレータのように:
LIKE演算子は、ファジーマッチに使用される。 ほとんどの場合、LIKE演算子はデータをフィルタリングするためにワイルドカードとともに使用されます。 ワイルドカードは任意の文字を示します。 PostgreSQLは、次の2つのワイルドカードをサポートします。
パーセント記号 (%): 長さが無制限の文字列を示します。 このワイルドカードは、ゼロまたは複数の文字と一致します。
アンダースコア (_): 1文字を示します。 このワイルドカードはどの文字にも一致します。
上記のワイルドカードがLIKE句で使用されていない場合、LIKE句はequal to (=) 演算子と同じ結果を返します。 ワイルドカードを使用すると、データに対してファジー一致と範囲のクエリをより柔軟に実行できます。 たとえば、次のSELECTステートメントを使用して、すべてのECSリソースタイプを照会できます。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_type LIKE 'ACS::ECS::%';オペレータで:
IN演算子はブール演算子で、値リストに特定の値が含まれているかどうかを確認するために使用されます。 値リストに値が含まれている場合、IN演算子はtrueを返します。 それ以外の場合、IN演算子はfalseを返します。
SELECT column1, column2, ... , columnN FROM table_name WHERE exp IN (value1, value2, ..., valueN);expには、フィールド名、値、または関数呼び出しや操作の式などの式を指定できます。value1, value2, ..., valueNは、値リストを示す。 値リストの値はコンマ (,) で区切ります。
たとえば、次のSELECTステートメントを使用して、ECSインスタンスとECSインスタンスにアタッチされているディスクを照会できます。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_type IN('ACS::ECS::Instance', 'ACS::ECS::Disk');NULL演算子:
フィールドはNULL値を含むことができます。 NULLは、フィールドがNULL値を有するかどうかを判定するために使用されます。 IS NOT NULLは、フィールドにNULL値がないかどうかを判断するために使用されます。 たとえば、次のSELECTステートメントを使用して、resource_nameプロパティがNULL値を持つリソースを照会できます。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_name IS NULL;
演算子を使用して、特定のフィルター条件に基づいてデータをフィルター処理し、目的のクエリ結果を取得できます。
注文単位
ORDER BY句は、クエリ結果をソートするために使用されます。 次のコードは、構文を示しています。
SELECT
column1, column2, ... , columnN
FROM
table_name
ORDER BY
column1, column2, .. columnN ASC | DESC;ORDER BY句では、キーワードASCまたはDESCを使用して、クエリ結果を返す順序を指定します。 ASCは昇順を示し、DESCは降順を示します。 order BY句で順序を指定しない場合、クエリ結果はデフォルトで昇順にソートされます。
order BY句で指定した順序は、順序のすぐ後に続く式に対してのみ有効になります。 たとえば、order BY column1, column2 DESCで指定された順序が有効になるオブジェクトは、ORDER BY column1 DESC, column2 DESCで指定された順序が有効になるオブジェクトとは異なります。 ORDER BY column1、column2 DESCの場合、クエリ結果は、最初にcolumn1に基づいて昇順にソートされ、次にcolumn1に重複する値を持つ行についてcolumn2に基づいて降順にソートされます。 ORDER BY column1 DESC、column2 DESCの場合、クエリ結果は最初にcolumn1に基づいて降順にソートされ、次にcolumn1に重複する値を持つ行についてはcolumn2に基づいて降順にソートされます。
ORDER BY句で1つ以上のフィールドを並べ替えの基準として指定できます。 SELECTリストで指定されていないフィールドもサポートされています。 複数のフィールドを指定する場合は、フィールド名をコンマ (,) で区切ります。 クエリ結果は、最初に指定した最初のフィールドに基づいてソートされます。 最初のフィールドに重複する値がある場合、指定した2番目のフィールドに基づいてクエリ結果がソートされます。
クエリ結果をソートするフィールドを指定するときは、次の項目に注意してください。
リソースの並べ替えにNULL値を持つプロパティフィールドを使用しないことを推奨します。 このようなプロパティフィールドを使用する場合は、特別な処理を行う必要があります。 特別な処理を行わないと、プロパティフィールドに基づいてリソースを正しくソートできません。
指定したフィールドの値が重複している場合、同じSELECTステートメントを複数回実行した後に異なる結果が返されることがあります。 クエリ結果の一貫性を確保するために、ORDER BY句に別のフィールドを追加してソートすることをお勧めします。
たとえば、次のSELECTステートメントを使用して、最初にリソースタイプでリソースをソートし、次に同じタイプのリソースをリソースIDでソートできます。
SELECT
resource_id,
resource_name,
region_id,
zone_id,
resource_type,
account_id,
FROM
resources
ORDER BY
resource_type,
resource_id;グループ化
GROUP BY句は、クエリ結果をグループ化する1つ以上のフィールドを指定するために使用されます。 グループごとに、統計の収集、集計、またはフィルタリング操作をさらに実行できます。 次のコードは、構文を示しています。
SELECT
column1, column2, ... , columnN
FROM
table_name
WHERE
[ conditions ]
GROUP BY
column1, column2....columnN
ORDER BY
column1, column2....columnNGROUP BY句は、WHERE句 (存在する場合) とORDER BY句 (存在する場合) の間に配置する必要があります。
GROUP BY句で1つ以上のフィールドをグループ化の基礎として指定できます。 ただし、フィールドがSELECTリストに含まれていることを確認する必要があります。 それ以外の場合、SELECTステートメントを実行するとエラーが報告されます。 GROUP BYステートメントを使用する場合、SUM、COUNT、AVGなどの集計関数を使用して、各グループでコンピューティングを実行できます。 集計関数は、各グループで計算を実行し、すべてのグループで計算の集計結果を返します。 これにより、データ集約の各グループの統計分析が容易になります。
たとえば、次のSELECTステートメントを使用して、リソースタイプごとにリソースをグループ化し、異なるタイプのリソースの数を照会できます。 返されるクエリ結果には、値が文字列である列と値が数値である列の2つの列のみが含まれます。 高度な検索機能を使用すると、グラフ内の2つの列のみを含むクエリ結果を表示できます。
SELECT
resource_type,
COUNT(*) AS cnt
FROM
resources
GROUP BY
resource_type
ORDER BY
cnt DESC;リミット
LIMIT句は、クエリ結果でSELECTステートメントによって返される行の最大数を制限するために使用されます。 LIMIT句には、返すことができる行の最大数と、クエリ結果を返すオフセットを含めることができます。
LIMIT
count OFFSET start次のコードは、LIMIT句にOFFSETキーワードが含まれる構文を示しています。
SELECT
column1, column2, ... , columnN
FROM
table_name
LIMIT
[no of rows] OFFSET [row num]LIMIT句は、クエリ結果でSELECTステートメントによって返される行の最大数を制限するために使用されます。 たとえば、LIMIT 10は、最大10行のデータを返すことができることを示します。
OFFSETキーワードは、クエリ結果の開始行を指定するために使用されます。 数値を指定してオフセットを決定できます。 たとえば、OFFSET10は、クエリ結果の開始行がソーステーブルの11行目であることを示します。 LIMIT句でOFFSETキーワードを指定しない場合、クエリ結果の開始行はデフォルトでソーステーブルの最初の行になります。
ほとんどの場合、LIMIT句を指定する場合は、ORDER BY句を使用して、クエリ結果を並べ替える順序を指定する必要があります。 LIMIT句をORDER BY句と一緒に使用しない場合、同じSELECTステートメントを複数回実行した後に返されるクエリ結果が異なる場合があります。 これは、クエリが異なる順序で実行されるためです。 したがって、LIMIT句を使用する場合は、ORDER BY句を使用して、指定されたフィールドの行の順序を制御することをお勧めします。 これにより、クエリ結果で返される行が連続して一貫していることが保証されます。
たとえば、次のSELECTステートメントを使用して、リソースIDで降順にソートされた最初の20個のリソースを照会できます。
SELECT
resource_id,
resource_name,
region_id,
resource_type,
account_id
FROM
resources
ORDER BY
resource_id DESC
LIMIT
20;場合によっては、指定されたオフセットからデータを返すクエリを開始することができます。 高度な検索機能を使用して実行されるクエリは、最大1,000行を返すことができます。 クエリを実行するデータの量が大きすぎる場合は、OFFSETキーワードを指定してLIMIT句を使用して、ページ化されたクエリを実行できます。 クエリを実行するたびに、LIMIT句を使用して返すことができる最大行数を指定し、OFFSETキーワードを使用して次のページのデータを取得できます。 連続した一貫した行がクエリ結果に返されるようにするには、ORDER BY句を使用して、クエリ結果を特定のフィールドに基づいてソートできるようにする必要もあります。
たとえば、次のSELECTステートメントを使用して、リソースIDでリソースを降順に並べ替え、行1001から行2000にデータをクエリできます。
SELECT
resource_id,
resource_name,
region_id,
resource_type,
account_id
FROM
resources
ORDER BY
resource_id DESC
LIMIT
1000 OFFSET 1000;例
サンプルクエリテンプレートの詳細については、「サポートされているサンプルクエリテンプレート」をご参照ください。