WHERE句で条件を指定するとき、両辺に記述した列や値を比較する記号のことを比較演算子と呼びます。

SQLの主な比較演算子は下表のとおりです。

演算子説明
=~と等しい
<>~と等しくない
>=~以上
>~より大きい
<=~以下
<~より小さい

以下のデータが格納される表を使って、以降の例を示します。

SELECT name, hire_date, salary
 FROM Employees;
    name    | hire_date  | salary
------------+------------+--------
 山田太郎   | 1984-04-01 | 500000
 佐藤達弘   | 2002-11-01 | 300000
 木村幸平   | 2014-04-01 | 250000
 神埼恵美   | 2017-04-01 | 220000
 高木龍之介 | 2017-10-01 | 210000
 青木和也   | 2018-04-01 | 210000
(6 行)

=演算子

WHEREの後に=を指定すると、=の左辺と右辺が等しい行だけが抽出されます。

SELECT name, salary
  FROM Employees
 WHERE salary=500000;
実行結果
   name   | salary
----------+--------
 山田太郎 | 500000
(1 行)

>, <, >=, <=演算子

WHEREの後に>, <, >=, <=を指定すると、左辺と右辺の大小関係を比較し、その条件に合致する行だけが抽出されます。

SELECT name, salary
  FROM Employees
 WHERE salary>=250000;
実行結果
   name   | salary
----------+--------
 山田太郎 | 500000
 佐藤達弘 | 300000
 木村幸平 | 250000
(3 行)

<>演算子

WHEREの後に<>を指定すると、左辺と右辺が一致しない行だけが抽出されます。(その際、NULLは比較対象外となります。)

SELECT name, salary
  FROM Employees
 WHERE salary<>250000;
実行結果
    name    | salary
------------+--------
 山田太郎   | 500000
 佐藤達弘   | 300000
 神埼恵美   | 220000
 高木龍之介 | 210000
 青木和也   | 210000
(5 行)

これらの比較演算子は文字、数値、日付など、ほぼすべてのデータ型の列、値を比較することができます。例えば、「給与額が30万以上」の行や「入社日が2000年より前」の行を選択するなどといったことが可能です。

SELECT name, hire_date
  FROM Employees
 WHERE hire_date < '2000-1-1';
実行結果
   name   | hire_date
----------+------------
 山田太郎 | 1984-04-01
(1 行)

日付では「~より小さい」が「~より前」になります。指定した日付も含めて後の日を検索条件にしたい場合には「~以上」を表す>=演算を使います。

また、不等号とイコールを書く位置にも注意する必要があります。必ず不等号が左側、イコールが右側になります。逆に書くとエラーになります。

文字列に不等号を使う

比較演算子はほぼすべてのデータ型の列、値を比較できると前述しましたが、文字列に「~以上」や「~より小さい」といった不等号を使うとどのような結果になるのでしょうか。

わかりやすくするため、以下のテーブルを作成します。

CREATE TABLE Str_test
(str CHAR(4) NOT NULL,
 PRIMARY KEY (str));

BEGIN TRANSACTION;
INSERT INTO Str_test VALUES ('1');
INSERT INTO Str_test VALUES ('2');
INSERT INTO Str_test VALUES ('3');
INSERT INTO Str_test VALUES ('10');
INSERT INTO Str_test VALUES ('11');
INSERT INTO Str_test VALUES ('222');
INSERT INTO Str_test VALUES ('あ');
INSERT INTO Str_test VALUES ('い');
INSERT INTO Str_test VALUES ('あい');
INSERT INTO Str_test VALUES ('ん');
COMMIT;

では、早速このテーブルを使って以下のSELECT文を実行してみます。

SELECT str
  FROM Str_test
 WHERE str > '2';
実行結果
  str
--------
 3
 222
 あ
 い
 あい
 ん
(6 行)

WHERE句では「’2’より大きい」という検索条件を指定しているので、’10’や’11’も選択されるように思えますが、結果には出力されていません。

str列に数字が入っていますが、データ型は文字列型(CHAR型)です。つまり、数値型の2と文字列型の’2’は別ものなのです。

そして、文字列型のデータの大小を比較する際には、数値とは異なるルールが使われます。代表的なルールは「辞書式順序」です。名前のとおり、辞書の見出し項目の順番を決めるときに使われるものです。
このルールの重要なところは「同じ文字ではじまる単語同士は、異なる文字ではじまる単語同士よりも近い関係になる」ということです。

上記サンプルのstr列のデータをORDER BY句を使って昇順に並べてみます。(ORDER BY句は明示的に行の順序を指定するものです。詳細は別ページ参照。)

   SELECT str
     FROM Str_test
 ORDER BY str;
実行結果
  str
--------
 1
 10
 11
 2
 222
 3
 あ
 あい
 い
 ん
(10 行)

この結果からわかるように、’10’や’11’は、同じ’1’に連なる文字列ですから、’2’よりも「小さいと」判定されて先に来ます。

このように、文字列型の順序の原則は辞書式であり、数値の大小順序と混合してはいけません。

NULLへの比較演算子

比較演算子についてもう1つ、重要なことがあります。それは、検索条件とする列にNULLが含まれている場合です。
例えば、以下のような行があったとします。

    name    | department_id
------------+---------------
 山田太郎   | 0010
 佐藤達弘   | 0050
 木村幸平   | 0050
 神埼恵美   | 0100
 高木龍之介 |
 青木和也   |
(6 行)

まずは、department_idが’0050’の行を選択します。

SELECT name, department_id
  FROM Employees
 WHERE department_id = '0050';
実行結果
   name   | department_id
----------+---------------
 佐藤達弘 | 0050
 木村幸平 | 0050
(2 行)

想定どおりの行が選択されています。では、今度は、department_idが’0050’以外の行を選択してみます。

SELECT name, department_id
  FROM Employees
 WHERE department_id <> '0050';
実行結果
   name   | department_id
----------+---------------
 山田太郎 | 0010
 神埼恵美 | 0100
(2 行)

「高木龍之介」と「青木和也」が結果に含まれていません。これら2行は、そもそもdepartment_id(部門ID)が不明(NULL)なので、’0050’でないかどうかを判定できないのです。

それでは、NULLの行を選択するにはどういう条件式を書けば良いのでしょう。「department_id = NULL」と思いつくかもしれませんが、これは不正解で、実行しても1行も選択されません。

SQLにはNULLかどうかを判別するための専用の演算子IS NULLが用意されています。NULLの行を選択したいときはそのIS NULLを使用します。

SELECT name, department_id
  FROM Employees
 WHERE department_id IS NULL;
実行結果
    name    | department_id
------------+---------------
 高木龍之介 |
 青木和也   |
(2 行)

反対に、NULLではない行を選択したときには、IS NOT NULL演算子を使用します。

SELECT name, department_id
  FROM Employees
 WHERE department_id IS NOT NULL;
実行結果
   name   | department_id
----------+---------------
 山田太郎 | 0010
 佐藤達弘 | 0050
 木村幸平 | 0050
 神埼恵美 | 0100
(4 行)