【问题标题】:Sql queries differencesql查询区别
【发布时间】:2013-02-25 08:52:50
【问题描述】:

我想知道这两个版本在结果上是否相同,哪个版本出于性能原因更好,为什么? 选择版本中的嵌套选择

select 
 t1.c1, 
 t1.c2, 
 (select Count(t2.c1) from t2 where t2.id = t1.id) as count_t 
from 
 t1 

VS

select t1.c1,t1.c2, Count(t2.c1)
from t1,t2
where t2.id= t1.id

【问题讨论】:

    标签: mysql sql tsql


    【解决方案1】:

    第一个查询是这个查询的模拟 -

    SELECT
      t1.c1,
      t1.c2,
      COUNT(t2.c1)
    FROM t1
      LEFT JOIN t2
        ON t2.id = t1.id;
    

    从第一个表中选择所有记录,从第二个表中选择所有匹配的记录(它是LEFT JOIN条件)。

    第二个是这个查询的模拟-

    SELECT
      t1.c1,
      t1.c2,
      COUNT(t2.c1)
    FROM t1
      JOIN t2
        ON t2.id = t1.id;
    

    它只选择两个表中匹配的记录(它是INNER JOIN条件)。

    【讨论】:

    • "第一个查询是这个查询的模拟 ..." 是的,但只有 t2(id) 是主键或唯一的。
    • @Devart:为了澄清一点,我的第一个查询 count(t2.c1) 是否在 t1.idt2.id 之间存在匹配,而在您的建议中,当且仅当 Count 函数不匹配时,这将起作用不算nulls,对吗?
    【解决方案2】:

    它们是不同的查询。如果表 t2 中没有匹配的 id,则顶部将选择 t1 中的所有行返回 0 作为计数。

    第二个查询将只返回 t1 和 t2 都具有相同 id 的行。

    【讨论】:

      【解决方案3】:

      第一个查询可能会遇到大型数据集的性能问题。第二个查询可能存在笛卡尔问题。如果表 2 没有相关记录,我会根据您的意图使用连接或左连接来获取表 1 中的记录,然后添加一个 group by 语句来控制笛卡尔。

      【讨论】:

        猜你喜欢
        • 2021-07-14
        • 1970-01-01
        • 2020-02-09
        • 2021-02-25
        • 2015-08-17
        • 2023-03-19
        • 2020-07-31
        • 2020-03-22
        • 2017-01-30
        相关资源
        最近更新 更多