2013-05-20 216 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' 
) 

子查询在性能上比直接连接更加昂贵。如果这是一个在真正的汽车系统部门(有数百万条记录)上运行的查询,那么您将希望避免不惜一切代价使用子查询,而是使用直接连接。