機能
操作するデータを指定する条件やテーブルを結合する為の条件式などを記述します。
データ操作命令(SELECT、UPDATE、DELETE)の一部として記述します。
データ操作命令 文法
SELECT 列,・・・ FROM テーブル WHERE 条件 |
テーブルから条件に該当するデータを取得します。 |
SELECT 列,・・・ FROM テーブル1,テーブル2 WHERE 結合条件 |
テーブル1とテーブル2を結合条件で結合して取得します。 |
UPDATE テーブル SET 列=値,・・・ WHERE 条件 |
条件に該当するテーブルのデータを対象に、列を値に更新します。 |
DELETE FROM テーブル WHERE 条件 |
条件に該当するテーブルのデータを削除します。 |
ここで紹介している文法は、代表的な使い方を抜粋したものです。
解説
WHERE句は、操作対象のデータを特定する(データ抽出条件)というものなので、既存データを操作するSELECT、UPDATE、DELETEで使用できますが、データを追加するINSERT文では使用できません。
※もしINSERT文の文法にWHERE句が存在したとしたら、「WHERE句で指定したデータに、INSERT文のデータを追加する」という意味不明な命令になってしまいますね。
SELECT WHERE句 抽出条件文例
(1)
|
WHERE 列1 = 1 |
列1が1のデータを抽出する。 (1という定数と比較していますね) |
(2) |
WHERE 列1 > 列2 |
列1>列2のデータを抽出する。 (テーブル上のデータ列を比較していますね) |
(3)
|
WHERE LENGTH(列1) > 5 |
列1の文字数>5のデータを抽出する (テーブル上の列を関数で加工した結果を使っていますね) |
(4)
|
WHERE 列1 IS NULL |
列1の文字数>5のデータを抽出する (テーブル上の列を関数で加工した結果を使っていますね) |
このように算術演算や比較条件、関数などを使って条件に該当するWHERE文を記述していきます。
また記述の違いによって処理速度にも大きく影響を与える事があるので、 シンプルでかつ効率的に処理することを意識すべきです。
例えば、
(A) : WHERE 列 1 > ( 360 / 60)
(B) : WHERE (列1 * 60) > 360
(A)も(B)も同じ結果が得られますね。
しかし (A)は一度定数を計算すれば全データの列1と比較できるのに対し、(B)は全データの列1を計算しその答えと比較していく必要があります。 100万件あるなら100万回計算しないと結果が得られないという事になります。
よって(A)の書き方をするのが実践的といえます。
※実際は、この例のような単純なものは、速度への影響はほとんど無く更に実行時に最適化してくれるので問題にはなりません。
しかし速度に影響を与えそうな複雑な条件ほど自動での最適化が不可能な場合が多いので常に意識しておく事が重要です。
SELECT WHERE句 結合条件文例
(1)
|
WHERE テーブル1.列2 = テーブル2.列3 |
列2と列3の内容が一致という条件で、テーブル1とテーブル2を結合します。
SELECT文全体の例としては下記のような感じになります。 SELECT テーブル1.列1 テーブル1.列2 テーブル1.列3 テーブル2.列1 テーブル2.列2 FROM テーブル1, テーブル2 WHERE テーブル1.列2 = テーブル2.列3 |
※ここでいう結合とは、複数テーブル間の列結合です。
データの結合(100件のテーブル+50件のテーブルを結合して150件のテーブルにする)ではありません。
テーブルのデータをまとめる操作を行いたい場合は、UNION を使います。
(1)は極めて基本的な使い方なので必ず使えるようになっておかなければなりませんね。
実際の用途としては、コードテーブルなどをデータに結合なんてことを頻繁に行うことになるでしょう。
ここで注意しなければならない事は、テーブル1とテーブル3を結合した時、常に1:1で対応するとは限らないということです。
1:n、n:1の関係かもしれません。またどちらかのデータが欠落しているかもしれません。
もちろんそれはテーブルにどのようなデータが入っているかで決まるわけですが、注意しておかないと予想外のデータが生成される羽目になってしまいます。