Windows+Apache+PHP+PostgreSQLによるWebアプリケーション
−入門編−

第3章 psqlによるPostgreSQLの操作

前へ | 目次へ |次へ  | Yamada-Lab

 

3.1 psqlの基本操作

■psqlの起動(方法1)

(1)「スタート」−「プログラム」−「PostgreSQL3.2」−「’postgres’へのpsql」を選択します。

(2)psqlが起動し、以下のコマンドプロンプトの画面が表示されます。

■psqlの起動(方法2)

(1)「スタート」−「プログラム」−「アクセサリ」−「コマンドプロンプト」で右クリックし、「管理者として実行」を選択します。

(2)コマンドプロンプト画面が表示されます。以下を入力します。

psql -U postgres

(注)「-U」は必ず半角大文字です。
なお、後述の「環境変数PATH値の設定」が実施すみであることを前提とします。
そうでない場合は、cdコマンドで、カレントディレクトリをpsql.exeがあるディレクトリ「C:\Program Files\PostgreSQL\8.2\bin」に変更しておく必要があります。

■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」を使用します。

■環境変数PATHの値の変更

 「psql.exe」をどこのフォルダーからでも実行できるように環境変数「Path」の値に、 「psql.exe」 のあるフォルダーのフルパスを以下の手順で追加します。

(1)「エクスプローラ」を開き、「マイコンピュータ」の上で右クリックし、メニューから「プロパティ」を選択します。

(2)「システムの詳細設定」リンクをクリックします。

(3)「詳細設定」タグを選択し、下の方の「環境変数」ボタンをクリックします。

(3)「システム環境変数」の欄の変数「Path」を選択し、「編集」ボタンをクリックします。

(4)変数名「Phth」の変数値欄の最後に「;」(半角のセミコロン)を記入し、その直後に、psql.exeの実行ファイルのあるフォルダーのフルパスの値「C:\Program Files\PostgreSQL\8.2\bin」をを貼り付け、「OK」ボタンをクリックします。

(5)「OK」ボタンを順次クリックし、「システムのプロパティ」のダイアログボックスを閉じます。

(6)以上の設定を有効にするには、パソコンを再起動する必要があります。

■作業用フォルダーの作成と移動

(1)Cドライブ上に、作業用のフォルダー「psql」を作成します。さらにその下に「販売管理」フォルダを作成します。

(2)「スタート」−「プログラム」−「アクセサリー」−「コマンドプロンプト」を選択し、「コマンドプロンプト」ウィンドウを開きます。

(3)「cd c:\psql\販売管理」と入力し、カレントフォルダを作業用の「C:\psql\販売管理」フォルダーに変更します。
(コマンドラインの入力の最後には、「Enter」キーを押しますが、以下この記述は省略します。)

(4)「psql」を実行中に、カレントディレクトリを変更する場合は、以下の「\! cd」コマンドを使用します。「\!」はWindowsOSのコマンドを実行するためのpsqlマンドです。

\! cd 変更先ディレクトリ

 あるいは、pseqlコマンドの「\cd」を使用します。

\cd 変更先ディレクトリ

3.2 データベースの操作

■データベースの一覧表示

(1)存在するデータベースの一覧を表示するには、内部スラッシュコマンド「\l」を使用します。

 

■ データベースへの接続

 データベース「db_test01」に接続します。

(1) 別のデータベースに接続するには、内部スラッシュコマンド「\c」を使用します。

\c db_test01

 パスワードは、現在ログオンしているユーザのパスワードを入力します。ここでは、PostgreSQLのスーパユーザpostgresのパスワードになります。

 正常にデータベースdb_test01に接続されると、コマンドラインのプロンプトが「db_test01=#」に切り替わります。

■データベースの作成

 データベースの作成には、SQLコマンドの「CREATE DATABASE」文を使います。コマンドは小文字「create database」でもかまいません。

=# CREATE DATABASE データベース名;

 ここでは、データベース「db_hanbai」を作成します。

(注)データベース名に漢字等2バイトコードを使用すると、その後正常に動作しません。

 

3.3 テーブルの操作

■ テーブルの一覧表示

(1)接続されているデータベース内のテーブル一覧を表示するには、内部スラッシュコマンド「\d」を使用します。

(2)内部スラッシュコマンド「\z」を使用して、接続されているデータベース内のテーブル一覧と各テーブルへのアクセス権を確認できます。

 

■テーブルの作成

 テーブルの作成には、SQLコマンドの「CREATE TABLE」文を使います。

=# CREATE TABLE テーブル名(フィールド定義);

 フィールドは列あるいはカラムともいいますが、以下フィールドと呼びます。フィールド定義は以下のように記述します。ここでは、オプションを省略した最も単純な例を示します。フィールド名と型の間は半角スペースで区切ります。次のフィールド名の定義に移る場合は半角カンマで区切ります。最後に、主キー(プライマリーキー:PRIMARY KEY)を定義します。フィールド名nはPRIMARY KEYとするフィールド名を記入します。

