1. 程式人生 > >mysql 中NULL被如何處理

mysql 中NULL被如何處理

1.enum欄位與int欄位有null情況
2.null欄位在timestamp,datetime中的情況
3.select count在欄位有null的情況
4.not in 和not exists在有null值存在的情況

舉例:

1.enum欄位與int欄位有null情況
因為在MySQL中有三種狀態:True、False、Unknown,任何NULL的比較操作都是Unknown狀態,NULL跟任何比較操作返回結果都是unknown狀態,而且所有查詢條件都是unknown狀態當做false處理。所以不會返回null這個組。

mysql> select default_group_type,count(*) from emailTemplateGroup where default_group_type <>'takedownTool' group by 1;

+--------------------+----------+
| default_group_type | count(*) |
+--------------------+----------+
| p2p                |      147 |
| Ad network         |      154 |
| searchEngine       |      154 |
| linkingsite        |      154 |
+--------------------+----------+
4 rows in set (0.00 sec)

mysql> select default_group_type,count(*) from emailTemplateGroup where default_group_type is null;

+--------------------+----------+
| default_group_type | count(*) |
+--------------------+----------+
| NULL               |      386 |
+--------------------+----------+
1 row in set (0.02 sec)

mysql> select 'p2p'<>'takedownTool','Ad network'<>'takedownTool','searchEngine' <>'takedownTool','linkingsite'<>'takedownTool','takedownTool'<>'takedownTool',null <>'takedownTool';

+-----------------------+------------------------------+---------------------------------+-------------------------------+--------------------------------+-----------------------+
| 'p2p'<>'takedownTool' | 'Ad network'<>'takedownTool' | 'searchEngine' <>'takedownTool' | 'linkingsite'<>'takedownTool' | 'takedownTool'<>'takedownTool' | null <>'takedownTool' |
+-----------------------+------------------------------+---------------------------------+-------------------------------+--------------------------------+-----------------------+
|                     1 |                            1 |                               1 |                             1 |                              0 |                  NULL |
+-----------------------+------------------------------+---------------------------------+-------------------------------+--------------------------------+-----------------------+

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;   
+----------+-----------+----------+----------+   
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |   
+----------+-----------+----------+----------+   
| NULL | NULL | NULL | NULL |   
+----------+-----------+----------+----------+   

因為在MySQL中有三種狀態:True、False、Unknown,任何NULL的比較操作都是Unknown狀態,NULL跟任何比較操作返回結果都是unknown狀態,而且所有查詢條件都是unknown狀態當做false處理。所以不會返回null這個組。
由此可見,我們不能對null進行數學運算,如要查詢Null值資料必須在where後面加is null;

2. null欄位在timestamp,datetime中的情況

timestamp 預設允許為 “非空”(not null by default), 如果你在定義“ts TIMESTAMP DEFAULT NULL” 是非法的。 可以指定為空 null,當在timestamp中插入Null值,不管我們給timestamp定義default為何值,DB會預設記錄當前時間

[email protected] 03:47:34>create table xbb4(
    -> id  int(10) unsigned NOT NULL AUTO_INCREMENT,
    -> col1 datetime,
    -> col2 timestamp,
    -> col3 date,
    -> PRIMARY KEY (`id`)
    -> )ENGINE=InnoDB  DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.33 sec)

[email protected] 03:57:29>insert into xbb4(col1,col2,col3) values(null,null,null);
Query OK, 1 row affected (0.00 sec)

[email protected] 03:57:36>select * from xbb4;
+----+------+---------------------+------+
| id | col1 | col2                | col3 |
+----+------+---------------------+------+
|  1 | NULL | 2013-05-23 07:57:36 | NULL |
+----+------+---------------------+------+
1 row in set (0.00 sec)

[email protected] 09:31:54>show create table xbb6\G
*************************** 1. row ***************************
       Table: xbb6
Create Table: CREATE TABLE `xbb6` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `col1` datetime DEFAULT '0000-00-00 00:00:00',
  `col2` timestamp DEFAULT '0000-00-00 00:00:00',
  `col3` date DEFAULT '0000-00-00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

[email protected] 09:32:25>insert into xbb6(col1,col2,col3) values(null,null,null);
Query OK, 1 row affected (0.00 sec)

