【初心者向け】SQLの比較演算子を完全解説|基本の使い方と実践例まとめ

データベース・SQL

SQLを使ってデータを検索するとき、避けて通れないのが「比較演算子」です。

例えば「売上が1000円以上の商品を表示したい」「登録日が今日より前のデータを取り出したい」といった条件は、すべて比較演算子で表現します。

この記事では、SQLの基本的な比較演算子をわかりやすく紹介し、それぞれの使い方や実例を詳しく解説します。

初心者の方でも無理なく理解できる内容なので、ぜひ参考にしてください。

スポンサーリンク

比較演算子って何?

比較演算子の役割

比較演算子とは、SQLで2つの値を比べて条件を決めるための記号です。

主にWHERE句の中で使われ、特定の条件に合うデータだけを取り出すときに使います。

どんなときに使うの?

数値の大小を比べる

  • 「価格が1000円以上の商品」
  • 「年齢が20歳未満の人」

日付の前後を判定する

  • 「今日より前に登録されたデータ」
  • 「2024年以降の注文」

文字列が同じかチェックする

  • 「名前が田中の人」
  • 「ステータスが完了ではないもの」

基本的な構文

SELECT 列名 FROM テーブル名 WHERE 列名 比較演算子 値;

SELECT * FROM products WHERE price >= 1000;

この文は「productsテーブルから、価格が1000円以上の商品を全て取り出す」という意味です。

基本の比較演算子一覧

SQLで使える基本的な比較演算子は7つあります。

演算子意味読み方
=等しいイコールWHERE age = 20
<>等しくないノットイコールWHERE status <> '完了'
!=等しくない(別の書き方)ノットイコールWHERE category != '本'
>より大きいより大きいWHERE score > 80
<より小さいより小さいWHERE stock < 50
>=以上以上WHERE age >= 18
<=以下以下WHERE discount <= 30

それぞれの使い方を詳しく見てみよう

=(等しい)

指定した値と完全に同じデータを探します。

数値の場合

SELECT * FROM products WHERE price = 1000;

価格がちょうど1000円の商品を取得

文字列の場合

SELECT * FROM users WHERE name = '田中太郎';

名前が「田中太郎」の人を取得

日付の場合

SELECT * FROM orders WHERE order_date = '2025-06-03';

注文日が2025年6月3日のデータを取得

<>と!=(等しくない)

指定した値と違うデータを探します。<>!=は同じ意味です。

-- どちらも同じ意味
SELECT * FROM products WHERE status <> '売り切れ';
SELECT * FROM products WHERE status != '売り切れ';

実際の使用例

-- 未完了のタスクを取得
SELECT * FROM tasks WHERE status <> '完了';

-- 在庫がある商品を取得
SELECT * FROM products WHERE stock != 0;

>(より大きい)

指定した値より大きいデータを探します。

-- 1000円より高い商品
SELECT * FROM products WHERE price > 1000;

-- 18歳より年上の人
SELECT * FROM users WHERE age > 18;

-- 昨日以降の注文(昨日は含まない)
SELECT * FROM orders WHERE order_date > '2025-06-02';

<(より小さい)

指定した値より小さいデータを探します。

-- 1000円未満の商品
SELECT * FROM products WHERE price < 1000;

-- 在庫が少ない商品(10個未満)
SELECT * FROM products WHERE stock < 10;

-- 今年より前のデータ
SELECT * FROM records WHERE created_date < '2025-01-01';

>=(以上)

指定した値以上(その値も含む)のデータを探します。

-- 1000円以上の商品(1000円も含む)
SELECT * FROM products WHERE price >= 1000;

-- 成人以上の人(18歳も含む)
SELECT * FROM users WHERE age >= 18;

-- 今月以降の予定
SELECT * FROM events WHERE event_date >= '2025-06-01';

<=(以下)

指定した値以下(その値も含む)のデータを探します。

-- 1000円以下の商品(1000円も含む)
SELECT * FROM products WHERE price <= 1000;

-- 高校生以下の人(18歳も含む)
SELECT * FROM users WHERE age <= 18;

-- 今月末までの締切
SELECT * FROM tasks WHERE deadline <= '2025-06-30';

論理演算子と組み合わせる方法

比較演算子だけでは1つの条件しか指定できませんが、論理演算子と組み合わせることで、複雑な条件を作れます。

AND(かつ):すべての条件を満たす

