我有一个关于这个SQL查询的问题:
SELECT class
FROM Ships
WHERE name IN (SELECT ship
FROM Outcomes
WHERE result = ’sunk’);
我可以在子查询SELECT * From Outcomes
中写入吗?还是总是需要select
和row
?
那么什么查询的性能最好呢?
从性能角度来看,请使用此查询
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’
);