|
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つのレコードのみの変更が出来なくなります。
|
|
|
|