SQL でのデータの操作 (SELECT/INSERT/UPDATE/DELETE)
MySQL 関連でユーザー管理、データベース・テーブルの作成ときたので、勢いでレコードの問い合わせ・挿入・更新・削除の方法もご紹介してしまおうと思います。既存の Web アプリケーションを使うだけなら知らなくても問題ありませんが、ちょっとカスタマイズをしようと思うと必要になってきますので、押さえておくに越したことはないでしょう。
毎度のことで恐縮ですが、MySQL、というか SQL の機能は非常に幅広く、それらをすべて説明しようとすると本が 1 冊書けてしまうほどです。ですので、ここでは基本的なところを押さえるに留めます。詳細は専門の書籍などを参照してください。というか、私もまだまだ勉強中ですので(^^ゞ
問い合わせ(SELECT 文)
まずは既存のレコードを取得する方法からいきましょう。SQL では、テーブルの個々のデータを取得することを「問い合わせ(Query)」と呼びます。問い合わせに使う SQL 文は SELECT です。
基本的な使用方法
SELECT 文の基本的な書式は以下のようになります。複数行に書いていますが、SQL 文では文字列以外での改行は無視されるので 1 行で書いても同じです。
SELECT <問い合わせ内容> FROM [<データベース>.]<テーブル> [WHERE <条件>];
- 問い合わせ内容
- 取得する情報を指定します。カラム名をコンマ区切りで並べればそのカラムのデータがそのまま取得できます。* を指定するとすべてのカラムが取得できます。さまざまな演算を行うこともできますが、今回はそこまで踏み込みません。
- データベース
- 取得するデータを格納したデータベースの名前を指定します。省略するとカレントのデータベースが使用されます。
- テーブル
- 取得するデータを格納したテーブルの名前を指定します。
- 条件
- 取得するレコードを制限するための条件を指定します(詳細は後述)。省略するとすべてのレコードが対象になります。
ユーザー管理の記事でも少し使用しましたが、テーブル "mysql.user" に格納されている MySQL のユーザー名(およびホスト名)をリストアップするには、以下のようにします。
SELECT User,Host FROM mysql.user;
もうひとつ例を挙げておきましょう。以下の SQL 文は、hokousya というユーザーの全情報を取得します。
SELECT * FROM mysql.user WHERE User='hokousya';
SQL では、データとしての文字列はシングルクォーテーションで囲わなくてはなりません(MySQL ではダブルクォーテージョンでも同じです)。そうでないとカラム名などとして解釈されてしまいます。
詳細:http://dev.mysql.com/doc/refman/4.1/ja/select.html
出力のソート
ORDER BY を利用すると指定したカラムの内容で出力を並べ替えることができます。以下の例は、ローカルホストのユーザーを名前順に表示します。
SELECT User FROM mysql.user WHERE Host='localhost' ORDER BY User;
DESC を指定すると降順になります。
SELECT User FROM mysql.user WHERE Host='localhost' ORDER BY User DESC;
ソート順に複数のカラムを指定することもできます。
SELECT User,Host FROM mysql.user ORDER BY User,Host;
FROM, WHERE, ORDER BY などの記述順は固定であることに注意してください。WHERE の前に ORDER BY を書くとエラーになります。
WHERE で指定する条件
WHERE で記述する条件は、カラム名に対してさまざまな条件演算子を適用することによって指定します。使用できる演算子には以下のようなものがあります。
演算子 | 機能 |
---|---|
= | 等しい |
> | より大きい |
< | より小さい |
>= | 同じかより大きい |
<= | 同じかより小さい |
<> | 等しくない |
IS NULL | NULL である |
IS NOT NULL | NULL でない |
BETWEEN a AND b | a 以上かつ b 以下 |
IN (v1,v2,...) | v1, v2... のいずれかと等しい |
LIKE str | str にマッチする |
REGEX regex | regex で指定した正規表現にマッチする |
最後の LIKE 演算子の str には、"%", "_" がワイルドカードとして使えます。それぞれ、シェルでいう "*", "?" に相当します。文字として "%", "_" を指定するときは "\" でエスケープします。
さらに、以下の演算子を使って複数の条件式を結合できます。
演算子 | 機能 |
---|---|
AND | 論理積 |
OR | 論理和 |
XOR | 排他的論理和 |
NOT | 否定 |
詳細:http://dev.mysql.com/doc/refman/4.1/ja/functions.html
レコードの挿入(INSER 文)
レコードの挿入には、INSERT 文を使用します。基本的な書式は以下のとおりです。
INSERT INTO [<データベース名>.]<テーブル名> (<カラム名リスト>) VALUES (<値リスト>);
- データベース
- 挿入する先のテーブルが所属するデータベースの名前を指定します。省略するとカレントのデータベースが使用されます。
- テーブル
- 挿入先のテーブルの名前を指定します。
- カラム名リスト
- 明示的に値を指定するカラムです。コンマ区切りで複数指定できます。ここに指定しなかったカラムには、デフォルト値が設定されていればそれが、なければ NULL が設定されます。省略した場合はすべてのカラムが選択されたとみなされます。
- 値リスト
- カラム名リスト の各カラムに設定する値をコンマ区切りで指定します。値には定数だけでなく式を書くこともできます。
例として、INSERT 文を使用してユーザーを追加する方法を示します。
INSERT INTO mysql.user VALUES('localhost','hokousya',PASSWORD('pass'));
本来はこのような方法を使うべきではないので、安易に実行しないでください(^^;
詳細:http://dev.mysql.com/doc/refman/4.1/ja/insert.html
レコードの更新
レコードの更新(データの変更)には、UPDATE 文を使用します。基本的な書式は以下のとおりです。
UPDATE [<データベース名>.]<テーブル名> SET <カラム名>=<値>,... WHERE [WHERE <条件>];
- データベース
- 更新するデータを格納したデータベースの名前を指定します。省略するとカレントのデータベースが使用されます。
- テーブル
- 更新するデータを格納したテーブルの名前を指定します。
- カラム名
- 更新するカラムを指定します。
- 値
- カラムに設定する値を指定します。式を記述することもできます。
- 条件
- 更新するレコードを制限するための条件を指定します。書式は SELECT 文と同じです。省略するとテーブル内の全レコードが対象になります(要注意)。
例として、ユーザー "hokousya" のパスワードを書き換える SQL 文です。そんな名前のユーザーはいないと思いますが、実行しないほうが無難でしょう。
UPDATE mysql.user SET Password=PASSWORD('pass') WHERE User='hokousya';
詳細:http://dev.mysql.com/doc/refman/4.1/ja/update.html
レコードの削除
レコードの削除には DELETE 文を使用します。基本的な書式は以下のとおりです。
DELETE FROM [<データベース名>.]<テーブル名> WHERE [WHERE <条件>];
- データベース
- 削除するデータを格納したデータベースの名前を指定します。省略するとカレントのデータベースが使用されます。
- テーブル
- 削除するデータを格納したテーブルの名前を指定します。
- 条件
- 削除するレコードを制限するための条件を指定します。書式は SELECT 文と同じです。省略するとテーブル内の全レコードが対象になります(要注意)。
例として、ユーザー "hokousya" を削除する SQL です。そんな名前(以下略^^;)。
DELETE FROM mysql.user WHERE User='hokousya';
詳細:http://dev.mysql.com/doc/refman/4.1/ja/delete.html
本日は、SQL 文を使ってデータを操作する方法をご紹介しました。実際の Web アプリケーションでも、上記とまったく同じ方法を用いています。それらのカスタマイズや解析をしようと思ったときに、上記の基礎的な知識だけでもかなり役に立つはずです。もしそのような機会があったら、ぜひもう一度、当ページをご覧くださいませ(^^)
詳しくはこちらの記事をどうぞ!
この記事にコメントする