我对这个 SQL 查询有疑问:
SELECT class
FROM Ships
WHERE name IN (SELECT ship
FROM Outcomes
WHERE result = ’sunk’);
我可以在子查询中写SELECT * From Outcomes
还是我总是需要select
一个row
?
那么什么查询的性能最好呢?
我对这个 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’
)
您需要选择一个列,就像您在 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’
);
您正在使用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
您应该始终尽量避免使用 *. 更好的是永远不要使用 *.
但在您的查询中,您必须说明该列。
在这种情况下,您需要说明您选择的列。
我会建议加入
seLECT class
FROM Ships
inner join outcomes
on ships.name=outcomes.ship
WHERE result = ’sunk’