第3章 SQL構文

SELECT構文:WHEREで検索条件を設定する

SELECT構文の中でも特に重要なWHERE句を紹介します。WHEREを使えるようになると、膨大なレコードの中から特定のレコードを抽出することが可能になります。

WHEREを使って検索する

SELECT構文を使って特定のレコードを検索するには、WHERE句を使います。WHEREの後に条件式を指定することにより、その条件にマッチしたレコードだけを選択することができます。

SELECT フィールド名
	FROM テーブル名 
	WHERE 条件式
特定の条件を満たすレコードを取り出す

条件式は、検索対象となるフィールド名と、演算子、関数、定数などを使って表現します。たとえば、顧客(customer)テーブルの中から男性だけを取り出すには次のような条件式を設定します。

# sex フィールドの値が1のレコードを取り出す
SELECT * FROM customer WHERE sex=1;
+------+--------------------------------+-----+-----+
| id_c | fullname                       | age | sex |
+------+--------------------------------+-----+-----+
|    2 | トミー・ゲレロ                 |  34 |   1 |
|    3 | マディ・ウォーターズ           |  55 |   1 |
|    4 | エディ・ロバーツ               |  28 |   1 |
|    6 | スライ・ストーン                |  34 |   1 |
+------+--------------------------------+-----+-----+

複数の条件式を指定する際は、論理演算子のANDやORで接続します。顧客(customer)テーブルの中から男性だけを取り出し、年齢が34歳の顧客だけを選択するには次のような条件式を設定します。

SELECT * FROM customer WHERE sex=1 AND age=34;
+------+--------------------------+-----+-----+-------------------+
| id_c | fullname                 | age | sex | email             |
+------+--------------------------+-----+-----+-------------------+
|    2 | トミー・ゲレロ           |  34 |   1 | tommy@exsample.jp |
|    6 | スライ・ストーン          |  34 |   1 | NULL              |
+------+--------------------------+-----+-----+-------------------+

WHERE句で使える演算子

演算子のほとんどはWHERE句で使用することができます。次の表は、WHERE句で使用することができる演算子の一覧です。

演算子 説明
= 等しい
> 大きい
< 小さい
>= 大きい、もしくは等しい
<= 小さい、もしくは等しい
!=
<>
等しくない
AND 2つの条件を結合し、両方の条件が真
OR 2つの条件のうち、どちらか一方が真
NOT 式の結果を反転
BETWEEN a AND b 対象のフィールドが a と
b の範囲内
IN 対象のフィールドが式の一覧の1つに一致
LIKE 対象のフィールドがパターンに一致

比較演算子

比較演算子は、値の大小を比較し、その結果を返します。次の例はWHERE句で簡単でよく利用される条件式で、フィールドの値を指定して、それにマッチしたレコードだけを選択します。

SELECT * FROM customer WHERE id_c = 1;
+------+--------------------------------------+-----+-----+
| id_c | fullname                             | age | sex |
+------+--------------------------------------+-----+-----+
|    1 | エラ・フィッツジェラルド             |  48 |   2 |
+------+--------------------------------------+-----+-----+

次の例では、[顧客ID(id_c)]フィールドの値が 1 以外のレコードだけを選択します。

SELECT * FROM customer WHERE id_c !=1;
+------+--------------------------------+-----+-----+
| id_c | fullname                       | age | sex |
+------+--------------------------------+-----+-----+
|    2 | トミー・ゲレロ                 |  34 |   1 |
|    3 | マディ・ウォーターズ           |  55 |   1 |
|    4 | エディ・ロバーツ               |  28 |   1 |
|    5 | マーサ・リーブス               |  38 |   2 |
|    6 | スライ・ストーン                |  34 |   1 |
+------+--------------------------------+-----+-----+

> や < のような値の大小を比べる演算子は、論理演算子のANDを併用することで選択範囲を指定することができます。次の例では、[顧客ID(id_c)]フィールドの値が 2~4 までのレコードを選択しています。

# id_c フィールドの値が 2~4 のレコードを選択
SELECT * FROM customer WHERE id_c >= 2 AND id_c <= 4;
+------+--------------------------------+-----+-----+
| id_c | fullname                       | age | sex |
+------+--------------------------------+-----+-----+
|    2 | トミー・ゲレロ                 |  34 |   1 |
|    3 | マディ・ウォーターズ           |  55 |   1 |
|    4 | エディ・ロバーツ               |  28 |   1 |
+------+--------------------------------+-----+-----+

論理演算子

