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 のベクターマップソースの読み込みの問題を解決する

推薦する

HTML のテキストエリアの改行問題の概要

最近、Textrea に転送したときに、データが本当に行ごとに保存できるかどうかという問題に遭遇しま...

Reactのコンポーネント共同利用実装

目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...

CentOS 7 で grub パスワードと単一ユーザー ログインを設定するサンプル コード

Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...

レスポンシブWebデザイン学習(3) - モバイルデバイスでのWebページのパフォーマンスを向上させる方法

序文モバイル デバイスでは、帯域幅とプロセッサ速度の制限により、Web ページのパフォーマンスに対す...

JavaScript インスタンス オブジェクトでプロトタイプ メソッドをオーバーライドする方法の詳細

目次JavaScriptでは、通常、次のコードのようにクラスを簡単に定義できます。 var サンプル...

Linux ディスク パーティションの実装の原理と方法の分析

覚えて: IDE ディスク: 最初のディスクは hda、2 番目のディスクは hdb...最初のディ...

Linux7 ベースの Hadoop のインストールと構成の詳細なグラフィック説明

上記のように材料を準備します(ps: hadoop-3.1.2-srcはhadoop-3.1.2に変...

DockerでMySQLマスタースレーブ環境を構築する方法の詳しい説明

序文この記事では、docker-compose と dockerfile を使用して、binlog ...

MySQLトリガーについて深く理解するための記事

目次1. SC テーブルを挿入または変更するときに、テスト スコアが 0 ~ 100 の範囲外の場合...

Vue-router ネストルーティングの詳細な説明

目次ステップ1. ルーティング ルールを設定し、子構成項目を使用します。 2. ジャンプ(フルパスを...

MySQLカスタム関数とストアドプロシージャの詳細な説明

序文この記事では主にMySQLのカスタム関数とストアドプロシージャに関する関連コンテンツを紹介し、皆...

MySQLで数千万のテストデータを素早く作成する方法

述べる:この記事で扱うデータ量は 100 万です。数千万のデータが必要な場合は、量を増やすだけで済み...

nginx を https をサポートするように設定するためのサンプル コード

1. はじめにあなたのウェブサイトはまだインターネット上に公開されたままですか?ここでは、HTTPS...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

互換性を維持しながら他のウェブページのデータを適用する iframe の使い方

以下は、Shiji Tiancheng が Tencent KartRider ページを呼び出すため...