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

推薦する

VUEはG2チャートを使用した実装を導入します

目次G2チャートについて使用テンプレートで使用される完全なコード (棒グラフ)世界地図を追加するG2...

Ubuntu 18.04 のsources.listをAlibabaまたはTsinghuaミラーに変更する方法

1. バックアップソースリストUbuntu のデフォルトのソースは国内サーバーではないため、更新され...

js を使用して QR コードを生成するサンプル コード

以前、プロジェクトでQRコードをスキャンして情報を表示する機能を開発する必要がありました。インターネ...

JavaScript でクールなマウス テーリング効果を実装

これを見た後、あなたにも手ができて、さまざまな美しい小さなしっぽを作れるようになることを保証します!...

Docker で onlyoffice をインストールして展開する詳細なプロセス

0. システム要件CPU I5-10400F以上メモリ 16 GB、32 GBのメモリが最適ハードド...

MySQLのイベントスケジューラEVENTを理解する

MySQL のイベント スケジューラ EVENT は、Unix crontab や Windows ...

Vue+js 矢印をクリックして画像を切り替える

この記事の例では、矢印をクリックして画像を切り替えるVue + jsの具体的なコードを共有しています...

VMware esxi6.5 のインストールと使用の詳細な手順

目次導入建築ESXIの利点vSphere とは何ですか? 2. 仮想マシンの利点3. 仮想マシンを使...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

フロントエンド開発者は毎日HTMLタグの理解を学ばなければならない(1)

2.1 セマンティクス化により、Webページが検索エンジンに理解されやすくなりますこの章では、We...

CSS3 は反転可能なホバー効果を実現します

CSS3 は反転可能なホバー効果を実装します。具体的なコードは次のとおりです。 1.css /*基本...

JSを使用して画像を効果的に圧縮する方法

目次序文変換関係具体的な実装file2DataUrl(ファイル、コールバック) file2Image...

Reactの仮想DOMとdiffアルゴリズムの詳細な説明

仮想DOMの役割まず、仮想 DOM の出現によってどのような問題が解決されるのかを知る必要があります...

初めてDockerイメージを構築、実行、公開、取得するための詳細な手順

1. はじめに以前は、Python アプリケーションの作成を開始したい場合、最初のステップはマシンに...