(
 フィールド名1 型1,
 フィールド名2 型2,
 フィールド名3 型3,
 PRIMARY KEY(フィールド名n)
)

 ここでは、データベース「db_hanbai」に、以下のテーブル「tbl_商品表」を作成します。

フィールド名 主キー 説明
商品コード CHAR(4) 商品コード
商品名 CHAR(16)   商品名
単価 INTEGER   単価

 データベースを「db_hanbai」に接続し、テーブル一覧を確認しておきます。

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

■テーブルのフィールド一覧表示

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

=# \d テーブル名

■テーブルの削除

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

=# DROP TABLE テーブル名;

 

3.4 データの操作

■テーブルへのデータの入力

 テーブルへデータを入力するには、SQLコマンドの「INSERT INTO」文を使います。テーブルへデータを入力するとレコードが順次追加されます。レコードは行あるいはロウとも呼ばれますが、以下レコードと呼びます。

=# INSERT INTO テーブル名
     (
       フィールド名1,
        フィールド名2,
        :
      )
      VALUES
      (
        値1,
        値2,
        :
      )

■テーブルの全レコードの一覧表示

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

=# SELECT * FROM テーブル名;

 最初のレコードのデータが正常にテーブルに入力されていることが確認できます。

■ファイルに記述したSQL文の実行

 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文を使います。

■WHERE句

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

■AND条件式

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

■あいまい検索

 次に、条件式にあいまい条件や、範囲指定を用いる例を示します。参照するテーブルは、次の「tbl_商品表3」です。

「tbl_商品表3」
+------------+------------+------+
| 商品コード | 商品名   | 単価 |
+------------+------------+------+
| 1001    | 田舎定食  | 1000 |
| 1002    | 山の幸定食 | 1200 |
| 1003    | 海の幸定食 | 1500 |
| 1004    | 七福神御膳 | 3000 |
| 1005    | 松竹梅御膳 | 2000 |
| 1006    | 鶴亀御膳  | 2500 |
+------------+------------+------+

■ワイルドカード文字「%」とLIKE演算子

 文字列の部分一致条件を使う場合は、LIKE演算子とワイルドカード文字「%」(半角)を使います。ワイルドカード文字「%」は0文字以上の任意の文字列を意味します。

■後方一致検索

 次の例は末尾が「定食」となる商品名を含むレコードを参照します。いわゆる後方一致検索です。

(注)商品名のフィールドのデータ型は「CHAR(20)」で20バイトの固定長です。したがって、フィールドの値が'田舎定食'の場合、末尾に12バイトの空白文字列が詰め込まれています。したがって、広後方一致検索を行う場合は、この空白文字列をtrim()関数で削除してから、比較演算を行う必要があります。

■前方一致検索

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

■任意文字列検索

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

■ワイルドカード文字「_」

 特定の長さの文字列に一致する条件を指定する場合は、ワイルドカード文字「_」(半角のアンダーバー)を使います。

 冒頭が「鶴亀」で4文字の商品名を含むレコードを参照する場合は、「LIKE '鶴亀_ _'」とします。

(注)「_ _」は2個連続した半角のアンダーバーの意味です。ここでは分かりやすいように、間に半角スペースを挿入していますが、SQL文では、半角スペースは入れません。

■IN演算子

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

■BETWEN演算子

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

■データの並べ替え(ソート)

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

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

■集約関数

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

 次の例は、「単価」フィールドの平均値を計算しています。

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

 

■グループ化

 あるフィールド名に着目し、その値が同じレコードを部分集合としてグループ化することができます。一般には、その部分集合ごとにある演算を行います。

 次のテーブル「tbl_商品」を参照することとします。

「tbl_商品」
+------------+--------------+----------------+------+
| 商品コード | 品目     | 品名      | 単価 |
+------------+--------------+----------------+------+
| 110     | せんべい   | 塩せんべい   | 200 |
| 120     | せんべい   | えびせんべい  | 300 |
| 130     | せんべい   | のりせんべい  | 350 |
| 210     | チョコレート | 板チョコ    | 200 |
| 220     | チョコレート | 棒チョコ    | 250 |
| 310     | つまみ    | つまみ詰め合せ | 500 |
+------------+--------------+----------------+------+

 次の例では、フィールド名「品目」に着目し、同じ「品目」の値のレコードをグループ化し、各グループのレコード数を計数しています。

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

 

3.5 表結合と相関名

 データの正規化により作成されたテーブルは冗長性のない合理的な構造となりますが、逆に人間にはわかりにくいものとなっています。そこで、実際の利用では、正規化により分割されたテーブルを結合して、わかりやすくします。これを表結合といいます。

 次のテーブル「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個以上で区切って相関名となるアルファベットを挿入することで定義します。

 

3.6 副問い合わせ

 SELECT文、DELETE文、UPDATE文のWHERE句にSELECT文を使った条件式を使うことができます。このWHERE句の中のSELECT文を副問い合わせ(サブクエリ)といいます。副問い合わせのSELECT文は()で囲む必要があります。

 

この記事へのコメント


前へ | 目次へ |次へ  | Yamada-Lab

執筆 山田豊通
更新日: 2007年9月15日