SQL子查询什么具有最佳性能



我有一个关于这个SQL查询的问题:

 SELECT class
 FROM Ships
 WHERE name IN (SELECT ship
                FROM Outcomes
                WHERE result = ’sunk’);

我可以在子查询SELECT * From Outcomes中写入吗?还是总是需要selectrow

那么什么查询的性能最好呢?

从性能角度来看,请使用此查询

 select class 
 FROM Ships 
 join outcomes on ships.name=outcomes.ship
 and result like 'sunk'

您不能在这个子查询中放入*。最好的方法是:

SELECT class
  FROM Ships s
 WHERE exists
     (
        select 1 
          from Outcomes o
        where s.name = o.ship
          and result = ’sunk’
       )

在这种情况下,您需要说明您正在选择的列。

我建议加入

 seLECT class 
 FROM Ships 
     inner join outcomes
     on ships.name=outcomes.ship
    WHERE result = ’sunk’

您使用的是In,因此只需要一个row即可将其与名称进行比较。在这种特殊情况下,您可以使用Join作为替代方案。在MySQL中,性能相同,但在SQL Server中,In比Join更具性能。因此,在这种情况下,您只需要返回一行。

如果在inner join中使用subquery,则可以使用*,但为了可读性,最好返回将要使用的字段。这个例子将是

select (fields..)
from yourTable
inner join (select fields from yourTable2) T2 on ConditionOfJoining
select (fields..)
from yourTable
inner join (select * from yourTable2) T2 on ConditionOfJoining

您应该尽量避免使用*。更好的是永远不要使用*。

但在查询中,您必须声明该列。

您需要选择一列,就像您在SQL示例中所做的那样。

同样值得注意的是,通配符*对性能不利,因为服务器将需要做一些额外的工作来计算出所有列是什么,正如您没有明确指出的那样。

如果你想在IN中包括多个要比较的列,那么我建议在你的子查询中使用UNION

SELECT class
     FROM Ships
     WHERE name IN
       (SELECT ship
        FROM Outcomes
        WHERE result = ’sunk’
        UNION
        SELECT secondColumn
        FROM Outcomes
        WHERE result = ’sunk’        
        );

相关内容

  • 没有找到相关文章

最新更新