PostgreSQLでテーブルからレコードを抽出するときの,SQLの書き方です.

目次

  1. テーブルの全データを抽出する
  2. テーブルから一意なデータを抽出する
  3. テーブルから特定の列を抽出
  4. 条件をつけて絞り込む(WHERE句)
    1. 算術演算子
    2. 比較演算子
    3. 論理演算子
    4. IN句
  5. 検索結果を並び替える(ORDER BY句)
  6. 条件分岐(CASE式)
  7. コメント
  8. 参考文献

テーブルの全データを抽出する

*により全ての列を対象とします.

SELECT * FROM テーブル名;

テーブルから一意なデータを抽出する

DISTINCTキーワードを用います.

SELECT DISTINCT * FROM テーブル名;

テーブルから特定の列を抽出

SELECT句で列を指定します.
別名が不要であればAS 別名は省略できます.

SELECT
カラム名 AS 別名,
カラム名 AS 別名
FROM テーブル名;

カラム名の代わりに定数を与えることもできます.
定数が文字列や日付の場合にはシングルクオーテーションで囲みます.

文字列定数はシングルクオーテーションで囲みますが,日本語で別名をつけるときはダブルクオーテーションで囲みます.

条件をつけて絞り込む(WHERE句)

FROM句の直後に条件式をつなげて,レコードを絞り込みます.

SELECT
カラム名 AS 別名,
カラム名 AS 別名
FROM テーブル名
WHERE 条件式;

算術演算子

加減乗除が行えますが,NULLとの演算結果はNULLとなります.

比較演算子

通常の比較演算子を使えます.

標準SQLでは等しくないことを表すのに<>を使うとされています.(PostgreSQLで!=<>に変換されて処理されます.)

NULL値であるかどうかの判定はIS NULL演算子やIS NOT NULL演算子を使います.
例えば,あるカラムがNULL値でないレコードだけ抽出したいのであれば,

WHERE カラム名 IS NOT NULL

と書きます.

論理演算子

条件式の接続や否定はANDORNOTで行えます.

接続が連続する場合は括弧を使うべきですが,括弧がなかった場合,AND演算子がOR演算子より優先されます.

真理値についてSQLは3値論理になっており,「真」・「偽」に加えてNULLによる「不明」のケースが存在します.
真理表では「真となるか」が確定できるかどうかを見るます.
すなわち,「真かつ不明ならば不明」,「偽かつ不明ならば偽」,「真または不明ならば真」,「偽または不明ならば不明」です.

条件文により,SELECTした結果は条件文が真となったものへと絞り込まれますが,真のケースでないものの中には偽のケースだけでなく,NULLの影響を受けているケースがあるということに注意しなければなりません.

IN句

条件文で,1, 2, 3の中に含まれるなら,という書き方はINを使って

WHERE カラム IN (1, 2, 3)

と書けます.
含まれない場合を条件にしたいならNOT INです.

特に,クエリの一部にクエリを埋め込んだサブクエリにすると,(つまり,

WHERE カラム IN サブクエリ

という形にすると,)サブクエリにより得られたテーブルのカラムから条件を作ることができます.

検索結果を並び替える(ORDER BY句)

検索結果を並び替えるには,ORDER BY句をSELECT文の最後尾に配置します.

SELECT
カラム名 AS 別名,
カラム名 AS 別名
FROM テーブル名
WHERE 条件式
ORDER BY カラム名, カラム名 ASC;

並べたカラムの順に優先されます.

デフォルトは昇順で,それを意味するASCキーワードは省略可能です.
降順にするにはDESCキーワードを用います.

絞り込みを行った後で並び替えが行われますから,ORDER BY句ではカラムの別名を用いて指定することもできます.

SELECT句に含まれていない列を指定することもできます.

NULLを含むカラムがORDER BY句で指定された場合,NULLは最初か最後に集められます.

条件分岐(CASE式)

SELECT句で条件分岐を行う場合,CASE式を用います.

SELECT item_name,
CASE WHEN item_name='apple' THEN 'red'
WHEN item_name='banana' THEN 'yellow'
ELSE 'other'
END
FROM dummy_tabel;

簡易的な構文として,

SELECT item_name,
CASE item_name
WHEN 'apple' THEN 'red'
WHEN 'banana' THEN 'yellow'
ELSE 'other'
END
FROM dummy_tabel;

とも書けます.

コメント

別ファイルにSQLを書く場合などで,単行のコメントを書きたければ,--コメントとします.
ブロックコメントは

/*
コメント
*/

です.

参考文献

SQLの方言に配慮しつつ,リレーショナルデータベースの操作を一から説明している入門書です.

  • ミック (2016)「SQL」第2版,翔泳社.