第 6 章 行の選択 - WHERE 句
6.1 WHERE 句による行の選択
WHERE句は、SELECTステート メントなど 、取り出す行を限定できるSQLステート メントで使用します。
書式は、次の通りです。
SELECT FROM [WHERE] [GROUP BY] [HAVING] [ORDER BY]
WHERE句を使う場合、WHEREというキーワード を記述し 、その右に条件を指定します。この条件にした がって、行(レコード )が取り出されることになります。つまり、条件はフィルタの役目を果たし ます。
■ WHERE句を使った場合、指定した条件を満たす行が取り出され 、照会( クエリ)の結果として返り
ます。
■ 指定した条件を満たさない行は無視され 、照会( クエリ)の結果から排除されます。
WHERE句はオプションで、必ずしも指定する必要はありません。SELECTステート メントにWHERE句を 指定しなかったときには、ベーステーブルのすべてのレコードが結果として返ります。したがって、ベース テーブルが大きい場合、返ってくるレコード の数も多くなります。
SELECT名前, 売上 FROM営業部
WHEREマネージャ = 104 WHERE句による行の取り出し
!"#$%
! &#"!%
' (#""&%
True
False
Unknown
図6.1:WHERE句による行の選択
検索条件
SQLでは、各種各様の検索条件を使用して、他種類のクエリを効率よく行うことができます。SQLの場合、
基本的な条件として次のようなものがあります。
・ 比較テスト(=、<>、<=、<、>、>=)… 式を使用して2つの値を比較し 、その結果を条件として検 索を行うことができます。
6
・ 範囲テスト(BETWEEN)… 値が一定の範囲に収まるかど うかをチェックし 、その結果を条件として検 索を実行できます。
・ メンバーシップテスト(IN)… 複数の値を指定しておき、項目の値が 、その複数の値のいずれかと一致 する場合、レコードが取り出されます。
・ パターンマッチテスト(LIKE)… パターンを指定し 、項目の値( 文字列)が 、そのパターンに一致す るかど うかをチェックできます。このチェックで、値が指定したパターンと一致した場合、レ コードが取り出されます。
・NULL値テスト(IS NULL)… 項目の値がNULLかど うかをチェックでき、その結果をもとにレコード の取り出しが可能です。
・ 複合検索(AND、OR、NOT)… AND、OR、NOTの各論理演算子を使った条件です。この方法では、
複雑な条件を作成できます。
構文:
SELECT カラム名[, カラム名 . .]
FROM テーブル名
WHERE 条件 [条件, 条件 . . .]
比較テスト による行の取り出し
比較テストでは、比較を行う式を指定し 、その式を満足するレコード を取り出すことができます。 比較テス トでは、=、<>、<=、<、>、>=の6種類の演算子を使用できます。
=を使った比較テスト 構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 = 値( 式)
例:
「社員情報」というテーブルがあり、その中の「部門10(部門番号が10の部門)」に属する社員すべてにつ いて、その社員番号、名前、職種、給料を取り出したい場合、次のようになります。
SELECT 社員番号, 名前, 職種, 給料 FROM社 員情報
WHERE 部門番号 = 10 結果:
社員番号 名前 職種 給料 3123 ウオーカー 社長 5500 3115 カーライル 事務 3375 3970 オニール マネージャ 4850
<>を使った比較テスト
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 <> 値( 式)
SQLガ イド 6.1 WHERE句による行の選択 6–3
例:
「社員情報」というテーブルの社員のうち、マネージャでない社員の名前と職種、給料を取り出したい場合、
次のようになります。
SELECT 名前, 職種, 給料 FROM 社員情報
WHERE 職種 <> ’マネージャ’
結果:
名前 職種 給料
アレン 営業 2300
ジョージ 営業 2400 ターンブル 営業 2050 マークソン 事務 3000 ジョーダン アナリスト 4250 ウオーカー 社長 5500 クレ イン アナリスト 3900 アントン 事務 3500 カーライル 事務 3375 ボンフィーリオ アナリスト 4175
比較される値が文字列の場合、大文字と小文字が区別されます。また、一重引用符で囲まなければなりませ ん。,たとえば 、上記の例では、下のように小文字を使った場合、
WHERE 職種 <> ’マネージャ’
この場合、結果としては 、「マネージャ」のレコード が4つ表示されます( 大文字と小文字が区別されるた めです)。大文字と小文字が区別されて認識されるかど うは、データベースによっても異なります。たとえ ば 、MS-SQL Serverでは、大文字と小文字が区別されます。
範囲テスト による行の取り出し
範囲テストによる取り出しでは、範囲を指定し 、その範囲に該当する値を持ったレコード を取り出すことが できます。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 BETWEEN式 AND式 例:
1985年3月1日から1989年12月31日までの間に入社した社員について、その名前、職種、入社日を取り 出したい場合、次のようにします。なお、ここでは、条件として指定した項目( 名前、職種、入社日)のデー タ型はそれぞれ 、文字、文字、日付としています。
SELECT 名前, 職種, 入社日 FROM 社員情報
WHERE 入社日 BETWEEN ’1985年3月1日’
AND ’1989年12月31日’
6 結果:
名前 職種 入社日
アレン 営業 1985年4月15日 ジョーダン アナリスト 1989年5月3日 ウオーカー 社長 1985年3月13日
メイジャー マネージャ 1985年3月13日 バートン マネージャ 1987年12月2日 エイデン マネージャ 1989年8月4日 メンバーシップテスト による行の取り出し
メンバーシップテストによる行の取り出しでは、複数の値を指定し 、その中のいずれかの値を持ったレコー ド を取り出すことができます。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 IN (値, 値 . . .) 例:
テーブル「社員情報」のレコード のうち、職種が営業またはアナリストである社員のレコード を取り出した い場合、次のようにします。
SELECT 名前, 職種 FROM 社員情報
WHERE 職種 IN (’営業’, ’アナリスト’) 結果:
名前 職種
アレン 営業
ジョージ 営業 ターンブル 営業 ジョーダン アナリスト クレ イン アナリスト ボンフィーリオ アナリスト
また、メンバーシップテストによる行の取り出しでは、NOTキーワード を使うことで、指定した複数の値以 外の値のレコード を取り出すこともできます。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 NOT IN (値, 値 . . .) 例:
テーブル「社員情報」のレコード のうち、職種が営業またはアナリストでない社員のレコード を取り出した い場合、次のようになります。
SELECT 名前, 職種 FROM社 員情報
WHERE 職種 NOT IN (’営業’, ’アナリスト’)
SQLガ イド 6.1 WHERE句による行の選択 6–5
結果:
名前 職種
マークソン 事務 ウオーカー 社長
メイジャー マネージャ バートン マネージャ エイデン マネージャ アントン 事務 カーライル 事務 オニール マネージャ
パターンマッチテスト による行の取り出し
カラムに格納されている値が正確には分からない場合、パターンを指定し 、そのパターンに合致する値が格 納されているレコードを取り出すことができます。この方法をパターンマッチテストによる取り出しと呼び 、 LIKEキーワード を使います。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 LIKEパターン
パターンは文字列で、次のワイルド カード 文字を使用できます。
■ パーセント 記号(%) … このワイルド カード 文字は、任意の数(0からnまで )の文字を表します。
■ 下線( ) … このワイルド カード 文字は、1文字を表します。パターンには、ワイルド カー ド のほか実際の文字を指定でき、この文字は、そのまま認識されます。
例:
テーブル「社員情報」のレコード のうち、名前が「B」で始まる社員について、その名前、職種、部門番号 を取り出したい場合、次のようになります。
SELECT 名前, 職種, 部門番号 FROM社 員情報
WHERE 名前 LIKE ’B%’
結果:
名前 職種 部門番号
バートン マネージャ 20 ボンフィーリオ アナリスト 50 例:
テーブル「社員情報」のレコード のうち、姓が6文字以上の社員について、その名前、職種、部門番号を取 り出したい場合、次のようになります。
SELECT名前, 職種, 部門番号 FROM社員情報
WHERE名前 LIKE ’_ _ _ _ _ _ %’
上記の6つの下線( )は、姓の最初の6文字を表します。最後のパーセント記号(%)は、任意の数(0か らnまで )の文字を表し 、したがって、このパターンは6文字以上の文字列を示すことになります。
6 結果:
名前 職種 部門番号
ジョージ 営業 40 ターンブル 営業 40 マークソン 事務 50 ジョーダン アナリスト 50 ウオーカー 社長 10 バートン マネージャ 20 カーライル 事務 10 ボンフィーリオ アナリスト 50
NULL値テスト による行の取り出し
項目に値が入っていない行を取り出したい場合、NULL値テストによる行を取り出しを使います。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 IS NULL 例:
テーブル「社員情報」のレコード のうち、手数料を受け取っていない社員のレコード を抽出し 、その名前と 給料を表示したい場合、次のようになります。
SELECT 名前, 給料
FROM 社員情報 WHEREカラム IS NULL 結果:
名前 給料
マークソン 3000 ジョーダン 4250 ウオーカー 5500 メイジャー 4750 クレ イン 3900 バートン 4200 エイデン 4700 アントン 3500 カーライル 3375 ボンフィーリオ 4175 オニール 4850
NULL値テストによる行の取り出しでは、「IS NOT NULL」を使うことで、NULL値が入っていないレコー ド をすべて取り出すこともできます。
構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名
WHERE カラム名 IS NOT NULL
SQLガ イド 6.1 WHERE句による行の選択 6–7
例:
テーブル「社員情報」のレコード のうち、手数料を受け取った社員のレコード をすべて抽出し 、その名前と 給料、手数料の額を表示したい場合、次のようになります。
SELECT 名前, 給料, 手数料 FROM 社員情報
WHERE 手数料 IS NOT NULL 結果:
名前 給料 手数料 アレン 4300 2000 ジョージ 4400 3000 ターンブル 4050 5050
複合検索による行の取り出し
レコード は、複数の条件を使用して取り出すこともできます。この場合の条件を複合検索条件( または、複 合論理式)と呼んでいます。複合検索条件による行の取り出しでは、条件はAND、OR、NOTの各論理演算 子を使用して結合します。
各条件ではそれぞれ 、式を複数指定することもできます。また、各条件による結果がすべて結合されてい、
最終的にレコードが抽出されます。なお、比較演算子と論理演算子は、その優先順が決まっており、その優 先順にしたがって結果が出力されます。
比較演算子
=、!=、>、>=、IN、LIKE、IS NULL、BETWEEN 論理演算子
NOT、AND、OR 構文:
SELECT カラム名[, カラム名 . . .]
FROM テーブル名 WHERE式
AND [NOT] (式) OR [NOT] (式) 例:
テーブル「社員情報」のレコード のうち、職種がマネージャで、かつ、給料が$4,300以上の社員のレコード、
および職種が営業の社員のレコード を抽出し 、その社員の名前、職種、入社日、給料を表示したい場合、ス テート メントは次のようになります。
SELECT 名前, 職種, 入社日, 給料 FROM 社員情報
WHERE (給料 >= 4300 AND 職種 = ’マネージャ’) OR 職種 = ’営業’