Mysql Sql查询差异

Mysql Sql查询差异,mysql,sql,tsql,Mysql,Sql,Tsql,我想知道这两个版本的结果是否相同,出于性能原因,哪一个更好,为什么? 选择版本中的嵌套选择 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 它们是不同的查询。如果表t2中没有匹配的id,则最上面的一个将选择t1中

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

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

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


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

第一个查询类似于此查询-

SELECT
  t1.c1,
  t1.c2,
  COUNT(t2.c1)
FROM t1
  LEFT JOIN t2
    ON t2.id = t1.id;
SELECT
  t1.c1,
  t1.c2,
  COUNT(t2.c1)
FROM t1
  JOIN t2
    ON t2.id = t1.id;
它从第一个表中选择所有记录,从第二个表中选择所有匹配的记录(它是左连接条件)

第二个类似于这个查询-

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

它只在两个表中选择匹配的记录(这是内部联接条件)。

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

“第一个查询类似于此查询…”是的,但只有
t2(id)
是主键或唯一键。@Devart:我想澄清一下,我的第一个查询
count(t2.c1)
如果
t1.id
t2.id
之间存在匹配,而在您的建议中,如果且仅当
count
函数不计算
nulls
,这将起作用,对吗?