MySQL NULLがピットを引き起こした

MySQL NULLがピットを引き起こした

比較演算子でNULLを使用する

mysql> 1>NULLを選択します。
+--------+
| 1>NULL |
+--------+
| NULL |
+--------+
セット内の 1 行 (0.00 秒)

mysql> 1<NULL; を選択します。
+--------+
| 1<NULL |
+--------+
| NULL |
+--------+
セット内の 1 行 (0.00 秒)

mysql> 1<>NULL を選択します。
+---------+
| 1<>NULL |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> 1>NULLを選択します。
+--------+
| 1>NULL |
+--------+
| NULL |
+--------+
セット内の 1 行 (0.00 秒)

mysql> 1<NULL; を選択します。
+--------+
| 1<NULL |
+--------+
| NULL |
+--------+
セット内の 1 行 (0.00 秒)

mysql> 1>=NULL を選択します。
+---------+
| 1>=NULL |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> 1<=NULL を選択します。
+---------+
| 1<=NULL |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> 1!=NULL を選択します。
+---------+
| 1!=NULL |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> 1<>NULL を選択します。
+---------+
| 1<>NULL |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> NULL=NULL、NULL!=NULL を選択します。
+-----------+-------------+
| NULL=NULL | NULL!=NULL |
+-----------+-------------+
| NULL | NULL |
+-----------+-------------+
セット内の 1 行 (0.00 秒)

mysql> 1 in (null)、1 not in (null)、null in (null)、null not in (null);
+-------------+-----------------+----------------+--------------------+
| 1 が (null) に含まれる | 1 が (null) に含まれない | null が (null) に含まれる | null が (null) に含まれない |
+-------------+-----------------+----------------+--------------------+
| NULL | NULL | NULL | NULL |
+-------------+-----------------+----------------+--------------------+
セット内の 1 行 (0.00 秒)

mysql> 1 = anyを選択します(nullを選択)、null = any(nullを選択)。
+--------------------+-----------------------+
| 1=任意(null を選択) | null=任意(null を選択) |
+--------------------+-----------------------+
| NULL | NULL |
+--------------------+-----------------------+
セット内の 1 行 (0.00 秒)

mysql> 1 =すべてを選択(nullを選択)、null =すべて(nullを選択);
+--------------------+-----------------------+
| 1=すべて(null を選択) | null=すべて(null を選択) |
+--------------------+-----------------------+
| NULL | NULL |
+--------------------+-----------------------+
セット内の 1 行 (0.00 秒)

結論: 演算子 (>、<、>=、<=、!=、<>) または (in、not in、any/some、all) を使用して任意の値を NULL と比較すると、戻り値は NULL になります。NULL をブール値として使用すると、1 でも 0 でもありません。

データを準備する

mysql> テーブル test1(a int,b int) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> test1 に値 (1,1)、(1,null)、(null,null) を挿入します。
クエリは正常、3 行が影響を受けました (0.00 秒)
記録: 3 重複: 0 警告: 0

mysql> test1 から * を選択します。
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
| NULL | NULL |
+------+------+
セット内の 3 行 (0.00 秒)

上記の 3 つのデータ、特に NULL レコードを詳しく見てみましょう。

IN、NOT IN、NULLの比較

INとNULLの比較

mysql> test1 から * を選択します。
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
| NULL | NULL |
+------+------+
セット内の 3 行 (0.00 秒)

mysql> test1 から * を選択します。 where a in (null);
空のセット (0.00 秒)

mysql> test1 から * を選択します。 where a in (null,1);
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
+------+------+
セット内の 2 行 (0.00 秒)

結論: IN を NULL と比較すると、NULL を含むレコードは照会できません。

NOT IN と NULL の比較

mysql> test1 から * を選択します。 where a は (1) に含まれません。
空のセット (0.00 秒)

mysql> test1 から * を選択します。 where a は (null) ではありません。
空のセット (0.00 秒)

mysql> test1 から * を選択します。 where a は (null,2) に含まれません。
空のセット (0.00 秒)