WHEREの中で複数の条件を指定したい場合は、論理演算子を使います。論理演算子を使うことにより、「~で~のレコードを選択」、「~もしくは~のレコードを選択」といったAND/OR検索が可能になります。

複数の条件を指定する

ANDやORを組み合わせることにより、複数の条件を指定することができます。

# id_c フィールドの値が 1 以上で 4 以下のレコードを選択
SELECT * FROM customer WHERE id_c > 1 AND id_c < 4;
+------+--------------------------------+-----+-----+
| id_c | fullname                       | age | sex |
+------+--------------------------------+-----+-----+
|    2 | トミー・ゲレロ                 |  34 |   1 |
|    3 | マディ・ウォーターズ           |  55 |   1 |
+------+--------------------------------+-----+-----+

# id_c フィールドの値が 2、もしくは 4 のレコードを選択
SELECT * FROM customer WHERE id_c = 2 OR id_c = 4;
+------+--------------------------+-----+-----+
| id_c | fullname                 | age | sex |
+------+--------------------------+-----+-----+
|    2 | トミー・ゲレロ           |  34 |   1 |
|    4 | エディ・ロバーツ         |  28 |   1 |
+------+--------------------------+-----+-----+

複数のANDやORを組み合わせる場合、優先順位を明確にするために式を括弧で囲むことがあります。括弧内の式は括弧外の式よりも優先順位が高いため、先に実行されます。実行の順番によっては結果が変わってくるので、複数の式を組み合わせる際はなるべく括弧を使って記述しましょう。

# id_c フィールドの値が 2、もしくは 4 、もしくは[性別(sex)]フィールドの値が
# 1 のレコードを選択
SELECT * FROM customer
WHERE (id_c >= 2 AND id_c <=4) OR sex = 1;

指定した条件に一致しないレコードを指定したい場合は、NOT演算子で条件を否定します。

# id_c フィールドの値が 2 ではないレコードを選択
SELECT * FROM customer WHERE NOT (id_c = 2);
+------+--------------------------------------+-----+-----+
| id_c | fullname                             | age | sex |
+------+--------------------------------------+-----+-----+
|    1 | エラ・フィッツジェラルド             |  48 |   2 |
|    3 | マディ・ウォーターズ                 |  55 |   1 |
|    4 | エディ・ロバーツ                     |  28 |   1 |
|    5 | マーサ・リーブス                     |  38 |   2 |
|    6 | スライ・ストーン                      |  34 |   1 |
+------+--------------------------------------+-----+-----+

式に対してNOTを使う場合、式を括弧で囲む必要があります。括弧を省略すると、上記の場合はフィールド名だけがNOTの対象になり、思ったような結果になりません。

LIKE演算子

LIKEはワイルドカードを使って文字列を検索するための演算子です。ワイルドカードとは、何かと一致する特殊な文字で、「任意の文字列」を表すパーセント( %
)と、「1文字の任意の文字」を表すアンダスコア( _ )の2種類があります。

LIKEで使用できるワイルドカードには次の2つがあります。

アンダスコア記号(_)
任意の1文字にマッチする。
パーセント記号(%)
0個以上のの連続した文字にマッチする。

次の例では、WHERE句に[フルネーム(fullname)]フィールドの値が"マディ"で始まるという条件を設定しています。

SELECT * FROM customer WHERE fullname LIKE 'マディ%';

"マディ"から始まる値を探しているので、 [姓名(fullname)]フィールドの値の先頭に"マディ"の文字があれば、次にどのような文字列がきてもTRUEが帰ってきます。このような処理方法を『パターンマッチング』と呼びます。

% や _ などのワイルドカード自体を検索対象にしたい場合は、\ を使ってエスケープ処理を行います。たとえば、任意の文字列の後に % があるような値を検索したい場合は、"%\%"とします。最初の % がワイルドカードで、2番目の % は % そのものです。


BETWEEN演算子

BETWEEN演算子は、対象の値が指定した2つの値の範囲以内にあるかを判定します。

対象値 BETWEEN 最低値 AND 最大値

対象値には式やフィールド名を指定します。

BETWEEN~AND

次の例では、顧客テーブル(customer)から、[年齢(age)]フィールドの値が40から55までのレコードを選択しています。

SELECT fullname, age FROM customer
WHERE age BETWEEN 40 AND 55;
+--------------------------------------+-----+
| fullname                             | age |
+--------------------------------------+-----+
| エラ・フィッツジェラルド             |  48 |
| マディ・ウォーターズ                 |  55 |
+--------------------------------------+-----+

