今回は SQL コマンド(SQL 文)について解説します。
分かりにくいかもしれませんが、目的別とコマンドの解説を記載しています。
PostgreSQL の SQL コマンド一覧
PostgreSQL の SQL コマンド一覧は以下のメタコマンドで確認できます。
postgres=# \h |
SQL コマンドの分類
- DDL(Data Definition Language、データ定義言語)
- DML(Data Manipulation Language、データ操作言語)
- DCL(Data Control Language、データ制御言語)
DDL(Data Definition Language、データ定義言語)
- CREATE テーブル、インデックス作成
- DROP テーブル、インデックス削除
- ALTER テーブルやインデックスの定義を変更
- TRUNCATE テーブルからレコードを削除
DML(Data Manipulation Language、データ操作言語)
- SELECT データを検索
- INSERT データを挿入
- UPDATE データを更新
- DELETE データを削除
DCL(Data Control Language、データ制御言語)
- GRANT アクセス権限の付与
- REVOKE アクセス権限の取り消し
- BEGIN トランザクションの開始
- COMMIT トランザクションの確定
- ROLLBACK トランザクションの取り消し
データベースを作成する
データベースを作成します。
まずは現在のデータベース一覧を表示します。
-bash-4.2$ psql -l |
psql コマンドでデフォルトのデータベースに接続します。
-bash-4.2$ psql |
データベース(testdb)を作成します。
postgres=# CREATE DATABASE testdb; |
データベースが作成されたことを確認します。
postgres=# \l |
新しく作成されたデータベース(testdb)にアクセスします。
postgres=# \c testdb |
テーブルを作成してデータを挿入する
新規作成したデータベース(testdb)に新規テーブル(testtable)を作成します。
testdb=# CREATE TABLE testtable ( |
テーブルにデータを挿入します。
testdb=# INSERT INTO testtable VALUES(1,’高橋’); |
データを確認します。
testdb=# SELECT * FROM testtable; |
テーブルにデータを追加する
更にテーブルにデータを追加します。
testdb=# INSERT INTO testtable VALUES(2,’山田’); |
データを確認します。
testdb=# SELECT * FROM testtable; |
複雑な SELECT 文の結果を仮想のテーブルのように利用したい(ビュー、VIEW)
SELECT 文の結果を基に新しいテーブルを作成したい場合はビューを作成します。
ビューへの問い合わせが発生した場合、そのビューを作成する SELECT 文が実行されます。
CREATE TABLE ~ と CREATE VIEW ~ の違い
- CREATE TABLE ~ ← CREATE TABLE ~ で作成したテーブルは、テーブルを作成する基になったテーブルとは関連性がなくなります。
- CREATE VIEW ~ ← ビューは問い合わせを行うたびに、元のテーブルを参照します。
ユーザーを作成、確認する(ユーザー管理)
ユーザーの作成や確認方法です。
最初に現在のユーザーを確認します。
postgres=# \du |
ユーザー test01 を作成します。
postgres=# CREATE USER test01; |
ユーザー test01 を確認します。
postgres=# \du |
※まだ test01 には権限が割り当てられていません。
ユーザーに権限を割り当てる
ユーザーに権限を割り当てます。
対象のデータベースに変更します。
postgres=# \c testdb |
現在のテーブルを確認します。
testdb=# \dt |
現在の testtable に対する権限を確認します。
まだ何も権限が割り当てられていません。
testdb=# \z |
テーブル testtable に対して SELECT, INSERT, UPDATE, DELETE 権限をアカウント test01 に割り当てます。
testdb=# GRANT SELECT, INSERT, UPDATE, DELETE on testtable TO test01; |
権限を確認します。
testdb=# \z |
権限の確認方法
権限の確認方法です。
testdb=# \z |
- test01=arwd/postgres ← test01 に対して「arwd」の権限が割り当てられています。権限を付与したのは「postgres」アカウントです。
- a ← INSERT 権限
- r ← SELECT 権限
- w ← UPDATE 権限
- d ← DELETE 権限
- D ← TRUNCATE 権限
- x ← REFERENCES 権限
- t ← TRIGGER 権限
- arwdDxt ← ALL すべての権限
自動的にシーケンス番号を割り振る(SEQUENCE)
CREATE SEQUENCE コマンドでシーケンス番号を設定します。
- シーケンス ← testsequence
- CACHE ← メモリに格納するデータ量を指定します。この範囲内(10まで)なら高速でデータにアクセスが可能になります。
- MAXVALUE ← シーケンスの最大値を設定します。この場合は10が限界値です。
- NO CYCLE ← 限界値(10)に到達したら終了します。(それ以上入れるとエラーになります)
postgres=# CREATE SEQUENCE testsequence CACHE 10 MAXVALUE 10 NO CYCLE; |
値を設定します。
postgres=# SELECT setval(‘testsequence’, 1); |
現在の値(1)を確認します。
postgres=# SELECT currval(‘testsequence’); |
nextval で次の値を取得し、自動的に値が増加していることを確認します。
postgres=# SELECT nextval(‘testsequence’); |
限界値を超えたらエラーが出るのか確認します。
postgres=# SELECT nextval(‘testsequence1’); |
指定したテーブル(ビュー)に適用するルールを定義したい
CREATE RULE により、指定したテーブル(ビュー)に適用するルールを定義することができます。
その結果、テーブルに対する挿入、更新、削除時に実行される別の処理を定義できます。
ルールを作成する
【例】
CREATE RULE ルール名 AS ON INSERT TO ビュー名 DO INSTED NOTHING;
ルールを削除する
DROP RULE ルール名;
SQL 文でのパターンマッチング
UNIX、LINUX では「正規表現」を利用してパターンマッチングをしますが、PostgreSQL の SQL 文でも以下の 3つでパターンマッチングを利用できます。
- LIKE 演算子 ← 対象のカラム名 LIKE ‘パターン’
- SIMILAR TO 演算子 ← 対象のカラム名 SIMILAR TO ‘パターン’
- POSIX 正規表現 ← 対象のカラム名 ~ ‘パターン’
「LIKE 演算子」と「SIMILAR TO 演算子」の任意の文字列を表わす「%」を利用できます。
【例】
LIKE ‘%TEST%’ |
- TEST、11TEST、TTEST11 → 含まれます。
【例】
LIKE ‘TEST’ |
- TEST → 含まれます。
- 11TEST、TTEST11 → 含まれません。
【例】
~ ‘TEST’ |
- TEST、11TEST、TTEST11 → 含まれます。
CREATE
CREATE コマンドについて解説します。
CREATE SCHEMA
CREATE SCHEMA <スキーマ名> AUTHORIZATION <所有者名>; |
【例】
CREATE SCHEMA TestSchema01 AUTHORIZATION TestUser01; |
DROP
DROP コマンドについて解説します。
DROP DATABASE データベースを削除する
データベースを削除します。
DROP TABLE <テーブル名> テーブルを削除する
データも含めてテーブルを削除します。
DROP TABLE <テーブル名>; |
DROP ROLE(DROP USER) データベースロール(データベースユーザー)を削除する
【データベースロールを削除する】
DROP ROLE ロール名; |
【データベースユーザーを削除する】
DROP USER ロール名; |
GRANT
GRANT は権限を付与するコマンドです。
■主な付与できる権限
- すべての権限を付与(ALL)
- テーブルへのアクセス権限を付与(SELECT)
- データベースへのアクセス権限を付与(CONNECT)
- スキーマへのアクセス権限を付与(CREATE)
- テーブルのデータをファイルにコピーする権限を付与(COPY)
- 外部キーを作成する権限を付与(REFERENCES)
- トリガーの作成を許可する(TRIGGER)
【テーブルへのアクセス権限を付与】
GRANT <権限> ON <テーブル名> TO <ユーザー名>; |
【データベースへのアクセス権限を付与】
GRANT <権限> ON DATABASE <データベース名> TO <ユーザー名>; |
【スキーマへのアクセス権限を付与】
GRANT <権限> ON SCHEMA <スキーマ名> TO <ユーザー名>; |
REVOKE
REVOKE は GRANT コマンドとは逆に「権限を取り消す」コマンドです。
※revoke の意味は「取消す、廃止する、解約する」という意味です。
■主な取り消しできる権限
- すべての権限を付与(ALL)
- テーブルへのアクセス権限を付与(SELECT)
- データベースへのアクセス権限を付与(CONNECT)
- スキーマへのアクセス権限を付与(CREATE)
- テーブルのデータをファイルにコピーする権限を付与(COPY)
- 外部キーを作成する権限を付与(REFERENCES)
- トリガーの作成を許可する(TRIGGER)
【テーブルへのアクセス権限を取消す】
REVOKE <権限> ON <テーブル名> FROM <ユーザー名>; |
【データベースへのアクセス権限を取消す】
REVOKE <権限> ON DATABASE <データベース名> FROM <ユーザー名>; |
【スキーマへのアクセス権限を取消す】
REVOKE <権限> ON SCHEMA <スキーマ名> FROM <ユーザー名>; |
COUNT
COUNTはカラムのデータ件数を返します。
カラムの値の中は見ていません。データ件数をカウントしています。
カラムを指定した場合、値が「NULL」の場合はカウントされません。
COUNT(*)とアスタリスクですべてを指定した場合は「NULL」もカウントされます。
- COUNT(カラム) ← NULL カウントしない
- COUNT(*) ← NULL もカウントする
重複を排除する(DISTINCT)
重複を排除する場合は DISTINCT を使用します。
SELECT 文の結果に対して処理をする場合に使用します。
- distinct ← 明確な、明瞭な、他と異なる
重複している行を削除したい(INTERSECT)【2つのSQL文】
INTERSECT を使用して、2つの SQL 文で重複した行を削除することができます。
- intersect ← 交差する、横切る
【例】
<SQL文1> INTERSECT <SQL文2> |
※ALL を付けると重複した行もすべて表示されます。
2つの SQL 文を足した行を表示したい(UNION)【2つのSQL文】
UNION を使用して、2つの SQL 文を足した行を表示できます。
- union ← 結合する
【例】
<SQL文1> UNION <SQL文2> |
※計算式としては、「SQL文1 + SQL文2」の合計です。
※ALL を付けると重複した行は省略されます。
2つの SQL 文の差分を表示したい(EXCEPT)【2つのSQL文】
EXCEPT を使用して、2つの SQL 文の差分を表示することができます。
- except ← 除外する
【例】
<SQL文1> EXCEPT <SQL文2> |
※計算式としては、「SQL文1 – SQL文2」の差分です。(SQL文1の結果からSQL文2の結果を引いたもの)
※ALL を付けると重複した行もすべて表示されます。
SELECT 文の結果の表示数や範囲を指定したい(LIMIT OFFSET)
LIMIT OFFSET の組み合わせで SELECT 文で検索した結果の表示数や範囲を指定することができます。
testtableの内容です。
testdb=# SELECT * FROM testtable; |
「LIMIT 3 OFFSET 1」で 2 から 3 つのデータを表示しています。
testdb=# SELECT * FROM testtable no LIMIT 3 OFFSET 1; |
SELECT 文の結果に対して件数を指定して操作する(カーソル、CURSOR)
LIMIT でも同様に任意の位置からデータを取得することは可能ですが、カーソルの場合は、SELECT 文の結果に対して、任意の位置から件数を指定して操作したり、任意の場所から取り出したデータに対して操作をすることができます。
その場合は「カーソル(CURSOR)」を使用します。
カーソルの作成
DECLARE CURSOR コマンドでカーソルを作成します。
カーソルのオプション
- INSENTIVE ← デフォルト。カーソルから取得したデータが取得元テーブルの更新に影響をうけません。
- SCROLL ← 順方向(0→1→2→3→4→5→6→7)・逆方向(7→6→5→4→3→2→1→0)どちらでもカーソルを動かせるようにします。
- NO SCROLL ← データの順方向(0→1→2→3→4→5→6→7)のみカーソルを動かせるようにします。逆方向に動かした場合はエラーになります。
- WITH HOLD ← トランザクションコミット後もカーソルを利用できます。
- WITHOUT HOLD ← トランザクション内でのみカーソルを利用できます。
カーソルを利用してテーブルから行を抽出する(FETCH)
FETCH はカーソルを利用してテーブルから行を抽出します。
FETCH はカーソルを移動させて対象のデータ1行を取り出したり、複数行のデータを取り出すことができます。
FETCH のオプション
- FETCH NEXT ← (デフォルト)次の行を取り出します。
- FETCH PRIOR ← 1つ前の行を取り出します。
- FETCH <count> ← 次の<count>行を取り出します。(複数行可)
- FETCH ALL ← 残っている行をすべて取り出します。
- FETCH FORWARD ← 次の行を取り出します。
- FETCH FORWARD <count> ← 次の<count>行を取り出します。(複数行可)
- FETCH FORWARD ALL ← 残っている行をすべて取り出します。
- FETCH BACKWARD ← 1つ前の行を取り出します。
- FETCH BACKWARD <count> ← 前の<count>行を取り出します。(複数行可)
- FETCH BACKWARD ALL ← 現在行より前の行から最初まですべて取り出します。
パターンの一致(LIKE、SIMILAR TO、正規表現)
テーブルの中の値に一致する文字列があるかどうか検索する方法です。
- LIKE 演算子
- SIMILAR TO 演算子
- 正規表現
【例】TESTという文字列を検索したい場合
- TEST ← 完全一致。「TEST」のみ対象となります。
- %TEST% ← 文字列のどこかに「TEST」という文字列が入っています。
- TEST% ← 文字列の先頭が「TEST」で始まります。
- %TEST ← 文字列の最後が「TEST」で終わります。
SQL コマンドの終了はセミコロン(;)
SQL コマンドはセミコロン(;)で終了します。
postgres=# SELECT * FROM user; |
内部結合と外部結合と交差結合と自然結合
- 内部結合(INNER JOIN) ← 結合するテーブルの双方に結合条件を満たしたデータ(値)がある場合に限り、行が結合されます。
- 外部結合(OUTER JOIN) ← 結合するテーブルの双方に結合条件を満たしたデータ(値)がない場合でも結合が行われます。
- 交差結合(CROSS JOIN) ← 結合するテーブルのすべての組み合わせのデータ(値)で結合が行われます。
- 自然結合(NATURAL JOIN) ← 結合するテーブル同士の同じ列名を結合条件とした結合が行われます。
もっと簡単に言うと以下のようになるでしょうか。
- 内部結合(INNER JOIN) ← 両方のテーブルに指定したカラムの一致データがある場合に結合する
- 外部結合(OUTER JOIN) ← 両方のテーブルに指定したカラムの一致データがなくても結合する
外部結合の種類
- 左外部結合(LEFT OUTER JOIN)
- 右外部結合(RIGHT OUTER JOIN)
■どちらのテーブルが基準となるのか
- LEFT OUTER JOIN ← FROM の後ろにあるテーブルが左
- RIGHT OUTER JOIN ← JOIN の後ろにあるテーブルが右
■例(LEFT が基準になる)
testdb=# SELECT * FROM <左側テーブル> LEFT OUTER JOIN <右側テーブル> ON <左側テーブル>.busho_id = <右側テーブル>.busho_id; |
■例(RIGHT が基準になる)
testdb=# SELECT * FROM <左側テーブル> RIGHT OUTER JOIN <右側テーブル> ON <左側テーブル>.busho_id = <右側テーブル>.busho_id; |
実行例のための環境作成
「INNER JOIN」、「OUTER JOIN」、「FEFT OUTER JOIN」、「RIGHT OUTER JOIN」の違いを具体的に確認するため環境を作成します。
table01を作成します。
testdb=# CREATE TABLE table01 ( |
table02を作成します。
testdb=# CREATE TABLE table02 ( |
table01にデータを挿入します。
testdb=# INSERT INTO table01 VALUES(1,’高橋’,1); |
table02にデータを挿入します。
testdb=# INSERT INTO table02 VALUES(1,’営業’); |
■table01の中身
testdb=# SELECT * FROM table01; 1 | 高橋 | 1 |
■table02の中身
testdb=# SELECT * FROM table02; 1 | 営業 |
INNER JOIN の場合
■table01の場合
testdb=# SELECT * FROM table01 INNER JOIN table02 ON table01.busho_id = table02.busho_id; 1 | 高橋 | 1 | 1 | 営業 |
■table02の場合
testdb=# SELECT * FROM table02 INNER JOIN table01 ON table01.busho_id = table02.busho_id; busho_id | name | no | name | busho_id |
LEFT OUTER JOIN の場合
■table01の場合
testdb=# SELECT * FROM table01 LEFT OUTER JOIN table02 on table01.busho_id = table02.busho_id; 1 | 高橋 | 1 | 1 | 営業 |
■table02の場合
testdb=# SELECT * FROM table02 LEFT OUTER JOIN table01 ON table01.busho_id = table02.busho_id; 1 | 営業 | 5 | 中村 | 1 |
RIGHT OUTER JOIN の場合
■table01の場合
testdb=# SELECT * FROM table01 RIGHT OUTER JOIN table02 on table01.busho_id = table02.busho_id; 5 | 中村 | 1 | 1 | 営業 |
■table02の場合
testdb=# SELECT * FROM table02 RIGHT OUTER JOIN table01 on table01.busho_id = table02.busho_id; 1 | 営業 | 1 | 高橋 | 1 |
CROSS JOIN の場合
testdb=# SELECT * FROM table01 CROSS JOIN table02; 1 | 高橋 | 1 | 1 | 営業 |
PostgreSQL シリーズ
今まで学習した PostgreSQL の技術をシリーズとしてまとめました。
【PostgreSQL】PostgreSQL の特徴と基本【Part.1】
【PostgreSQL】【正規化】リレーショナルデータベース(RDMS)の基本【Part.2】
【PostgreSQL】PostgreSQL のインストールと初期設定【Part.3】
【PostgreSQL】PostgreSQL の標準付属ツールの説明とコマンド手順【Part.4】
【PostgreSQL】PostgreSQL の設定ファイル(postgresql.conf、pg_hba.conf)の解説【Part.5】
【PostgreSQL】PostgreSQL のバックアップ手順とリストア手順【Part.6】
【PostgreSQL】PostgreSQL の運用管理(ユーザー管理、バキューム)【Part.7】
【PostgreSQL】PostgreSQL の基本的な SQL文 とオブジェクトについて【Part.8】
【PostgreSQL】PostgreSQL の組み込み関数、ユーザー定義関数、演算子について【Part.9】
【PostgreSQL】PostgreSQL のトランザクションについて【Part.10】
【PostgreSQL】SQL文【Part.11】
【PostgreSQL】テーブル設計(データ型、制約)【Part.12】
コメント