比較演算子(= <> < > <= >=)の使い方
shain社員
| name | salary |
|---|---|
| 佐藤 | 720000 |
| 加藤 | 610000 |
| 中村 | 530000✕ |
| 井上 | 505000✕ |
| … | |
salary >= 600000真になった行
| name | salary |
|---|---|
| 佐藤 | 720000 |
| 加藤 | 610000 |
| … | |
WHERE salary >= 600000
- 取り消し線= 条件に合わないので結果に出てこない行
- 社員 18 行 → 真になった行 5 行(13 行が消えます)
18 行のうち残ったのは 5 行です。比較は 1 行ずつ独立に行われ、他の行の値は影響しません。
比較演算子は 6 つだけです。 ただし SQL の比較には、他の言語に無い特徴があります。答えが true と false の 2 通りではなく、「どちらとも言えない」を含む 3 通りあることです。ここを知らないと、条件を書いたのに行が消える理由が分かりません。
この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database
未確認: IBM Db2
このページの実行結果と図は、すべて本物のデータベースに同じ SQL を流して得たものです。手で書いた「たぶんこうなる」ではありません。
01使えるのは 6 つ
結論: `=` `<>` `<` `>` `<=` `>=` の 6 つです。
=… 等しい<>… 等しくない<>… より小さい/より大きい<=>=… 以下/以上
「等しくない」は `<>` が標準です。 != も多くの製品で通りますが、規格にあるのは <> のほうなので、迷ったらこちらを使ってください。
比較できるのは同じ種類のもの同士です。数どうし、文字列どうし、日付どうしは比べられます。
SELECT name, salaryどの列を出すかFROM shainどの表を見るかWHERE salary >= 600000比較して真になった行だけ残すORDER BY salary DESC並び順
比較は WHERE の中だけでなく、SELECT や ORDER BY にも書けます。「比較する」ことと「行を絞る」ことは別の話です。
SELECT name, salary
FROM shain
WHERE salary >= 600000
ORDER BY salary DESC;| name | salary |
|---|---|
| 鈴木 | 980000 |
| 佐藤 | 720000 |
| 山田 | 700000 |
| 清水 | 650000 |
| 加藤 | 610000 |
(5 行)
SELECT name, busho_id
FROM shain
WHERE busho_id <> 2
ORDER BY shain_id;| name | busho_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;| name | taishoku_on | hantei |
|---|---|---|
| 鈴木 | NULL | NULL |
| 佐藤 | NULL | NULL |
| 田中 | NULL | NULL |
| 中村 | NULL | NULL |
| 小林 | NULL | NULL |
| 加藤 | NULL | NULL |
| 吉田 | NULL | NULL |
| 山田 | NULL | NULL |
| 高橋 | 2025-09-30 | true |
| 伊藤 | NULL | NULL |
(18 行 … うち先頭 10 行を表示)
hantei が NULL と表示されている行が unknown です(結果の表では unknown も NULL として出ます)。退職日が入っている 2 人だけ true / false が付き、在籍中の 16 人はすべて unknown になっています。
⚠️ この書き方は SQLite / SQL Server / Oracle Database では使えません(DATE 'YYYY-MM-DD' の日付リテラル)。製品ごとの対応表
03⚠️ よくある間違い:文字列の大小は「読み」ではない
結論: 文字列を `<` や `>` で比べると、五十音順ではなく文字コード順になります。
数値や日付は誰が見ても大小が同じですが、文字列は違います。どの文字がどの文字より大きいかは、その列の照合順序(collation)が決めます。日本語では、多くの環境で漢字は読みではなく文字コードの並びになります。
つまり「田中より後ろの名前」を name > '田中' で取ると、読みで「たなか」より後ろの人が全員出るわけではありません。
五十音順で扱いたいなら、読み仮名の列を別に持って、そちらで比較するのが確実です。文字列の比較は、思っている順序と違う可能性を常に疑ってください。
SELECT name
FROM shain
WHERE name > '田中'
ORDER BY name;| name |
|---|
| 鈴木 |
| 高橋 |
(2 行)
読みで考えれば「渡辺」「山田」なども後ろに来そうですが、出てきません。文字コードの上で田中より後ろなのが、この 2 人だけだからです。
SELECT '10' < '9' AS moji,
10 < 9 AS suuchi;| moji | suuchi |
|---|---|
| true | false |
(1 行)
文字列として比べると 1 文字目の '1' と '9' を見るので '10' のほうが小さくなります。数として比べれば 10 のほうが大きいので false です。数を文字列の列に入れていると、この差が事故になります。
04⚠️ よくある間違い:種類が違うものは比べられない
結論: 数の列と、数に変換できない文字列を比べると、行が消えるのではなくエラーになります。
多くの製品は「比べられそうなもの」を自動で変換してから比較します。salary > '500000' は文字列を数に直して通ります。しかし '500000abc' のように変換できないものを渡すと、そこで止まります。
これは親切な仕様です。黙って 0 行を返されるより、エラーで気づけるほうが安全だからです。自動変換に頼らず、比べたい型のまま書くのがいちばん確実です。
SELECT name
FROM shain
WHERE salary > '500000abc';「numeric として読めない」と言われます。条件の書き間違いがエラーで分かる、ありがたい例です。
05日付はそのまま比較できる
結論: 日付は数と同じように `>=` や `<` で比べられます。
日付を書くときは DATE '2025-01-01' の形が標準です。単なる文字列 '2025-01-01' を書いても多くの製品では自動変換されて通りますが、書式の解釈が製品や設定で変わる(月と日が入れ替わる等)ので、型を明示するほうが安全です。
⚠️ 日付リテラルの書き方は製品差が大きい部分です。使えない製品がある例には自動で注記が出ます。
SELECT name, hired_on
FROM shain
WHERE hired_on >= DATE '2025-01-01'
ORDER BY hired_on;| name | hired_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 句比較演算子をいちばん使う場所です。
根拠(一次情報)
- PostgreSQL 18 マニュアル: 比較関数と演算子一次情報・確認 2026-08-03
- PostgreSQL 18 マニュアル: 照合順序のサポート一次情報・確認 2026-08-03
- SQLite: Datatypes In SQLite(比較と型)一次情報・確認 2026-08-03