はじめてのSQL【初級編:WHERE句について③】
こんにちは。
スタッフブログ担当の岩でございます。
前回の記事では算術演算子について説明いたしました。
今回はWHERE句で使用する「論理演算子」について説明いたします。
今回もShopテーブルを使って説明します。
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0002 | おろしがね | キッチン用品 | 500 | 350 | 2020-09-07 |
0003 | フォーク | キッチン用品 | 100 | 30 | |
0004 | 圧力鍋 | キッチン用品 | 5000 | 1000 | 2020-04-25 |
0005 | 包丁 | キッチン用品 | 8000 | | 2020-07-05 |
0006 | カッターシャツ | 衣類 | 3000 | 1500 | 2020-06-11 |
0007 | 穴あけパンチ | 事務用品 | 400 | 240 | 2020-11-27 |
0008 | Tシャツ | 衣類 | 1500 | | 2020-03-13 |

論理演算子
論理演算子には以下の種類があります。
論理演算子 | 意味 |
NOT | ~でない |
AND | 両辺の条件が両方とも成り立つ |
OR | 両辺の条件のうち、どちらか一方あるいは両方が成り立つ |
ここでいう論理演算子の論理とは「真理値を操作する」という意味です。
真理値とは「真(TRUE)」または「偽(FALSE)」のいずれかになる値のことです。
以前の投稿で説明した比較演算子は、演算の結果として真理値を返します。
比較した結果が成り立てば「真(TRUE)」、成り立たなければ「偽(FALSE)」となります。
(例)shiire_tanka >= 1000
上記の条件では「ボールペン」は仕入単価が100のため「偽(FALSE)」となり
「カッターシャツ」は仕入単価が1500のため「真(TRUE)」となります。
論理演算子を使ったSELECT文

それでは論理演算子を使ったSELECT文をみながら、詳細を説明いたします。
例1.商品分類が事務用品 かつ 販売単価が500以下である
SELECT *
FROM Shop
WHERE shohin_bunrui = '事務用品'
AND hanbai_tanka <= 500 ;
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0007 | 穴あけパンチ | 事務用品 | 400 | 240 | 2020-11-27 |
AND演算子は論理演算子を挟んだ両辺の真理値がともに「真(TRUE)」であるときに「真(TRUE)」、それ以外は「偽(FALSE)」を返します。
表にすると以下の通りです。
条件1 | 条件2 | 条件1 AND 条件2 |
真 | 真 | 真 |
真 | 偽 | 偽 |
偽 | 真 | 偽 |
偽 | 偽 | 偽 |
例1.でいうと、「商品分類が事務用品」と「販売単価が500以下である」の2つの条件に当てはまるデータのみが結果になります。
例2.商品分類が事務用品 または 販売単価が500以下である
SELECT *
FROM Shop
WHERE shohin_bunrui = '事務用品'
OR hanbai_tanka <= 500 ;
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0002 | おろしがね | キッチン用品 | 500 | 350 | 2020-09-07 |
0003 | フォーク | キッチン用品 | 100 | 30 | |
0007 | 穴あけパンチ | 事務用品 | 400 | 240 | 2020-11-27 |
OR演算子は論理演算子を挟んだ両辺がともに「偽(FALSE)」でなければ「真(TRUE)」、両辺が「偽(FALSE)」のときにだけ「偽(FALSE)」を返します。
表にすると以下の通りです。
条件1 | 条件2 | 条件1 OR 条件2 |
真 | 真 | 真 |
真 | 偽 | 真 |
偽 | 真 | 真 |
偽 | 偽 | 偽 |
例2.でいうと、「商品分類が事務用品」と「販売単価が500以下である」の2つの条件に当てはまるか、どちらかの条件に当てはまるデータが結果となります。
例3.商品分類がキッチン用品でない
SELECT *
FROM Shop
WHERE NOT shohin_bunrui = 'キッチン用品' ;
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0006 | カッターシャツ | 衣類 | 3000 | 1500 | 2020-06-11 |
0007 | 穴あけパンチ | 事務用品 | 400 | 240 | 2020-11-27 |
0008 | Tシャツ | 衣類 | 1500 | 2020-03-13 |
この結果は以下のSQLと同じ結果となります。
SELECT *
FROM Shop
WHERE shohin_bunrui <> 'キッチン用品' ;
こちらの比較演算子については以前の記事で詳細を説明しております。
NOT演算子は「真(TRUE)」のときに「偽(FALSE)」を、「偽(FALSE)」のときに「真(TRUE)」を返します。
表にすると以下の通りです。
条件1 | NOT 条件1 |
真 | 偽 |
偽 | 真 |
NOT演算子は高度なSQLを書く場合に必要となってきますが、ほとんどは比較演算子の「<>」で書くことができます。
また「<>」を使った方がわかりやすく記述できる場合もあります。
無理にNOT演算子を使う必要はありません。
論理演算子の組み合わせ

