我随机尝试运行如下查询:
select count(*) from table1, table2
结果实际上是两个表的实际行数的乘积,即结果是645792行 table1 有868排 table2 有744排。如果这是一种预期的行为,我查看了文档,但无法更好地了解这种行为。
table1
table2
8xiog9wr1#
这是你的 from 条款:
from
from table1, table2
这相当于:
from table1 cross join table2
这是两个表的笛卡尔积,它生成一个包含868*744行的结果集。那么 count(*) 只需计算结果行的数量,即得到的结果。如果要对每个表中的行数求和,则需要计算两个单独的计数:
count(*)
select (select count(*) from table1) + (select count(*) from table2) total_no_rows
avwztpqn2#
您当前的查询:
正在使用老式的隐式连接语法。因为没有连接条件出现在 WHERE 条款(没有 WHERE 子句),联接默认为交叉联接。这只是两个表中记录之间的交叉积,这就是您当前看到的结果。编写查询的更好方法是:
WHERE
SELECT COUNT(*) FROM table1 CROSS JOIN table2;
azpvetkf3#
'在没有连接条件的情况下,内部连接和(逗号)在语义上是等价的:两者都产生笛卡尔积'https://dev.mysql.com/doc/refman/8.0/en/join.html
3条答案
按热度按时间8xiog9wr1#
这是你的
from
条款:这相当于:
这是两个表的笛卡尔积,它生成一个包含868*744行的结果集。那么
count(*)
只需计算结果行的数量,即得到的结果。如果要对每个表中的行数求和,则需要计算两个单独的计数:
avwztpqn2#
您当前的查询:
正在使用老式的隐式连接语法。因为没有连接条件出现在
WHERE
条款(没有WHERE
子句),联接默认为交叉联接。这只是两个表中记录之间的交叉积,这就是您当前看到的结果。编写查询的更好方法是:azpvetkf3#
'在没有连接条件的情况下,内部连接和(逗号)在语义上是等价的:两者都产生笛卡尔积'https://dev.mysql.com/doc/refman/8.0/en/join.html