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 条件];
COPY
https://www.postgresql.jp/document/11/html/sql-copy.html
- ファイルの内容をテーブルにコピー
- COPY table_name FROM 'filename'
- テーブルの内容をファイルにコピー
標準SQLにはない、PostgreSQLの独自拡張機能。
デフォルトではタブ区切りファイルを入出力する。
入出力先としてファイル名を指定する場合、実行には管理者権限が必要になる。
ファイルのパス名も絶対パスで指定すべき。
psqlの\copyメタコマンドは、内部的にはCOPYコマンドが実行される。
COPY文ではテーブルしか指定できない(例えば、ビューを指定できない)という制限がある。
SQLのINSERTを使うよりも高速に処理される。
サーバー側のファイルにアクセスする。クライアント側は \copy を利用する。
ファイル名を指定しない場合はスーパーユーザーである必要はない。
受験対策
2.48_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法」
2.64_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(COPY文(SQL)、\copyコマンド(psql)の使い方)」
- copy foo to stdout (delimiter ',');
- copy foo to stdout (format csv);
2.85_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(COPY文(SQL)、¥copyコマンド(psql)の使い方)」
2.104_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(COPY文、¥copyコマンドの使い方)」
2.124_Silverの例題解説「S2 運用管理 - S2.4 バックアップ方法(COPY文(SQL)、\copyコマンド(psql)の使い方)」