|
||||||||||||||||
|
3.1 psqlの基本操作■psqlの起動(方法1)(1)「スタート」−「プログラム」−「PostgreSQL3.2」−「’postgres’へのpsql」を選択します。 (2)psqlが起動し、以下のコマンドプロンプトの画面が表示されます。
■psqlの起動(方法2)(1)「スタート」−「プログラム」−「アクセサリ」−「コマンドプロンプト」で右クリックし、「管理者として実行」を選択します。 (2)コマンドプロンプト画面が表示されます。以下を入力します。
■psqlの起動(その3)psqlは、ラインコマンドを使って対話型でデータベースの操作を行うPostgreSQLの管理・開発ツールです。無償で利用できます。 なお、パソコンには、「postgres」でログオンしている必要があります。 (1)psqlは、Windowsのエクスプローラからc:\Program Files\PostgreSQL\8.2\bin\psql.exeを選択し、起動します。
(2)次のpsqlのコマンドライン画面が表示されパスワード入力待ちとなります。Windowsユーザとしての「postgres」のパスワードを入力し、「Enter」キーを押します。
(4)psqlが起動し、次の画面が表示されます。接続されているデータベースは既定でデータベース「postgres」です。
■psqlの終了psqlを終了するには、内部スラッシュコマンド「\q」を使用します。 |
| フィールド名 | 型 | 主キー | 説明 |
| 商品コード | CHAR(4) | ○ | 商品コード |
| 商品名 | CHAR(16) | 商品名 | |
| 単価 | INTEGER | 単価 |
データベースを「db_hanbai」に接続し、テーブル一覧を確認しておきます。

テーブル「tbl_商品表」を作成し、テーブル一覧を確認します。なお、SQLコマンドの最後に「;」(セミコロン)を忘れないようにします。

テーブルのフィールド一覧を表示するには、内部スラッシュコマンド「\d」を使用します。
=# \d テーブル名

テーブルの削除には、SQLコマンドの「DROP TABLE」文を使います。
=# DROP TABLE テーブル名;

テーブルへデータを入力するには、SQLコマンドの「INSERT INTO」文を使います。テーブルへデータを入力するとレコードが順次追加されます。レコードは行あるいはロウとも呼ばれますが、以下レコードと呼びます。
=# INSERT INTO テーブル名
(
フィールド名1,
フィールド名2,
:
)
VALUES
(
値1,
値2,
:
)

テーブルの全レコードを一覧表示するには、SQLコマンドの「SELECT * FROM」文を使います。「*」はワイルドカードといい、「全て」を意味します。ここでは、テーブルの全てのフィールドを選択して表示しなさいという意味になります。このSELECT文はSQLコマンドの中で最も多く使われるコマンドです。
=# SELECT * FROM テーブル名;

最初のレコードのデータが正常にテーブルに入力されていることが確認できます。
INSERT INTO文のような数行にわたるSQL分をpsqlのコマンドラインから入力するのはなかなか大変です。そこでSQL文をあらかじめ、テキストファイルに記述しておき、そのファイルをコマンドラインから読み込んで実行する方法があります。内部スラッシュコマンド「\i」コマンドを使います。なお、文の最後に「;」(セミコロン)は不要です。
=# \i ファイル名
たとえば、以下のテキストファイルを「insert01.sql」のファイル名で作成し、「D:\psql\販売管理」フォルダに保存しておきます。「D:\psql\販売管理」フォルダは、カレントディレクトリです。
テキストファイル「insert01.sql」の内容:
INSERT INTO tbl_商品表(商品コード,商品名 ,単価)
VALUES ('1002' ,'山の幸御膳',1200);
INSERT INTO tbl_商品表(商品コード,商品名 ,単価)
VALUES ('1003' ,'海の幸御膳',1400);
INSERT INTO tbl_商品表(商品コード,商品名 ,単価)
VALUES ('1004' ,'松竹梅御膳',1800);
なお、psqlでカレントディレクトリを変更するには、内部スラッシュコマンド「\cd」を使用します。なおディレクトリの階層の区切り記号は「\」でなく「/」を使います。たとえば、「D:\psql\販売管理」は「D:/psql/販売管理」と記述します。
=# \cd 変更先ディレクトリ
また、ドライブを変更する場合は、MS-DOSコマンドを使用します。psqlのコマンドラインで、MS-DOSコマンドを使用するには、内部スラッシュコマンド「\!」を使用します。
=# \! MS-DOSコマンド
カレントドライブがC:ドライブの場合に、カレントディレクトリを「D:\psql\販売管理」に変更するには次のようにします。

