0

我对这个 SQL 查询有疑问:

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

我可以在子查询中写SELECT * From Outcomes还是我总是需要select一个row

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

4

6 回答 6

2

从性能的角度来看,使用这个查询

 select class 
 FROM Ships 
 join outcomes on ships.name=outcomes.ship
 and result like 'sunk'
于 2012-08-23T12:23:44.010 回答
1

您不能将 * 放在此子查询中。最好的方法是:

SELECT class
  FROM Ships s
 WHERE exists
     (
        select 1 
          from Outcomes o
        where s.name = o.ship
          and result = ’sunk’
       )
于 2012-08-23T12:25:37.430 回答
0

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

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

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

SELECT class
     FROM Ships
     WHERE name IN
       (SELECT ship
        FROM Outcomes
        WHERE result = ’sunk’
        UNION
        SELECT secondColumn
        FROM Outcomes
        WHERE result = ’sunk’        
        );
于 2012-08-23T12:23:33.967 回答
0

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

如果您subquery在 a 中使用 a inner join,您可以使用*,但为了便于阅读,最好返回您将使用的字段。这个例子,将是

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
于 2012-08-23T12:24:22.103 回答
0

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

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

于 2012-08-23T12:25:07.507 回答
0

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

我会建议加入

 seLECT class 
 FROM Ships 
     inner join outcomes
     on ships.name=outcomes.ship
    WHERE result = ’sunk’
于 2012-08-23T12:21:47.713 回答