コマンド道場

比較演算子(= <> < > <= >=)の使い方

比較して、真になった行だけが残る

shain社員

namesalary
佐藤720000
加藤610000
中村530000
井上505000

salary >= 600000真になった行

namesalary
佐藤720000
加藤610000

WHERE salary >= 600000

  • 取り消し線= 条件に合わないので結果に出てこない行
  • 社員 18 行 → 真になった行 513 行が消えます)

18 行のうち残ったのは 5 行です。比較は 1 行ずつ独立に行われ、他の行の値は影響しません。

比較演算子は 6 つだけです。 ただし SQL の比較には、他の言語に無い特徴があります。答えが true と false の 2 通りではなく、「どちらとも言えない」を含む 3 通りあることです。ここを知らないと、条件を書いたのに行が消える理由が分かりません。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database

未確認: IBM Db2

製品ごとの対応表(根拠つき)を見る

このページの実行結果と図は、すべて本物のデータベースに同じ SQL を流して得たものです。手で書いた「たぶんこうなる」ではありません。

01使えるのは 6 つ

結論: `=` `<>` `<` `>` `<=` `>=` の 6 つです。

  • = … 等しい
  • <> … 等しくない
  • < > … より小さい/より大きい
  • <= >= … 以下/以上

「等しくない」は `<>` が標準です。 != も多くの製品で通りますが、規格にあるのは <> のほうなので、迷ったらこちらを使ってください。

比較できるのは同じ種類のもの同士です。数どうし、文字列どうし、日付どうしは比べられます。

1 行ずつ、何をしているか
  1. SELECT name, salaryどの列を出すか
  2. FROM shainどの表を見るか
  3. WHERE salary >= 600000比較して真になった行だけ残す
  4. ORDER BY salary DESC並び順

比較は WHERE の中だけでなく、SELECT や ORDER BY にも書けます。「比較する」ことと「行を絞る」ことは別の話です。

給与が 60 万以上
SELECT name, salary
FROM shain
WHERE salary >= 600000
ORDER BY salary DESC;
namesalary
鈴木980000
佐藤720000
山田700000
清水650000
加藤610000

5

所属が 2 ではない社員
SELECT name, busho_id
FROM shain
WHERE busho_id <> 2
ORDER BY shain_id;
namebusho_id
鈴木1
加藤5
吉田5
山田3
高橋3
伊藤3

12 … うち先頭 6 行を表示

18 行のうち 12 行です。開発(busho_id = 2)の 4 人が消えるのは分かりますが、実は所属が未設定の 2 人も消えています。理由は次の節で説明します。

02比較の答えは 3 通りある

結論: 比較の結果は true / false のほかに「どちらとも言えない(unknown)」がある、これが SQL の比較の核心です。

片側が NULL のとき、比較の結果は false ではなく unknown になります。NULL は「値が無い」ではなく 「値が分からない」 という意味なので、分からないものと何かを比べても答えが出ないのです。

WHERE真になった行だけを残します。false の行も unknown の行も残りません。この 2 つは残らない点では同じですが、否定したときに違いが出ますNOT false は真ですが、NOT unknown は unknown のままです)。

次の例では、比較の結果をそのまま列に出しています。3 通りが揃っているのが見えます。

比較の結果を列に出してみる
SELECT name,
       taishoku_on,
       taishoku_on > DATE '2025-01-01' AS hantei
FROM shain
ORDER BY shain_id;
nametaishoku_onhantei
鈴木NULLNULL
佐藤NULLNULL
田中NULLNULL
中村NULLNULL
小林NULLNULL
加藤NULLNULL
吉田NULLNULL
山田NULLNULL
高橋2025-09-30true
伊藤NULLNULL

18 … うち先頭 10 行を表示

hantei が NULL と表示されている行が unknown です(結果の表では unknown も NULL として出ます)。退職日が入っている 2 人だけ true / false が付き、在籍中の 16 人はすべて unknown になっています。

⚠️ この書き方は SQLite / SQL Server / Oracle Database では使えません(DATE 'YYYY-MM-DD' の日付リテラル)。製品ごとの対応表

