这两个SQL语句有什么区别?

时间:2018-07-09 02:01:13

标签: sql

这里有两个我认为相等的SQL语句,但是当我运行脚本时,第二个要慢得多,有人可以告诉我为什么吗?

第一个:

select 
    a.name, if(b.score1 = 0, b.score2, b.score1) 
from 
    a, b
where 
    a.id = b.id 
    and if(b.score1 = 0, b.score2, b.score1) > 0

第二个:

select 
    a.name, temp.score 
from 
    a, b,
    (select if(b.score1 = 0, b.score2, b.score1) as score from b) as temp
where 
    a.id = b.id 
    and temp.score > 0

上面是一个简单的示例,如果我的查询是:

select a.name,
if(b.usedname1='',if(b.usedname2='',b.usedname3,b.usedname2),b.usedname1)
from a,b 
where a.id=b.id and
if(b.usedName1='',if(b.useNname2='',b.usedname3,b.usedname2),b.usedname1)<>'tom';

我的表中还有5个使用过的名字,有什么方法可以简化这种陈述?

2 个答案:

答案 0 :(得分:2)

编写查询的正确方法是使用正确的,明确的标准 JOIN语法。

我会这样写:

select a.name, (case when b.score1 = 0 then b.score2 else b.score1 end)
from a join
     b
     on a.id = b.id 
where (b.score1 = 0 and b.score2 > 0) or b.score1 > 0;

我怀疑您可能真的希望greatest()而不是条件表达式,但这只是推测。

第二条语句还有一个附加的join。我不知道为什么您会认为具有三个表引用和两个联接的查询等同于具有两个表引用和一个联接的查询。

答案 1 :(得分:0)

如果您编写了相同的查询,我可能什么也没说。使用您使用的任何数据库引擎生成的查询计划。

但是,尽管您介绍了temp并且仍然加入了b,但它们并不相同。

这可能是相同的:

select a.name,temp.score from a,temp,
(select if(b.score1=0,b.score2,b.score1) as score from b) as temp
where a.id=temp.id and temp.score>0