DROP TABLEコマンドによりテーブルを削除します。構文も単純であり、削除するテーブル名を指定するのみです。
では、実際にテーブルを削除してみましょう。その前に、データベース内に存在するテーブルを確認しておきます。
testdb=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-------------+----------+----------
public | staff | テーブル | postgres
public | testTable01 | テーブル | postgres
(2 行)
現状は2つのテーブルがあることが確認できます。ではそのうちのStaffテーブルを削除してみましょう。
testdb=# DROP TABLE staff;
DROP TABLEコマンド発行後、正しくテーブルが削除されたかどうか確認してみます。
testdb=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-------------+----------+----------
public | testTable01 | テーブル | postgres
(1 行)
このようにテーブルの削除は非常に簡単です。ただし、「間違えて削除してはいけないテーブルを削除してしまった」とDROP TABLEコマンド発行後に気がついても、もう元には戻せません。
例えば、本番稼働中のシステムのテーブルを誤って削除してしまったといった場合、直後に惨劇が訪れます。データベースはあらゆるシステムの根幹です。DROP TABLEコマンドを使用する場合は十分に注意するよう心がけて下さい。
]]>DELETEコマンドにより、テーブルのデータを削除することができます。基本的な構文は以下になります。
DELETEコマンドで削除するのは行(レコード)単位です。例えば、一部の列だけを削除すると言ったことはできません。
では、実際にDELETEコマンドを発行してデータを削除してみましょう。
testdb=# DELETE FROM Staff WHERE id='0002';
WHERE句で削除する対象の行を指定します。上記例では、id列が「0002」の行を削除しています。
では、id列「0002」の行が削除されているかどうか、SELECTコマンドで確認してみます。
testdb=# SELECT * FROM Staff; id | name | age ------+------------+----- 0001 | 山田太郎 | 46 0003 | 斉藤達弘 | 46 0004 | 桜井さつき | 46 (3 行)
対象行は存在せず、正しく削除されていることが確認できます。
UPDATEコマンドと同じく、WHERE句の指定がないとテーブル内の全ての行が削除されます。
例えば、以下のDELETEコマンドを発行してみましょう。
testdb=# DELETE FROM Staff;
上記コマンド発行後、SELECTコマンドでデータを確認すると、データが1件も登録されていないことがわかります。
testdb=# SELECT * FROM Staff; id | name | age ----+------+----- (0 行)
意図して、全行削除する場合は良いですが、WHERE句の記述を忘れて誤って全てのデータを削除してしまったということにならないよう十分に注意しましょう。本番稼働中のシステムでこのようなミスをしてしまっては目も当てられません。
UPDATEやDELETEコマンドはある意味、危険なコマンドであるということを念頭に置いておくことが大切です。
]]>UPDATEコマンドにより、テーブルのデータを変更することができます。基本的な構文は以下になります。
更新対象の列と、更新後の値は、SET句で指定します。また、更新対象の行はWHERE句で指定します。
例えば、渡辺さんが結婚して苗字が「桜井」に変わったとします。その場合は、以下のようなUPDATEコマンドを発行して、渡辺さんの名前を変更します。
testdb=# UPDATE Staff SET name = '桜井さつき' WHERE id='0004';
次に、name列が正しく変更されたかどうかSELECTコマンドで確認してみます。
testdb=# SELECT * FROM Staff;
id | name | age
------+------------+-----
0001 | 山田太郎 | 26
0002 | 佐藤隆 | 34
0003 | 斉藤達弘 | 45
0004 | 桜井さつき | 28
(4 行)
正しく変更されているのが確認できます。
更新対象の行を指定するのはWHERE句ですが、WHERE句を記述しないことで、全行を更新対象とすることになります。
例えば、以下のUPDATEコマンドを発行してみましょう。
testdb=# UPDATE Staff SET age = 46;
変更後、全行をSELECTコマンドで確認すると以下のような結果になります。
testdb=# SELECT * FROM Staff; id | name | age ------+------------+----- 0001 | 山田太郎 | 46 0002 | 佐藤隆 | 46 0003 | 斉藤達弘 | 46 0004 | 桜井さつき | 46 (4 行)
すべての行のage列が更新されています。基本的に、全行に対して同じ値で更新するようなケースはめずらしく、大抵がWHERE句の記述を忘れたなどの操作ミスにより、誤って更新してしまったというパターンとなるでしょう。
WHERE句を指定しないとテーブル内のすべての行のデータが更新されてしまうという点に十分注意しておきましょう。
]]>SELECTコマンドで必要なデータを検索し、取り出すことができます。また、そのことを「問い合わせ」あるいは「クエリ(query)」と呼ぶこともあります。
SELECTコマンドは構文が数多くあり、かなり複雑です。ここでは基本的な構文のみ見ていきます。
SELECTコマンドには、SELECT句とFROM句という2つの句があります。
※句はSQL文を構成する要素であり、SELECTやFROMなどのキーワードから始まるフレーズのことです。
SELECT句には、テーブルから取り出したい列名を書き並べます。また、FROM句には、データを取り出すテーブル名を指定します。
では早速、Staffテーブルから前回登録したデータを取り出してみましょう。
testdb=# SELECT name FROM Staff;
name
------------
山田太郎
佐藤隆
斉藤達弘
渡辺さつき
(4 行)
上記のように、全ての行のname列が表示されます。
上記サンプルでは、出力したい列名を指定していましたが、すべての列を出力したいときには、すべての列を意味するアスタリスク(*)を使用できます。
testdb=# SELECT * FROM Staff; id | name | age ------+------------+----- 0001 | 山田太郎 | 26 0002 | 佐藤隆 | 34 0003 | 斉藤達弘 | 45 0004 | 渡辺さつき | 28 (4 行)
上記のように、全ての行の全ての列が表示されます。
アスタリスクを使用した場合の注意点として、結果の列の並びを指定することはできなくなります。必ず、CREATE TABLEコマンドで定義した列の順番で表示されます。
まず、Staffテーブルの定義を確認しましょう。Staffテーブルは以下の列を持ちます。
| 列名 | データ型 | 制約 |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| name | TEXT | NOT NULL |
| age | INTEGER | なし |
テーブルへのデータ登録はINSERTコマンドで行います。
列名1に値1、列名2に値2がセットされます。列と値の数は一致させる必要があり、不一致の場合はエラーとなり挿入に失敗します。また、データ型も一致させる必要があります。例えば、INTEGER型の列に文字列をセットしようとしてもエラーとなります。
列名を省略することもできます。ただし、省略すると、VALUES句にはテーブルの全ての列にセットする値を指定してやる必要があります。
では、実際にINSERTコマンドを発行してデータを登録してみましょう。
testdb=# INSERT INTO Staff (id, name, age) VALUES ('0001', '山田太郎', 26);
testdb=# INSERT INTO Staff (id, name, age) VALUES ('0002', '佐藤隆', 34);
testdb=# INSERT INTO Staff (id, name, age) VALUES ('0003', '斉藤達弘', 45);
列名を省略した場合は以下のように記述します。
testdb=# INSERT INTO Staff VALUES ('0004', '渡辺さつき', 28);
VALUES句内に指定する値の順序は、テーブルの定義時に指定した列の順序で指定します。データ登録時に、全ての列にデータをセットする必要がある場合は、このように省略しても構いません。
]]>まずは、データの入れ物であるテーブルを作成します。
テーブルの作成はCREATE TABLEコマンドで行います。
()内は列名とデータ型、その列の制約で1セットとなり、定義する列の分だけ、カンマ(,)区切りで指定します。列名とデータ型の定義は必須であり、制約は必要に応じて任意に設定します。
列に指定する制約として以下の項目があります。
| PRIMARY KEY | 主キーとする。 |
|---|---|
| UNIQUE | 列内で重複する値を許可しない。 |
| REFERENCES 表名(列名) | 外部キーとする。参照先は指定した表名(列名)となる。 |
| CHECK(条件) | 条件に合う値のみ登録を許可する。 |
| NOT NULL | NULL値(空の値)を許可しない。 |
| DEFAULT 値 | 新規行追加時の初期値を指定する。 |
上記は列ごとに制約を指定していますが、以下の制約については表全体の制約として指定することができます。
| PRIMARY KEY(列名リスト) | 指定した列(複合キーの場合は列1、列2…と列挙)を主キーとする。 |
|---|---|
| UNIQUE(列名リスト) | 指定した列内で重複する値を許可しない。 |
| FOREIGN KEY(列名リスト) REFERENCES 表名(列名リスト) | 指定した列(複数列を参照する場合は列1、列2…と列挙)を外部キーとする。参照先は指定した表名(列名)となる。 |
特に複数の列を使って主キーとする複合キーなどは、列ごとに設定することができないため、この表制約にて設定を行うことになります。
ここではサンプルとして以下の列を持つStaffテーブルを作成します。
| 列名 | データ型 | 制約 |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| name | TEXT | NOT NULL |
| age | INTEGER | なし |
スタッフの名簿情報を格納するテーブルです。列には「id」「name」「age」を持ち、それぞれ、ID、名前、年齢を格納します。データ型はそれぞれ数字、文字列、数字とします。
また、各列の制約として、「id」にはPRIMARY KEY(主キー)制約を持たせます。PRIMARY KEY制約は、列内で重複する値の格納を許可せず、かつ、必ずデータを格納しなければならないという制約です。
「name」には必ずデータを格納しなければならないことを示すNOT NULL制約を持たせます。
では、実際にCREATE TABLEコマンドを発行してテーブルを作成してみましょう。今回発行するSQL文は以下になります。
CREATE TABLE Staff (id CHAR(4) NOT NULL, name TEXT NOT NULL, age INTEGER , PRIMARY KEY (id));
まず、PostgreSQLに接続します。本サンプルでは接続先のデータベースとして「testdb」を指定しています。データベースの作成については「サンプルデータベースの作成」を参照してください。
# su - postgres $ psql -U postgres testdb
「testdb」に接続できたら、上記のCREATE TABLEコマンドを発行し、Staffテーブルを作成します。SQL文は1行で実行しても構いませんが、見やすいよう以下のように複数行に分けて実行します。
testdb=# CREATE TABLE Staff testdb-# (id CHAR(4) NOT NULL, testdb(# name TEXT NOT NULL, testdb(# age INTEGER , testdb(# PRIMARY KEY (id));
2行目以降は、プロンプトが「=#」から「-#」や「(#」に変わっていることに着目してください。これは、まだSQLが終わっていないことを示しており、セミコロンを入力し、Enterキーを押すことで、ここまでの入力した内容がひとつのSQL文として見なされ実行されます。
では、テーブルが作成されたかどうかをバックスラッシュコマンドで確認してみましょう。
testdb=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-------------+----------+----------
public | staff | テーブル | postgres
public | testTable01 | テーブル | postgres
(2 行)
Staffテーブルが一覧から確認できます。これでテーブルは作成されました。次回は今回作成したテーブルにデータを挿入するSQLについて見ていきます。
]]>psqlは、PostgreSQLに標準で付属しており、PostgreSQLをインストールした環境であれば、すぐに利用できます。
今回は、psqlでPostgreSQLに接続し、データベースに関する情報を表示する手順について見ていきます。
Linux版のPostgreSQLの場合であれば、シェル上からpsqlコマンドを実行します。
-Uオプションでデータベースのユーザー名を指定し、引数としてデータベース名を指定します。psqlコマンドでよく使われるオプションとして以下のようなものがあります。
| オプション | 説明 |
|---|---|
| -l | データベース一覧を表示する。コマンド実行後、データベースに接続したままにならず、プロンプトに戻る。 |
| -c ‘コマンド’ | 引数で指定したSQLコマンドを実行し、結果を表示する。コマンド実行後、データベースに接続したままにならず、プロンプトに戻る。 |
| -f ファイル名 | 引数で指定したファイルの中身をSQLとして実行する。コマンド実行後、データベースに接続したままにならず、プロンプトに戻る。 |
| -p ポート番号 | 接続するPostgreSQLのポート番号を指定する。 |
| -h ホスト名 | 接続するPostgreSQLのホスト名を指定する。 |
では、実際にpsqlを利用してデータベースに接続してみましょう。今回はpostgresユーザーでtemplate1データベースに接続します。
# su - postgres $ psql -U postgres template1
コマンド実行後は、指定したデータベース(template1)への接続に成功したら、プロンプトが以下のように変わります。
template1=#
このプロンプトになっている間はデータベース(template1)に接続していることを示します。この状態になれば、直接SQLを実行することが可能となります。
また、プロンプトの最後が「=#」になっていますが、この意味は接続したユーザーがスーパーユーザーであることを表しています。一般ユーザーで接続した場合は「=>」になります。
SQLを実行する前に、まず接続したデータベースにどのようなテーブルやインデックスがあるのかを確認する方法について見ていきましょう。
データベースに関する情報は、psqlで実装されているバックスラッシュコマンドで参照できます。例えば、定義されているテーブルを確認するには「\d」コマンドを実行します。
template1=# \d
よく使用されるバックスラッシュコマンドとして以下のようなものがあります。
| バックスラッシュコマンド | 説明 |
|---|---|
| \? | バックスラッシュコマンドヘルプを表示 |
| \h | SQLヘルプを表示 |
| \q | psqlを終了 |
| \l | データベースの一覧を表示 |
| \dn | スキーマの一覧を表示 |
| \d | テーブル、インデックス、シーケンス、ビューの一覧を表示 |
| \dt | テーブルの一覧を表示 |
| \di | インデックスの一覧を表示 |
| \ds | シーケンスの一覧を表示 |
| \dv | ビューの一覧を表示 |
| \dS | システムテーブルの一覧を表示 |
| \du | データベースユーザーの一覧を表示 |
| \df | 関数の一覧を表示 |
| \r | 入力途中のクエリのリセット |
| \timing | SQL実行時間計測表示のON/OFF |
他にもいろいろあり覚えるのが大変かもしれませんが、どのようなことが確認できるのかをおさえておき、バックスラッシュコマンドヘルプを表示するコマンドを最低限覚えておきましょう。
]]>SQL文は1文ずつ発行され、1文につき、1つのデータベース操作を行います。
RDBMSに1つのSQL文の終わりを示すためには、区切り文字が必要です。SQLでは、その区切り文字が「;」(セミコロン)となります。
例:
SELECT * FROM sampleTable;
SQL文の中には、テーブル名、列名など、対象データを特定する為の情報と、いくつかのキーワードとを組み合わせて記述します。
例えば、以下のSQL分では、
SELECT * FROM sampleTable;
「SELECT」と「FROM」がキーワードです。
キーワードに大文字/小文字の区別はなく、「SELECT」「select」と、どちらで書いても正しく処理されます。
また、キーワードとキーワードの間には、スペースやタブ、改行を挿入することができます。数に制限もなく、いくら挿入しても問題ありません。ただし、全角スペースは使用できません。
SQL文の中にじかに書く文字列や日付、数値などを定数と言います。
それらのうち、文字列と日付については、SQL文内で定数として表現するときは、シングルクォーテーション(‘)で囲む必要があります。
SELECT * FROM sampleTable WHERE name = 'Tanaka'; SELECT * FROM sampleTable WHERE birth = '1975-02-22';
一方、数値は何かで囲む必要はなく、そのまま記述します。
SELECT * FROM sampleTable WHERE age = 40;]]>
PostgreSQLを含む、ほとんどのRDBMSがSQLをサポートしており、アプリケーションからデータベースを利用する場合にはSQLを使用してデータベースに対して各種問い合わせを行うことになります。
SQLでできることのほとんどはpgAdminによるGUIからでも操作できますが、アプリケーションからデータベースにアクセスする場合には、GUIで操作というわけにはいきません。
そのため、PostgreSQLに限らず、データベースを利用するアプリケーションを開発する上で、SQLの習得は必須であり、避けては通れないものです。
SQL(Structured Query Language)はデータベース(正確にはリレーショナルデータベース)を操作するために開発された言語です。
もともと、データベースから効率良くデータを検索することを目的としたものでしたが、現在ではデータ検索だけでなく、データの登録や削除といったデータベース操作のほとんどをSQLで行うことができます。
SQLにはISO(国際標準化機構)で定められた標準規格があり、それに準拠したSQLを標準SQLと言います。
このように標準規格を定めることで、さまざまにあるRDBMSで同じSQL文を使うことができます。
ただし、標準SQLに完全に準拠したRDBMSばかりではなく、RDBMSごとにいわゆる「方言」のようなものが存在します。(例えば、Oracleデータベースで使用できるSQL文がSQL Serverでは使用できないなど。)
とは言うものの、標準SQLを覚えれば、大抵のデータベース操作が可能なため、まず、標準SQLでの書き方を覚えていくのが良いでしょう。
SQLは機能により、大きく次の3つに分類されます。
DDL(データ定義言語)は、テーブルなどのオブジェクトを作成するためのコマンド群です。DDLに分類されるコマンドは以下になります。
| CREATE | データベースやテーブルなどを作成する。 |
|---|---|
| DROP | データベースやテーブルなどを削除する。 |
| ALTER | データベースやテーブルなどの構成を変更する。 |
DML(データ操作言語)は、データの挿入/更新/削除などを行うためのコマンド群です。DMLに分類されるコマンドは以下になります。
| SELECT | テーブルから行を検索する。 |
|---|---|
| INSERT | テーブルに新規行を登録する。 |
| UPDATE | テーブルの行を更新する。 |
| DELETE | テーブルの行を削除する。 |
DCL(データ制御言語)は、トランザクション関連のコマンドが含まれます。DCLに分類されるコマンドは以下になります。
| COMMIT | データベースに対して行った変更を確定する。 |
|---|---|
| ROLLBACK | データベースに対して行った変更を取り消す。 |
| GRANT | ユーザーに操作の権限を与える。 |
| REVOKE | ユーザーから操作の権限を奪う。 |
このように、SQLは機能により3つの種類に分けられます。そのうち、最もよく使われるのがDML(データ操作言語)になります。
]]>テーブルにデータを登録するには以下の2通りの方法があります。
ひとつ目のSQL文を実行する方法はpsqlコマンドによりデータベースへログインするなどして行います。ふたつ目のデータビューを使用する方法はpgAdminを使用して登録することになります。
ここでは後者のデータビューを使用して登録する手順を見ていきます。
pgAdminの機能であるデータビューを使用すれば、データの登録・削除・参照をGUIベースで行えます。
※ただし、登録に関しては、主キーが設定されている、もしくはテーブル作成時に「OIDを持つ」にチェックを入れている必要があり、いずれの条件も満たしていない場合は、参照のみとなり、登録はできません。
早速、データビューを使用してデータを登録してみます。
pgAdminを起動したら左ペインのオブジェクトブラウザのツリーから「staff」テーブルを右クリックし、コンテキストメニューから「データビュー」-「全ての列を表示」をクリックします。(以下のスクリーンショットではテーブル名が「sampleDB」となっていますが、「staff」テーブルに読み替えてください。)

