【SELECT文について(WHERE句/論理演算子)】
1-1 論理演算子とは
論理演算子は、比較演算子の結果を組み合わせたり、条件を反対の意味にしたりするときに使用する演算子。これらを使用し、条件を組み合わせ、より細かい条件を指定できるようになる。

■AND演算子
ANDは論理演算子の1つ。左右の式の両方が真である場合に、AND演算子は真を戻す。つまり「両辺の検索条件が両方とも成り立つときに全体の検索条件として成り立つ」という働きがある。日本語で言えば「かつ」に相当する。
それでは、以下の【syainzyoho】というテーブルで、 「syain_seibetsu」が「m」、かつ「syain_age」が「40以上」という条件で、「syain_id」、「syain_mei」、「syain_seibetsu」、「shain_age」列を取得してみる。

《「syainzyoho」テーブルから「syain_seibetsu」が「m」、かつ「syain_age」が「40以上」のレコードだけを抜き出し、「syain_id」、「syain_mei」、「syain_seibetsu」、「syain_age」列だけを表示させるSQL文》
【SELECT syain_id,syain_mei,syain_seibetsu,syain_age FROM syainzyoho WHERE syain_seibetsu='m' AND syain_age>=40;】
ここでは、「syain_seibetsu」が「m」と「syain_age」が「40以上」という条件の両方を満たすレコードという意味になる。

実行結果は以下のとおり。

ANDはさらに複数つなげることもできる。
以下の社員情報を扱う【syainzyoho】というテーブルで、 「syain_seibetsu」が「m」、かつ「syain_age」が「40以上」、かつ「busyo_code」が「30」という条件で、検索してみる。

《「syainzyoho」テーブルから「syain_seibetsu」が「m」、かつ「syain_age」が「40以上」かつ「busyo_code」が「30」のレコードだけを抜き出し、「syain_id」、「syain_mei」、「syain_seibetsu」、「syain_age」、「busyo_code」列だけを表示させるSQL文》
【SELECT syain_id,syain_mei,syain_seibetsu,syain_age,busyo_code FROM syainzyoho WHERE syain_seibetsu='m' AND syain_age>=40 AND busyo_code=30;】
ここでは、「syain_seibetsu」が「m」と「syain_age」が「40以上」と「syain_code」が「30」いう条件の全てを満たすレコードという意味になる。

実行結果は以下のとおり。

■OR演算子
「どちらか一方の条件が真である場合に、全体で真を戻す」という場合には、ORで条件式をつなげる。ORも論理演算子のひとつ。ANDとは異なり、どちらかで条件が満たされていれば、全体として真になる。日本語で言えば「または」に相当する。
以下の食品情報を扱う【foodtable】というテーブルで、「food_bunrui」が「肉類」、または「food_bunrui」が「野菜類」という条件で、「food_id」、「fod_mei」、「food_bunrui」列を取得してみる。

《「foodtable」テーブルから「food_bunrui」が「肉類」、または「野菜類」のレコードだけを抜き出し、「food_id」、「food_mei」、「food_bunrui」列だけを表示させるSQL文》
【SELECT food_id,food_mei,food_bunrui FROM foodtable WHERE food_bunrui='肉類' OR food_bunrui='野菜類';】
ここでは、「food_bunrui」が「肉類」または「food_bunrui」が「野菜類」のいずれかの条件を満たすレコードという意味になる。

実行結果は以下のとおり。

また、ORもANDと同様に複数つなげることもできる。
以下の食品情報を扱う【foodtable】というテーブルで、「food_bunrui」が「肉類」、または「food_bunrui」が「野菜類」、または「rieki」が「300」以上という条件で、「food_id」、「food_mei」、「food_bunrui」、「rieki」列を取得してみる。

《「foodtable」テーブルから「food_bunrui」が「肉類」、または「野菜類」または「riekiが300以上」のレコードだけを抜き出し、「food_id」、「food_mei」、「food_bunrui」、「rieki」列だけを表示させるSQL文》
【SELECT food_id,food_mei,food_bunrui,rieki FROM foodtable WHERE food_bunrui='肉類' OR food_bunrui='野菜類'OR rieki>=300;】
ここでは、「food_bunrui」が「肉類」または「food_bunrui」が「野菜類」または「rieki」が「300以上」のいずれかの条件を満たすレコードという意味になる。

実行結果は以下の通り。

■NOT演算子
NOT演算子はそれ単独では使用しない。他の検索条件と組み合わせて使用する。NOT演算子は「否定」を示し、「××ではない」という意味になる。
以下の食品情報を扱う【foodtable】というテーブルで、「rieki」が「300以上ではない」、という条件で、「food_id」、「food_mei」、「rieki」列を取得してみる。

《「foodtable」テーブルから「rieki」が「300以上ではない」レコードだけを抜き出し、「food_id」、「food_mei」、「rieki」列だけを表示させるSQL文》
【SELECT food_id,food_mei,rieki FROM foodtable WHERE NOT rieki >= 300;】
ここでは、「rieki」が「300以上でない(300未満)」の条件を満たすレコードという意味になる。すなわち、「WHERE rieki < 300」と同値。

実行結果は以下の通り。

1-2 複数の論理演算子での条件の指定
論理演算子は複数組み合わせて使うことができる。異なる論理演算子も組み合わせる事はできるが、優先順位がある。
優先順位は以下の通り。
【1】NOT
【2】AND
【3】OR
例えば、「条件1 OR 条件2 AND 条件3」では、ANDの部分がORより先に演算(条件がチェック)される。従って、「条件1である」または「条件2かつ条件3である」という意味になる。

四則演算では、カッコで囲むと優先順位が上がり、その部分が先に計算されるが、カッコで囲むと優先順位が上がるのは、論理演算でも同様。
例えば、「(条件1 OR 条件2)AND 条件3」では、「(条件1 OR 条件2)」の部分が「AND 条件3」より先に演算される。従って、「条件1または条件2である」かつ「条件3である」という意味になる。

それでは、以下の社員情報を扱う【syainzyoho】というテーブルで、 「syain_seibetsu」が「m」、または「syain_age」が「40以上」、かつ「syain_bloodtype」が「O」という条件で、検索してみる。

《「syainzyoho」テーブルから「syain_seibetsu」が「m」、または「syain_age」が「40以上」かつ「syain_bloodtype」が「O」のレコードだけを抜き出し、「syain_id」、「syain_mei」、「syain_seibetsu」、「syain_age」、「syain_bloodtype」列だけを表示させるSQL文》
【SELECT syain_id,syain_mei,syain_seibetsu,syain_age,syain_bloodtype FROM syainzyoho WHERE syain_seibetsu='m' OR syain_age>=40 AND syain_bloodtype='O';】
実行結果は以下のとおり。

以下の社員情報を扱う【syainzyoho】というテーブルで、 「syain_seibetsu」が「f」、または「syain_bloodtype」が「O」、かつ「syain_age」が「30未満」という条件で、「syain_id」、「syain_mei」、「syain_seibetsu」、「syain_bloodtype」、「syain_age」列を取得してみる。

《「syainzyoho」テーブルから「syain_seibetsu」が「f」、または「syain_bloodtype」が「O」かつ「syain_age」が「30未満」のレコードだけを抜き出し、「syain_id」、「syain_mei」、「syain_seibetsu」、「syain_bloodtype」、「syain_age」、列だけを表示させるSQL文》
【SELECT syain_id,syain_mei,syain_seibetsu,syain_bloodtype,syain_age FROM syainzyoho WHERE (syain_seibetsu='f' OR syain_bloodtype='O')AND syain_age < 30;】
実行結果は以下のとおり。
