since 2002/01/01
lastupdate 2003/01/16
   

SQLによる問い合わせ - その1

さて、PostgreSQL に限らず、データベースを使う場合に避けて通れないのが SQL で、 データベースは SQL文字列による問い合わせに対し、必要な処理を行ったり、結果を返したりします。
なにやら小難しそうですが、SQL だけで細かいことを行うにはかなり難しいかも知れませんが、 実際に使うパターンはそんなに多くなく、フロントエンドのアプリケーションとの兼ね合いもありますが、 基本的な処理を組み合わせて行えば、さほど難しくない SQL だけでもそれなりのシステムは作れますし、 実際私はそうしてます。って言うか難しいのはまだ書けないだけですけど(^^;;;
とりあえず、私の説明できるレベルでのSQLのさわりについて。


基本

SQLは、データベースへの問い合わせ言語です。 基本的には予約語にたとえばテーブル名カラム名などを加え、最後に( ; )セミコロンをつけることで発行します。
psql においては、SQL文の最後にセミコロンを付け、enter キーをたたくと SQL が発行され、結果が返ってきます。
尚、SQL ではセミコロンをつけて enter を押すまでが1行としてみなされますので、セミコロンをつけない限り、 何度改行しても問題ありません。

SQL で最もよく利用されるのは、SELECT・INSERT・UPDATE・WHERE といった予約語でしょう。 また他に、CREATE TABLE も入るでしょう。
これらは、データの表示・挿入・更新・抽出、といった基本的な機能を提供する予約語であり、 CREATE TABLE は読んだとおりテーブルを作成するものです。 実際には、もっとたくさんの予約語がありますが、 これらがとりあえず基本となるでしょう。
尚、PostgreSQL では、SQL92互換となっており、これに独自に拡張が加えられているようです。 が、 基本的なものは、そんなに変わらないと思います。

SQL文の書き方ですが、予約語やテーブル名はスペースで区切ります。 予約語は大文字小文字を区別しませんので、どちらで書いても問題ありません。
また、データやカラム名は、( , )カンマで区切って書くことが多く、 データとして文字列を書く場合には( ' )シングルクォーテーションでくくります。 また、日付型のデータもシングルクォートします。
尚、数値型のデータの場合にシングルクォートしても問題ありませんので、 プログラムなどの繰り返し構文などで SQL を作る場合などは、全てシングルクォートしておけば楽です。
また、-- (ハイフン2つ)以降はコメントとして無視されます。 後はやりやり覚えてください(^^

テーブルの作成 ( CREATE TABLE )

データベースのデータは、全て テーブル と呼ばれる入れ物に入っています。 当然何はともあれまずテーブルを作ることから始めます。
尚、テーブル作成するには、データ型、というものも知らなければならないでしょう。 詳細はマニュアルなどを見てもらうとして、主なデータ型には、 数値型( integre, int )文字列型( varchar, text )などがあります。
実際にテーブルを作るには、次のような構文になります。カラム名とデータ型はスペースで区切り、 複数のカラムがある場合にはカンマで区切ります。

構文: CREATE TABLE テーブル名 ( カラム名 データ型, ... ) ;

たとえば商品の名前と在庫のテーブル: zaiko を作る SQL は次のようになります。

koano=# CREATE TABLE zaiko (hinmei text, zaiko int) ;

テーブルの作成が成功すれば CREATE と表示されます。
ちなみに、良く私が失敗するパターンですが、カラムの最後にうっかりカンマを付けてしまい叱られる事があります。
こんな間抜けは私だけかと思いますが、参考まで(^^;;;

レコードの追加 ( INSERT INTO )

テーブルができたら、次はデータを格納します。新しいデータを追加するには、INSERT文を使います。
INSERT文には、カラム名とそれに対応するデータを別々に記述します。ちょっと面倒ですね。 ただし、全てのカラムに並び順どおりにVALUESを配置すれば、カラム名を省略できます。

構文: INSERT INTO テーブル名 ( カラム名, カラム名, ... ) VALUES ( データ, データ, ... ) ;

では、先ほど作成したzaikoテーブルにデータを実際に追加してみましょう。

TEST=# INSERT INTO zaiko VALUES ( 'red', 100 ) ;
TEST=# INSERT INTO zaiko ( hinmei, zaiko ) VALUES ( 'blue', 50 ) ;

これで、INSERT 18888 1 などと表示されれば成功です。 ここで18888というのは、oid(オブジェクトID)と呼ばれるもので、次の1が追加されたレコード数を表しています。 で、既におわかりと思いますが、上の2つの SQL は値以外は同じ結果になります。
さらにレコードを追加する場合は、同じような手順で行います。 ついでですのでサンプル用としてもう少しデータを追加しておきましょう。

TEST=# INSERT INTO zaiko VALUES ( 'green', 75 ) ;
TEST=# INSERT INTO zaiko VALUES ( 'yellow', 30 ) ;

また、一度にたくさんのレコードを追加するのにいちいちINSERT文を発行していたのではらちが明きません。 そのような場合には psql のバックスラッシュコマンドの ¥copy や ¥i を使います。

レコードの表示 ( SELECT )

SELECT文はレコードを表示する SQL で、SQL の中ではもっとも基本的なものといえるでしょう。 それだけに、いろいろな使い方があり極めるのが難しそうです。 とりあえず基本的な構文としては次のとおりです。

構文: SELECT カラム名 FROM テーブル名 [ WHERE 条件式 ] ;

ま、実際にやってみるのが一番。とりあえずここまでに入力したレコードを表示してみましょう。

TEST=# SELECT * FROM zaiko ;

一番簡単なSELECT文ですね。SELECT の後の ( * ) は全てのカラムを指定するワイルドカードです。
簡単に説明すると、テーブル: zaiko 内全てのカラムのデータを表示しなさい、ということになります。
この SQL により、次のような表が表示されます。

 hinmei | zaiko
--------+-------
 red    |   100
 blue   |    50
 green  |    75
 yellow |    30
(4 rows)

レコードの抽出 ( WHERE )

通常、テーブルのレコードを全て返すようなSQLは稀だと思います。 実際数万件もあるようなテーブルのデータを 全て返してもらってもどうしようもありません。
そこで、普通は目的のレコードを抽出する条件を付加してSELECT文を発行します。
で、条件をつけるためのキーワードとして WHERE というのを使います。 構文は、上のSELECT文で書いてあるのでここでは省略します。

たとえば、先ほどの zaiko テーブルにおいて hinmei が red のレコードだけを抽出する場合は次のようなSQLを発行します。

TEST=# SELECT * FROM zaiko WHERE hinmei = 'red' ;

これにより、次のような表が表示されます。

 hinmei | zaiko
--------+-------
 red    |   100
(1 row)

このように、WHERE句に続けて カラム名 = 値 とするのが基本的な使い方となります。
また、より複雑な使い方として、条件を複数組み合わせることもできます。 たとえば、red と green のみを抽出する場合は、

TEST=# SELECT * FROM zaiko WHERE hinmei = 'red' OR hinmei = 'green' ;

となり、結果はこのようになります。

 hinmei | zaiko
--------+-------
 red    |   100
 green  |    75
(2 rows)

また、数値による比較も行えます。たとえば カラム:zaikoの値が70より多いものを抽出するには、

TEST=# SELECT * FROM zaiko WHERE zaiko > 70 ;

となり、結果はこのようになります。

   hinmei | zaiko
  --------+-------
   red    |   100
   green  |    75
  (2 rows)

尚、複数の条件を設定する時には、OR の他 AND なども利用できます。