【SQL超入門講座】13.AND, OR|複数条件で抽出する方法

挨拶

こんにちは。キノコードです。
SQL超入門講座でWhereについて紹介しました。
そこで、特定の条件でデータを抽出する場合について説明しました。
そのレッスンで紹介したのは、idが2と等しいもの、idが2以上ものといったように条件が1つのみのデータ抽出方法でした。
ただ、idが2以上で10以下といったような2つの条件。
idが2以上で10以下で、なおかつ、売上が1万円以上といったような2つ以上の条件で指定したい場合があると思います。
そこで、この動画では、2つ以上の条件式を組み合わせてデータ抽出をする方法について解説をします。
2つ以上の条件式をデータ抽出する方法の中でも、この動画では、論理演算子のANDとORを使った方法を説明をします。
なお、論理演算子とは、複数の条件を判断させる演算子のことです。
日本語でいうと「かつ」とか「または」のことです。英語でいうとandとorです。
これだけ聞くと難しい感じがしますが、簡単です。
動画でわかりやすく解説します。

キノコードでは、この動画の他にも、たくさんのプログラミングのレッスンを配信しています。
チャンネル登録がまだの方は、チャンネルがどこにいったかわからなくならないように、チャンネル登録をお願いします。

また、キノコードではメンバーシップをやっています。
キノコードの動画制作活動を応援してくださる方は、月額290円から応援できます。
詳しくはチャンネル登録ボタンの隣にある「メンバーになる」をクリックしてください。
キノコードのメンバーシップの解説動画があります。

それでは、レッスンスタートです。

【SQL超入門講座】13.AND, OR|複数条件で抽出する方法

論理演算子のANDとORについて

論理演算子のANDとORは、「AかつB」、「AまたはB」といった2つ以上の条件式を組み合わせてデータ抽出を行う際に使用します。

SELECTに、論理演算子を追加した構文は次の通りです。

SELECT カラム FROM テーブル
WHERE 条件式A OR 条件式B ;

それでは実際にテーブルを使って使い方を確認していきましょう。
test_tableを使って説明を進めていきます。

AND演算子の使い方

まずAND演算子の使い方を確認していきましょう。
AND演算子を使うと「AかつB」というように、2つの条件式を両方とも満たすレコードを抽出することができます。

それではtest_tableからAND演算子を使って、「商品分類がボトムス」、「単価が6,000円以上」という2つの条件をどちらも満たすレコードを抽出してみましょう。
SQLは次のように書くことができます。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' AND 単価 >= 6000

WHERE句で2つの条件式をANDでつなぎます。
これで「商品分類がボトムスかつ単価が6,000円以上」という条件が成立します。

それではSQLを実行してみましょう。

意図した通り「商品分類がボトムス」、「単価が6,000円以上」を両方とも満たすレコードだけを抽出することができました。

OR演算子の使い方

同じようにOR演算子の使い方を確認していきましょう。
OR演算子を使うと「AまたはB」というように、2つの条件式のどちらかを満たすレコードを抽出することができます。

今度はtest_tableから「商品分類がボトムス」、「単価が6,000円以上」という2つの条件のどちらかを満たすレコードを抽出してみましょう。
SQLは次のように書きます。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' OR 単価 >= 6000

先ほどのAND演算子の説明で使ったSQLのANDをORに変更するだけなので簡単ですね。
ではSQLを実行してみましょう。

想定した通り「商品分類がボトムス」、「単価が6,000円以上」のどちらかを満たすレコードをすべて抽出できました。

論理演算子ANDとORの違いは理解できましたでしょうか。
ANDとORで抽出されるデータの関係性は、ベン図で見ると分かりやすいので確認しておきましょう。
AND演算子で抽出されるデータは条件式Aと条件式Bのどちらも満たす必要があります。
そのため交わった領域が抽出対象のデータになります。