-- 20歳以上で、かつ女性のユーザー
SELECT * FROM users 
WHERE age >= 20 AND gender = '女性';

-- 価格が1000円以上で、かつ在庫が10個以上の商品
SELECT * FROM products 
WHERE price >= 1000 AND stock >= 10;

-- 今年のデータで、かつステータスが完了のもの
SELECT * FROM orders 
WHERE order_date >= '2025-01-01' AND status = '完了';

OR(または):どれかの条件を満たす

-- カテゴリが「本」または「雑誌」の商品
SELECT * FROM products 
WHERE category = '本' OR category = '雑誌';

-- 価格が500円以下、または割引率が50%以上の商品
SELECT * FROM products 
WHERE price <= 500 OR discount >= 50;

-- 優先度が「高」または「緊急」のタスク
SELECT * FROM tasks 
WHERE priority = '高' OR priority = '緊急';

NOT(〜でない):条件を否定する

-- 価格が0円でない商品
SELECT * FROM products 
WHERE NOT price = 0;

-- ステータスが「完了」でないタスク
SELECT * FROM tasks 
WHERE NOT status = '完了';

括弧を使って優先順位を明確にする

複数の条件を組み合わせるときは、括弧を使って優先順位をはっきりさせましょう。

-- 発送済みまたは完了で、かつ今月の注文
SELECT * FROM orders 
WHERE (status = '発送済み' OR status = '完了') 
  AND order_date >= '2025-06-01';

-- 安い商品(500円以下)または高割引商品(30%以上)で、在庫があるもの
SELECT * FROM products 
WHERE (price <= 500 OR discount >= 30) 
  AND stock > 0;

実際の仕事で使える例

ECサイトの商品検索

-- セール対象商品を検索
-- (定価1000円以上で、割引率20%以上、在庫あり)
SELECT product_name, price, discount, stock
FROM products 
WHERE price >= 1000 
  AND discount >= 20 
  AND stock > 0;

顧客管理システム

-- アクティブな顧客を検索
-- (最終ログインが30日以内で、購入回数が5回以上)
SELECT customer_name, last_login, purchase_count
FROM customers 
WHERE last_login >= '2025-05-04'  -- 30日前
  AND purchase_count >= 5;

売上分析

-- 高額取引を分析
-- (今年の売上で、10万円以上の取引)
SELECT order_id, customer_name, total_amount, order_date
FROM orders 
WHERE order_date >= '2025-01-01' 
  AND total_amount >= 100000
ORDER BY total_amount DESC;

在庫管理

-- 補充が必要な商品をチェック
-- (在庫が10個以下で、人気商品(月間売上50個以上))
SELECT product_name, stock, monthly_sales
FROM products 
WHERE stock <= 10 
  AND monthly_sales >= 50
ORDER BY stock ASC;

よくある間違いと注意点

=と==を混同する

間違い

-- これはエラーになります
SELECT * FROM users WHERE age == 20;

正しい書き方

SELECT * FROM users WHERE age = 20;

SQLでは等号は=ひとつだけです。プログラミング言語の==と混同しないよう注意しましょう。

NULLの扱い方を間違える

間違い

-- これは正しく動きません
SELECT * FROM users WHERE email = NULL;

正しい書き方

-- NULLをチェックするときは IS NULL を使う
SELECT * FROM users WHERE email IS NULL;

-- NULLでないことをチェックするときは IS NOT NULL
SELECT * FROM users WHERE email IS NOT NULL;

なぜ= NULLがダメなのか?

NULLは「値が存在しない」という特別な状態なので、普通の比較演算子では比較できません。

文字列の大文字・小文字に注意

データベースによって、大文字と小文字の扱いが違います。

MySQLの場合(通常は区別しない)

-- これらは同じ結果になることが多い
SELECT * FROM users WHERE name = 'TANAKA';
SELECT * FROM users WHERE name = 'tanaka';

PostgreSQLの場合(区別する)

-- これらは違う結果になる
SELECT * FROM users WHERE name = 'TANAKA';  -- 大文字のTANAKAだけ
SELECT * FROM users WHERE name = 'tanaka';  -- 小文字のtanakaだけ

安全な書き方

-- 大文字に統一して比較
SELECT * FROM users WHERE UPPER(name) = UPPER('tanaka');

日付の書き方に注意

日付を文字列で指定するとき、フォーマットに気をつけましょう。

推奨される書き方

-- 国際標準形式(YYYY-MM-DD)
SELECT * FROM orders WHERE order_date >= '2025-06-03';

