我对这个SQL查询有疑问:
SELECT class
FROM Ships
WHERE name IN (SELECT ship
FROM Outcomes
WHERE result = ’sunk’);
我可以在子查询中写SELECT * From Outcomes
还是总是需要select
row
?
那么什么查询的性能最好呢?
答案 0 :(得分:2)
对于性能观点,请使用此查询
select class
FROM Ships
join outcomes on ships.name=outcomes.ship
and result like 'sunk'
答案 1 :(得分:1)
你不能把*放在这个子查询中。最好的方法是:
SELECT class
FROM Ships s
WHERE exists
(
select 1
from Outcomes o
where s.name = o.ship
and result = ’sunk’
)
答案 2 :(得分:0)
在这种情况下,您需要说明您选择的列。
我建议改为加入
seLECT class
FROM Ships
inner join outcomes
on ships.name=outcomes.ship
WHERE result = ’sunk’
答案 3 :(得分:0)
您需要选择一个列,就像在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’
);
答案 4 :(得分:0)
您正在使用In
,因此您只需要一个row
来将其与名称进行比较。
在这种特殊情况下,您可以使用Join作为替代方案。
在MySQL
中,subquery
具有同等效力,但in SQL-Server In is more performant than Join。
所以,在这种情况下,你只需返回一行。
如果您在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
,但为了便于阅读,最好返回您将使用的字段。
这个例子将是
{{1}}
答案 5 :(得分:0)
你应该总是尽量避免使用*。更好的是永远不会使用*。
但在您的查询中,您必须说明该列。