コマンドラインから、SQL文を記述したファイルを読み込みます。

入力済みのレコードの一部のフィールドの値を修正(更新)するには、SQLコマンドの「UPDATE」文を使います。
=# UPDATE テーブル名
SET フィールド名1 = 値1,
フィールド名2 = 値2,
:
WHERE 更新条件;
実行例を以下に示します。

入力済みのレコードを削除するには、SQLコマンドの「DELETE」文を使います。
=# DELETE FROM テーブル名
WHERE 条件式;
実行例を以下に示します。

商品コードの値が「1004」のレコードが削除されたのが確認できます。
テーブルに格納したデータ(レコード)を参照(検索、抽出などの表現も使う)する場合には、SQLコマンドの「SELECT」文を使います。SELECT文はもっともよく使うSQLコマンドです。このような操作は問い合わせ(query)とも言います。
SELECT フィールド名1,フィールド名2, ・・
FROM テーブル名
WHERE 条件式
ORDER BY フィールド名;
いくつかの例を示します。参照するテーブルは、次の「tbl_商品表2」です。
「tbl_商品表2」
+------------+------------+------+
| 商品コード | 商品名 | 単価 |
+------------+------------+------+
| 1001 | 田舎御膳 | 1000 |
| 1002 | 山の幸御膳 | 1200 |
| 1003 | 海の幸御膳 | 1500 |
| 1004 | 七福神御膳 | 3000 |
| 1005 | 松竹梅御膳 | 2000 |
| 1006 | 鶴亀御膳 | 2500 |
+------------+------------+------+
テーブルのすべてのフィールドとすべてのレコードのデータを参照する場合は、以下のSELECT文を使います。「*」はワイルドカードですべてのフィールド名を意味します。

一部のフィールド名のみたとえば、「商品コード」と「商品名」のみを表示する場合は、次のようなSELECT文を使います。

条件にあったレコードのみを参照(抽出)する場合は、次のようにSELECT文にWHERE句を使います。

次は、条件に「AND」を使い、複数の条件を満たすレコードを参照する場合のSELECT文です。

次に、条件式にあいまい条件や、範囲指定を用いる例を示します。参照するテーブルは、次の「tbl_商品表3」です。
「tbl_商品表3」
+------------+------------+------+
| 商品コード | 商品名 | 単価 |
+------------+------------+------+
| 1001 | 田舎定食 | 1000 |
| 1002 | 山の幸定食 | 1200 |
| 1003 | 海の幸定食 | 1500 |
| 1004 | 七福神御膳 | 3000 |
| 1005 | 松竹梅御膳 | 2000 |
| 1006 | 鶴亀御膳 | 2500 |
+------------+------------+------+
文字列の部分一致条件を使う場合は、LIKE演算子とワイルドカード文字「%」(半角)を使います。ワイルドカード文字「%」は0文字以上の任意の文字列を意味します。
次の例は末尾が「定食」となる商品名を含むレコードを参照します。いわゆる後方一致検索です。
(注)商品名のフィールドのデータ型は「CHAR(20)」で20バイトの固定長です。したがって、フィールドの値が'田舎定食'の場合、末尾に12バイトの空白文字列が詰め込まれています。したがって、広後方一致検索を行う場合は、この空白文字列をtrim()関数で削除してから、比較演算を行う必要があります。

前方一致検索の場合は、「LIKE '山%'」のようにします。

商品名に「幸」の文字が含まれるレコードを参照する場合は、「LIKE '%幸%'」とします。

特定の長さの文字列に一致する条件を指定する場合は、ワイルドカード文字「_」(半角のアンダーバー)を使います。
冒頭が「鶴亀」で4文字の商品名を含むレコードを参照する場合は、「LIKE '鶴亀_ _'」とします。
(注)「_ _」は2個連続した半角のアンダーバーの意味です。ここでは分かりやすいように、間に半角スペースを挿入していますが、SQL文では、半角スペースは入れません。

いくつかの特定の値に一致する場合の条件式には、IN演算子を使います。「1000」あるいは「1500」のいずれかに一致する場合という条件式は、「IN(1000,1500)」と記述します。