避けたい書き方

-- 地域によって解釈が変わる可能性がある
SELECT * FROM orders WHERE order_date >= '06/03/2025';

数値と文字列の比較

数値を文字列として比較すると、予想外の結果になることがあります。

問題のある例

-- 文字列として比較されると '9' > '10' になってしまう
SELECT * FROM products WHERE price_text > '10';

正しい例

-- 数値として比較する
SELECT * FROM products WHERE CAST(price_text AS INTEGER) > 10;

パフォーマンスを考えた書き方

インデックスを活用する

よく検索される列にはインデックスを付けて、検索を高速化しましょう。

-- よく使われる検索パターン
SELECT * FROM orders WHERE customer_id = 123;
SELECT * FROM products WHERE category = '家電';

-- これらの列にインデックスを付けると検索が早くなる
CREATE INDEX idx_customer_id ON orders(customer_id);
CREATE INDEX idx_category ON products(category);

効率的な条件の順番

-- インデックスがある列を最初に書く
SELECT * FROM orders 
WHERE customer_id = 123        -- インデックスあり(早い)
  AND order_date >= '2025-01-01'  -- インデックスなし(遅い)
  AND total_amount > 10000;      -- インデックスなし(遅い)

不要な検索を避ける

-- 悪い例:全件検索してから絞り込み
SELECT * FROM products WHERE 1=1;  -- 全件取得(遅い)

-- 良い例:最初から条件を指定
SELECT * FROM products WHERE category = '家電';  -- 必要な分だけ(早い)

応用テクニック

範囲検索の書き方

年齢の範囲

-- 20代の人(20歳以上30歳未満)
SELECT * FROM users 
WHERE age >= 20 AND age < 30;

-- または
SELECT * FROM users 
WHERE age BETWEEN 20 AND 29;

期間の範囲

-- 今月のデータ
SELECT * FROM orders 
WHERE order_date >= '2025-06-01' 
  AND order_date < '2025-07-01';

複数の値から選択

-- 特定のカテゴリの商品
SELECT * FROM products 
WHERE category = '家電' 
   OR category = '家具' 
   OR category = '衣類';

-- INを使ってもっと簡潔に
SELECT * FROM products 
WHERE category IN ('家電', '家具', '衣類');

あいまい検索

-- 名前に「田中」が含まれる人
SELECT * FROM users 
WHERE name LIKE '%田中%';

-- 「A」で始まる商品
SELECT * FROM products 
WHERE product_name LIKE 'A%';

トラブルシューティング

期待した結果が返ってこないとき

データ型を確認

-- 列のデータ型を確認
DESCRIBE products;  -- MySQL
\d products;        -- PostgreSQL

実際のデータを確認

-- サンプルデータを見てみる
SELECT * FROM products LIMIT 5;

条件を段階的に確認

-- まず全件取得
SELECT COUNT(*) FROM products;

-- 条件を1つずつ追加
SELECT COUNT(*) FROM products WHERE price >= 1000;
SELECT COUNT(*) FROM products WHERE price >= 1000 AND stock > 0;

エラーが出るとき

よくあるエラーメッセージ

Column 'xxx' doesn't exist

→ 列名が間違っているか、存在しない

You have an error in your SQL syntax

→ SQL文の書き方が間違っている

Data truncated for column

→ データ型が合っていない

まとめ

比較演算子は、SQLのWHERE句で使う最も基本的で重要な要素です。

数値の大小判断、文字列の一致確認、日付の前後比較など、日常的に必要な条件をすべて表現できます。

重要なポイント

  • 基本の7つの演算子=, <>, !=, >, <, >=, <=
  • 論理演算子との組み合わせ:AND、OR、NOTで複雑な条件を作成
  • NULLの扱いIS NULLIS NOT NULLを正しく使う
  • データ型に注意:数値、文字列、日付それぞれに適した比較方法
  • パフォーマンスを考慮:インデックスの活用と効率的な条件設定

覚え方のコツ

  • まずは基本の7つの演算子を覚える
  • 簡単な例から始めて、少しずつ複雑な条件にチャレンジ
  • 実際のデータで試しながら理解を深める
  • エラーが出ても焦らず、一つずつ確認する

これらの比較演算子を使いこなせるようになると、データベースから必要な情報を正確に取り出せるようになります。

SQLスキルの向上に向けて、ぜひこの記事を参考にして練習してみてください!

コメント

タイトルとURLをコピーしました