Perl For UNIX/Linux
 
TryThe Homepage
初めてのCGI
CGI 研究室
ダイナミックCGI
ダウンロード
サービス
サーバ構築(Windows)
データベースアクセス
有料サービス
FAQ
お問い合わせ
このページを印刷
SQLステートメント
本コーナーでご紹介するサンプルコードは以下のデータベース構造となっています。
【郵便番号テーブル(iptable)】
フィールド名 データの種類 種類の幅 Primary Key? インクリメント 備考
id int はい はい 一意キー
code varchar 7 7桁郵便番号
pre int 県番号
citys text 市区町村地域
【都道府県テーブル(pretable)】
フィールド名 データの種類 種類の幅 Primary Key? インクリメント 備考
pre int はい はい 県番号
name varchar 20 都道府県名
  SELECT 文
テーブルからデータを選択します。
SELECT [DISTINCT] * | column_list
FROM table [WHERE predicates]
[GROUP BY group]
[HAVING having]
[ORDER BY order]

SELECT 文は、0個、1個、または複数の列を動的な結果セットに取り出すために使用します。 列は、1つまたは複数のテーブルから取り出すことができます。
(複数のテーブルから取り出す場合は「結合」といいます)。
SELECT 節はデータを取り出す列を示し、この列が結果セットを構成します。 結果セットの列は、テーブル列、リテラル値、および計算値からなるカンマ区切りのリストで指定します。 列リストのリテラル値は、パラメータを介して SELECT 文に渡すことができます。 パラメータによって SQL 文に列名を渡すことはできません。 アスタリスクを使用すると、すべての列から値を取り出すことができます。 SELECT 節の列リストには、複数のテーブルからの列を指定できますが、 そのテーブルはすべて FROM 節のリストに含まれていなければなりません。 FROM 節によって、データを取り出すテーブルを識別します。
次の例は郵便番号テーブル「iptable」の都道府県コードが39番の物だけを抽出しています。
SELECT * FROM iptable WHERE iptable.pre = 39 ORDER BY code
SELECT節には「*」を指定していますので、すべてのフィールドを返し、ORDER BY節で「code」を していますので、郵便番号順に並び替えています。
こちらは、複数のテーブルからフィールドを取り出す例です。
SELECT iptable.*,pretable.name FROM iptable LEFT JOIN pretable ON iptable.pre=pretable.pre WHERE iptable.pre = 39 ORDER BY iptable.code;
SELECT節では、iptableのすべてのフィールドとpretableの都道府県名を含める指定で、 LEFT JOIN は、iptableの都道府県コードとpretableの都道府県コードが一致する pretableの都道府県名を結合しています。このように必要な時だけ必要なデータと結合する事で、 それぞれのテーブルを小さくします。
【Perlでの記述】
$statement = "SELECT iptable.*,pretable.name FROM iptable LEFT JOIN pretable ON iptable.pre=pretable.pre WHERE iptable.pre = 39 ORDER BY iptable.code;";
$dbh->do($statement);
  DELETE 文
テーブルから 1 つまたは複数の行を削除します。
DELETE [table.*]
FROM table
WHERE criteria

DELETE ステートメントは、多数のレコードを削除する場合に特に便利です。
DELETE iptable WHERE code = 7815103
これは、郵便番号テーブルから郵便番号が「7815103」のレコードを削除しています。
DELETE iptable WHERE pre = 39
のように都道府県番号を指定すると39番(高知県)のレコードすべてが削除されます。
【Perlでの記述】
$statement = "DELETE iptable WHERE pre = 39";
$dbh->do($statement);

データベースからテーブル全体を削除するには、DROP ステートメントで Execute メソッドを使用します。 ただし、テーブルを削除するとテーブルの構造も失われます。 これに対して、DELETE ステートメントを使用した場合はデータのみが削除され、 テーブルの構造やフィールド属性、インデックスはそのまま残されます。
  INSERT 文
テーブルに 1 つまたは複数のレコードを追加します。
INSERT INTO table
[(columnslist)]
VALUES (updateatoms)

INSERT 文は、1 つのテーブルへ新規の行データを追加するために使用します。 INTO 節には、データの挿入先となるテーブルの参照を指定することができます。 オプションで、挿入先となるテーブルの列を指定することもできます。 指定する列はカンマで区切って列挙し、カッコで囲みます。 VALUES 節には更新する要素をカンマで区切って列挙し、カッコで囲みます。 新しい列がSELECT 副問い合わせで与えられる場合を除き、VALUES 節の指定が必要です。 挿入先の列を指定しない場合は、挿入する値(要素)は挿入先テーブルのフィールドに、 テーブルの構造どおりの順番で順次挿入されます。 更新要素は、VALUES 節で列挙した順番どおりに各列に挿入されます。 つまり、挿入先テーブルの列の数と同じだけの更新要素を指定する必要があります。
INSERT INTO iptable VALUES (1,7815103,39,高知市大津)
この例では、1番に郵便番号「7815103」、都道府県番号「39」、市区町村名「高知市大津」のレコードを追加しています。
【Perlでの記述】
$statement = sprintf("INSERT INTO iptable VALUES ('%d','%s','%d','%s')",1, 7815103, 39, '高知市大津');
$dbh->do($statement);
  UPDATE 文
テーブル中の 1 つまたは複数の行を更新します。
UPDATE table
SET newvalue
WHERE criteria;

UPDATE ステートメントは、多数のレコードを変更する場合や、 変更するレコードが複数のテーブルに含まれている場合に特に便利です。 UPDATE ステートメントでは、複数のフィールドを同時に変更できます。
UPDATE iptable SET code=7815103,sitys=高知市大津 WHERE id = 1;
この例では、idが1番のレコードの郵便番号と市区町村名を変更しています。
【Perlでの記述】
$statement = "UPDATE iptable SET code=7815103,sitys=高知市大津 WHERE id = 1;";
$dbh->do($statement);
※テーブルに重複しない一意キーが無ければ1つのレコードのみの変更が出来なくなります。
Copyright 2004 Terra. All rights reserved. No reproduction or republication without written