MySQLのnull値に関する小さな問題

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭遇したことがあるでしょうか。

何が起こっているのか、ご説明します。テーブル内の値をフィルタリングする場合、age=2 の列を削除してから、残りの列の情報を表示する必要があります。この操作は比較的簡単に思えます。テーブルを使用してプロセスをシミュレートします。

テーブル「test」を作成します(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) デフォルト NULL,
  `score` varchar(20) NOT NULL DEFAULT '',
  主キー (`id`)、
  キー `idx_score` (`score`)
) エンジン=InnoDB AUTO_INCREMENT=12 デフォルト文字セット=utf8

テーブル構造は上記のとおりです。id フィールドと score フィールドは両方とも not null 制約の対象ですが、age フィールドはこの制約の対象ではありません。次のようにデータを挿入します。

mysql:yeyztest 23:32:57>>テストから*を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 7 です (0.00 秒)

現在のデータ セットは完了しており、各フィールドには値があります。次に、次の SQL ステートメントを使用して、指定されたレコードを照会します。

ID が 0 のテストから * を選択します。 = 2;

結果を見てみましょう:

mysql:yeyztest 23:33:14>>age!=2 の場合、test から * を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 5 です (0.00 秒)

この時点で、2 つのレコードを挿入します。

mysql:yeyztest 23:33:17>>テスト(id,score)値(12,60)に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql:yeyztest 23:34:02>>テスト(id,score)値(13,65)に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql:yeyztest 23:34:10>>テストから*を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
| 12 | NULL | 60 |
| 13 | NULL | 65 |
+----+------+-------+
セット内の行数は 9 です (0.00 秒)

上記のステートメントを使用して再度クエリを実行すると、次のような結果が表示されます。

mysql:yeyztest 23:34:15>>age!=2 の場合、test から * を選択します。
+----+------+-------+
| ID | 年齢 | スコア |
+----+------+-------+
| 1 | 1 | 5 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
セット内の行数は 5 です (0.00 秒)

つまり、レコードに null 値が含まれている場合は、逆一致の age を使用します。 =2 では完全なクエリ結果を取得するには不十分であり、明らかに期待どおりではありません。

実は、この問題は前回の記事でも触れました。データ レコードでは、NULL 値フィールドと一般フィールドは一緒に保存されません。NULL 値フィールドは、NULL 値リストに保存されます。これにより、検索時に不一致が発生します。これは比較的重要なポイントであり、皆様のお役に立てば幸いです。

ちなみに、テスト環境は MySQL バージョン 5.7.16 です。

上記は、MySQL の null 値に関する小さな問題の詳細です。MySQL null 値の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?
  • MySQLのよくある間違い
  • MySQL の null と not null、null と空の値の違いの詳細な説明''''''''
  • MySQL IFNULL判定問題の解決方法
  • MySQL で null 値と空文字 ('''') を区別する
  • mysql の not equal to null と equal to null の書き方の詳細説明
  • MySQL NULLがピットを引き起こした
  • MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ
  • MySQLの3値ロジックとNULLの詳細な説明

<<:  表のセルの内容が超過した場合に省略記号効果を表示する(実装コード)

>>:  JavaScript の構造化代入の一般的なシナリオと例 5 つ

推薦する

シンプルなタブバー切り替えケースを実現するJavaScript

この記事では、タブバーの切り替え効果を簡単に実現するためのJavaScriptの具体的なコードを参考...

Linux teeコマンドの使い方の詳しい説明

teeコマンドは主にstandout(標準出力ストリーム、通常はコマンド実行ウィンドウ)に出力し、同...

三角形を描画するための CSS 実装コード (border メソッド)

1. 単純な三角形を実装するCSS ボックス モデルの境界線を使用すると、次のような三角形を実現で...

HTML 選択オプション デフォルトの選択方法

オプションに属性 selected = "selected" を追加すると、それ...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

CSS3は三角形の連続拡大効果を実現します

1. CSS3の三角形は特殊効果でズームし続けます11.1 画像プレビュー 11.2 index.h...

階段を転がす特殊効果を実現する JavaScript (jQuery 実装)

皆さんもJDを使ったことがあると思います。ホームページには非常によく見られる機能があります。階段の特...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

パーソナライズされた検索エンジンを使用して、必要なパーソナライズされた情報を検索します

現在、多くの人がインターネット上で生活しており、インターネットで情報を検索することは日常的な作業とな...

MySQL インデックス プッシュダウンを 5 分で理解する

目次インデックス プッシュダウンとは何ですか?インデックスプッシュダウン最適化の原理インデックスプッ...

非常に詳細な MySQL8.0.22 のインストールと設定のチュートリアル

みなさんこんにちは。今日は、MySQL 8.0.22 のインストールと構成について学習します。注意深...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

Docker を使用して ELK 環境を迅速にデプロイする方法の詳細な説明 (最新バージョン 5.5.1)

Linux サーバーに Docker をインストールした後、関連する公式 Docker イメージを...

Dreamweaver8を使用してウェブサイトのファイルをチェックして整理する方法

Dreamweaver8 を使用して独自の Web サイトを作成する目的は何ですか?インターネットに...