こんにちは!「LINUX工房」管理人の「リナックス先生」です。
「MySQL初心者講座」もいよいよ中盤戦。これまでは「データの入れ物」を作り、読み書きする方法を学んできました。今日からは、そのデータを「いかに賢く、効率的に取り出すか」という、より実践的なフェーズに突入します。
例えば、ECサイトで「1,000円以下の商品だけを表示したい」「先週登録されたユーザーだけを抽出したい」「名前が『佐藤』で始まる人を探したい」といった要望はすべて、今日学習するWHERE句が解決してくれます。さらに、取り出したデータを「最新順」や「価格が安い順」に並べるORDER BYを組み合わせることで、データは初めて「役に立つ情報」へと変わります。
先生、前回までは「id = 1」みたいな単純な条件しか使ってきませんでしたが、もっと「〜の間」とか「〜を含まない」みたいな複雑な条件も書けるんですか?
あと、並び替えるときに複数の項目(例えば『日付順』かつ『ID順』)で並べる方法も知りたいです!
もちろんよ、コウ君。SQLのWHERE句は、プログラミング言語の「if文」と同じくらい柔軟なの。比較演算子や論理演算子を組み合わせれば、どんなに複雑な条件でも1つのSQLで表現できるわ。
今回はAIに「検索条件のテストパターン」を作らせながら、ミスのない抽出テクニックを身につけていきましょう!
📚 MySQL初心者講座・連載ロードマップ(全8回)
- 【第1回】データベースの概念と最速インストール・初期設定
- 【第2回】テーブル設計の極意:データ型と主キーの重要性
- 【第3回】SQL基本4操作(CRUD):SELECT/INSERT/UPDATE/DELETEをマスターする
- 【第4回】データの抽出と並び替え:WHERE句とORDER BYを使いこなす(本記事)
- 【第5回】複数のテーブルを繋ぐ:JOIN(結合)の魔法を理解する(公開予定)
- 【第6回】集計とグループ化:COUNT/SUMとGROUP BYで統計を取る(公開予定)
- 【第7回】インデックスとパフォーマンス:重いクエリを劇的に速くする方法(公開予定)
- 【第8回】バックアップと復旧:mysqldumpによるデータ保護と自動化(公開予定)
目次
1. WHERE句の基本と「比較演算子」を極める
WHERE句は、SELECT、UPDATE、DELETE文などで「どの行を対象にするか」を指定するためのフィルタリング機能です。最も多用されるのが比較演算子です。
1-1. 主要な比較演算子一覧
| 演算子 | 意味 | 使用例 |
|---|---|---|
| = | 等しい | age = 20 |
| <> または != | 等しくない | status != 'deleted' |
| < | より小さい(未満) | price < 1000 |
| > | より大きい(超過) | age > 18 |
| <= | 以下 | point <= 500 |
| >= | 以上 | created_at >= '2026-05-01' |
注意点: 文字列や日付を比較する場合は、必ず ' '(シングルクォーテーション)で囲む必要があります。数値の場合は囲む必要はありません。
2. 「〜を含む」を自在に操る!LIKE検索とワイルドカード
名前の一部やメールアドレスのドメインだけで検索したいときに使うのが LIKE 演算子です。ここでは「%(パーセント)」という特殊な記号(ワイルドカード)を組み合わせて使います。
2-1. ワイルドカードの使い方
- 前方一致 (佐藤%): 「佐藤」で始まるすべての文字列にマッチ(佐藤さん、佐藤太郎など)。
- 後方一致 (%太郎): 「太郎」で終わるすべての文字列にマッチ(佐藤太郎、田中太郎など)。
- 部分一致 (%中央%): どこかに「中央」が含まれるすべての文字列にマッチ(中央区、東京都中央、中央線など)。
# Gmailユーザーだけを抽出する SELECT * FROM users WHERE email LIKE '%@gmail.com';
3. 複数条件の組み合わせ(AND / OR / NOT / IN)
現実のシステムでは、複数の条件を組み合わせて検索することがほとんどです。
3-1. 論理演算子の活用
- AND: すべての条件を満たす(「20代」かつ「男性」)。
- OR: いずれかの条件を満たす(「東京在住」または「千葉在住」)。
- IN: 指定したリストのいずれかに一致する(
WHERE id IN (1, 3, 5))。
# 「18歳以上、かつ、名前がリナックス先生ではない人」を抽出 SELECT * FROM users WHERE age >= 18 AND name != 'リナックス先生';
4. 範囲指定とNULL値の特殊な扱い(BETWEEN / IS NULL)
数値や日付の範囲をスマートに書きたいときや、「データが入っていない状態(NULL)」を扱いたいときの書き方です。
4-1. BETWEENによる範囲指定
# 年齢が20歳から29歳までの人を抽出 SELECT * FROM users WHERE age BETWEEN 20 AND 29;
4-2. NULLの検索は「=」ではない
NULL値は「値がない」という特殊な状態なため、= NULL ではマッチしません。専用の構文を使います。
# 電話番号が登録されていない(NULL)人を抽出 SELECT * FROM users WHERE phone_number IS NULL; # 逆に、登録されている人を抽出 SELECT * FROM users WHERE phone_number IS NOT NULL;
5. ORDER BY:データを昇順・降順に並び替える
データを取り出した際、その並び順には保証がありません。意味のある順番にするには ORDER BY を使います。
<7/19 ~26限定 全品15倍 要エントリー>試して理解Linuxのしくみ 実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識/武内覚 価格:3520円 |
5-1. ASC(昇順)と DESC(降順)
- ASC (Ascending): 小さい順(1→10, A→Z)。デフォルトなので省略可能です。
- DESC (Descending): 大きい順(10→1, Z→A)。最新順にしたいときによく使います。
# 年齢が若い順(昇順)、かつ、年齢が同じならIDが新しい順(降順) SELECT * FROM users ORDER BY age ASC, id DESC;
6. 実践:ページネーションに必須のLIMITとOFFSET
Google検索の結果画面のように、データを10件ずつ小分けにして表示したいときに使うのが LIMIT と OFFSET です。
# 最新のユーザー5件だけを取得 SELECT * FROM users ORDER BY created_at DESC LIMIT 5; # 6件目から10件目まで(2ページ目)を取得 SELECT * FROM users ORDER BY created_at DESC LIMIT 5 OFFSET 5;
7. AIを活用した複雑な抽出クエリの生成と妥当性チェック
複雑な条件が絡み合うとき、人間は論理的なミス(ANDとORの優先順位ミスなど)を犯しやすくなります。AIにクエリの作成と「テストデータの想定」を依頼しましょう。
7-1. クエリ検証用プロンプト
「MySQLで以下の条件を満たすSELECT文を作ってください。 1. 20歳以上、または、プレミアム会員(is_premium=1)であること 2. ただし、退会済み(status='withdrawn')のユーザーは絶対に除外すること 3. 最後に登録が新しい順に並べること このクエリを作成する際、括弧 ( ) を使ったAND/ORの優先順位の注意点と、 どのようなテストデータを用意すればこの条件が正しく動いているか確認できるか、5つのパターンで教えてください。」
AIは WHERE (age >= 20 OR is_premium = 1) AND status != 'withdrawn' という正確な括弧の使い方に加え、「20歳以上だけど退会済みの人が除外されているか確認しましょう」といったテスト観点も提示してくれます。
まとめ:思い通りのデータを取り出す快感を味わおう
第4回の講座、お疲れ様でした!
今日は、データベースの「検索」という最も創造的で知的な操作について学びました。WHERE句と比較演算子、そしてORDER BY。これらを組み合わせることで、あなたは数万、数百万というデータの海を自在に泳ぎ回り、必要な宝物を瞬時に見つけることができるようになりました。
SQLを書くときは、「自分が何を欲しいのか」を言葉にする力が必要です。その言葉(日本語の要件)をSQLに正しく変換する力を、これからも磨いていきましょう。
次回、第5回「複数のテーブルを繋ぐ:JOIN(結合)の魔法を理解する」では、ついに「リレーショナル(関連性)」という概念の本丸に攻め込みます。別々のテーブルにある情報をガッチャンコして、1つの大きな表として扱う、プロのSQLの醍醐味を解説します。お楽しみに!
▼ データの抽出を極めてみよう ▼
大量のテストデータを高速検索
「AlmaLinux 9対応の高性能VPS」
高度なクエリを使いこなせる
「データサイエンティストへの一歩」

コメント