Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 空条件下的内部联接:bug还是特性?_Mysql_Sql_Join - Fatal编程技术网

Mysql 空条件下的内部联接:bug还是特性?

Mysql 空条件下的内部联接:bug还是特性?,mysql,sql,join,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, val

以下是测试设置:

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的一个错误或功能?

内部按定义连接只返回匹配的记录。如果一个表没有任何记录,那么就不能有任何相遇记录。这是所有RDBMs的标准行为。如果要从表中返回行,而不管是否匹配另一个表中的行,请使用left或right join而不是inner

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

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

MySQL或SQL Server?不要标记未涉及的产品…一个表为空的内部联接将始终返回零行。即使“select*from A inner join B on(true或B.value为null)”,也不会产生不同的结果-实际上我有很好的理由不使用LEFT join您没有理解我的观点:内部联接查找匹配的行。如果表中没有行,则无论在联接条件中放置了什么,它都不会返回任何行。