この章のコードはSample_SQL5.txtを使用します。
WHERE句を使った行の選択
SQLではWHERE句を使用して、いくつかの条件を指定して行(レコード)を選択する事ができます。
書式は下記のとおりです。
<書式5.1>
SELECT <列名1>,<列名2>,… FROM <テーブル名> WHERE <条件式>;
<条件式の構文1>
<列名、値または式> <比較演算子または特殊演算子> <値>
条件式では、列名や値のほかに定数、文字列、関数を使用することができます。
<条件式の構文2>
<条件式1> <論理演算子> <条件式2> <論理演算子> <条件式3> …
実行時に行毎に条件式が評価され、結果がTrue(真)となる行が選択されます。
それでは、下図のテーブル「Staff」を検索対象としてSQL文の例を考えてみましょう。
列条件の指定
下記の例はテーブル「Staff」より女性従業員のみ検索するSQL文です。
<SQL例5.1>
SELECT
*
FROM “Staff”
WHERE “Gender” = ‘f’;
【<SQL例5.1>の実行結果】
列「Gender」が「f」の行だけが選択されたことが確認されます。
演算子について
条件式内で個々のデータ項目を操作する記号(シンボル)を演算子といいます。演算子には算術、比較、論理、連結、特殊の各演算子があります。
算術演算子
2つ以上の数値から1つの数値を算出したり、数値の記号を正から負に、又は負から正に変換するには算術演算子を使います。
演算子 | 使用例 | 用 途 |
---|---|---|
+ | A + B | AとBの和を求める |
– | A – B | AとBの差を求める |
* | A * B | AとBを乗算する |
/ | A / B | AをBで除算する |
一つの式に複数の算術演算子がある場合の優先順位は下記のとおりです。
①最初に乗算・除算が評価され、加算・減算より優先される。
②式の中に同じ優先順位の演算子がある場合、記述の左から右の順に評価される。
③括弧でくくられた式を含む場合はその式が最優先される。
比較演算子
比較演算子は値を比較し、True(真)、False(偽)、またはNullを返すために使います。なお、「True」や「False」のことをブール値といいます。
<SQL例5.1>の<条件式>では比較演算子として「=」を使用しています。下記の表を参考にして「=」以外の演算子についても実行して結果を確認してみて下さい。
演算子 | 使用例 | 使用例の意味 |
---|---|---|
= | A = B | AとBが等しい |
<> | A <> B | AとBが等しくない(A≠B) |
< | A < B | AがBより小さい |
> | A > B | AがBより大きい |
<= | A <= B | AがB以下(A≦B) |
>= | A >= B | AがB以上(A≧B) |
(注)「<=」や「>=」のように2文字で記述する演算子は必ず不等号が左、等号が右になるよう、記述します。逆に記述すると文法エラーになります。また「≠」の意味で記述する場合の「><」も文法エラーになります。
論理演算子(ブール演算子)
論理演算子を使って2つのブール値を組み合わせると、結果としてTrue、False、またはNullが返されます。
演算子 | 使用例 | 用 途 |
---|---|---|
AND | 条件A AND 条件B | 条件Aと条件BがTrueの場合にTrueを返す |
OR | 条件A OR 条件B | 条件Aまたは条件BのいずれかがTrueの場合にTrueを返す |
NOT | NOT 条件A | 条件AがTrueでない場合にTrueを返す |
一つの条件式に複数の比較演算子や論理演算子を使用した場合の優先順位は下記のとおりです。
①比較演算子を使用した条件
②NOT条件
③AND条件
④OR条件
AND演算子の使用例
<SQL例5.2>
SELECT
*
FROM “Staff”
WHERE “Gender” = ‘m’
AND “Department_ID” = ‘S101’;
【<SQL例5.2>の実行結果】
列「Gender」が「m」、かつ列「Department_ID」が「S101」の行だけが選択されたことが確認されます。
OR演算子の使用例
<SQL例5.3>
SELECT
*
FROM “Staff”
WHERE “Department_ID” = ‘S107’
OR “Department_ID” = ‘S109’;
【<SQL例5.3>の実行結果】
列「Department_ID」が「S107」または「S109」の行だけが選択されたことが確認されます。
NOT演算子の使用例
<SQL例5.4>
SELECT
*
FROM “Staff”
WHERE NOT “Department_ID” = ‘S102’;
【<SQL例5.4>の実行結果】
列「Department_ID」が「S102」以外の行が選択されたことが確認されます。
連結演算子
連結演算子は第3章でも紹介したように「+」(プラス)および「||」(バーティカルバー2文字)によって2つの文字列を連結してひとつの文字列にまとめることができます。
特殊演算子
下記の表に示すように、結果としてTrue、False、またはNullを返すには特殊演算子を使用します。
演算子 | 使用例 | 用 途 |
---|---|---|
IS NULL | A IS NULL | AがNullの場合にTrueを返す |
IS NOT NULL | A IS NOT NULL | AがNull以外の場合にTrueを返す |
LIKE | A LIKE ‘abc%’ | Aが「%」や「_」などのワイルドカードを使って一致した場合にTrueを返す |
BETWEEN | A BETWEEN 4 AND 7 | Aが一定範囲内にある場合にTrueを返す |
IN | A IN (1,3,5) | Aがセット内のいずれかの値に一致した場合にTrueを返す |
NOT IN | A NOT IN (1,3,5) | Aがセット内のいずれの値にも一致しない場合にTrueを返す |
(注)LIKE演算子のワイルドカード「%」(パーセント)は「任意の数の何かの文字」という意味で使用し、「_」(アンダーバーまたはアンダースコア)は「何か1文字」という意味で使用します。
それでは、下図のテーブル「Item」を検索対象としてSQL文の例を考えてみましょう。
IS NULL演算子の使用例
<SQL例5.5>
SELECT
*
FROM “Item”
WHERE “UnitPrice” IS NULL;
【<SQL例5.5>の実行結果】
列「UnitPrice」がNull値になっている行を選択しているのが確認されます。
IS NOT NULL演算子の使用例
<SQL例5.6>
SELECT
*
FROM “Item”
WHERE “UnitPrice” IS NOT NULL;
【<SQL例5.6>の実行結果】
列「UnitPrice」がNull値でない行を選択しているのが確認されます。
LIKE演算子の使用例①
LIKE演算子を使った検索を「あいまい検索」ともいいます。
<SQL例5.7>
SELECT
*
FROM “Item”
WHERE “Name” LIKE ’_茶%’;
【<SQL例5.7>の実行結果】
<SQL例5.7>は、列「Name」の値が1文字目が何かの文字、2文字目が「茶」、3文字目以降、何かの文字がいくつあってもよしとする行を検索しています。
LIKE演算子の使用例②
<SQL例5.8>
SELECT
*
FROM “Item”
WHERE “Name” LIKE ’__茶%’;
【<SQL例5.8>の実行結果】
<SQL例5.8>は、ワイルドカード「_」が2文字指定されているので、列「Name」の値が1文字目から2文字目が何かの文字、3文字目が「茶」、4文字目以降、何かの文字がいくつあってもよしとする行を検索しています。
BETWEEN演算子の使用例
<SQL例5.9>
SELECT
*
FROM “Item”
WHERE “ID” BETWEEN ’S003’AND ’S005’;
【<SQL例5.9>の実行結果】
IN演算子の使用例
<SQL例5.10>
SELECT
*
FROM “Item”
WHERE “ID” IN(’S002’,’S004’,’S006’);
【<SQL例5.10>の実行結果】
NOT IN演算子の使用例
<SQL例5.11>
SELECT
*
FROM “Item”
WHERE “ID” NOT IN(’S002’,’S004’,’S006’);
【<SQL例5.11>の実行結果】
※ 条件式で使用するIN演算子、またはNOT IN演算子の次に記述する括弧内には別のSQLを記述し、それを実行して得られる結果のひとつに該当する(またはしない)という条件付けにすることが可能です。この別のSQLのことを「サブSQL」といいます。「サブSQL」については次節でも取り扱います。
キーワードEXISTSを使用した条件付け
WHERE句の条件式で「EXISTS」を使用することにより、あるデータが存在する(または存在しない)の条件付けをすることができます。「EXISTS」の次の括弧内に記述するサブSQL(副問い合わせともいいます)の結果が存在する場合は条件式の評価がTrueになり、存在しない場合は評価がFalseになります。
キーワード「EXISTS」を使ったWHERE句の書式は下記のとおりです。
<書式5.2>
SELECT <列名1>,<列名2>,… FROM <テーブル名>
WHERE { EXISTS | NOT EXISTS } (<サブSQL>);
(注1)
書式中の「|」(バーティカルバー)はコーディング上の記号ではなく、書式記述上の約束事の一つで、オプションを表します。また、オプションの対象となる個所を「{}」(中括弧またはブレースカールといいます)で囲っています。
(注2)
「NOT EXISTS」を選択した場合の条件式の評価は「EXISTS」を選択した場合と逆転します。つまり、「NOT EXISTS」を選択した場合はサブSQLの実行結果が存在した場合にFalseになります。
<SQL例5.12>
SELECT * FROM “Staff“
WHERE EXISTS(SELECT * FROM “Empoyee” WHERE “Empoyee“.“ID“=“Staff“.“ID“);
【<SQL例5.12>の実行結果】
上図ではテーブル「Staff」のIDと同じIDがテーブル「Employee」に存在しているレコードのみ表示されています。同じSQLのEXISTSの前にNOTを付けて実行すると、テーブル「Staff」のIDと同じIDがテーブル「Employee」に存在していないレコードが表示されますので試してみて下さい。
※ なお、サブSQLは他の個所でも使うことができます。例えばSELECT句で列名を記述する場所で括弧を付けて別のSQLを記述するとその結果を表示することができます。
応用例は「Base中級」コース第9章第2節「トランザクション用レポートの作成」の第1項「レポート用クエリーの作成」で紹介しています。興味ある方はご覧下さい。
LIMIT句を使用した行の選択
SQL文ではWHERE句を使用せずにLIMIT句を記述して検索レコード数を制限することができます。
ただし、何かの都合でWHERE句を記述した場合はその後ろにLIMIT句を記述して下さい。
書式は下記のとおりです。
<書式5.3>
SELECT <列名1>,<列名2>,…
FROM <テーブル名>
LIMIT <limit値> [OFFSET <offset値>];
(注)書式の記述の中に「[]」(ブラケット)がありますが、これは書式記述上の約束事の一つです。「[]」で囲まれたキーワード「OFFSET <offset値>」は省略可能という意味になります。
下図のテーブル「State」を例にSQLを考えてみましょう。
<SQL例5.13>
SELECT *
FROM “State”
LIMIT 5 OFFSET 3;
【<SQL例5.13>の実行結果】
ID=1~10のレコードが登録されているテーブル「State」より、ID=1~3のレコードを除いて5レコード表示されています。このように、limit値は検索後に表示する行数を指定し、offset値は検索対象から省く行を先頭の位置から数えた行数で指定する値です。