單表刪除語句:
DELETE
[LOW_PRIORITY][IGNORE] FROM tbl_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
這里只對delete的常用參數及用法做出介紹。
說明:
low_priority:強制delete命令被延遲執行,直到沒有其它客戶端讀取本表時再執行。
ignore:使MySQL忽略delete執行所有的錯誤,而錯誤會以警告的方式返回。
order by...:表中記錄按照指定的順序進行刪除,此子句一般與limit聯用才有意義。
limit:指定刪除操作的指定行范圍。
注意:1)不能把ORDER BY或LIMIT與multiple-table UPDATE(多表更新)同時使用;
2)當delete伴隨有多個限制條件時,是將多個限制條件執行查詢操作后,再執行對應的刪除操作。
(1)簡單單表刪除
語句:delete from table_name where [條件]
示例:
mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 1 | guoding | 3200 | | 2 | dingtao | 2800 | | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | | 6 | fengfei | 3200 | | 7 | guoting | 2600 | | 8 | guoding | 3200 | | 9 | xiaohua | 3200 | +----+----------+-------+ 9 rows in set (0.00 sec) mysql> delete from staff where id=9; //通過where指定要刪除的記錄或記錄組合 Query OK, 1 row affected (0.00 sec) mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 1 | guoding | 3200 | | 2 | dingtao | 2800 | | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | | 6 | fengfei | 3200 | | 7 | guoting | 2600 | | 8 | guoding | 3200 | +----+----------+-------+ 8 rows in set (0.00 sec)
(2)刪除-排序、限制
order by...一般與limit搭配使用才有意義。
如:刪除工資最低的記錄
mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 1 | guoding | 3200 | | 2 | dingtao | 2800 | | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | | 6 | fengfei | 3200 | | 7 | guoting | 2600 | | 8 | guoding | 3200 | +----+----------+-------+ 8 rows in set (0.00 sec) mysql> delete from staff order by slary asc limit 1; //刪除工資最低的數據記錄 Query OK, 1 row affected (0.00 sec) mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 1 | guoding | 3200 | | 2 | dingtao | 2800 | | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | | 6 | fengfei | 3200 | | 8 | guoding | 3200 | +----+----------+-------+ 7 rows in set (0.00 sec)
(3)連接刪除
假設有一個post表與staff對應:
mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 1 | guoding | 3200 | | 2 | dingtao | 2800 | | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | | 6 | fengfei | 3200 | | 8 | guoding | 3200 | +----+----------+-------+ 7 rows in set (0.00 sec) mysql> select * from post; +-----+----------+-------+ | num | name | level | +-----+----------+-------+ | 1 | haotian | 3 | | 2 | guoming | 1 | | 3 | haofugui | 2 | +-----+----------+-------+ 3 rows in set (0.00 sec)
現在需要從表staff中刪除在post沒有對應記錄的記錄:
mysql> delete staff from staff left join post on staff.name=post.name where post.name is NULL; Query OK, 4 rows affected (0.00 sec) mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----------+-------+ | 3 | haofugui | 10000 | | 4 | guoming | 3500 | | 5 | haotian | 2900 | +----+----------+-------+ 3 rows in set (0.00 sec)
在上述刪除命令中,也可以引入別名,方便輸入,如:
mysql> delete A from staff as A left join post as B on A.name=B.name where B.name is NULL;
注意:NULL不可以用等號(B.name=NULL),正確的應該是B.name is NULL