はじめに
データベース内のデータを操作するには、特定のレコードを効果的に取得してターゲットにできる必要があります。クエリ内でフィルタリング句を使用することで、最も関連性の高いレコードのみを返すための特定の基準を追加できます。
このガイドでは、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内に存在するデータを有用な回答に変えるには、クエリ修飾子とフィルターが不可欠です。