直入正題
建表
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
)
得到正確結果: