PostgreSQL DML(SELECT、INSERT、UPDATE、DELETE、COPY)

SELECT

https://www.postgresql.jp/document/11/html/sql-select.html

  • SELECT 列名 FROM テーブル名 WHERE 検索条件
ORDER BY
  • SELECT 列名 FROM テーブル名 WHERE 検索条件 ORDER BY ソート対象 [ ASC | DESC ]

返される行は指定した順番でソートされる。

LIMIT と OFFSET

https://www.postgresql.jp/document/11/html/queries-limit.html

  • SELECT 列名 FROM テーブル名 WHERE 検索条件 ORDER BY ソート対象 [ ASC | DESC ] LIMIT 件数 OFFSET 位置

結果は、指定の位置から指定の件数を返す。
LIMIT、最大何件取得するか。
OFFSET、先頭から何件スキップするか。

DISTINCT
  • SELECT DISTINCT [ ON (重複除去対象の列名) ] 列名 FROM テーブル名 WHERE 検索条件

結果から重複行を取く。
DISTINCT ON にはソートを行う作用がある。

GROUP BY と HAVING
  • SELECT 列名 FROM テーブル名 WHERE 検索条件 GROUP BY 対象列名 HAVING 条件

まず、WHERE句が評価され、GROUP BY でグループ化、その後に HAVING が表示される。
HAVING句には、集約関数が使用できる。

副問い合わせ

https://www.postgresql.jp/document/11/html/functions-subquery.html

  • SELECT 列名 FROM (SELECT 列名 FROM テーブル名) エイリアス WHERE 検索条件
  • SELECT 列名 FROM テーブル名 WHERE 検索条件 = (SELECT 列名 FROM テーブル名 WHERE 検索条件)
  • SELECT (SELECT 列名 FROM テーブル名)

WHERE 句の副問い合わせでは、FROM句から取得したデータを副問い合わせで評価する。
SELECT の列名に副問い合わせを指定する場合、複数の結果を返す副問い合わせはエラーになる。
(結果は1件のみ)

IN と NOT IN
  • SELECT 列名 FROM テーブル名 WHERE 列名 IN (値)
  • SELECT 列名 FROM テーブル名 WHERE 列名 NOT IN (値)
ANY
  • SELECT 列名 FROM テーブル名 WHERE 列名 演算子 ANY (副問い合わせ)

IN、NOT IN との違い、副問い合わせの結果は 1列 である事、値は配列形式である事、演算子を使用できる事。

BETWEEN
  • SELECT 列名 FROM テーブル名 WHERE 列名 BETWEEN 値 AND 値
INNER JOIN
  • SELECT 列名 FROM テーブル名1 [INNER] JOIN テーブル名2 ON テーブル名1.列名 = テーブル名2.列名 WHERE 条件
  • SELECT 列名 FROM テーブル名1 [INNER] JOIN テーブル名2 USING (列名) WHERE 条件
  • SELECT 列名 FROM テーブル名1 NATURAL [INNER] JOIN テーブル名2 WHERE 条件

内部結合は、複数のテーブルから一致する要素がある行のみを結合して表示する。
USING、NATURAL を使用した場合、対象の列は左にまとめられる。
ON を使用した場合、双方の列が表示される。

CROSS JOIN
  • SELECT 列名 FROM テーブル名1 CROSS JOIN テーブル名2 WHERE 条件
  • SELECT 列名 FROM テーブル名1, テーブル名2 WHERE 条件

クロス結合は、テーブルt1の1行ごとに、テーブルt2の全行を結合して表示する。
クロス結合で得られる結果の行数は、テーブルt1とテーブルt2の行数の積となります。

OUTER JOIN
  • SELECT 列名 FROM テーブル名1 { LEFT | RIGHT | FULL } [OUTER] JOIN テーブル名2 ON テーブル名1.列名 = テーブル名2.列名 WHERE 条件
  • SELECT 列名 FROM テーブル名1 { LEFT | RIGHT | FULL } [OUTER] JOIN テーブル名2 USING (列名) WHERE 条件
  • SELECT 列名 FROM テーブル名1 NATURAL { LEFT | RIGHT | FULL } [OUTER] JOIN テーブル名2 WHERE 条件

外部結合は、複数のテーブルから一致する要素の有無にかかわらず結合して表示する。

EXISTS と NOT EXISTS
  • SELECT 列名 FROM テーブル名 WHERE EXISTS (副問い合わせ)
  • SELECT 列名 FROM テーブル名 WHERE NOT EXISTS (副問い合わせ)

副問い合わせの結果、1件以上あれば真、0件であれば偽となる。
真であれば、テーブル名から対象の列名をすべて取得する。
副問い合わせに、テーブル名に関する条件が指定された場合、その条件に合致する行のみを取得する。

UNION(和)、EXCEPT(差)、INTERSECT(積)

https://www.postgresql.jp/document/11/html/queries-union.html

  • SELECT文 UNION [ALL] SELECT文
  • SELECT文 EXCEPT [ALL] SELECT文
  • SELECT文 INTERSECT [ALL] SELECT文

同じ列数で、列のデータ型がそれぞれ互換性を持っている必要がある。
ALL を付けないと、重複を排除する。
優先度は INTERSECT が高く、UNION と EXCEPT は同じ。(左から処理される)

INSERT

https://www.postgresql.jp/document/11/html/sql-insert.html

  • INSERT INTO テーブル名 [(列名)] VALUES (挿入データ)
  • INSERT INTO テーブル名 [(列名)] SELECT文

UPDATE

https://www.postgresql.jp/document/11/html/sql-update.html

  • UPDATE テーブル名 SET 列名 = 値[, 列名 = 値...] [WHERE 条件];
  • UPDATE テーブル名 SET (列名[, 列名...]) = (値[, 値...]) [WHERE 条件];

DELETE

https://www.postgresql.jp/document/11/html/sql-delete.html

  • DELETE FROM テーブル名 WHERE 条件

COPY

https://www.postgresql.jp/document/11/html/sql-copy.html

  • ファイルの内容をテーブルにコピー
    • COPY table_name FROM 'filename'
  • テーブルの内容をファイルにコピー
    • COPY table_name TO 'filename'
    • COPY テーブル名 TO {'絶対パスのファイル名' | STDOUT} [WITH] [オプション];
      • COPY sample TO '/Users/local/sample.csv' WITH (FORMAT csv);
    • COPY テーブル名 FROM {'絶対パスのファイル名'} [WITH] (FORMAT csv, HEADER);

標準SQLにはない、PostgreSQLの独自拡張機能
デフォルトではタブ区切りファイルを入出力する。
入出力先としてファイル名を指定する場合、実行には管理者権限が必要になる。
ファイルのパス名も絶対パスで指定すべき。
psqlの\copyメタコマンドは、内部的にはCOPYコマンドが実行される。
COPY文ではテーブルしか指定できない(例えば、ビューを指定できない)という制限がある。
SQLのINSERTを使うよりも高速に処理される。
サーバー側のファイルにアクセスする。クライアント側は \copy を利用する。
ファイル名を指定しない場合はスーパーユーザーである必要はない。