MySQLのWHERE句を完全マスター!初心者向けに条件指定の基本と注意点を徹底解説
生徒
「データベースから特定のデータだけを取り出したいときは、どうすればいいんですか?例えば、20歳以上の人だけを選びたいときとか……。」
先生
「その時に使うのが『WHERE句(ウェアく)』という命令です。WHEREは英語で『どこに』という意味がありますが、プログラミングの世界では『もし〜なら』という条件を指定する役割を持っています。」
生徒
「条件をつけるんですね!難しそうに見えますが、私でも覚えられますか?」
先生
「基本はとてもシンプルですよ。名簿の中から、特定の条件に当てはまる行に付箋を貼るようなイメージです。具体的な書き方を見ていきましょう。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、インターネットショッピングの会員名簿の中から自分自身の情報を探したり、新しい商品を登録したりするときに、コンピューターに対して『このデータを見せて!』とお願いするための専用の言葉です。プログラミング未経験の方でも、決まった型を覚えるだけで簡単に操作できるようになります。
2. WHERE句の役割と基本の書き方
データベースに保存されているデータは、往々にして膨大な量になります。数万、数百万というデータの中から、必要なものだけを絞り込む魔法のキーワードが「WHERE句」です。WHERE句を使わずにデータを取得すると、名簿の全員分が表示されてしまいますが、WHERE句を使えば『東京都に住んでいる人だけ』や『30歳以上の人だけ』といった具合に、自由自在にフィルタリングが可能です。
まずは、基本となる「数値」を使った絞り込みを見てみましょう。比較演算子と呼ばれる記号(> や < など)を使って条件を指定します。
操作前のデータ(usersテーブル)
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
2 | 佐藤花子 | 19 | 大阪府 | 0
3 | 鈴木一郎 | 30 | 神奈川県 | 1
4 | 田中次郎 | 15 | 東京都 | 0
5 | 伊藤純子 | 42 | 福岡県 | 1
6 | 渡辺健太 | 20 | 北海道 | 0
この名簿から「20歳以上のユーザー」だけを探し出すSQLを書いてみます。
SELECT *
FROM users
WHERE age >= 20;
実行結果
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
3 | 鈴木一郎 | 30 | 神奈川県 | 1
5 | 伊藤純子 | 42 | 福岡県 | 1
6 | 渡辺健太 | 20 | 北海道 | 0
このように、条件に一致した行(レコード)だけが表示されました。これがWHERE句の最も基本的な使い方です。
3. 文字列や複数の条件を指定する方法
数値だけでなく、名前や住所といった「文字列」を条件にすることもできます。文字列を指定する場合は、必ずシングルクォーテーション(' ')で囲むというルールがあります。また、複数の条件を組み合わせたいときは、「AND(かつ)」や「OR(または)」を使います。これらを使いこなすことで、より複雑な検索が可能になります。
例えば、「東京都に住んでいる、有料会員(premium_memberが1)」のユーザーを探してみましょう。条件が2つあるので、ANDで繋ぎます。
操作前のデータ(usersテーブル)
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
2 | 佐藤花子 | 19 | 大阪府 | 0
3 | 鈴木一郎 | 30 | 神奈川県 | 1
4 | 田中次郎 | 15 | 東京都 | 0
5 | 伊藤純子 | 42 | 福岡県 | 1
6 | 渡辺健太 | 20 | 北海道 | 0
SELECT name, age, city
FROM users
WHERE city = '東京都' AND premium_member = 1;
実行結果
name | age | city
---------+-----+--------
山田太郎 | 25 | 東京都
「東京都」かつ「会員フラグが1」の人だけが抽出されました。シングルクォーテーションを忘れるとエラーになってしまうので、注意しましょう。プログラミング初学者が最初につまずくポイントの一つです。
4. 曖昧な検索を行うLIKE句の使い方
「名前が『山』から始まる人」や「メールアドレスに『example』が含まれる人」など、はっきりと一致しない「曖昧(あいまい)な条件」で探したいときもあります。そんな時に便利なのが「LIKE句」です。パーセント記号(%)をワイルドカードとして使います。ワイルドカードとは、「どんな文字が入ってもいいよ」という目印のようなものです。
ここでは、「名字に『田』が含まれる人」を全員抽出してみましょう。
操作前のデータ(usersテーブル)
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
2 | 佐藤花子 | 19 | 大阪府 | 0
3 | 鈴木一郎 | 30 | 神奈川県 | 1
4 | 田中次郎 | 15 | 東京都 | 0
5 | 伊藤純子 | 42 | 福岡県 | 1
6 | 渡辺健太 | 20 | 北海道 | 0
SELECT *
FROM users
WHERE name LIKE '%田%';
実行結果
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
4 | 田中次郎 | 15 | 東京都 | 0
「山田さん」と「田中さん」の両方がヒットしました。このように、「%」を文字の前後につけることで、その文字が含まれているかどうかを判断できます。これを「部分一致検索」と呼びます。
5. WHERE句を使う際の重要な注意点
WHERE句は非常に強力ですが、初心者の方が間違いやすい注意点がいくつかあります。これを知っておかないと、意図しないデータを消してしまったり、システムが動かなくなったりする原因になります。
データベースには「NULL(ヌル)」という「値が何も入っていない状態」を指す特別な言葉があります。NULLを探すときは `WHERE age = NULL` とは書けません。正しくは `WHERE age IS NULL` と書く必要があります。これは非常によくある間違いです。
データを変更する「UPDATE」や、削除する「DELETE」を使うとき、WHERE句を書き忘れると、テーブル内の全てのデータが書き換わったり消えたりしてしまいます。「1人だけ消すつもりが、全員の名簿を白紙にしてしまった」という大事故を防ぐため、実行前には必ず確認しましょう。
また、MySQL特有の挙動として、大文字と小文字を区別しない設定になっていることが多いですが、環境によっては区別される場合もあります。さらに、全角と半角も別物として扱われるため、例えば「東京都」と「東京都 (最後に全角スペース)」は一致しません。入力ミスや目に見えないスペースが原因でデータが見つからないことも多いため、データのクレンジング(きれいに整理すること)も大切です。
6. データの並べ替えと制限
WHERE句で絞り込んだ後、さらに「年齢が若い順に見たい」や「上位3名だけ見たい」といった要望が出てくることがあります。絞り込みの条件だけでなく、その後の「並べ替え」や「件数制限」についても軽く触れておきましょう。並べ替えには「ORDER BY句」、件数制限には「LIMIT句」を使います。これらを組み合わせることで、実務で使える本格的なクエリ(命令文)になります。
操作前のデータ(usersテーブル)
id | name | age | city | premium_member
---+----------+-----+-----------+----------------
1 | 山田太郎 | 25 | 東京都 | 1
2 | 佐藤花子 | 19 | 大阪府 | 0
3 | 鈴木一郎 | 30 | 神奈川県 | 1
4 | 田中次郎 | 15 | 東京都 | 0
5 | 伊藤純子 | 42 | 福岡県 | 1
6 | 渡辺健太 | 20 | 北海道 | 0
SELECT name, age
FROM users
WHERE age >= 20
ORDER BY age DESC
LIMIT 3;
実行結果
name | age
---------+-----
伊藤純子 | 42
鈴木一郎 | 30
山田太郎 | 25
ここでは「20歳以上の人を、年齢が高い順(降順:DESC)に並べて、上から3人だけ表示する」という命令を実行しました。このように、WHERE句はSQLの基礎でありながら、データの分析や活用において非常に重要な役割を果たします。一つひとつの単語の意味を理解しながら、実際に手を動かして練習してみることが上達の近道です。