【AlmaLinux 9】MySQL初心者講座 第4回:WHERE句による高度な抽出とORDER BYによる並び替え

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
「MySQL初心者講座」もいよいよ中盤戦。これまでは「データの入れ物」を作り、読み書きする方法を学んできました。今日からは、そのデータを「いかに賢く、効率的に取り出すか」という、より実践的なフェーズに突入します。

例えば、ECサイトで「1,000円以下の商品だけを表示したい」「先週登録されたユーザーだけを抽出したい」「名前が『佐藤』で始まる人を探したい」といった要望はすべて、今日学習するWHERE句が解決してくれます。さらに、取り出したデータを「最新順」や「価格が安い順」に並べるORDER BYを組み合わせることで、データは初めて「役に立つ情報」へと変わります。

コウ君

先生、前回までは「id = 1」みたいな単純な条件しか使ってきませんでしたが、もっと「〜の間」とか「〜を含まない」みたいな複雑な条件も書けるんですか?
あと、並び替えるときに複数の項目(例えば『日付順』かつ『ID順』)で並べる方法も知りたいです!

リナックス先生

もちろんよ、コウ君。SQLのWHERE句は、プログラミング言語の「if文」と同じくらい柔軟なの。比較演算子や論理演算子を組み合わせれば、どんなに複雑な条件でも1つのSQLで表現できるわ。
今回はAIに「検索条件のテストパターン」を作らせながら、ミスのない抽出テクニックを身につけていきましょう!

📚 MySQL初心者講座・連載ロードマップ(全8回)


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 を使います。

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件ずつ小分けにして表示したいときに使うのが LIMITOFFSET です。

# 最新のユーザー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」

おすすめVPSを詳しく見る

高度なクエリを使いこなせる
「データサイエンティストへの一歩」

エンジニア転職の無料相談

コメント