: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中是一樣的 –