一方でOR演算子で抽出されるデータは条件式Aと条件式Bのどちらかを満たせばよいので、2つの領域を合わせたものが抽出対象のデータになります。

AND演算子とOR演算子の併用について

WHERE句でANDとORを併用して条件式を作ることもできます。
ANDとORを併用した抽出について最後に確認しておきましょう。
例えば「商品分類がボトムスかつ単価が6,000円以上」または「売上金額が100,000円以上」という条件で抽出を行うにはどうすればよいでしょうか。

SQLは次のように書くことができます。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' AND 単価 >= 6000 OR 売上金額 >= 100000

SQLを実行します。

想定した通りの抽出結果を得ることができました。

今度は「商品分類がボトムスまたは単価が6,000円以上」かつ「売上金額が100,000円以上」という条件で抽出を行ってみましょう。
こういった条件で抽出する場合、論理演算子の優先順位に注意してください。
論理演算子の優先順位を知らずに、次のようにSQLを書いてしまうと意図した通りの抽出結果を得ることができません。

AND演算子とOR演算子の併用について

WHERE句でANDとORを併用して条件式を作ることもできます。
ANDとORを併用した抽出について最後に確認しておきましょう。
例えば「商品分類がボトムスかつ単価が6,000円以上」または「売上金額が100,000円以上」という条件で抽出を行うにはどうすればよいでしょうか。

SQLは次のように書くことができます。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' AND 単価 >= 6000 OR 売上金額 >= 100000

SQLを実行します。

想定した通りの抽出結果を得ることができました。

今度は「商品分類がボトムスまたは単価が6,000円以上」かつ「売上金額が100,000円以上」という条件で抽出を行ってみましょう。
こういった条件で抽出する場合、論理演算子の優先順位に注意してください。
論理演算子の優先順位を知らずに、次のようにSQLを書いてしまうと意図した通りの抽出結果を得ることができません。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' OR 単価 >= 6000 AND 売上金額 >= 100000

試しにSQLを実行してみます。

この通り売上金額100,000円以下のレコードが抽出されてしまっており、意図した通りの抽出結果を得られていません。
これはAND演算子がOR演算子よりも優先されているからです。
つまり先ほどのSQLだと「商品分類がボトムス」または「単価が6,000円以上かつ売上金額が100,000円以上」という条件で抽出が行われてしまっています。

そのため正しく条件を指定するためには、()をつけて論理演算子の優先順位を明示することが必要です。

正しくは次のようにSQLを書くことができます。

SELECT * FROM test_table
WHERE (商品分類 = 'ボトムス' OR 単価 >= 6000) AND 売上金額 >= 100000

SQLを実行します。

()の中の条件は優先的に処理されるため、今度は意図した通りの実行結果を得ることができました。

このようにANDとORを併用する場合は条件が複雑になっていきますので、論理演算子の優先順位には気を付けるようにしましょう。

SELECT * FROM test_table
WHERE 商品分類 = 'ボトムス' OR 単価 >= 6000 AND 売上金額 >= 100000

試しにSQLを実行してみます。

この通り売上金額100,000円以下のレコードが抽出されてしまっており、意図した通りの抽出結果を得られていません。
これはAND演算子がOR演算子よりも優先されているからです。
つまり先ほどのSQLだと「商品分類がボトムス」または「単価が6,000円以上かつ売上金額が100,000円以上」という条件で抽出が行われてしまっています。

そのため正しく条件を指定するためには、()をつけて論理演算子の優先順位を明示することが必要です。

正しくは次のようにSQLを書くことができます。

SELECT * FROM test_table
WHERE (商品分類 = 'ボトムス' OR 単価 >= 6000) AND 売上金額 >= 100000

SQLを実行します。

()の中の条件は優先的に処理されるため、今度は意図した通りの実行結果を得ることができました。

このようにANDとORを併用する場合は条件が複雑になっていきますので、論理演算子の優先順位には気を付けるようにしましょう。