:SQL子查询什么有我有一个关于这个SQL查询问题的最佳性能
SELECT class
FROM Ships
WHERE name IN (SELECT ship
FROM Outcomes
WHERE result = ’sunk’);
我可以写在子查询SELECT * From Outcomes
还是我总是需要一个select
row
?
然后什么查询具有最佳性能?
:SQL子查询什么有我有一个关于这个SQL查询问题的最佳性能
SELECT class
FROM Ships
WHERE name IN (SELECT ship
FROM Outcomes
WHERE result = ’sunk’);
我可以写在子查询SELECT * From Outcomes
还是我总是需要一个select
row
?
然后什么查询具有最佳性能?
你不能把*放在这个子查询中。最好的办法是:
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’
您需要选择一列,因为你在你的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’
);
对于视图使用性能点这个查询
select class
FROM Ships
join outcomes on ships.name=outcomes.ship
and result like 'sunk'
您正在使用In
,因此您只需要一个row
即可将其与名称进行比较。 在这种特殊情况下,您可以使用Join作为替代方案。 MySQL
同样表现,但是in SQL-Server In is more performant than 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
您应尽量避免使用*。更好的是永远不会使用*。
但在您的查询中,您必须声明该列。
我阿西夫同意以下 选择类 船舶 上ships.name = outcomes.ship 加入的结果,并导致像“沉没” 但你的数据库设计,甚至可能会更好,当你有一个您的“结果”表中的外键与您的“船舶”表的ID链接,而不是使用名称。 (使用更少的存储空间并防止输入错误) SELECT class FROM Ship INNER JOIN结果ON ships.Id = outcomes.shipId and result ='sunk' – KouryouChairudo
如果他使用的SQL服务器这可能是性能较低。在MySQL中是一样的 –