SQLを使ってデータベースから特定の条件に合致するデータを抽出する際、比較演算子の理解は不可欠です。
特に「大なり」や「小なり」といった記号は、数値の大小だけでなく日付や文字列の順序を定義するためにも頻繁に利用されます。
正しくこれらの演算子を使いこなすことで、複雑なデータセットの中から必要な情報だけを的確に、そして高速に取得することが可能になります。
本記事では、SQLにおける「大なり・小なり」の基本的な書き方から、データ型ごとの挙動の違い、さらには実務で陥りやすい注意点まで詳しく解説します。
SQLにおける比較演算子の基本概念
SQLにおける比較演算子は、主に WHERE 句の中で使用され、列の値と指定した値を比較するために用いられます。
比較の結果は真 (TRUE) 、偽 (FALSE) 、または不明 (UNKNOWN) のいずれかの論理値として返されます。
「大なり」や「小なり」は、特定の範囲を指定してデータを絞り込む際に最も基本的な役割を果たします。
「大なり」「小なり」の基本記法
まずは、最も頻繁に使用される4つの比較演算子の書き方を確認しましょう。
「AはBより大きい」を表す場合は > を使用し、「AはBより小さい」を表す場合は < を使用します。
これらには比較対象の値そのものは含まれないため、数学でいう「未満」や「超過」に該当します。
一方で、比較対象の値を含める場合には >= (以上) や <= (以下) を使用します。
これらの記号を記述する際は、等号 = を必ず右側に配置する必要がある点に注意してください。
基本的なクエリの記述例
以下の例では、社員テーブルから給与が300,000円を超える社員を抽出するクエリを記述しています。
-- 給与が300,000円より大きい(超過)社員を取得
SELECT
employee_name,
salary
FROM
employees
WHERE
salary > 300000;
employee_name | salary
--------------+--------
田中 太郎 | 350000
佐藤 次郎 | 400000
このクエリの結果には、給与がちょうど300,000円の社員は含まれません。
もし300,000円ちょうどの社員も含めたい場合は、以下のように >= を使用します。
-- 給与が300,000円以上の社員を取得
SELECT
employee_name,
salary
FROM
employees
WHERE
salary >= 300000;
employee_name | salary
--------------+--------
田中 太郎 | 350000
佐藤 次郎 | 400000
鈴木 花子 | 300000
データ型による比較の挙動の違い
比較演算子は数値だけでなく、文字列や日付、時刻といった様々なデータ型に対して使用することができます。
しかし、データ型によって「大きい」「小さい」の定義が異なるため、その特性を理解しておくことが重要です。
数値型における比較
数値型 (INTEGER, DECIMAL, FLOATなど) における比較は、数学的な大小関係に基づきます。
正の数だけでなく、負の数の比較においても数学的なルールが適用されます。
例えば、-10 > -20 は真となりますが、-10 < 5 も真となります。
文字列型における比較
文字列型 (VARCHAR, TEXTなど) に対して「大なり・小なり」を使用した場合、辞書順 (アルファベット順や文字コード順) で比較が行われます。
「A」よりも「B」の方が大きいと判定され、日本語の場合は一般的に五十音順や文字コードの昇順に基づきます。
ここで注意が必要なのは、数字が文字列として格納されている場合です。
-- 文字列としての比較例
SELECT '10' > '2' AS result;
result
-------
false
数値としては10の方が大きいですが、文字列として比較すると先頭の文字である「1」と「2」が比較されるため、このような結果になります。
数字を扱う列は必ず数値型として定義するか、比較時に明示的な型変換を行うようにしましょう。
日付・時刻型における比較
日付や時刻のデータ型において、「大きい」は「より新しい (未来) 」を意味し、「小さい」は「より古い (過去) 」を意味します。
例えば、2026年1月1日は2025年12月31日よりも「大きい」と判定されます。
-- 2026年以降の注文データを取得
SELECT
order_id,
order_date
FROM
orders
WHERE
order_date >= '2026-01-01';
日付の比較は、ログデータの解析や期間限定のキャンペーン対象者の抽出など、実務で非常に多用される手法です。
時刻を含むタイムスタンプ型を比較する場合、境界値の扱いに注意が必要です。
'2026-01-01' とだけ記述した場合、多くのデータベースでは '2026-01-01 00:00:00' として解釈されるためです。
NULL値と比較演算子の重要な関係
SQLを利用する上で最も注意すべき点の一つが、NULL値に対する比較演算子の挙動です。
SQLにおいて NULL は「値が存在しない」あるいは「不明」であることを示します。
そのため、NULL に対して > や < を使用しても、結果は真にも偽にもならず、UNKNOWN (不明) となります。
なぜNULLは比較できないのか
例えば、ある商品の在庫数が NULL である場合、「在庫数が0より大きいか」という問いに対して、システムは「はい」とも「いいえ」とも答えられません。
この特性により、WHERE 句で比較演算子を使用しても、対象の列に NULL が含まれている場合、そのレコードは抽出結果から除外されます。
-- 在庫がある商品を抽出しようとする場合
SELECT * FROM products WHERE stock_quantity >= 0;
このクエリでは、stock_quantity が NULL の商品は結果に含まれません。
もし NULL のデータも考慮に入れる必要がある場合は、IS NULL 句や COALESCE 関数を組み合わせて使用する必要があります。
範囲指定における使い分け:比較演算子 vs BETWEEN
「〇〇以上かつ〇〇以下」という範囲を指定する場合、比較演算子を2回使う方法と BETWEEN 演算子を使う方法の2種類があります。
それぞれの書き方とメリットを整理しておきましょう。
比較演算子を組み合わせる方法
AND 演算子を用いて、2つの比較式を記述します。
-- 20歳以上30歳以下のユーザーを取得
SELECT * FROM users WHERE age >= 20 AND age <= 30;
この書き方のメリットは、境界値を含めるかどうかを柔軟に変更できる点にあります。
例えば、「20歳より大きく30歳未満」としたい場合は、単に > と < に書き換えるだけで済みます。
BETWEEN演算子を使用する方法
より直感的に範囲を指定できるのが BETWEEN です。
-- 同じ条件をBETWEENで記述
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
BETWEEN は常に境界値を含む (以上・以下) という動作をします。
コードが短くなり可読性が向上しますが、どちらかの境界値を含めたくない場合には使用できない点に注意してください。
インデックスとパフォーマンスへの影響
大量のデータを保持するテーブルに対して「大なり・小なり」による絞り込みを行う際、パフォーマンスへの影響を考慮することが不可欠です。
B-Treeインデックスが作成されている列に対して比較演算子を使用すると、データベースは効率的に対象範囲をスキャンできます。
レンジスキャンの仕組み
インデックスが貼られた列で score > 80 のような条件を指定すると、データベースはインデックスツリー内で「80」を探し、そこから先のデータを順番に読み取ります。
これをレンジスキャンと呼び、全件スキャン (フルテーブルスキャン) に比べて圧倒的に高速です。
しかし、比較する列に対して関数を適用してしまうとインデックスが使われないという罠があります。
-- インデックスが効かない例
SELECT * FROM orders WHERE YEAR(order_date) >= 2026;
-- インデックスが効く例
SELECT * FROM orders WHERE order_date >= '2026-01-01';
左辺に演算や関数を記述せず、生のカラム値と比較するようにクエリを設計することが、実務におけるパフォーマンスチューニングの鉄則です。
複雑な条件での大なり・小なりの活用
比較演算子は単独で使用するだけでなく、サブクエリやケース式の中でも重要な役割を果たします。
サブクエリとの組み合わせ
「平均点より高いスコアの生徒を取得する」といった動的な比較を行う場合に便利です。
SELECT
student_name,
score
FROM
test_results
WHERE
score > (SELECT AVG(score) FROM test_results);
このように右辺にスカラーサブクエリを配置することで、データの状態に応じた柔軟なフィルタリングが可能になります。
CASE式での条件分岐
取得した値を特定の範囲に基づいてカテゴリ分けする際にも、比較演算子が活躍します。
SELECT
product_name,
CASE
WHEN stock_quantity <= 10 THEN '要発注'
WHEN stock_quantity <= 50 THEN '在庫僅少'
ELSE '在庫あり'
END AS stock_status
FROM
products;
CASE 式では、上から順番に条件が評価されるため、範囲の重なりを考慮しながら記述するのがコツです。
よくある間違いとトラブルシューティング
SQLの書き方に慣れていても、ふとした瞬間にミスが発生しやすいのが比較演算子の周辺です。
不等号の向きと等号の位置
初心者に多いミスとして、=> や =< と記述してしまうケースがありますが、これらは構文エラーとなります。
必ず = は右側に書くと覚えておきましょう。
また、否定の比較として「~ではない」を表す <> (または !=) もありますが、これらも広義の比較演算子に含まれます。
浮動小数点数の比較
FLOAT や REAL といった浮動小数点数型を使用している場合、微細な誤差によって = による比較が期待通りに動作しないことがあります。
このような場合、> や < を組み合わせて特定の許容範囲内に収まっているかを判定する手法が取られることがあります。
まとめ
SQLの比較演算子「大なり・小なり」は、データの抽出条件を定義する上で最も基盤となる要素です。
数値の比較という単純な用途を超えて、文字列の順序判定や日付の範囲指定など、その用途は多岐にわたります。
本記事で解説した以下のポイントを意識することで、より正確で効率的なSQLが書けるようになります。
- 数値、文字列、日付で「大小」の解釈が異なることを理解する。
NULLとの比較は常にUNKNOWNになるため、専用の処理が必要。BETWEENは境界値を含むため、含まない場合は比較演算子をANDで繋ぐ。- パフォーマンス向上のため、インデックスが貼られた列の左辺に関数を使わない。
データベースエンジニアやデータアナリストにとって、これらの基礎知識は日々の業務を支える強力な武器となります。
ぜひ実際のデータ操作を通じて、比較演算子の正確な挙動をマスターしてください。
