2013-05-20 281 views
4

嗨,大家好做一些更多的修改,如何做到以下幾點:MYSQL刪除記錄

刪除屬於「A威爾克斯」甲殼蟲

person (driver-id, name, address) 
car (license, model, year) 
accident (report-number, date, location) 
owns (driver-id, license) 
participated (driver-id, car, report-number, damage-amount) 

這裏就是我想出了:

DELETE FROM car 
WHERE model = 'beetle' 

但是我知道這是錯誤的,因爲它會刪除所有的甲殼蟲車輛,而不僅僅是A Wilks所擁有的車輛。

+2

你可以寫一個('SELECT')查詢來顯示「beetle」並擁有所有者「A」的汽車嗎?如果是的話,可以很容易地將查詢變成一個'DELETE'語句。 –

回答

5
DELETE FROM car 
WHERE model = 'beetle' 
AND license = (
    SELECT o.license from owns o INNER JOIN person p 
    ON o.driver-id = p.driver-id 
    WHERE p.name = 'A Wilks' 
) 
-3

我建議你添加車主的車,做:

DELETE FROM car 
WHERE model = 'beetle' and owner = 'ownername' 

這是行不通的,除非你有列入carowner

+0

爲什麼downvote ??? – pattyd

+0

你不能在sql中有兩個WHERE。所以你應該擺脫其中一個 – greedybuddha

+0

好的謝謝!我注意到另一個人拖着在哪裏,所以我認爲我做錯了。事實證明我是對的!謝謝@greedybuddha! – pattyd

1
DELETE FROM car 
WHERE model = 'Beetle' AND license IN (
    SELECT license 
    FROM owns 
    INNER JOIN Person ON owns.driver_id = person.driver_id 
    WHERE person_name = 'A Wilks' 

你可以在查詢的第二行中使用license =而不是license IN如果你一定會有屬於「A威爾克斯」只是一個甲蟲。

請考慮坐下來看看MySQL的副本並嘗試一些查詢;你會更好的學習材料:)

0

delete from car where model ='beetle' and licence=(select licence owns INNER JOIN Person ON owns.driver_id = person.driver_id WHERE person_name = 'A Wilks')

0

通過Philippinedev給出的答案是一個很好的一個,我想說明爲什麼它比答案更好的技術,使用子查詢。

他的回答是使用連接語法(最佳性能和控制):

DELETE FROM car 
USING car 
INNER JOIN owns 
INNER JOIN person 
WHERE car.license=owns.license 
AND car.model='Beetle' 
AND owns.driver-id=person.driver-id 
AND person.name='A Wilks'; 

他用執行與連接表的查詢語法,並從DELETE FROM子句中的表中刪除任何匹配的記錄。另一種方法使用子查詢格式(易碼,表現較差):

DELETE FROM car 
WHERE model = 'beetle' 
AND license = (
    SELECT o.license from owns o INNER JOIN person p 
    ON o.driver-id = p.driver-id 
    WHERE p.name = 'A Wilks' 
) 

子查詢在性能上比直接連接更加昂貴。如果這是一個在真正的汽車系統部門(有數百萬條記錄)上運行的查詢,那麼您將希望避免不惜一切代價使用子查詢,而是使用直接連接。