mysql> select * from test1 where a not in (2);
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
+------+------+
セット内の 2 行 (0.00 秒)

結論: NOT IN の後に NULL 値がある場合、状況に関係なく SQL 全体のクエリ結果は空になります。

EXISTS、NOT EXISTS、NULL の比較

mysql> test2 から * を選択します。
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
| NULL | NULL |
+------+------+
セット内の 3 行 (0.00 秒)

mysql> select * from test1 t1 where exists (select * from test2 t2 where t1.a = t2.a);
+------+------+
| ア | ロ |
+------+------+
| 1 | 1 |
| 1 | NULL |
+------+------+
セット内の 2 行 (0.00 秒)

mysql> test1 t1 から * を選択します (t1.a = t2.a の場合、 test2 t2 から * を選択します);
+------+------+
| ア | ロ |
+------+------+
| NULL | NULL |
+------+------+
セット内の 1 行 (0.00 秒)

上記では、テーブル test1 をコピーし、テーブル test2 を作成しました。

クエリ ステートメントで exists と not exists を使用して、test1.a=test2.a を比較します。= では NULL を比較できないため、結果は期待どおりになります。

NULLを判断するには、IS NULLとIS NOT NULLのみを使用できます。

mysql> select 1 は null ではありません。
+---------------+
| 1 は null ではありません |
+---------------+
| 1 |
+---------------+
セット内の 1 行 (0.00 秒)

mysql> select 1 は null です。
+-----------+
| 1 は null です |
+-----------+
| 0 |
+-----------+
セット内の 1 行 (0.00 秒)

mysql> null を選択すると null になります。
+--------------+
| null は null です |
+--------------+
| 1 |
+--------------+
セット内の 1 行 (0.00 秒)

mysql> null を選択すると null ではありません。
+------------------+
| null は null ではありません |
+------------------+
| 0 |
+------------------+
セット内の 1 行 (0.00 秒)

上記の効果を見ると、返される結果は 1 または 0 です。

結論: IS NULL と IS NOT NULL は、値が空かどうかを判断するためにのみ使用できます。

集計関数におけるNULLの落とし穴


mysql> test1 から count(a),count(b),count(*) を選択します。
+----------+----------+----------+
| カウント(a) | カウント(b) | カウント(*) |
+----------+----------+----------+
| 2 | 1 | 3 |
+----------+----------+----------+
セット内の 1 行 (0.00 秒)
  • count(a) は 2 行を返しますが、a フィールドに NULL が含まれる行はカウントされません。
  • count(b)は1行のレコードを返し、NULL値を持つ2行のレコードはカウントされません。
  • count(*) は、フィールド内のデータが NULL であるかどうかに関係なく、すべてのデータをカウントできます。

視聴を続ける

mysql> test1 から * を選択します。ここで a は null です。
+------+------+
| ア | ロ |
+------+------+
| NULL | NULL |
+------+------+
セット内の 1 行 (0.00 秒)

mysql> test1 から count(a) を選択します (a は null です)。
+----------+
| カウント(a) |
+----------+
| 0 |
+----------+
セット内の 1 行 (0.00 秒)

上記の最初の SQL では、結果を照会するために null が使用され、2 番目の SQL の count(a) は 0 行を返します。

結論: count(field) は NULL であるフィールドの値をカウントできませんが、count(*) は値が null である行をカウントできます。

NULLは主キー値として使用できません

mysql> テーブル test3(a int 主キー、b int) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> test3 に値 (null,1) を挿入します。
エラー 1048 (23000): 列 'a' は null にできません

上記でテーブル test3 を作成しました。フィールド a は指定されておらず、空にすることはできません。NULL データが挿入されています。エラーの理由は、フィールド a の値を NULL にできないことです。テーブル作成ステートメントを見てみましょう。

mysql> show テーブル test3 を作成します。
+-------+-------------+
| テーブル | テーブルの作成 |
+-------+-------------+
| test3 | テーブル `test3` を作成します (
 `a` int(11) NULLではない、
 `b` int(11) デフォルト NULL,
 主キー (`a`)
) エンジン=InnoDB デフォルト文字セット=utf8
+-------+-------------+
セット内の 1 行 (0.00 秒)