すると、以下のダイアログボックスが表示されます。

ここに、1行(レコード)ずつ、適当なデータを入力してみてください。

各列にデータを入力し、Enterキーを押下すれば、その時点でデータは登録されます。その際、テーブル作成時に取り決めた制約を守っている必要があります。例えば、「age」列に0より小さな値を入力した場合、制約違反となり以下のようなエラーが出力されます。

続いて、登録したデータを削除してみましょう。今回は5行目のレコードを削除してみます。

6歳ではまだ労働できないので「staff」テーブルから削除します。当該行を選択した状態で、画面上部のゴミ箱アイコンをクリックします。
すると、以下のような確認ダイアログが表示されるため「はい」ボタンを押下します。

行が削除されているのが確認できます。

データベースの主目的はデータ検索をすばやく行うことです。次に、データビューを使用して「staff」テーブルに格納されているデータを検索してみましょう。
左ペインのオブジェクトブラウザのツリーから「staff」テーブルを右クリックし、コンテキストメニューから「データビュー」-「行フィルターの表示」をクリックします。

以下のようなダイアログボックスが表示されます。「フィルタ文字列」テキストボックスに「age >= 30」と入力して「OK」ボタンを押下します。

すると、以下のように「age」(年齢)が30歳以上のスタッフのレコードのみが表示されます。

このように条件式を入力し、その条件を満たすデータのみをデータビューに表示させることができます。
pgAdminからSQL文を直接発行してデータ検索を行うこともできます。
左ペインのオブジェクトブラウザのツリーから「staff」テーブルを右クリックし、コンテキストメニューから「スクリプト」-「SELECTスクリプト」をクリックします。

以下のようなダイアログボックスが表示されます。「SQLエディタ」に任意のSQL文を入力し、画面上部の実行アイコンをクリックすれば、画面下部の出力ビューに結果が表示されます。

SQLに慣れてる場合は、こちらの方法の方が便利かもしれません。
]]>