MySQL 演算子の具体的な使用法 (and、or、in、not)

MySQL 演算子の具体的な使用法 (and、or、in、not)

1. はじめに

MySQL で where 句を使用してクエリ データをフィルタリングする場合、複数のフィルタリング条件を同時に満たしたり、複数のフィルタリング条件のうち 1 つを満たしたりする必要がある場合がよくあります。このとき、演算子を使用して where 句を接続できます。

いくつかの演算子の機能:

オペレーター効果
そしてそして、where句の条件は同時に満たされる必要がある。
またはまたは、複数のwhere句のうち1つの条件のみが一致する必要がある
where句クエリのスコープを指定するために使用します
ないNotは、通常、in、between、existsと一緒に使用され、否定を示します。

2. 本文

まず、User テーブルを準備します。DDL とテーブルデータは以下のとおりで、そのままコピーして使用できます。

名前を設定します utf8mb4;
FOREIGN_KEY_CHECKS = 0 を設定します。
 
-- ----------------------------
-- ユーザー用テーブル構造
-- ----------------------------
`user` が存在する場合はテーブルを削除します。
テーブル `user` を作成します (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `name` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ユーザー名',
  `age` int(11) NOT NULL COMMENT '年齢',
  `sex` smallint(6) NOT NULL COMMENT '性別',
  BTREE を使用した主キー (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- ユーザーの記録
-- ----------------------------
`user` に VALUES (1, '李子8', 18, 1) を挿入します。
INSERT INTO `user` VALUES (2, '张三', 22, 1);
`user` VALUES (3, '李四', 38, 1) に INSERT INTO します。
`user` VALUES (4, '王五', 25, 1) に INSERT INTO します。
INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
`user` VALUES (6, '田七', 37, 1) に INSERT INTO します。
`user` VALUES (7, 'Thank you', 18, 0) に INSERT INTO します。
 
FOREIGN_KEY_CHECKS = 1 を設定します。

データの初期順序は次のとおりです。

mysql> ユーザーから * を選択します。
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の行数は 7 です (0.00 秒)

2.1 および演算子

クエリが where 句の条件を同時に満たす必要がある場合は、and 演算子を使用できます。and 条件は and 関係にあります。

必要:
年齢が 18 歳で性別が男性のユーザーを検索します (注: sex=1 は男性を表します)
声明:

mysql> 年齢 = 18、性別 = 1 の場合、ユーザーから * を選択します。

結果:

+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
+----+--------+-----+-----+
セット内の 1 行 (0.00 秒)

この時点で、age=18 と sex=1 の両方を満たすユーザーのみがクエリされていることがわかります。同様に、複数の and が同時に存在することも可能です。たとえば、上記に基づいて **name=李子柒** を検索する必要がある場合は、それに別の and 演算子を続けるだけです。

mysql> select * from user where age = 18 and sex =1 and name = '李子柒';
空のセット (0.00 秒)

2.2 または演算子

and とは異なり、or は複数の where 条件のすべてではなく、そのうちの 1 つだけを満たす必要があります。条件は or 関係にあります。

必要:
年齢が 18 歳または性別が男性のユーザーを検索します (注: 性別が 1 は男性を表します)
声明:

mysql> 年齢 = 18 または性別 = 1 の場合、ユーザーから * を選択します。

結果:

+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の 6 行 (0.00 秒)

この時点で、age=18 または sex=1 を満たすすべてのユーザーが見つかったことがわかります。同じ or 演算子を複数の where 句に同時に適用することもできます。

2.3 オペレーター

in 演算子は、where 句のクエリ スコープを指定するために使用されます。これは包含を意味し、複数の or 演算子を使用して実装できます。

必要:
名前が Zhang San、Li Si、Wang Wu に等しいユーザー情報を照会します。
声明:
or演算子の使用

mysql> select * from user where name = '张三' or name = '李四' or name = '王五';
+----+------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+------+-----+-----+
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
+----+------+-----+-----+
セット内の 3 行 (0.00 秒)

in演算子の使用

mysql> select * from user where name in ('张三', '李四', '王五');
+----+------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+------+-----+-----+
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
+----+------+-----+-----+
セット内の 3 行 (0.00 秒)

上記の要件は or 演算子と in 演算子を使用することで実現できますが、in 演算子を使用すると SQL ステートメントが簡潔になることは明らかです。​

2.4 not演算子

値が特定の範囲内にないか存在しないかを照会する必要がある場合は、not 演算子を使用できます。not 演算子は単独では使用されず、in 演算子、like 演算子、between and、exists などと一緒に使用されることがよくあります。​

ない
必要:
名前が Zhang San、Li Si、Wang Wu と等しくないユーザー情報を照会します。
声明:

mysql> select * from user where name not in ('张三', '李四', '王五');
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の 4 行 (0.00 秒)

好きではない
必要:
名前が「lizi」で始まらないユーザーを照会します。

mysql> select * from user where name not like '李子%';
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の 6 行 (0.00 秒)

との間ではない
必要:
年齢が 20 ~ 30 歳ではないユーザーを照会するには:

mysql> select * from user where age not between 20 and 30;
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 3 | 李思 | 38 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の行数は 5 です (0.00 秒)

存在しない

not exists テーブルは exists テーブルと同じように使用され、現在の where 句の結果を返すかどうかを決定するために使用されます。 not exists と exists はサブクエリに作用し、親に true と false を返します。
構文例:

SELECT ... FROM テーブル WHERE EXISTS (サブクエリ)
SELECT ... FROM table WHERE NOT EXISTS (サブクエリ)

効果を示すために、テーブル作成ステートメントとデータは次のようになる単純な注文テーブルを作成します。

名前を設定します utf8mb4;
FOREIGN_KEY_CHECKS = 0 を設定します。
 
-- ----------------------------
-- 注文のテーブル構造
-- ----------------------------
`order` が存在する場合はテーブルを削除します。
テーブル「order」を作成します(
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主キー',
  `number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '注文番号',
  `user_id` bigint(20) NULL デフォルト NULL コメント 'ユーザーID',
  `price` 小数点(10, 2) NULL デフォルト NULL コメント 'amount',
  `create_date` datetime(0) NULL DEFAULT NULL COMMENT '作成日',
  BTREE を使用した主キー (`id`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- 注文記録
-- ----------------------------
`order` に値 (1, 'DD-20211110-000001', 1, 250.00, '2021-11-10 22:37:19') を挿入します。
 
FOREIGN_KEY_CHECKS = 1 を設定します。

注意: order は MySQL のキーワードであるため、テーブルを作成するときにテーブルに直接 order という名前を付けることはお勧めしません。ここでは、この問題を解決する方法を説明するために order という名前を付けます。

mysql> `order` から * を選択します。
+----+--------------------+---------+--------+---------------------+
| id | 番号 | ユーザーID | 価格 | 作成日 |
+----+--------------------+---------+--------+---------------------+
| 1 | DD-20211110-000001 | 1 | 250.00 | 2021-11-10 22:37:19 |
+----+--------------------+---------+--------+---------------------+
セット内の 1 行 (0.00 秒)

よく見ると、順序が ` で変更されており、MySQL がそれをキーワードとして解析しないことがわかります。 MySQL を追加しないと、例外がスローされます。

話題に戻ると、今度は exists を使用して要件を照会します。
注文のユーザー情報を照会します。

mysql> select * from user where exists(select id from `order` where user_id = user.id);
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
+----+--------+-----+-----+
セット内の 1 行 (0.00 秒)

このとき、注文をしていないユーザー情報を照会したい場合は、not exists を使用するだけで済みます。

mysql> 存在しないユーザーから * を選択します (user_id = user.id である `order` から id を選択します);
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 5 | 劉麻子 | 13 | 0 |
| 6 | 天斉 | 37 | 1 |
| 7 | ありがとう | 18 | 0 |
+----+--------+-----+-----+
セット内の 6 行 (0.00 秒)

2.5 演算子の順序

上記ではいくつかの演算子について説明しましたが、多くの場合、複数の演算子を組み合わせて使用​​する必要があります。このとき、演算子の順序に注意する必要があります。

たとえば、次の要件があります。
ユーザー テーブルで、20 歳以上または男性で、名前が Zhang San と等しくないユーザーを照会します。
声明:

mysql> select * from user where age > 20 or sex = 1 and name != '张三';
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 2 | 張三 | 22 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 6 | 天斉 | 37 | 1 |
+----+--------+-----+-----+
セット内の行数は 5 です (0.00 秒)

この時点で、クエリの戻り結果には実際に Zhang San が含まれていることがわかります。これは、and が or よりも優先順位が高いためです。MySQL の下部にある SQL パーサーは、上記の SQL を sex = 1 and name != 'Zhang San' or age > 20 と解析します。また、age > 20 であるため、Zhang San も検出されます。この問題を解決するには、 or ステートメントを括弧で囲むだけです。

mysql> select * from user where (age > 20 or sex = 1) and name != '张三';
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | プラム 8 | 18 | 1 |
| 3 | 李思 | 38 | 1 |
| 4 | 王武 | 25 | 1 |
| 6 | 天斉 | 37 | 1 |
+----+--------+-----+-----+
セット内の 4 行 (0.00 秒)

この時点で、クエリの返されたデータには Zhang San は含まれなくなりました。

したがって、SQL を書くときは、括弧を使用する習慣を身につけることができます。括弧で演算子をグループ化することで、デフォルトの順序を使用することで発生するエラーのリスクを回避できます。

これで、MySQL 演算子 (and、or、in、not) の具体的な使用法に関するこの記事は終了です。MySQL 演算子に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL データベース ターミナル - 一般的な操作コマンド コード
  • MySQL データベースの集計クエリと結合クエリ操作
  • MySQLデータベースのデータテーブルに関する詳細な基本操作
  • MySQL データベースの操作とデータ型
  • いくつかのMySQL更新操作のケース分析
  • MySQL 8.0はJSONを扱えるようになりました
  • MySQLの高度な操作手順の概要

<<:  HTML におけるスクリプトの配置に関する簡単な説明

>>:  OpenLayers 3 のベクターマップソースの読み込みの問題を解決する

推薦する

Linux で killall コマンドを使用してプロセスを終了する 8 つの例

Linux コマンドラインには、プロセスを強制終了するためのコマンドが多数用意されています。たとえば...

MySQL操作テーブルでよく使われるSQLのまとめ

1. テーブル内のフィールドの種類を表示する テーブル名を記述する desc テーブル名 2. テー...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

MySQL 4.1/5.0/5.1/5.5/5.6の主な違い

バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...

オンラインチャットを実現するVue+sshフレームワーク

この記事では、オンラインチャットを実現するためのVue + sshフレームワークの具体的なコードを参...

Linuxのアラーム機能の例の説明

Linuxアラーム機能の紹介上記のコード: #include <stdio.h> #in...

JavaScriptはボタンをクリックして4桁のランダムな検証コードを生成します

この記事の例では、ボタンをクリックすることで4桁のランダムな検証コードを生成するjsの具体的なコード...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...

Linux で MySQL スケジュールタスクを実装する方法

前提: ストアド プロシージャは、毎日午後 10 時から午前 5 時まで 10 分ごとに実行されます...

CocosCreator 入門チュートリアル: ネットワーク通信

ネットワーク通信の概要オンライン ゲームを開発する場合、必然的にネットワーク通信に対処する必要があり...

Oracle の開閉の 4 つのモード

>1 データベースを起動するcmd コマンド ウィンドウで、「sqlplus」を直接入力して ...

Vueを使用して天気コンポーネントをロードする方法の詳細な説明

この記事では、Vueを使用して天気コンポーネントをロードする方法を参考までに紹介します。具体的な内容...

docker pullがリセットされる問題を解決する

この記事では、docker pull がリセットされる問題を解決する方法を紹介し、皆さんと共有します...

winx64 での mysql5.7.19 の基本的なインストール プロセス (詳細)

1. ダウンロード参考: https://www.jb51.net/softs/451120.ht...