このチャプターの目次
論理演算子を使う
論理演算子を使うと複数の条件を組み合わせることができます。
- 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)
できましたね!
昔やったことあったので、比較するクエリが欲しいと思って記載しておきました。他にも条件の指定はあるのですが、商品テーブルのようなデータでないと参考になりそうにないので、今回はこれぐらいにしておきましょう。