[email protected] 09:32:51>select * from xbb6;
+----+------+---------------------+------+
| id | col1 | col2                | col3 |
+----+------+---------------------+------+
|  2 | NULL | 2013-05-24 01:32:51 | NULL |
+----+------+---------------------+------+
1 row in set (0.01 sec)


[email protected] 11:17:08>show create table xbb7\G
*************************** 1. row ***************************
       Table: xbb7
Create Table: CREATE TABLE `xbb7` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `col1` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `col2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `col3` date NOT NULL DEFAULT '0000-00-00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1


[email protected] 11:16:59>insert into xbb7(col2) values(null);
Query OK, 1 row affected (0.00 sec)

[email protected] 11:17:04>select * from xbb7;
+----+---------------------+---------------------+------------+
| id | col1                | col2                | col3       |
+----+---------------------+---------------------+------------+
|  5 | 0000-00-00 00:00:00 | 2013-05-24 03:17:04 | 0000-00-00 |
+----+---------------------+---------------------+------------+
2 rows in set (0.00 sec)

3.count在欄位有null的情況下

COUNT(*)通常是對主鍵進行索引掃描,而COUNT(COL)就不一定了,另外前者是統計表中的所有符合的紀錄總數,而後者是計算表中所有符合的COL的紀錄數。null不被計數

[email protected] 11:27:01>select * from xbb6;
+----+------+---------------------+------+
| id | col1 | col2                | col3 |
+----+------+---------------------+------+
|  2 | NULL | 2013-05-24 03:20:57 | NULL |
+----+------+---------------------+------+
1 row in set (0.00 sec)

[email protected] 11:27:06>select count(*) from xbb6;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

[email protected] 11:27:13>select count(col1) from xbb6;
+-------------+
| count(col1) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

[email protected] 11:27:19>select count(col2) from xbb6;
+-------------+
| count(col2) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

也就是說,欄位中有null值的,count(col) 將不被計數

4.not in 和not exists在有null值存在的情況
in 是子表驅動外表,把外表和那表作hash join,而exists是對外表作loop,外表驅動子表,每次loop再對那表進行查詢。
由此可見使用not exists和not in要小心,當返回值中包含null時,not in返回false,not exists返回true。

[email protected] 11:36:28>select * from xbb;
+----+------+------+
| id | col1 | col2 |

相關推薦

mysql NULL如何處理

1.enum欄位與int欄位有null情況2.null欄位在timestamp,datetime中的情況3.select count在欄位有null的情況4.not in 和not exists在有null值存在的情況舉例:1.enum欄位與int欄位有null情況因為在My

mysqlnull處理經驗總結

在專案中需要比對兩條資料,篩選出有欄位不一致的資料 select * from t_table t1, t_table t2 where t1.key = t2.key and t1.column1 != t2.column1 其中column1是數值型且可為空,當t1中co

MySQLnull值問題

sqli star cti 不起作用 pan orm null arr log 今天寫答疑系統的時候,寫了這樣一截代碼: <?php session_start(); $db=mysqli_connect(‘localhost‘,‘root‘,‘ro

mysqlnull與not null的區別及效率

<span style="font-family: 宋體; background-color: rgb(255, 255, 255);">經常用mysql的人可能會遇到下面幾種情況:</span> 1、我欄位型別是not null,為什麼我可以插入空值 2、為什麼not

MySQL NULL和空值的區別

1:在進行count()統計某列的記錄數的時候,如果採用的NULL值,會別系統自動忽略掉,但是空值是會進行統計到其中的。 2: 判斷NULL 用IS NULL 或者 is not null,SQL 語句函式中可以使用ifnull()函式來進行處理,判斷空字元用=''或者 &

mysql NULL 值求和問題

在mysql 中 NULL值 與任何值相加 返回結果均是NULL  因此需要對部分NULL值做0的處理,可以使用如下命令來處理  (CASE WHEN b.cnt IS NOT NULL AND b.cnt!= " " THEN b.cnt ELSE 0 END

mysqlnull與‘’的區別

Mysql中空字元<''>和空值的區別,一直都知道mysql中空字串(”)和空值(null)之間有區別,但是沒好好研究過。直到專案上,這兩個概念被我搞混了之後才想起來研究一下。 根據網上的說法,空字串(”)是不佔用空間,而空值(null)是佔用空間。(這裡我不太明

MySQL NULL和空值的區別,索引列是否可空值或null

在建立表的時候儘量把欄位的預設值設定成 not null,除非你想儲存null;因為在mysql中為null的的欄位不會走索引,做統計的時候也不會被統計進去,如果想統計進去必須做特定的處理,這樣做比較複雜。可以給欄位的值設定成0、一個特殊的值或者一個空串代替空值。 MySQ

Spring boot + MyBatis返回mapnull處理

在日常開發中,查詢資料返回型別為map,資料庫中有些自動值為null,則返回的結果中沒有值為空的欄位,則如何顯示值為空的欄位呢?1.xml檔案:<resultMapid="userLoginInfo"type="map">  <resultcolumn="u

MySQLNULL和空值的區別

平時我們在使用MySQL的時候,對於MySQL中的NULL值和空值區別不能很好的理解。注意到NULL值是未知的,且佔用空間,不走索引,DBA建議建表的時候最好設定欄位是NOT NULL 來避免這種低效率

mysqlNull 與空值的區別

mysql中null確實很難纏,往往很多高手在sql優化時都被它坑過,下面總結了他們的區別: MySQL中,null是未知的,且佔用空間的。null使得索引、索引統計和值都更加複雜,並且影響優化器的判

MySQLSELECT+UPDATE處理併發更新問題解決方案分享

問題背景: 假設MySQL資料庫有一張會員表vip_member(InnoDB表),結構如下: 當一個會員想續買會員(只能續買1個月、3個月或6個月)時,必須滿足以下業務要求: •如果end_at早於當前時間,則設定start_at為當前時間,end_at為當

mysql 使用AES 處理敏感資料

mysql 中使用AES加密與解密處理資料 最近在做專案的時候,需要對一個敏感資訊進行加密,但是加密密文又需要可以逆轉,因為my

MySQL 處理 Null 時要注意兩個陷阱

MySQL資料庫是一個基於結構化資料的開源資料庫。SQL語句是MySQL資料庫中核心語言。不過在MySQL資料庫中執行SQL語句,需要小心兩個陷阱。 陷阱一:空值不一定為空 空值是一個比較特殊的欄位。在MySQL資料庫中,在不同的情形下,空值往往代表不同的含義。這是M

Mysql的資料用 json_decode 解析返回null的一則處理方法

剛剛遇到一個php json_decode解析的問題,記錄一下解決方法: 一個調查問卷系統,從資料庫中取出多條記錄,其中以下一條資料記錄,在用php json_decode解析時,結果返回NUll {"question_1359":"韓亮","question_1360":

mysql查看索引是否使用到

and 索引 沒有 object format mysq count perf type http://blog.sina.com.cn/s/blog_5037eacb0102vm5c.html 官方MySQL中查看索引是否被使用到: 在percona版本或marida

MySQLsleep線程過多的處理方法

rec 連接超時 服務 一行 client out char* mysql連接 測試 先說具體方法: 先在MySQL中操作 set global wait_timeout = 60; set global interactive_timeout = 60; 然後在配置

MySQL使用group_concat()函數數據截取(有默認長度限制),謹慎!

tro 問題: 存儲 lstat sql pre into desc lex 最近在工作中遇到一個問題: 我們系統的一些邏輯處理是用存儲過程實現的,但是有一天客服反饋說訂單下單失敗,查了下單牽扯到的產品基礎資源,沒有問題。 下單的存儲過程中有這樣兩句代碼: 1 dec

xampp使用mysql端口占用問題的解決方案

端口 命令 delete tps 經驗 運行 stat 服務狀態 無法 如果在安裝XAMPP前本機已經安裝了mysql,並且添加了Windows服務中 使用xampp時,兩個Mysql在Windows服務中有沖突 這意味著你之前在電腦上使用過mysql,路徑、端口都被占用過

(異常查詢Empty set)mysql 的 not in 注意事項——結果集中不能有null

注意 in 結果集有 null 不影響 not in 的結果集中出現 null 則查詢結果為 Empty set 實際應用(結果集存在有null) select t1.father_id from t_pub_link_info t1; +-