sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでクエリ結果をフィルタリングする方法


    はじめに

    データベース内のデータを操作するには、特定のレコードを効果的に取得してターゲットにできる必要があります。クエリ内でフィルタリング句を使用することで、最も関連性の高いレコードのみを返すための特定の基準を追加できます。

    このガイドでは、PostgreSQL内で利用可能な最も一般的なフィルタリング操作のいくつかを見て、それらを使用してステートメントの焦点を絞り込む方法を示します。 WHERE を使用して、個々のレコード内の特性をテストする方法を示します。 句、 GROUP BYを使用して情報を要約するためにレコードをグループ化する方法 、 HAVINGを使用してレコードのグループをフィルタリングする方法 副次句、および LIMITを使用して返される行の最大数を設定する方法 条項。



    WHEREの使用 一致基準を定義する句

    クエリ要件を示す最も一般的で広く役立つ方法の1つは、 WHEREです。 句。 WHERE 句を使用すると、一致するすべてのレコードに対して真でなければならない条件を指定することにより、クエリステートメントの実際の検索条件を定義できます。

    WHERE 句は、データの各候補行に対してチェックされるブール式を定義することによって機能します。式の結果がfalseの場合、その行は結果から削除され、返されないか、処理の次の段階に進みません。式の結果がtrueの場合、検索の基準を満たし、候補行としてさらに処理を続行します。

    WHEREの基本的な構文 句は次のようになります:

    SELECT * FROM my_table WHERE <condition>;

    <条件> ブール値になるものであれば何でもかまいません。 PostgreSQLでは、ブール値は TRUEのいずれかです。 、 FALSE 、または NULL

    多くの場合、条件は次の1つ以上の演算子を使用して形成されます。

    • = :等しい
    • > :より大きい
    • < :未満
    • > = :以上
    • <= :以下
    • <> または!= :等しくない
    • AND :論理「and」演算子— 2つの条件を結合し、 TRUEを返します 両方の条件がTRUEの場合
    • または :論理「または」演算子— 2つの条件を結合し、 TRUEを返します 条件の少なくとも1つがTRUEの場合
    • IN :値は、次のリスト、シリーズ、または範囲に含まれています
    • BETWEEN :値は、以下の最小値と最大値の範囲内に含まれます。
    • IS NULL :値が NULLの場合に一致します
    • NOT :次のブール値を無効にします
    • EXISTS :次のクエリには結果が含まれています
    • LIKE :パターンとの一致(ワイルドカードを使用) 0個以上の文字と_に一致する 単一の文字に一致する)
    • ILIKE :パターンとの一致(ワイルドカードを使用) 0個以上の文字と_に一致する 単一の文字に一致する場合)、大文字と小文字は区別されません
    • 類似 :SQLの正規表現方言を使用したパターンとの照合
    • :POSIX正規表現を使用してパターンと照合し、大文字と小文字を区別します
    • 〜* :POSIX正規表現を使用してパターンと照合し、大文字と小文字を区別しません
    • !〜 :POSIX正規表現を使用するパターンとは一致せず、大文字と小文字が区別されます
    • !〜* :POSIX正規表現を使用するパターンとは一致せず、大文字と小文字は区別されません

    上記のリストは最も一般的なテスト構成の一部を表していますが、 WHEREと組み合わせて使用​​できるブール結果を生成する他の多くの演算子があります 条項。


    WHEREを使用した例

    最も一般的で簡単なチェックの1つは、 =を使用した同等性のチェックです。 オペレーター。ここでは、 customerの各行が テーブルにはlast_nameがあります Smithに等しい値 :

    SELECT * FROM customer WHERE last_name = 'Smith';

    これに条件を追加して、論理演算子を使用して複合式を作成できます。この例では、 ANDを使用しています first_nameに対する追加のテストを追加する句 桁。有効な行は、指定された条件の両方を満たす必要があります:

    SELECT * FROM customer WHERE first_name = 'John' AND last_name = 'Smith';

    同様に、一連の条件のいずれかが満たされているかどうかを確認できます。ここでは、 addressの行を確認します zip_codeかどうかを確認するためのテーブル 値は60626またはneighborhoodに等しい 列は文字列「Roger'sPark」と同じです。 2つの一重引用符を使用して、リテラルの一重引用符を検索する必要があることを示します。

    SELECT * FROM address WHERE zip_code = '60626' OR neighborhood = 'Roger''s Park';

    IN 演算子は、括弧で囲まれた複数の値の比較のように機能します。指定された値のいずれかと一致する場合、式は TRUEです。 :

    SELECT * FROM customer WHERE last_name IN ('Smith', 'Johnson', 'Fredrich');

    ここでは、 LIKEを使用して文字列パターンをチェックします 。 0個以上の文字に一致するワイルドカードとして機能するため、「Pete」、「Peter」、および「Pete」で始まるその他の文字列は一致します。

    SELECT * FROM customer WHERE last_name LIKE 'Pete%';

    〜*を使用して同様の検索を行うことができます 大文字と小文字を区別せずにPOSIX正規表現を使用して一致をチェックする演算子。この場合、 last_nameの値が 「d」で始まり、「Dickson」、「Donald」、「Devon」などの名前と一致する部分文字列「on」が含まれています。

    SELECT * FROM customer WHERE last_name ~* '^D.*on.*';

    BETWEEN を使用して、番地が住所の4000ブロック内にあるかどうかを確認できます。 およびAND 包括的範囲を定義する演算子:

    SELECT * FROM address WHERE street_number BETWEEN 4000 AND 4999;

    ここでは、任意の customerを表示できます 9桁ではない社会保障番号を持つエントリ。 LENGTH()を使用します フィールドの桁数と<>を取得する演算子 不平等をチェックするには:

    SELECT * FROM customer WHERE LENGTH(SSN) <> 9;



    GROUP BYの使用 複数のレコードを要約する句

    GROUP BY 句は、単一の行で複数の結果を表すことによって結果をフィルタリングするもう1つの非常に一般的な方法です。 GROUP BYの基本的な構文 句は次のようになります:

    SELECT <columns> FROM some_table GROUP BY <columns_to_group>

    GROUP BYの場合 ステートメントに句が追加され、指定された1つまたは複数の列の一意の値ごとに1つの行を表示するようにPostgreSQLに指示します。これにはいくつかの重要な意味があります。

    GROUP BY以降 句は複数の行を単一の行として表す方法です。PostgreSQLは、表示するタスクの各列の値を計算できる場合にのみクエリを実行できます。これは、 SELECTによって識別される各列を意味します ステートメントの一部は次のいずれかである必要があります:

    • GROUP BYに含まれています 各行が一意の値を持つことを保証する句
    • 各グループ内のすべての行を要約するために要約されています

    実際には、これは SELECTのすべての列を意味します GROUP BYに含まれていないリスト 句は、各グループの列に対して単一の結果を生成するために集計関数を使用する必要があります。


    GROUP BYを使用した例

    このセクションの例では、 petというテーブルがあるとします。 このように定義して入力したこと:

    CREATE TABLE pet (    id SERIAL PRIMARY KEY,    type TEXT,    name TEXT,    color TEXT,    age INT);INSERT INTO pet (type, name, color, age) VALUES('dog', 'Spot', 'brown', 3),('dog', 'Rover', 'black', 7),('dog', 'Sally', 'brown', 1),('cat', 'Sabrina', 'black', 8),('cat', 'Felix', 'white', 4),('cat', 'Simon', 'orange', 8),('rabbit', 'Buttons', 'grey', 4),('rabbit', 'Bunny', 'brown', 8),('rabbit', 'Briony', 'brown', 6);

    GROUP BYの最も簡単な使用法 単一の列の一意の値の範囲を表示することです。これを行うには、 SELECTで同じ列を使用します およびGROUPBY 。ここでは、表で使用されているすべての色を確認できます。

    SELECT color FROM pet GROUP BY color;
     color-------- black grey brown white orange(5 rows)

    SELECTの1つの列を超えて移動すると 列リストの場合、列を GROUP BYに追加する必要があります 句を使用するか、集計関数を使用して、表されている行のグループに単一の値を生成します。

    ここでは、 typeを追加します GROUP BYへ 句。各行がtypeの一意の組み合わせを表すことを意味します およびcolor 値。 ageも追加します avg()によって要約された列 各グループの平均年齢を見つける関数:

    SELECT type, color, avg(age) AS average_age FROM pet GROUP BY type, color;
      type  | color  |     average_age--------+--------+-------------------- rabbit | brown  | 7.0000000000000000 cat    | black  | 8.0000000000000000 rabbit | grey   | 4.0000000000000000 dog    | black  | 7.0000000000000000 dog    | brown  | 2.0000000000000000 cat    | orange | 8.0000000000000000 cat    | white  | 4.0000000000000000(7 rows)

    集計関数は、 GROUP BYの単一の列でも同様に機能します 句。ここでは、各タイプの動物の平均年齢を確認します。

    SELECT type, avg(age) AS average_age FROM PET GROUP BY type;
      type  |     average_age--------+-------------------- rabbit | 6.0000000000000000 dog    | 3.6666666666666667 cat    | 6.6666666666666667(3 rows)

    各タイプの動物の中で最も古いものを表示したい場合は、代わりに max()を使用できます。 ageの関数 桁。 GROUP BY 句は結果を以前と同じ行に折りたたみますが、新しい関数は他の列の結果を変更します:

    SELECT type, max(age) AS oldest FROM pet GROUP BY type;
      type  | oldest--------+------- rabbit |     8 dog    |     7 cat    |     8(3 rows)



    HAVINGの使用 レコードのグループをフィルタリングする句

    GROUP BY 句は、複数のレコードを1つの代表的な行に折りたたむことによってデータを要約する方法です。しかし、追加の要因に基づいてこれらのグループを絞り込みたい場合はどうでしょうか?

    HAVING 句はGROUPBYの修飾子です 結果に含めるために各グループが満たさなければならない条件を指定できる句。

    一般的な構文は次のようになります:

    SELECT <columns> FROM some_table GROUP BY <columns_to_group> HAVING <condition>

    操作はWHEREと非常によく似ています 句、違いは WHERE 単一のレコードをフィルタリングし、 HAVING レコードのグループをフィルタリングします。


    HAVINGを使用した例

    前のセクションで紹介したのと同じ表を使用して、 HAVING 条項は機能します。

    ここでは、 petの行をグループ化します typeの一意の値によるテーブル 列、 ageの最小値を見つける 同じように。 HAVING 次に、句は結果をフィルタリングして、年齢が1以下のグループを削除します。

    SELECT type, min(age) AS youngest FROM pet GROUP BY type HAVING min(age) > 1;
      type  | youngest--------+---------- rabbit |        4 cat    |        4(2 rows)

    この例では、行を petにグループ化します。 彼らの色によって。次に、単一の行のみを表すグループをフィルタリングします。結果には、複数回表示されるすべての色が表示されます:

    SELECT color FROM pet GROUP BY color HAVING count(color) > 1;
     color------- black brown(2 rows)

    同様のクエリを実行して、 typeの組み合わせを取得できます およびcolor 1匹の動物だけが持っていること:

    SELECT type, color FROM pet GROUP BY type, color HAVING count(color) = 1;
      type  | color--------+-------- cat    | black rabbit | grey dog    | black cat    | orange cat    | white(5 rows)



    LIMITの使用 レコードの最大数を設定する句

    LIMIT 句は、クエリが返すレコードを削減するための別のアプローチを提供します。 LIMIT は、行自体の基準に基づいてデータの行を削除するのではなく、 句は、クエリによって返されるレコードの最大数を設定します。

    LIMITの基本構文 次のようになります:

    SELECT * FROM my_table LIMIT <num_rows> [OFFSET <num_rows_to_skip>];

    ここでは、 実行されたクエリから表示する最大行数を示します。これは、多くの場合、 ORDER BYと組み合わせて使用​​されます 特定の列で最も極端な値を持つ行を取得する句。たとえば、試験で最高の5つのスコアを取得するには、ユーザーは ORDER BYを使用できます。 スコア 列、次に LIMIT 結果は5になります。

    LIMIT デフォルトでは、結果の先頭からカウントされます。オプションの OFFSET キーワードを使用して、使用する開始位置をオフセットできます。事実上、これにより、 LIMIT で定義された結果の数を表示することにより、結果をページングすることができます。 次に、 LIMITを追加します OFFSETへの番号 次のページを取得します。


    LIMITを使用した例

    petを使用します このセクションの例については、前の表を参照してください。

    上記のように、 LIMIT 多くの場合、 ORDER BYと組み合わされます 適切な番号をスライスする前に、行の順序を明示的に定義する句。ここでは、 petを並べ替えます 年齢に応じたエントリ 、最も古いものから最も若いものへ。次に、 LIMITを使用します 最古の上位5匹の動物を表示するには:

    SELECT * FROM pet ORDER BY age DESC LIMIT 5;
      type  |  name   | color  | age | id--------+---------+--------+-----+---- cat    | Simon   | orange |   8 |  6 cat    | Sabrina | black  |   8 |  4 rabbit | Bunny   | brown  |   8 |  8 dog    | Rover   | black  |   7 |  2 rabbit | Briany  | brown  |   6 |  9(5 rows)

    ORDER BYなし 句、 LIMIT 完全に予測可能な方法で選択を行います。返される結果は、テーブル内のエントリの順序またはインデックスによって影響を受ける可能性があります。これは必ずしも悪いことではありません。

    単一のdogのレコードが必要な場合 テーブル内で、このようなクエリを作成できます。結果を予測するのは難しいかもしれませんが、これはランダムな選択ではないため、そのように使用しないでください。

    SELECT * FROM pet WHERE type = 'dog' LIMIT 1;
     type | name | color | age | id------+------+-------+-----+---- dog  | Spot | brown |   3 |  1(1 row)

    OFFSETを使用できます 結果をページングする句。 ORDER BYが含まれています 結果の特定の順序を定義する句。

    最初のクエリでは、 OFFSETを指定せずに結果を制限します 最初の3つの最年少エントリを取得するには:

    SELECT * FROM pet ORDER BY age LIMIT 3;
     type | name  | color | age | id------+-------+-------+-----+---- dog  | Sally | brown |   1 |  3 dog  | Spot  | brown |   3 |  1 cat  | Felix | white |   4 |  5(3 rows)

    次の3人を最年少にするために、 LIMITで定義された番号を追加できます OFFSETへ すでに取得した結果をスキップするには:

    SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 3;
      type  |  name   | color | age | id --------+---------+-------+-----+---- rabbit | Buttons | grey  |   4 |  7 rabbit | Briany  | brown |   6 |  9 dog    | Rover   | black |   7 |  2(3 rows)

    LIMITを追加すると OFFSETへ 繰り返しますが、次の3つの結果が得られます:

    SELECT * FROM pet ORDER BY age LIMIT 3 OFFSET 6;
      type  |  name   | color  | age | id--------+---------+--------+-----+---- cat    | Simon   | orange |   8 |  6 rabbit | Bunny   | brown  |   8 |  8 cat    | Sabrina | black  |   8 |  4(3 rows)

    これにより、クエリから管理可能なチャンクでデータの行を取得できます。




    結論

    クエリから得られる結果をフィルタリングしたり、制約したりする方法はたくさんあります。 WHEREのような句 およびHAVING 潜在的な行または行のグループを評価して、それらが特定の基準を満たしているかどうかを確認します。 GROUP BY 句は、1つ以上の列の値が共通しているレコードをグループ化することにより、データを要約するのに役立ちます。 LIMIT 句は、取得するレコード数にハード最大値を設定する機能をユーザーに提供します。

    これらの句を個別にまたは組み合わせて適用する方法を学ぶことで、大規模なデータセットから特定のデータを抽出できるようになります。 PostgreSQL内に存在するデータを有用な回答に変えるには、クエリ修飾子とフィルターが不可欠です。




    1. VS2015シェルにOledbのOracleプロバイダーがありません

    2. JDBCバッチ操作の理解

    3. Dockerを使用したnodeJSでのPostgresのECONNREFUSED

    4. Psqlはすべてのテーブルを一覧表示します