MySQLでのNULLとNULLの違い

5918 ワード

NULLとNULL
NULLは、フィールドにNULL値を格納し、空の値は、フィールドに空の文字(')を格納します.
1、占有スペースの違い
mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+
1 row in set

小まとめ:空の値(')の長さは0で、空間を占有しない.NULLの長さはNULLですが、実際にはスペースを占有しています.以下の説明を参照してください.
NULL columns require additional space in the row to record whether their values are NULL.
NULL列には、NULLの値があるかどうかを記録する行の余分なスペースが必要です.
通俗的に言えば、空の値は真空の回転状態のコップのようで、何もありませんが、NULLの値は空気がいっぱい入ったコップで、同じように見えますが、本質的な違いがあります.
2、挿入/照会方式の違い
テーブルを作成します.tb_test
CREATE TABLE `tb_test` (
  `one` varchar(10) NOT NULL,
  `two` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

検証の挿入:
--      NULL,  
mysql> INSERT tb_test VALUES (NULL,NULL);
1048 - Column 'one' cannot be null
--        ,  
mysql> INSERT tb_test VALUES ('','');
Query OK, 1 row affected

シミュレーションデータ:
INSERT tb_test VALUES (1,NULL);
INSERT tb_test VALUES ('',2);
INSERT tb_test VALUES (3,3);

NULLフィールド:
--    is null/is not null
mysql> SELECT * FROM tb_test where one is NULL;
Empty set

mysql> SELECT * FROM tb_test where one is not NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
|     | 2    |
| 3   | 3    |
+-----+------+
3 rows in set
--    = 、!=
mysql> SELECT * FROM tb_test where one = '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
+-----+-----+
1 row in set

mysql> SELECT * FROM tb_test where one != '';
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
| 3   | 3    |
+-----+------+
2 rows in set


NULL値フィールド:
--    is null/is not null
mysql> SELECT * FROM tb_test where two is not NULL;
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

mysql> SELECT * FROM tb_test where two is NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
+-----+------+
1 row in set

--    = 、!=
mysql> SELECT * FROM tb_test where two = '';
Empty set

mysql> SELECT * FROM tb_test where two != '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

小まとめ:NULL値列を単純に調べる場合はis NULL、空値(')列を単純に調べる場合は=''を使用します.
推奨クエリー方法:NULL値クエリーはis null/is not nullクエリーを使用し、空の値(')は=または!=、等算術演算子
3、COUNTとIFNULL関数COUNT関数を使用します.
mysql> SELECT count(one) FROM tb_test;
+------------+
| count(one) |
+------------+
|          3 |
+------------+
1 row in set

mysql> SELECT count(two) FROM tb_test;
+------------+
| count(two) |
+------------+
|          2 |
+------------+
1 row in set

mysql> SELECT count(*) FROM tb_test;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set
IFNULL関数を使用します.
mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';
+-----------------------+
| IFNULL(one,111111111) |
+-----------------------+
|                       |
+-----------------------+
1 row in set

mysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;
+----------------------+
| IFNULL(two,11111111) |
+----------------------+
| 11111111             |
+----------------------+
1 row in set

まとめ:COUNT(フィールド)統計を使用するとNULL値はフィルタされますが、空の値はフィルタされません.
説明:IFNULLには2つのパラメータがあります.最初のパラメータフィールドがNULLでない場合、最初のフィールドの値が返されます.そうでなければ、IFNULL関数は2番目のパラメータの値(デフォルト)を返します.
4、索引フィールドの説明
ネット上では、MySqlの列にNULLが含まれている場合、その列を含むインデックスは無効だという人もいます.oneフィールドとtwoフィールドには、それぞれ通常のインデックスが追加されます.前に書いたことがありますが、復習でインデックスを追加:Mysqlインデックス整理まとめ
-- ALTER TABLE table_name ADD INDEX index_name(col_name);
ALTER TABLE tb_test ADD INDEX index_oat (one, two);
ALTER TABLE tb_test add INDEX index_two(two);
show keys from ;またはshow indexes from ;を使用して、このテーブルのすべてのインデックス情報を表示します.
通常のインデックス、複合インデックスです.
複合インデックスは、クエリー条件で複合インデックスの最初のフィールドが使用されている場合にインデックスが使用されるという「最左接頭辞」の原則に従います.したがって、複合インデックスではインデックス列の順序が重要です.
 
 
 
2つのインデックスが作成され、index_tow NULLの列がYESであることがわかります.EXPLAINを使用してプレゼンテーションを行い、EXPLAINの使用説明:Mysqlのexplainの使用方法と結果フィールドの意味の説明
 
 
 
 
 
 
クエリtwoフィールドは、インデックスを正常に使用できることが分かった.私が使っているMYSQL 5.7、InnoDBエンジン.いくつかのネット上の資料を見て、MySQLの中でNULLがインデックスに与える影響この文章の中で例で検証して、MySQLはnullを含む列の上でインデックスを使用することができます.
備考:他の条件ではだめかもしれませんが、ネット上の資料を見ると を使うと失効すると言っています.具体的には検証していません.空間インデックスは使ったことがありません.公式サイトcreate-index-spatialを検索すると、興味のあるパートナーは自分で検証することができます.
 
 
 
ここで私は、多くの問題の答えが指定された条件と環境の下で成立し、多くの疑問、多くの検証を考えています.
まとめ:NULL値のあるフィールドでは、通常のインデックス、複合インデックス、全文インデックスなど、一般的なインデックスを使用してもインデックスが失効しません.スペースインデックスの場合、インデックス列がNOT NULLである必要があることを公式サイトで確認します.
03まとめ上げ
もしあなたが上記のいくつかの面から面接官とコミュニケーションを取ることができれば、答えがそんなに完璧ではなくても、「この2つを使ったことがあるので、具体的に何か違いがあるのか分からない」という答えより少しはいいです.
1、空の値はスペースを占めず、NULLの値はスペースを占める.フィールドがNULLでない場合は、空の値を挿入することもできます.
2、IS NOT NULLまたはIS NULLを使用する場合、フィールドにNULLでないものまたはNULLでないものがないことを検出するしかなく、NULL値を検出することはできない.
3、判定NULLはIS NULLまたはis not null、SQL文関数ではIFNULL()関数を用いて処理し、判定空文字は=''または<>''で処理する.
4、count()であるカラムのレコード数を統計する場合、NULL値を採用すると、自動的に無視されますが、空の値は統計されます.
5、MySqlの列にNULLが含まれている場合、その列を含むインデックスは無効です.この一言は正確ではない.
6:実際にNULL値を使うか空の値(')を使うかは、実際の業務によって区別されます.個人的には、実際の開発で特別なビジネスシーンがなければ、空の値を直接使用することをお勧めします.