MySQLのよくある間違い

MySQLのよくある間違い

NULL 値によると、MySQL の NULL 値は単にデータがないことを意味します。NULL 値は、一部の型のゼロ値とは異なります。たとえば、int 型のゼロ値は 0 で、文字列のゼロ値は "" ですが、これらには null ではなく、データがまだあります。

データを保存する際、一時的に利用できないデータは null として記録され、現時点では有効な情報を提供できないことが示されます。

ただし、nullを使用する場合は、いくつかの問題に注意する必要があります。MySQLのドキュメントでは、次のように説明されています。

null 使用時にエラーが発生しやすい点

以下では、MySQL 関係者が挙げている null のエラーが発生しやすいポイントについて説明します。

MySQL に慣れていない人は、null 値とゼロ値を簡単に混同する可能性があります。

NULL値の概念はSQL初心者にとってよくある混乱の原因です。

たとえば、次の2つのSQL文によって生成されるデータは独立している。

mysql> my_table (phone) に VALUES (NULL) を挿入します。
mysql> my_table (phone) に値 ('') を挿入します。

最初のSQL文は、電話番号が現時点では不明であることのみを示しており、2番目の文は電話番号が既知であり、 ''として記録されていることを示しています。

どちらのステートメントも電話列に値を挿入しますが、最初のステートメントは NULL 値を挿入し、2 番目のステートメントは空の文字列を挿入します。最初のステートメントの意味は「電話番号が不明」であり、2 番目のステートメントの意味は「その人は電話を持っていないことがわかっているため、電話番号はない」であると考えられます。

nullの論理的判断は別途処理する必要がある

値が null かどうかを判断するには、特殊な構文IS NULLIS NOT NULLIFNULL()を使用する必要があります。

NULL 処理を支援するために、IS NULL および IS NOT NULL 演算子と IFNULL() 関数を使用できます。

=を使って判断すると、常に偽になります

SQLでは、NULL値は他の値と比較しても真にはなりません。NULLであってもです。

NULLである列値を検索するには、expr = NULLテストは使用できません。次のステートメントは、expr = NULLが真になることはないため、行を返しません。

たとえば、次のように記述すると、where テストの結果は true になりません。

my_table から * を選択 WHERE phone = NULL;

null と他のデータを使用して計算を行う場合、MySQL ドキュメントで特定の操作について追加の特別な指示がない限り、結果は常に null になります。

NULLを含む式は、式に含まれる演算子と関数のドキュメントで特に指定がない限り、常にNULL値を生成します。

例えば:

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
+------+--------+---------------------------+
| NULL | 1+NULL | CONCAT('Invisible',NULL) |
+------+--------+---------------------------+
| NULL | NULL | NULL |
+------+--------+---------------------------+
セット内の 1 行 (0.00 秒)

したがって、null について論理的な判断を下したい場合は、 IS NULL

NULL値を探すには、IS NULLテストを使用する必要があります。

NULL値を持つ列のインデックス作成には、隠れた詳細をさらに予測する必要がある

InnoDB、MyISAM、および MEMORY ストレージ エンジンのみが、null 値を持つ列のインデックス作成をサポートします。

MyISAM、InnoDB、または MEMORY ストレージ エンジンを使用している場合は、NULL 値を持つことができる列にインデックスを追加できます。それ以外の場合は、インデックスが付けられた列を NOT NULL として宣言する必要があり、列に NULL を挿入することはできません。

インデックスの長さは通常のインデックスより 1 長くなります。つまり、消費するメモリがわずかに多くなります。

キーの保存形式により、NULL になる可能性がある列のキーの長さは、NOT NULL 列のキーの長さよりも 1 長くなります。

グループ化、重複排除、およびnull値のソートは特別に扱われます

=null は常に false であるという上記の記述とは反対に、null は等しいとみなされます。

DISTINCT、GROUP BY、ORDER BY を使用する場合、すべての NULL 値は等しいとみなされます。

null値のソートは特別に扱われます。

NULL値は最初または最後にソートされます。

ORDER BY を使用する場合、NULL 値は最初に提示され、DESC を指定して降順で並べ替える場合は最後に提示されます。

集計操作中はNullは無視されます

COUNT()、MIN()、SUM()などの集計(グループ)関数はNULL値を無視します。

たとえば、count(*) は null 値を持つデータをカウントしません。

例外は COUNT(*) で、これは行をカウントしますが、個々の列の値はカウントしません。たとえば、次のステートメントは 2 つのカウントを生成します。1 つ目はテーブル内の行数のカウントで、2 つ目は age 列の NULL 以外の値の数のカウントです。

mysql> SELECT COUNT(*), COUNT(age) FROM person;

上記は、MySQL null のよくある間違いの詳細です。MySQL null の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?
  • MySQLのnull値に関する小さな問題
  • 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の詳細な説明

<<:  Windows 10でDockerコンテナのポートにアクセスできない問題に対する完璧な解決策

>>:  18 個のキラー JavaScript ワンライナー

推薦する

nginxのアップストリーム設定と機能の詳細な説明

設定例 アップストリームバックエンド{ サーバー backend1.example.com 重み=5...

js キャンバスは検証コードを実装し、検証コード機能を取得します

この記事の例では、検証コードを作成して取得するためのjsキャンバスの具体的なコードを共有しています。...

CSS で 2 列レイアウトを実現する N 通りの方法

1. 2 列レイアウトとは何ですか? 2 列レイアウトには、左側が固定幅で右側が適応幅のレイアウトと...

Vue 開発者向けの VSCode 拡張機能ベスト 7

適切な VS Code 拡張機能を Visual Studio に追加すると、開発者としての作業がは...

HTML テーブル マークアップ チュートリアル (41): テーブル ヘッダーの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、ヘッダーの幅と高さはコンテンツに応じて自動的に調整されます。ヘッダーの幅と高さを手動...

MySQL トランザクション分離レベルとロックメカニズムの問題に関する深い理解

概要データベースは通常、複数のトランザクションを同時に実行します。複数のトランザクションが、同じデー...

Linuxでバージョン情報を表示する方法

Linux でバージョン情報を表示する方法。ビット数、バージョン情報、CPU コア情報、CPU 固有...

Ajax の JavaScript ソリューションにおける parsererror エラー ケースの詳細な説明

ajax の parsererror エラー (バックグラウンドからフロントエンドに送信される js...

Vueカスタムコンポーネントは双方向バインディングを実装します

シナリオ:一般的に使用される親コンポーネントと子コンポーネント間の相互作用方法は次のとおりです。親コ...

MySQLクライアントとサーバーのプロトコルの解釈

目次MySQL クライアント/サーバー プロトコルMySQL サーバーから高いパフォーマンスを得る必...

Celery と Docker を使用して Django で定期的なタスクを処理する方法

Django アプリケーションを構築して拡張していくと、必然的に特定のタスクをバックグラウンドで自動...

Linux での MySQL 5.6.33 のインストールと設定のチュートリアル

このチュートリアルでは、LinuxでのMySQL 5.6.33のインストールと設定方法を参考までに紹...

VMware Workstation 14 Pro インストール Ubuntu 16.04 チュートリアル

この記事では、VMware Workstation14 ProにUbuntu 16.04をインストー...

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

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

Django2.* + Mysql5.7 開発環境統合チュートリアル図

環境: 10.12 の新機能Python 3.6 MySQL 5.7.25 の場合ジャンゴ 2.2....