SQLのdeleteについてまとめています。
SQL deleteの構文
SQLのdeleteはレコードを削除します。whereによる条件指定が可能です。例えば、MySQLでのdeleteの構文は以下の通りです。
DELETE FROM テーブル名 [ WHERE 条件 ] [ ORDER BY ソート指定 ] [ LIMIT 件数制限 ]
order byによるソート指定は、単体ではあまり意味がありませんが、limitで削除件数を指定した場合にソート結果の先頭から指定件数だけ削除することが可能になります。
なお、order byとlimitの指定はMySQLの独自拡張です。
SQL deleteの使い方
deleteでソート先頭から、指定件数だけデータを削除する
deleteにorder byによるソート指定とlimitによる削除件数を指定した例です。
emp_no(社員番号)でソートして、データの先頭からlimit 5で削除件数を5件に指定しています。delete文実行後、データを確認すると、emp_no 10001~10005が削除されていることが確認できました。
mysql> select * from employees_copy limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec) mysql> delete from employees_copy order by emp_no limit 5; Query OK, 5 rows affected (0.31 sec) mysql> select * from employees_copy limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 | | 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 | | 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL DELETEで、データベース・テーブルの行を削除する方法
MySQL以外でソート順削除を行うには、Where句のサブクエリでソート指定する
MySQL以外の、delete文でorder byやlimitが使えないDBMSでは、where句のサブクエリで条件を指定します。
例えば、SQL Serverの場合は以下のようになります。削除すべきPurchaseOrderDetailIDをサブクエリでDueDateでソートしたデータの先頭10件分から取得しています。
DELETE FROM Purchasing.PurchaseOrderDetail WHERE PurchaseOrderDetailID IN (SELECT TOP 10 PurchaseOrderDetailID FROM Purchasing.PurchaseOrderDetail ORDER BY DueDate ASC); GO
参考)DELETE (Transact-SQL) – SQL Server | Microsoft Docs
まとめ
- SQLのdeleteはデータを削除する。DBMSごとに独自拡張あり
- MySQLのdeleteはorder byとlimitでソート順件数指定削除が可能
- MySQL以外は、サブクエリで条件指定することでソート順に件数指定削除が可能