选择从两个表中计数 = SQL 中的乘法?



>我随机尝试运行如下查询:

select count(*) from table1, table2

结果基本上是两个表的实际行数相乘,即基于table1有 868 行和table2有 744 行的事实,结果是645792行。

这是预期的行为吗,我查看了文档,但无法更好地理解这种行为。

这是您的from子句:

from table1, table2

这相当于:

from table1 cross join table2

这是两个表的笛卡尔乘积,它生成一个包含 868 * 744 行的结果集。然后count(*)只计算结果行数,因此得到的结果。

如果要对每个表中的行数求和,则需要计算两个单独的计数:

select
(select count(*) from table1) 
+ (select count(*) from table2) total_no_rows 

您当前的查询:

select count(*) from table1, table2

正在使用老式隐式连接语法。 由于WHERE子句中没有联接条件(没有WHERE子句(,因此联接默认为交叉联接。 这只是两个表中记录之间的交叉乘积,这就是您当前看到的。 编写查询的更好方法是:

SELECT COUNT(*)
FROM table1
CROSS JOIN table2;

'INNER JOIN 和 (逗号(在没有连接条件的情况下在语义上是等价的:两者都产生笛卡尔积"https://dev.mysql.com/doc/refman/8.0/en/join.html

最新更新