Chapter 04

データの検索②

JboyHashimoto
JboyHashimoto
2022.10.10に更新

論理演算子を使う

論理演算子を使うと複数の条件を組み合わせることができます。

  • NOT演算子は「〜ではない」
  • AND演算子を使った条件は、両方とも条件が当てはまるときに使えます。
  • OR演算子は、どちらかの条件に当てはまるときに使えます。

NOT演算子

「〜ではない」という否定の条件を指定する場合に、<>演算子を使いますが、広く使える演算子でNOTがあります。NOTは単独では使えません。他の検索条件と組み合わせて使います。
次のNOT演算子を使ったクエリは、38点を超えている生徒を表示するクエリのWHEREにNOT演算子を付けると、38点を超えていない生徒を表示します。

/*38点を超えている生徒を表示*/
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE
  class_score > 38;
/*NOT演算子を使用*/
/* 38点を超えていない生徒を表示 */
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE NOT
  class_score > 38;

実行結果

mysql> /*38点を超えている生徒を表示*/
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE
    ->   class_score > 38;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
| 堀北         |          95 |
| 櫛田         |          92 |
| 軽井沢       |          78 |
| 長谷部       |          68 |
+--------------+-------------+
5 rows in set (0.00 sec)

mysql> /*NOT演算子を使用*/
mysql> /* 38点を超えていない生徒を表示 */
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE NOT
    ->   class_score > 38;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 池           |          38 |
| 山内         |          38 |
| 桜           |          38 |
+--------------+-------------+
3 rows in set (0.00 sec)

NOT演算子を使うと、否定することになるので、38点を超えていない生徒さんが表示されましたね。
点数低すぎる...、私も学生時代これぐらい点数低かったですけどね💦

AND演算子とOR演算子

今まで、1つのSELECT文に指定した検索条件は、1つだけでしたが、複数の条件で絞り込みたいことがあります。
例えば、「名前が堀北さん」で「テストの点数が90点以上」というデータですね。

よく効く言葉で、Aの日付が2月で、かつBの仕入れ単価が¥2,000という条件があります。
かつって言葉が意味わかんなくて分かりにくので僕は、どっちの条件にも当てはまる情報だったら、検索できると解釈してます。これがAND演算子ですね。

どちらか1方の条件に当てはまる例えば、年齢が18歳以上か年齢が20歳で成人していているか?
こちらだとOR演算子ですね。

こちらが実行するクエリですね

/* AND演算子を使用 */
/* 生徒の名前が堀北でかつ点数が90点以上のデータを検索する */
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE student_name = '堀北' AND class_score >= 90;
/* OR演算子を使用 */
/* 生徒の名前が綾小路か点数が100点のデータを検索する */
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE
  student_name = '綾小路'
  OR class_score = 100;

実行結果

mysql> /* AND演算子を使用 */
mysql> /* 生徒の名前が堀北でかつ点数が90点以上のデータを検索する */
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE student_name = '堀北' AND class_score >= 90;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 堀北         |          95 |
+--------------+-------------+
1 row in set (0.00 sec)

mysql> /* OR演算子を使用 */
mysql> /* 生徒の名前が綾小路か点数が100点のデータを検索する */
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE
    ->   student_name = '綾小路'
    ->   OR class_score = 100;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
+--------------+-------------+
1 row in set (0.00 sec)

この様に書いても同じ結果を得ることができます。

/*&&記号を使うとANDとして使える*/
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE student_name = '堀北' && class_score >= 90;

/*||を使うとORとして使える*/
SELECT
  student_name,
  class_score
FROM
  ClassD
WHERE
  student_name = '綾小路'
  || class_score = 100;

実行結果

 /*&&記号を使うとANDとして使える*/
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE student_name = '堀北' && class_score >= 90;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 堀北         |          95 |
+--------------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> 
mysql> /*||を使うとORとして使える*/
mysql> SELECT
    ->   student_name,
    ->   class_score
    -> FROM
    ->   ClassD
    -> WHERE
    ->   student_name = '綾小路'
    ->   || class_score = 100;
+--------------+-------------+
| student_name | class_score |
+--------------+-------------+
| 綾小路       |         100 |
+--------------+-------------+
1 row in set, 1 warning (0.00 sec)

できましたね!
昔やったことあったので、比較するクエリが欲しいと思って記載しておきました。他にも条件の指定はあるのですが、商品テーブルのようなデータでないと参考になりそうにないので、今回はこれぐらいにしておきましょう。