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歳の顧客だけを選択するには、次のようにANDで条件をつなげます。
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を組み合わせる場合、優先順位を明確にするために式を括弧で囲むことがあります。括弧内の式は括弧外の式よりも優先順位が高いため、先に実行されます。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演算子は、指定した範囲内の値を検索します。
対象値 BETWEEN 最低値 AND 最大値
対象値には式やフィールド名を指定します。
BETWEEN~AND
次の例では、顧客テーブル(customer)から、[年齢(age)]フィールドの値が40から55までのレコードを選択しています。
SELECT fullname, age FROM customer WHERE age BETWEEN 40 AND 55; +--------------------------------------+-----+ | fullname | age | +--------------------------------------+-----+ | エラ・フィッツジェラルド | 48 | | マディ・ウォーターズ | 55 | +--------------------------------------+-----+
上記のとおり、BETWEEN演算子は~以上、~以下の範囲をとるので、指定した境界値も含みます。境界値を含めたくない場合は、> や < を使って条件を指定します。たとえば、40歳より大きく55歳未満にしたい場合は、次のように記述します。
SELECT fullname, age FROM customer
WHERE age > 40 AND age < 55;
+--------------------------------------+-----+
| 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を検索する場合は、=ではなくIS 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 | +------+--------------------------------------+-----+-----+--------------------+