03⚠️ よくある間違い:文字列の大小は「読み」ではない

結論: 文字列を `<` や `>` で比べると、五十音順ではなく文字コード順になります。

数値や日付は誰が見ても大小が同じですが、文字列は違います。どの文字がどの文字より大きいかは、その列の照合順序(collation)が決めます。日本語では、多くの環境で漢字は読みではなく文字コードの並びになります。

つまり「田中より後ろの名前」を name > '田中' で取ると、読みで「たなか」より後ろの人が全員出るわけではありません

五十音順で扱いたいなら、読み仮名の列を別に持って、そちらで比較するのが確実です。文字列の比較は、思っている順序と違う可能性を常に疑ってください。

「田中より大きい名前」は 2 人しかいない
SELECT name
FROM shain
WHERE name > '田中'
ORDER BY name;
name
鈴木
高橋

2

読みで考えれば「渡辺」「山田」なども後ろに来そうですが、出てきません。文字コードの上で田中より後ろなのが、この 2 人だけだからです。

同じ「10 と 9」でも答えが逆になる
SELECT '10' < '9'  AS moji,
       10   < 9   AS suuchi;
mojisuuchi
truefalse

1

文字列として比べると 1 文字目の '1' と '9' を見るので '10' のほうが小さくなります。数として比べれば 10 のほうが大きいので false です。数を文字列の列に入れていると、この差が事故になります。

04⚠️ よくある間違い:種類が違うものは比べられない

結論: 数の列と、数に変換できない文字列を比べると、行が消えるのではなくエラーになります。

多くの製品は「比べられそうなもの」を自動で変換してから比較します。salary > '500000' は文字列を数に直して通ります。しかし '500000abc' のように変換できないものを渡すと、そこで止まります。

これは親切な仕様です。黙って 0 行を返されるより、エラーで気づけるほうが安全だからです。自動変換に頼らず、比べたい型のまま書くのがいちばん確実です。

わざとエラーになる例
SELECT name
FROM shain
WHERE salary > '500000abc';
ERROR: invalid input syntax for type numeric: "500000abc"

「numeric として読めない」と言われます。条件の書き間違いがエラーで分かる、ありがたい例です。

05日付はそのまま比較できる

結論: 日付は数と同じように `>=` や `<` で比べられます。

日付を書くときは DATE '2025-01-01' の形が標準です。単なる文字列 '2025-01-01' を書いても多くの製品では自動変換されて通りますが、書式の解釈が製品や設定で変わる(月と日が入れ替わる等)ので、型を明示するほうが安全です。

⚠️ 日付リテラルの書き方は製品差が大きい部分です。使えない製品がある例には自動で注記が出ます。

2025 年以降に入社した社員
SELECT name, hired_on
FROM shain
WHERE hired_on >= DATE '2025-01-01'
ORDER BY hired_on;
namehired_on
松本2025-04-01
木村2026-04-01
渡辺2026-05-01
大野2026-06-01

4

日付にも「以上」「未満」がそのまま使えます。期間で絞るときは、この形か BETWEEN を使います。

⚠️ この書き方は SQLite / SQL Server / Oracle Database では使えません(DATE 'YYYY-MM-DD' の日付リテラル)。製品ごとの対応表

自分で打ってみる

このページの例と同じデータが入った本物のデータベースを、この場(あなたのブラウザの中)で起動できます。打った SQL がサーバーへ送られることはありません。

押すと初回だけ約 9MB を読み込みます(2 回目以降はキャッシュされます)。

解いてみる

読んだだけでは書けるようになりません。実行結果で採点します。

関連するトピック

  • AND / OR / NOT比較した結果を AND / OR / NOT でつなぐときの規則です。
  • IS NULL「どちらとも言えない」を避けて NULL を判定する方法です。
  • BETWEEN 述語「以上かつ以下」をひとまとめに書く書き方です。
  • WHERE 句比較演算子をいちばん使う場所です。

根拠(一次情報)