また、2000から2600までの間の任意の値に一致する条件式は、BETWEEN演算子を使います。

あるフィールド名の値に注目してデータの並べ替えを行うには、「ORDER BY」句を使います。次の例は、参照したレコードを単価の値の昇順に並べて表示しています。

降順に並べ替える場合は、「DESC」オプションを使います。

参照したレコードの特定のフィールド名に着目して、そのフィールド名の値が数値の場合、最大値、最小値、平均値などの演算を行うことができます。このような演算を行う関数を集約関数あるいは集合関数と呼びます。
次の例は、「単価」フィールドの平均値を計算しています。

参照した(条件にあった)レコード数を計数することもできます。

あるフィールド名に着目し、その値が同じレコードを部分集合としてグループ化することができます。一般には、その部分集合ごとにある演算を行います。
次のテーブル「tbl_商品」を参照することとします。
「tbl_商品」
+------------+--------------+----------------+------+
| 商品コード | 品目 | 品名 | 単価 |
+------------+--------------+----------------+------+
| 110 | せんべい | 塩せんべい | 200 |
| 120 | せんべい | えびせんべい | 300 |
| 130 | せんべい | のりせんべい | 350 |
| 210 | チョコレート | 板チョコ | 200 |
| 220 | チョコレート | 棒チョコ | 250 |
| 310 | つまみ | つまみ詰め合せ | 500 |
+------------+--------------+----------------+------+
次の例では、フィールド名「品目」に着目し、同じ「品目」の値のレコードをグループ化し、各グループのレコード数を計数しています。

また、グループごとの演算結果についてある条件にあったグループのみを参照(抽出)することができます。この場合はWHERE句でなくHAVING句を使います。

データの正規化により作成されたテーブルは冗長性のない合理的な構造となりますが、逆に人間にはわかりにくいものとなっています。そこで、実際の利用では、正規化により分割されたテーブルを結合して、わかりやすくします。これを表結合といいます。
次のテーブル「tbl_売上明細」とテーブル「tbl_商品1」を例にとります。
「tbl_売上明細」
+------------+------------+------+
| 伝票コード | 商品コード | 個数 |
+------------+------------+------+
| 1101 | 100 | 100|
| 1101 | 110 | 150|
| 1120 | 120 | 80|
| 1128 | 130 | 100|
+------------+------------+------+「tbl_商品1」
+------------+--------------+------+
| 商品コード | 商品名 | 単価 |
+------------+--------------+------+
| 100 | チョコレート | 200 |
| 110 | キャンディ | 300 |
| 120 | せんべい | 250 |
| 130 | ケーキ | 400 |
+------------+--------------+------+
テーブル「tbl_売上明細」には「商品コード」はありますが、第2正規化を行っているので、商品名は別途テーブル「tbl_商品1」を参照しないとわかりません。たとえば、テーブル「tbl_売上明細」の「商品コード」='100'の商品名は、「tbl_商品1」の「商品コード」='100'のレコードの「商品名」を参照して、「チョコレート」であることがわかります。テーブル「tbl_売上明細」の「商品コード」フィールドのとなりに、「商品名」フィールドがあると、人間にとってわかりやすくなります。そこで、テーブル「tbl_売上明細」とテーブル「tbl_商品1」を結合させることを考えます。
この場合、自然結合のための「NATURAL JOIN」句を使います。

同じような表結合は、等結合を用いたSELECT文でも記述できます。

複数のテーブルのフィールド名を混在して使用する場合は、どのテーブルのどのフィールド名かが分かるように、「テーブル名.フィールド名」のようにテーブル名とフィールド名を「.」(半角ピリオド)で結合した表記を使います。
ただ、このような表記では、表記が長くわかりづらくなるので、「相関名」を使ってより簡単に表記することができます。相関名とはたとえば、テーブル「tbl_売上明細」を1文字のアルファベット「M」で表記するような方法です。相関名は、FROM句内で、テーブル名の後に半角スペース1個以上で区切って相関名となるアルファベットを挿入することで定義します。

SELECT文、DELETE文、UPDATE文のWHERE句にSELECT文を使った条件式を使うことができます。このWHERE句の中のSELECT文を副問い合わせ(サブクエリ)といいます。副問い合わせのSELECT文は()で囲む必要があります。
執筆 山田豊通
更新日:
2007年9月15日