それではAND演算子とOR演算子を組み合わせた条件式を書いてみましょう。
例4.「商品分類がキッチン用品」かつ「登録日がNULL または 2020-10-20」
この条件に当てはまるのは「フォーク」だけです。
表はこちらを参照してください。
例4.の検索条件をそのまま書くと以下の通りです。
SELECT *
FROM Shop
WHERE shohin_bunrui = 'キッチン用品'
AND torokubi IS NULL
OR torokubi = '2020-10-20' ;
しかしこのSELECT文を実行すると間違った結果が返ってきます。
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0003 | フォーク | キッチン用品 | 100 | 30 |
なぜ上記のような間違った結果が返ってくるかというと
OR演算子よりAND演算子の方が優先されるからです。
つまり、「商品分類がキッチン用品 かつ 登録日がNULL」 または 「登録日が2020-10-20」と解釈されています。
例4.のようにAND演算子よりOR演算子を優先したい場合は()「カッコ」を使います。
正しいSELECT文は以下の通りです。
SELECT *
FROM Shop
WHERE shohin_bunrui = 'キッチン用品'
AND ( torokubi IS NULL
OR torokubi = '2020-10-20') ;
このように書くと結果は想定通り「フォーク」のみが返ってきます。
NULLを含む場合の真理値

shohinテーブルを見ると「包丁」と「Tシャツ」の仕入単価がNULLになっています。
これらの行を以下の条件式に照らし合わせたときの真理値は何になるでしょうか。
shiire_tanka = 2800
もし真ならば、この条件式をWHERE句で指定することで「包丁」と「Tシャツ」の行を選択できます。
しかし、以前の記事で説明した通り、NULLに比較演算子は使えません。
したがって、真ではありません。
では、偽でしょうか?
もし偽であるならば、上記の条件式を否定した以下の条件式のときに真となります。(偽は真の反対だから)
NOT shiire_tanka = 2800
ところが、実際はそうではありません。
真でも偽でもないこの真理値は「不明(UNKNOWN)」となります。
通常の論理演算は真と偽の2値論理と呼ばれるのに対して、
SQLは真と偽と不明の3値論理と呼ばれます。
3値論理におけるANDの真理表は以下の通りです。
条件1 | 条件2 | 条件1 AND 条件2 |
真 | 真 | 真 |
真 | 偽 | 偽 |
真 | 不明 | 不明 |
偽 | 真 | 偽 |
偽 | 偽 | 偽 |
偽 | 不明 | 偽 |
不明 | 真 | 不明 |
不明 | 偽 | 偽 |
不明 | 不明 | 不明 |
まとめ
今回説明した論理演算子はSQLを学ぶうえで非常に重要です。
論理演算子を正しく理解することで、求めるデータを正確に取得できるようになります。
実務でも必ず使うので、よく覚えておいてくださいね。
次回はWHERE句で使う述語について、説明いたします。
最後まで読んでくださりありがとうございました。