SQLにおける論理演算子の基本
条件判断をするときに、条件が1つしかないということは滅多にありません。膨大なデータの中から有用なデータを探すためには、たくさんの条件から判断した検索結果が必要になることが多いでしょう。条件式を比較演算子で記述するには、前のセクションで解説しました。しかし、複数の条件を並べることは比較演算子だけではできません。このようなときに使うのが論理演算子です。
論理演算子は、SQL文ではWHERE句の内部に記述され、条件式を評価し、その結果を真、または偽で返します。論理演算子には次のようなものがあります。
論理演算子 | 内容 |
---|---|
AND | 2つの条件式の結果が両方真になるときに真を返す |
OR | 2つの条件式の結果の片方が真になれば真を返す |
NOT | 後に続く条件式の結果が真なら偽を、偽なら真を返す |
AND演算子
SELECT * FROM 在庫リスト
WHERE 単価 > 10000 AND カテゴリ = '実用商品';
実行結果
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
---|---|---|---|---|
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
表:在庫リスト
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
---|---|---|---|---|
1 | 時の卵 | 空想商品 | 12345 | 2 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
OR演算子
OR演算子は、2つの条件式のどちらかが真になったときに、真を返す演算子です。左辺と右辺のどちらかが真なら真を返し、両方が真の場合も真を返します。偽を返すのはどちらも偽の場合だけになります。
OR演算子の使用例としては、「在庫リスト」表で、カテゴリが空想商品もしくは危険商品の商品を検索してみます。
SELECT * FROM 在庫リスト
WHERE カテゴリ = '空想商品' OR カテゴリ = '危険商品';実行結果
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
1 | 時の卵 | 空想商品 | 12345 | 2 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
表:在庫リスト
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
---|---|---|---|---|
1 | 時の卵 | 空想商品 | 12345 | 2 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
2つの=演算子を使った条件式の間に、OR演算子を使うことで、結果として2つの条件式のどちらかを満たす行が返されます。
NOT演算子
NOT演算子は、条件式を否定する演算子です。これは、条件式が真になった場合に偽を返し、条件式が偽になったときに真を返します。要するに条件式の結果を反転させる働きを持っています。
実際に、NOT演算子を使ってみましょう。次の例では、NOT演算子を付けて、=演算子でカテゴリが空想商品を検索しています。
SELECT * FROM 在庫リスト WHERE NOT カテゴリ = '空想商品';実行結果
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
SELECT * FROM 在庫リスト WHERE カテゴリ <> '空想商品';
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
論理演算子の優先順位
論理演算子を使えば、問合せを行うときに複数の条件式を組合せて検索を行えます。この論理演算子でも、算術演算子と同じように、「( )」を使うことで処理の優先順位を指定することができます。
通常論理演算を評価する順序は、先に記述してあるものから順番に行われます。
SELECT * FROM 在庫リスト WHERE 単価=1000
AND カテゴリ='空想商品' OR カテゴリ='実用商品';
実行結果
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
1 | 時の卵 | 空想商品 | 12345 | 2 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
表:在庫リスト
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
---|---|---|---|---|
1 | 時の卵 | 空想商品 | 12345 | 2 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
SQL文
SELECT 商品番号,商品名,カテゴリ,単価 FROM 在庫リスト
WHERE 単価 > 1000
AND (カテゴリ='空想商品' OR カテゴリ='実用商品');
実行結果
商品番号 | 商品名 | カテゴリ | 単価 |
1 | 時の卵 | 空想商品 | 12345 |
3 | 地面に沈む羽 | 空想商品 | 1200 |
4 | 見えない眼鏡 | 実用商品 | 20000 |
表:在庫リスト
商品番号 | 商品名 | カテゴリ | 単価 | 在庫 |
---|---|---|---|---|
1 | 時の卵 | 空想商品 | 12345 | 2 |
2 | 解けない氷 | 実用商品 | 500 | 32 |
3 | 地面に沈む羽 | 空想商品 | 1200 | 4 |
4 | 見えない眼鏡 | 実用商品 | 20000 | 12 |
5 | 柄のない包丁 | 危険商品 | 3200 | 3 |
このSQL文では、まず「( )」で囲んでいる「カテゴリ=’空想商品’」と「カテゴリ=’実用商品’」の条件式のOR演算を行ってから、「単価>1000」とのAND演算を行っています。
演算子の優先順位
ここまでいくつかのセクションで演算子を紹介してきました。しかし、SQLで扱える演算子はこれだけではなく、各演算子のリファレンスで紹介するように、他にも多くのものがあります。
そして、算術演算子、論理演算子など、各演算子の中での優先順位については、それぞれの中で解説をしていますが、演算子全体での優先順位というものもあります。この優先順位は、演算子の種類を組合せて使う場合には、知っておく必要があります。
主な演算子の優先順位は、次のようになっています。
主な演算子の優先順位
演算子 | 優先順 |
---|---|
* / % | 高 |
+ - | ↑ |
= > >= < <= <> != | | |
& | | | |
NOT | | |
AND | ↓ |
BETWEEN IN LIKE OR SONE | 低 |
優先順位を変更したい場合には、それぞれの演算子の優先順位でも解説した「( )」を使って、優先順位の変更を行います。