【SQLの基本】WHERE句
はじめに
今回の記事ではSQL第一回目に引き続き第二回目のSQLに関する記事として基本のWHERE句について説明したいと思います!
WHERE句基本
WHERE句の用途は絞り込みです。どのレコード(行)を対象にして取得・更新・削除するのかを条件式で絞り込みます。
WHERE 条件式
条件式とは真偽値を返却する式です。SQLでは主に比較演算子を使用します。
= (左右の値が等しい) < (左辺は右辺より小さい) > (右辺は左辺より小さい) <= (左辺は右辺の値以下) >= (右辺は左辺の値以下) <> (左右の値が等しくない)
例えば、IDが1であるレコードを対象として名前の列(カラム)を更新する場合は以下のようになります。
UPDATE game_character SET 名前=DAIKI WHERE ID = 1;
また、不等号を使用する例も挙げておきます。以下は数値カラムが50よりも大きいレコードの名前カラムを全てDAIKIに更新します。
UPDATE game_character SET 名前=DAIKI WHERE 数値 > 50;
逆にWHEREがないと行を指定する事ができないため、全ての行の指定した列の値が更新されてしまいます。
UPDATE game_character SET 名前=DAIKI // 全ての列の値がDAIKIになる・・・
RailsのActive Recordでも基本的にwhereを使っています。例えば、もっとも基本のfindでもIDが1であるUserを検索する際にはWHERE句によって取り出されます。
User.find(1) => User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
WHEREがあることによってどのレコードを変更するかを指定できるため、SQLによる複雑なデータ処理が可能となっています。
ちなみにRubyの!=
と同じ条件式として<>
があります。この等しくない条件式のSQLの演算子はRubyでは出てこないので覚えておきましょう。以下の例では数値の値が50でないレコードが全て更新されます。
UPDATE game_character SET 名前=DAIKI WHERE 数値 <> 50;
NULL判定
SQLでは値が格納されていないカラムの値をNULLと表現します。
このNULLという値があるレコードを絞り込むにはNULL専用の条件式があります。
式 IS NULL 式 IS NOT NULL
下記の例では名前の値が格納されていないレコードを絞り込みます。
SELECT * FROM game_character WHERE 名前 IS NULL
逆に=
や<>
ではNULLかどうかは判定できないことになります。
SELECT * FROM game_character WHERE 名前 = NULL; // エラーになる
パターンマッチング
パターンマッチングとは文字列があるパターンにマッチしているかをチェックすることです。例えば、普段使用している文字検索とかは全てパターンマッチングが使用されています。
文字列をパターンで絞り込むためにはLIKE演算子を使います。英語で「好き」のいみではなく「〜のような」の意味のLIKEです。
WHERE 文字の列 LIKE 'パターン式'
パターン式は実際に見てもらった方が話が早いと思います。
例えば、文字に「AIK」が含まれるレコードを検索する場合は以下のようになります。
SELECT * FROM game_character WHERE 名前 LIKE '%AIK%';
ここでパターン式で使われている%
について説明します。これはワイルドカードと呼ばれるもので、任意の文字を表します。
%
・・・任意の0文字以上の文字列_
(アンダースコア)・・・任意の1文字
上記のSQLのパターン式の場合、「任意の0文字以上の文字列」+ 'AIK' + 「任意の0文字以上の文字列」の文字列パターンにマッチした名前を絞り込んでいます。よって下記の例はマッチします。
- DAIKI
- AIK
- DAAIKI
ちなみにアンダースコアに置き換えた場合、「任意の1文字」+ 「'AIK'」 + 「任意の1文字」の文字列パターンにマッチした名前を絞り込んでいます。
SELECT * FROM game_character WHERE 名前 LIKE '_AIK_';
よって下記の例のみマッチします。
- DAIKI
終わりに
今回は非常にショートアウトプットですがWHEREは非常に重要です。蔑ろにせずしっかりと頭に叩き込みましょう!