上記のスクリプトからわかるように、フィールドが主キーの場合、フィールドは自動的に null 以外に設定されます。

結論: フィールドが主キーである場合、自動的に null 以外に設定されます。

上記をすべて読んだ後でも、まだ少し混乱しています。NULL の状況は確かに扱いが難しく、エラーが発生しやすくなります。最も効果的な方法は、NULL の使用を避けることです。したがって、フィールドを作成するときは、フィールドで NULL を許可せず、デフォルト値を設定することを強くお勧めします。

要約する

  • NULL は 1 でも 0 でもないブール値です。
  • 任意の値と NULL は演算子 (>、<、>=、<=、!=、<>) または (in、not in、any/some、all) を使用し、戻り値は NULL になります。
  • IN を NULL と比較する場合、NULL を含むレコードは照会できません。
  • NOT IN の後に NULL 値がある場合、どのような場合でも SQL ステートメント全体のクエリ結果は空になります。
  • 空かどうかを判断するには、IS NULLとIS NOT NULLのみを使用できます。
  • count(field) は NULL であるフィールドの値をカウントできませんが、count(*) は NULL 値を持つ行をカウントできます。
  • フィールドが主キーの場合、フィールドは自動的にnull以外に設定されます。
  • NULLによって引き起こされる落とし穴は防ぐのが難しい。フィールドを作成するときは、NULLを許可せず、デフォルト値を与えることを強くお勧めします。

MySQL NULL によって引き起こされる落とし穴に関するこの記事はこれで終わりです。MySQL NULL によって引き起こされる落とし穴に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  レンダリング関数と JSX の詳細

>>:  Dockerイメージのサイズを縮小する6つの方法

推薦する

MySQLでTEXT/BLOB型を使用する際の注意点を詳しく説明します

1. TEXTとBLOBの違いTEXT ファミリと BLOB ファミリの唯一の違いは、BLOB 型は...

Ubuntu 20.04にSogou入力方式をインストールする詳細な手順

1. Fcitx入力フレームワークをインストールする関連する依存ライブラリとフレームワークは自動的に...

フレックスマルチカラムレイアウトで発生する問題と解決策の詳細な説明

フレックス レイアウトは間違いなくシンプルで使いやすいです。レイアウトをよりシンプルかつ高速にします...

vue-amap のインストールと使用手順

以前、Amap API を非同期にロードする方法を紹介しました。今回は、vue-amap の使用方法...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

.Net Core を使用して数千万のデータを MySQL にインポートする手順

目次事前準備実施方法: 1. 単一のデータを挿入する2. マージデータ挿入3. MySqlBulkL...

MySQL のインデックスの種類と基本的な使用例

目次索引- 総合索引- ユニークなインデックス- 主キーインデックス- 複合インデックス- 全文索引...

Jenkins初心者のためのDockerデプロイメントチュートリアルの詳細な説明

この記事では、docker 経由で Jenkins+Maven+SVN+Tomcat をデプロイし、...

MySQL インデックスの原理と使用例の分析

この記事では、例を使用して MySQL インデックスの原理と使用方法を説明します。ご参考までに、詳細...

CSS フォント、テキスト、リストのプロパティの詳細な紹介

1. フォントのプロパティcolorは、div{color:red;}のようにテキストの色を指定しま...

HTML 要素に注釈を付けるときにクラスと ID のどちらが優れているかを分析する

Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...

MySQL データベース クエリ パフォーマンス最適化戦略

クエリを最適化するExplain ステートメントを使用してクエリ ステートメントを分析するExpla...

CSSフロートの特性についての簡単な説明

この記事では、CSS フロートの特徴を紹介します。皆さんと共有し、自分用のメモとして残したいと思いま...

マークアップ言語 - アンカー

前: マークアップ言語 - フレーズ要素 オリジナルソース 第 7 章 アンカーHTML のリンクの...

Linux カーネルプログラミングにおけるコンテナの of() 関数の紹介

序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...