mysql 中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
mysql中null的處理經驗總結
在專案中需要比對兩條資料,篩選出有欄位不一致的資料 select * from t_table t1, t_table t2 where t1.key = t2.key and t1.column1 != t2.column1 其中column1是數值型且可為空,當t1中co
MySQL中null值問題
sqli star cti 不起作用 pan orm null arr log 今天寫答疑系統的時候,寫了這樣一截代碼: <?php session_start(); $db=mysqli_connect(‘localhost‘,‘root‘,‘ro
mysql中null與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
mysql中null與‘’的區別
Mysql中空字元<''>和空值的區別,一直都知道mysql中空字串(”)和空值(null)之間有區別,但是沒好好研究過。直到專案上,這兩個概念被我搞混了之後才想起來研究一下。 根據網上的說法,空字串(”)是不佔用空間,而空值(null)是佔用空間。(這裡我不太明
MySQL 中NULL和空值的區別,索引列是否可空值或null
在建立表的時候儘量把欄位的預設值設定成 not null,除非你想儲存null;因為在mysql中為null的的欄位不會走索引,做統計的時候也不會被統計進去,如果想統計進去必須做特定的處理,這樣做比較複雜。可以給欄位的值設定成0、一個特殊的值或者一個空串代替空值。 MySQ
Spring boot + MyBatis返回map中null值處理
在日常開發中,查詢資料返回型別為map,資料庫中有些自動值為null,則返回的結果中沒有值為空的欄位,則如何顯示值為空的欄位呢?1.xml檔案:<resultMapid="userLoginInfo"type="map"> <resultcolumn="u
MySQL中NULL和空值的區別
平時我們在使用MySQL的時候,對於MySQL中的NULL值和空值區別不能很好的理解。注意到NULL值是未知的,且佔用空間,不走索引,DBA建議建表的時候最好設定欄位是NOT NULL 來避免這種低效率
mysql中Null 與空值的區別
mysql中null確實很難纏,往往很多高手在sql優化時都被它坑過,下面總結了他們的區別: MySQL中,null是未知的,且佔用空間的。null使得索引、索引統計和值都更加複雜,並且影響優化器的判
MySQL中SELECT+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
MySQL中sleep線程過多的處理方法
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; +-