上記のとおり、BETWEEN演算子は~以上、~以下の範囲をとるので、指定した境界値も含みます。簡単に境界値を含まない~未満、~超を実現するには、超の値に+1、未満の値に-1を加えるとよいでしょう。

SELECT fullname, age FROM customer
WHERE age BETWEEN 40+1 AND 55-1;
+--------------------------------------+-----+
| fullname                             | age |
+--------------------------------------+-----+
| エラ・フィッツジェラルド             |  48 |
+--------------------------------------+-----+

IN演算子

IN演算子は対象の値が指定した値のリストの中にあるかを判定します。

対象値 IN(値, 値, ...)

対象値には式やフィールド名を指定します。

次の例では、顧客テーブル(customer)から、[年齢(age)]フィールドの値が28、38、48の行を選択しています。

SELECT fullname, age FROM customer
WHERE age IN(28, 38, 48);
+--------------------------------------+-----+
| fullname                             | age |
+--------------------------------------+-----+
| エラ・フィッツジェラルド             |  48 |
| エディ・ロバーツ                     |  28 |
| マーサ・リーブス                     |  38 |
+--------------------------------------+-----+

否定のNOT演算子を使って、指定した以外の値を持ったレコードを選択することもできます。

SELECT fullname, age FROM customer
WHERE age NOT IN(28, 38, 48);
+--------------------------------+-----+
| fullname                       | age |
+--------------------------------+-----+
| トミー・ゲレロ                 |  34 |
| マディ・ウォーターズ           |  55 |
| スライ・ストーン                |  34 |
+--------------------------------+-----+

ISNULL(expr) / expr IS NULL

NULLは特殊な値で、通常の値のように比較演算子や論理演算子を使ってNULLを検索することができません。たとえば、顧客テーブル(customer)の[メールアドレス(email)]フィールドの値がNULLのレコードを検索する際、下記のようなSQL文では正しい結果を得ることができません。

SELECT * FROM customer WHERE email=NULL; 

NULLを検索する際は、ISNULL演算子、もしくはIS NULL演算子を使います。ISNULL演算子、IS NULL演算子は引数exprがNULLなら 1 を、そうでなければ 0 を返します。

SELECT * FROM customer 
WHERE email IS NULL;
+------+--------------------------+-----+-----+-------+
| id_c | fullname                 | age | sex | email |
+------+--------------------------+-----+-----+-------+
|    4 | エディ・ロバーツ         |  28 |   1 | NULL  |
|    6 | スライ・ストーン          |  34 |   1 | NULL  |
+------+--------------------------+-----+-----+-------+

SELECT * FROM customer 
WHERE ISNULL(email);
+------+--------------------------+-----+-----+-------+
| id_c | fullname                 | age | sex | email |
+------+--------------------------+-----+-----+-------+
|    4 | エディ・ロバーツ         |  28 |   1 | NULL  |
|    6 | スライ・ストーン          |  34 |   1 | NULL  |
+------+--------------------------+-----+-----+-------+

ISNULLの否定形にはNOTを使います。

SELECT * FROM customer 
WHERE email IS NOT NULL;
+------+--------------------------------------+-----+-----+--------------------+
| id_c | fullname                             | age | sex | email              |
+------+--------------------------------------+-----+-----+--------------------+
|    1 | エラ・フィッツジェラルド             |  48 |   2 | ella@exsample.jp   |
|    2 | トミー・ゲレロ                       |  34 |   1 | tommy@exsample.jp  |
|    3 | マディ・ウォーターズ                 |  55 |   1 | muddy@exsample.jp  |
|    5 | マーサ・リーブス                     |  38 |   2 | martha@exsample.jp |
+------+--------------------------------------+-----+-----+--------------------+

SELECT * FROM customer 
WHERE NOT ISNULL(email);
+------+--------------------------------------+-----+-----+--------------------+
| id_c | fullname                             | age | sex | email              |
+------+--------------------------------------+-----+-----+--------------------+
|    1 | エラ・フィッツジェラルド             |  48 |   2 | ella@exsample.jp   |
|    2 | トミー・ゲレロ                       |  34 |   1 | tommy@exsample.jp  |
|    3 | マディ・ウォーターズ                 |  55 |   1 | muddy@exsample.jp  |
|    5 | マーサ・リーブス                     |  38 |   2 | martha@exsample.jp |
+------+--------------------------------------+-----+-----+--------------------+

関連記事