DELETE
The DELETE statement is used to delete records from a table.
DELETE all rows
Section titled “DELETE all rows”Omitting a WHERE clause will delete all rows from a table.
DELETE FROM EmployeesSee TRUNCATE documentation for details on how TRUNCATE performance can be better because it ignores triggers and indexes and logs to just delete the data.
DELETE certain rows with WHERE
Section titled “DELETE certain rows with WHERE”This will delete all rows that match the WHERE criteria.
DELETE FROM EmployeesWHERE FName = 'John'TRUNCATE clause
Section titled “TRUNCATE clause”Use this to reset the table to the condition at which it was created. This deletes all rows and resets values such as auto-increment. It also doesn’t log each individual row deletion.
TRUNCATE TABLE EmployeesDELETE certain rows based upon comparisons with other tables
Section titled “DELETE certain rows based upon comparisons with other tables”It is possible to DELETE data from a table if it matches (or mismatches) certain data in other tables.
Let’s assume we want to DELETEdata from Source once its loaded into Target.
DELETE FROM SourceWHERE EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter FROM Target Where Source.ID = Target.ID )Most common RDBMS implementations (e.g. MySQL, Oracle, PostgresSQL, Teradata) allow tables to be joined during DELETE allowing more complex comparison in a compact syntax.
Adding complexity to original scenario, let’s assume Aggregate is built from Target once a day and does not contain the same ID but contains the same date. Let us also assume that we want to delete data from Source only after the aggregate is populated for the day.
On MySQL, Oracle and Teradata this can be done using:
DELETE FROM SourceWHERE Source.ID = TargetSchema.Target.ID AND TargetSchema.Target.Date = AggregateSchema.Aggregate.DateIn PostgreSQL use:
DELETE FROM SourceUSING TargetSchema.Target, AggregateSchema.AggregateWHERE Source.ID = TargetSchema.Target.ID AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDateThis essentially results in INNER JOINs between Source, Target and Aggregate. The deletion is performed on Source when the same IDs exist in Target AND date present in Target for those IDs also exists in Aggregate.
Same query may also be written (on MySQL, Oracle, Teradata) as:
DELETE SourceFROM Source, TargetSchema.Target, AggregateSchema.AggregateWHERE Source.ID = TargetSchema.Target.ID AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDateExplicit joins may be mentioned in Delete statements on some RDBMS implementations (e.g. Oracle, MySQL) but not supported on all platforms (e.g. Teradata does not support them)
Comparisons can be designed to check mismatch scenarios instead of matching ones with all syntax styles (observe NOT EXISTS below)
DELETE FROM SourceWHERE NOT EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter FROM Target Where Source.ID = Target.ID )Syntax
Section titled “Syntax”- DELETE FROM TableName [WHERE Condition] [LIMIT count]