【问题标题】:how does count(1) work with two tables in sqlcount(1) 如何处理 sql 中的两个表
【发布时间】:2014-05-29 16:22:58
【问题描述】:

我有两张表 customer 和 sales。

客户:

客户名称 loc 第1001章 第1002章 第1003章

销售额:

salesid 销售名称 saleloc 1001 ddd 第1002章

我查询

select count(1) from customer, sales

我得到的计数结果为 6

  1. 谁能解释其背后的逻辑?
  2. 如果有的话,使用什么样的连接?
  3. 如果 sales 有第 3 列,则计数结果变为 9。那是怎么发生的?

提前致谢。

【问题讨论】:

  • 您正在执行 CROSS JOIN,这是行的笛卡尔积,因为您没有连接条件。本质上,你从左边得到一行,右边的每一行 - 3 * 2 = 6...3 * 3 = 9count (1) 中的 1 无关紧要 - 它只会计算行数(1 只是一个表达式 - 你不妨使用 *)
  • 您提到在销售中添加“第三列”? sales 表已经有三列。您指的是“第三排”吗?此外,如果您使用SELECT *... 而不是SELECT COUNT(1)...,您也许可以帮助自己解释这一点。分享和享受。
  • @subee 。 . .您应该避免在from 子句中使用,。如果您使用cross join(等效)编写此内容,那么您的问题的答案将是显而易见的。

标签: sql join


【解决方案1】:

它变成了一个 CROSS JOIN,因为表没有与键列连接。因此客户行数 * 销售行数 (3*2) 总共变为 6 行,count 函数将其作为结果返回

【讨论】:

    【解决方案2】:

    这只是笛卡尔积。

    客户表的每一行都与销售表的每一行相连。

    例如,

    1001 aaa a with 1001 ddd d, 1002 eee e --> 当从客户表中获取一行时,链接与所有行在销售表中。

    所以结果为 3 * 2 = 6(客户表中 3 行,销售表中 2 行),同样为 3 * 3 = 9。(每个表中 3 行)

    这就是它背后的逻辑。

    【讨论】:

      【解决方案3】:

      1) 6 是笛卡尔积 3 x 2 的结果

      2) 1) 不使用join:是笛卡尔积;

      3) 9 是笛卡尔积 3 x 3 的结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 2021-12-28
        相关资源
        最近更新 更多