大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【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と表現します。

https://i.gyazo.com/51e8007287ea9fe5c969bddfd9f0e77c.png

https://works.forward-soft.co.jp/blog/detail/10263

このNULLという値があるレコードを絞り込むにはNULL専用の条件式があります。

IS NULLIS NOT NULL

下記の例では名前の値が格納されていないレコードを絞り込みます。

SELECT *
FROM game_character
WHERE 名前 IS NULL

逆に=<>ではNULLかどうかは判定できないことになります。

SELECT *
FROM game_character
WHERE 名前 = NULL; // エラーになる

パターンマッチング

パターンマッチングとは文字列があるパターンにマッチしているかをチェックすることです。例えば、普段使用している文字検索とかは全てパターンマッチングが使用されています。

https://i.gyazo.com/ccea2d4d3e542d0da10e6039e6b72548.png

文字列をパターンで絞り込むためには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は非常に重要です。蔑ろにせずしっかりと頭に叩き込みましょう!