B L O G

  1. TOP
  2. BLOG
  3. はじめてのSQL【初級編:WHERE句について③】
プログラミング
2025.05.12

はじめてのSQL【初級編:WHERE句について③】

こんにちは。

スタッフブログ担当の岩でございます。

前回の記事では算術演算子について説明いたしました。

はじめてのSQL【初級編:WHERE句について②】

今回はWHERE句で使用する「論理演算子」について説明いたします。

今回もShopテーブルを使って説明します。

shohin_id
(商品ID)
shohin_mei
(商品名)
shohin_bunrui
(商品分類)
hanbai_tanka
(販売単価)
shiire_tanka
(仕入単価)
torokubi
(登録日)
0001ボールペン事務用品100502020-10-20
0002おろしがねキッチン用品5003502020-09-07
0003フォークキッチン用品10030
0004圧力鍋キッチン用品500010002020-04-25
0005包丁キッチン用品80002020-07-05
0006カッターシャツ衣類300015002020-06-11
0007穴あけパンチ事務用品4002402020-11-27
0008Tシャツ衣類15002020-03-13
Shopテーブル

論理演算子

論理演算子には以下の種類があります。

論理演算子       意味
NOT~でない
AND両辺の条件が両方とも成り立つ
OR両辺の条件のうち、どちらか一方あるいは両方が成り立つ
論理演算子

ここでいう論理演算子の論理とは「真理値を操作する」という意味です。

真理値とは「真(TRUE)」または「偽(FALSE)」のいずれかになる値のことです。

以前の投稿で説明した比較演算子は、演算の結果として真理値を返します。

はじめてのSQL【初級編:WHERE句について①】

比較した結果が成り立てば「真(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ボールペン事務用品100502020-10-20
0007穴あけパンチ事務用品4002402020-11-27
例1.の結果

AND演算子は論理演算子を挟んだ両辺の真理値がともに「真(TRUE)」であるときに「真(TRUE)」、それ以外は「偽(FALSE)」を返します。

表にすると以下の通りです。

条件1条件2条件1 AND 条件2
AND演算子の真理表

例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ボールペン事務用品100502020-10-20
0002おろしがねキッチン用品5003502020-09-07
0003フォークキッチン用品10030
0007穴あけパンチ事務用品4002402020-11-27
例2.の結果

OR演算子は論理演算子を挟んだ両辺がともに「偽(FALSE)」でなければ「真(TRUE)」、両辺が「偽(FALSE)」のときにだけ「偽(FALSE)」を返します。

表にすると以下の通りです。

条件1条件2条件1 OR 条件2
OR演算子の真理表

例2.でいうと、「商品分類が事務用品」と「販売単価が500以下である」の2つの条件に当てはまるか、どちらかの条件に当てはまるデータが結果となります。

   

例3.商品分類がキッチン用品でない

SELECT *
FROM Shop
WHERE NOT shohin_bunrui = 'キッチン用品' ;
shohin_id
(商品ID)
shohin_mei
(商品名)
shohin_bunrui
(商品分類)
hanbai_tanka
(販売単価)
shiire_tanka
(仕入単価)
torokubi
(登録日)
0001ボールペン事務用品100502020-10-20
0006カッターシャツ衣類300015002020-06-11
0007穴あけパンチ事務用品4002402020-11-27
0008Tシャツ衣類15002020-03-13
例3.の結果

この結果は以下のSQLと同じ結果となります。

SELECT *
FROM Shop
WHERE shohin_bunrui <> 'キッチン用品' ;

こちらの比較演算子については以前の記事で詳細を説明しております。

NOT演算子は「真(TRUE)」のときに「偽(FALSE)」を、「偽(FALSE)」のときに「真(TRUE)」を返します。

表にすると以下の通りです。

条件1NOT 条件1
NOT演算子の真理表

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ボールペン事務用品100502020-10-20
0003フォークキッチン用品10030
例4.の結果

なぜ上記のような間違った結果が返ってくるかというと

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に比較演算子は使えません。

はじめてのSQL【初級編:WHERE句について①】

したがって、真ではありません。

では、偽でしょうか?

もし偽であるならば、上記の条件式を否定した以下の条件式のときに真となります。(偽は真の反対だから)

NOT shiire_tanka = 2800

ところが、実際はそうではありません。

真でも偽でもないこの真理値は「不明(UNKNOWN)」となります。

通常の論理演算は真と偽の2値論理と呼ばれるのに対して、

SQLは真と偽と不明の3値論理と呼ばれます。

3値論理におけるANDの真理表は以下の通りです。

条件1条件2条件1 AND 条件2
不明不明
不明
不明不明
不明
不明不明不明
3値論理におけるANDの真理表

まとめ

今回説明した論理演算子はSQLを学ぶうえで非常に重要です。

論理演算子を正しく理解することで、求めるデータを正確に取得できるようになります。

実務でも必ず使うので、よく覚えておいてくださいね。

次回はWHERE句で使う述語について、説明いたします。

最後まで読んでくださりありがとうございました。