SQLを利用する際、テーブルのデータを丸ごと取得するのではなく、任意の条件に沿ったデータを検索するのが一般的です。
本記事はSQLの条件指定に利用するWHERE句の基本的な使い方から、様々な検索条件の指定方法について確認していきたいと思います。
SQL検索条件の基本を抑えよう
最初にSQL検索条件の基本的な記述方法について学んでいきましょう。
今回サンプルデータとして「member」テーブルに下記のデータを用意しました。
memberテーブル
+------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 3 | 山田あかね | チーム3 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+
基本構文
SQLの検索条件を指定する際の基本構文は下記となります。
SELECT カラム名[, カラム名, ...] FROM テーブル名 WHERE 条件式:
条件式で利用可能な比較演算子を確認してみましょう。
- 等しい: 「=」
- 大きい: 「>」
- 以上: 「>=」
- 小さい:「<」
- 以下: 「<=」
- 等しくない: 「!=」または「」
サンプル
では上記でご紹介した比較演算子を利用したサンプルSQLで、検索条件の取得結果の違いを確認していきましょう。
等しい
条件式に「カラム名 = 値」と記述することで、データが一致するレコードのみを取得出来ます。
mysql> select * from member where team_name = "チーム1"; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | +------+-----------------+------------+ 3 rows in set (0.00 sec)
大きい
条件式に「カラム名 > 値」と記述することで、指定した値よりも大きいデータのレコードを取得出来ます。
mysql> select * from member where id > 3; +------+--------------+------------+ | id | name | team_name | +------+--------------+------------+ | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+--------------+------------+ 4 rows in set (0.00 sec)
以上
条件式に「カラム名 >= 値」と記述することで、指定した値と等しいまたは大きいデータのレコードを取得出来ます。
mysql> select * from member where id >= 3; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 3 | 山田あかね | チーム3 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+ 5 rows in set (0.00 sec)
小さい
条件式に「カラム名 < 値」と記述することで、指定した値より小さいデータのレコードを取得出来ます。
mysql> select * from member where id < 3; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | +------+-----------------+------------+ 2 rows in set (0.00 sec)
以下
条件式に「カラム名 <= 値」と記述することで、指定した値と等しいまたは小さいデータのレコードを取得出来ます。
mysql> select * from member where id <= 3; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 3 | 山田あかね | チーム3 | +------+-----------------+------------+ 3 rows in set (0.00 sec)
等しくない
条件式に「カラム名 !=[<>] 値」と記述することで、指定した値と等しくないデータのレコードを取得出来ます。
mysql> select * from member where id != 3; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+ 6 rows in set (0.00 sec)
「<>」で記述しても同様の結果を得ることが可能です。
mysql> select * from member where id <> 3; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+ 6 rows in set (0.00 sec)
SQLで複数の検索条件を指定するには
SQLでは、「AND」と「OR」を利用して複数の検索条件を組み合わせて指定することも可能です。
ANDを指定した場合、前後の条件式の双方を満たすデータ、ORを指定した場合、前後の条件式のどちらかを満たすデータのレコードが取得出来ます。
基本構文
ANDとORは2つ以上指定することも可能で、複数の条件式を指定することも可能です。
複数の条件を組み合わせる場合、算数と同じで「()」で囲った条件式の組み合わせが優先されるので、適宜利用するようにしましょう。
SELECT カラム名[, カラム名, ...] FROM テーブル名 WHERE 条件式 AND(OR) 条件式 [AND(OR) 条件式 ...]:
サンプル
上述したサンプルデータを利用して、複数条件の組わせてについても確認していきます。
AND条件
チーム名が「チーム1」かつidが「5」のデータを取得するサンプルです。
mysql> select * from member where team_name = "チーム1" and id = 5; +------+--------------+------------+ | id | name | team_name | +------+--------------+------------+ | 5 | 坂本一生 | チーム1 | +------+--------------+------------+ 1 row in set (0.00 sec)
OR条件
チーム名が「チーム2」またはidが「1」のデータを取得するサンプルです。
mysql> select * from member where team_name = "チーム2" or id = 1; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | | 4 | 斎藤ゆか | チーム2 | +------+-----------------+------------+ 3 rows in set (0.00 sec)
3つ以上の条件式を組みわせ
3つの条件式をカッコで囲って実行し、2つのサンプルの違いを確認してみましょう。
1つ目のサンプルSQLです。
mysql> select * from member where (team_name = "チーム2" and id = 2) or name = "田中はじめ"; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 2 | 鈴木ごろう | チーム2 | +------+-----------------+------------+ 2 rows in set (0.00 sec)
2つ目のサンプルSQLです。
mysql> select * from member where team_name = "チーム2" and (id = 2 or name = "田中はじめ"); +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 2 | 鈴木ごろう | チーム2 | +------+-----------------+------------+ 1 row in set (0.00 sec)
取得結果が異なりますよね。
1つ目のサンプルでは、チーム2に所属するidが2のデータ「または」”田中はじめ”のデータを取得する条件となりました。
一方で2つ目のサンプルでは、idが2のデータまたは”田中はじめ”のデータで「かつ」チーム2に所属していることが条件となっています。
SQLの検索条件指定方法はまだまだある
SQLの検索条件指定方法は、他にもいくつものパターンが存在します。
よく利用される条件式の記述方法について、ピックアップしてご紹介していきます。
- BETWEEN
- LIKE
- IN
- NOT
- IS NULL
サンプル
それぞれの演算子の使い方をサンプルで確認していきましょう。
BETWEEN
BETWEEN演算子で指定した2つの値の間にあるデータを取得する条件指定です。
「カラム名 BETWEEN 値 AND 値」の形で記述します。
mysql> select * from member where id between 2 and 5 ; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 2 | 鈴木ごろう | チーム2 | | 3 | 山田あかね | チーム3 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | +------+-----------------+------------+ 4 rows in set (0.00 sec)
LIKE
LIKE演算子で指定した値を含むデータを取得します。
「%」などのワイルドカードを利用することで、部分一致検索を実行出来ます。
「カラム名 LIKE 値」の形で記述します。
mysql> select * from member where name like "%あか%"; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 3 | 山田あかね | チーム3 | +------+-----------------+------------+ 1 row in set (0.00 sec)
サンプルでは名前に「あか」が含まれるデータを検索条件として指定しています。
IN
IN演算子では、指定した複数の値の中からデータが一致する場合に取得します。
同一カラムで複数の値を条件として指定したい場合に、OR条件で繋げるのではなく、IN演算子を使うことでSQLを簡潔に記述することが可能となります。
「カラム名 IN (値[, 値, 値, …])」の形で記述します。
mysql> select * from member where id in (1, 3, 5); +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 1 | 田中はじめ | チーム1 | | 3 | 山田あかね | チーム3 | | 5 | 坂本一生 | チーム1 | +------+-----------------+------------+ 3 rows in set (0.00 sec)
サンプルではidが「1, 3, 5」のいずれかに一致したレコードを取得出来ます。
NOT
NOT演算子では、指定した条件に当てはまらないデータを取得出来ます。
「NOT 条件式」の形で記述します。
mysql> select * from member where not id = 1; +------+-----------------+------------+ | id | name | team_name | +------+-----------------+------------+ | 2 | 鈴木ごろう | チーム2 | | 3 | 山田あかね | チーム3 | | 4 | 斎藤ゆか | チーム2 | | 5 | 坂本一生 | チーム1 | | 6 | 安倍みき | チーム1 | | 7 | NULL | NULL | +------+-----------------+------------+ 6 rows in set (0.00 sec)
IS NULL
NULLの検索を行う場合、比較演算子の「=」では値を取得出来ないため、「IS NULL」を活用します。
「カラム名 IS NULL」の形で記述します。
まずは比較演算子「=」を使って取得結果を確認してみましょう。
mysql> select * from member where name = null; Empty set (0.00 sec)
このようにNullは特別な値のため、通常の比較演算子ではデータを取得することが出来ませんでした。
mysql> select * from member where name is null; +------+------+-----------+ | id | name | team_name | +------+------+-----------+ | 7 | NULL | NULL | +------+------+-----------+ 1 row in set (0.00 sec)
「IS NULL」で条件指定することで、NULLデータのレコードが検索結果として取得出来ていることをご確認頂けます。
NULL以外のデータを取得したい場合には「IS NOT NULL」と指定します。
さいごに:SQLの検索条件を使いこなして適切な値を取得しよう
本記事では、SQLの検索条件指定方法について、様々な記述方法をご紹介してきました。
実際のプログラム開発では、ご紹介した演算子を組み合わせて複雑な条件でデータを取得する機会も多くなります。
まずは1つ1つの使い方をきっちり把握した上で、徐々に複雑な検索条件のデータ取得にチャレンジしてみてください。
条件式の「値」に文字列や日付を指定する場合「”(ダブルクォーテーション)」か「'(シングルクォーテーション)」で囲う必要があります。