mysql 子查詢 null或者分組無效導致的查詢結果空

直入正題

建表

CREATE TABLE user (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
userName VARCHAR(50) NULL DEFAULT NULL,
userPassword VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (id)
)
COLLATE=‘utf8_general_ci’
ENGINE=InnoDB
AUTO_INCREMENT=4
;

造數據

INSERT INTO user (id, userName, userPassword) VALUES (1, ‘張三’, ‘123’);
INSERT INTO user (id, userName, userPassword) VALUES (2, ‘張三’, ‘3’);
INSERT INTO user (id, userName, userPassword) VALUES (3, ‘李四’, NULL);
INSERT INTO user (id, userName, userPassword) VALUES (4, ‘李四’, NULL);
INSERT INTO user (id, userName, userPassword) VALUES (5, ‘aa’, ‘123’);
INSERT INTO user (id, userName, userPassword) VALUES (6, ‘aa’, NULL);
INSERT INTO user (id, userName, userPassword) VALUES (7, ‘bb’, NULL);

如下sql由於not in子查詢結果有null,導致結果行空

## not in() 子查詢結果不能有null,解決辦法 加條件 t.userPassword is not null
select * from user t

where t.userPassword not in 
(
select t.userPassword from user t where t.userName='aa'
)

子查詢gropu by 導致結果集空。

如下:

select * from user t

where t.id not in 
(
select t.id from user t 
group by t.userName
)

如圖select t.id from user t group by t.userName 子查詢結果是4條數據,按理最終結果行是三條。
在這裏插入圖片描述
但是結果行是空,如下:
在這裏插入圖片描述
原因:子查詢直接用gropu by,sql解析器直接獲取結果集,並不會gropu by,所以子查詢得到所有結果。主sql not in (所有結果),自然得到空。

通過再嵌套解決該問題,修改如下:

select * from user t

where t.id not in 
(
	select id
	from (
		select t.id from user t 
		group by t.userName
	)tt

)

得到正確結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章