mysql - 内部加入空条件 : bug or feature?

标签 mysql sql join

这是测试设置:

CREATE TABLE A (
    id bigint NOT NULL AUTO_INCREMENT,
    value bigint,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO A (id, value) VALUES (1, 22);
INSERT INTO A (id, value) VALUES (2, 25);
INSERT INTO A (id, value) VALUES (3, 25);

CREATE TABLE B (
    id bigint NOT NULL AUTO_INCREMENT, 
    value bigint, 
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

重要提示:表 B 不包含任何行!!!

测试查询:

select * from A  inner join B on (A.value=25 OR B.value=null);

惊喜:获取的结果集为空

如果表 B 包含以下内容:

INSERT INTO B (id, value) VALUES (3, 66);

然后相同的查询将返回 2 行:

id  value  id  value  
--  -----  --  -----  
2   25     3   66     
3   25     3   66     

这是 MySQL 的错误还是特性?

最佳答案

根据定义,INNER JOIN 仅返回匹配的记录。如果一个表没有任何记录,那么就不会有任何匹配记录。这是所有 RDBM 的标准行为。如果您想从一个表中返回行而不考虑来自另一个表的匹配行,请使用左连接或右连接而不是内部连接。

select * from A  left join B on ... where A.value=25 ;

此外,anything=NULL 比较总是返回 false,因为 NULL 不等于任何东西,甚至不等于另一个 NULL 值。如果要测试字段是否具有 NULL 值,则使用 fieldname IS NULL 表达式。

关于mysql - 内部加入空条件 : bug or feature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166686/

相关文章:

php - 在 Javascript 中解析一个单独的 PHP 数组

php - IN() 函数不使用百分号返回结果

mysql - SQL更新表,WHERE子句多字段

php - mysql错误内连接

mysql - 如何根据基于另一个表的 case 语句更新表? (在Mysql中)

sql - 优化 SQL 查询 - 连接 4 个表

php - 表中存在时如何从表中选择

MySQL:计算具有一个月偏移量的表中的数据

MySQL连接到同一个表中的列

mysql - mysql 过程出错