Skip to main content

MySQL DELETE Statement

In database management, removing data is just as important as adding or updating it. MySQL's DELETE statement lets you remove records from your database tables when they're no longer needed. This operation is permanent, so understanding how to use it correctly is crucial for maintaining your data integrity.

Introduction to DELETE Statements

The DELETE statement removes one or more rows from a table based on conditions you specify. Unlike dropping a table, which removes the entire table structure, the DELETE statement only removes data while preserving the table structure.

Basic Syntax

sql
DELETE FROM table_name
WHERE condition;

The basic components of a DELETE statement are:

  • DELETE FROM followed by the table name
  • WHERE clause that specifies which records to delete
Warning

If you omit the WHERE clause, all records will be deleted from the table! Always double-check your DELETE statements before executing them.

Simple DELETE Examples

Deleting a Single Record

Let's start with a basic example. Imagine we have a students table:

sql
SELECT * FROM students;

Output:

+----+--------------+------+-------------+
| id | name | age | department |
+----+--------------+------+-------------+
| 1 | John Smith | 20 | Computer |
| 2 | Jane Doe | 21 | Physics |
| 3 | Mike Johnson | 22 | Mathematics |
| 4 | Lisa Brown | 20 | Computer |
+----+--------------+------+-------------+

To delete a student with id 3:

sql
DELETE FROM students 
WHERE id = 3;

Output:

Query OK, 1 row affected (0.05 sec)

Now if we select all records again:

sql
SELECT * FROM students;

Output:

+----+------------+------+------------+
| id | name | age | department |
+----+------------+------+------------+
| 1 | John Smith | 20 | Computer |
| 2 | Jane Doe | 21 | Physics |
| 4 | Lisa Brown | 20 | Computer |
+----+------------+------+------------+

Deleting Multiple Records

You can delete multiple records that match a condition:

sql
DELETE FROM students 
WHERE department = 'Computer';

Output:

Query OK, 2 rows affected (0.07 sec)

This would remove all students in the Computer department.

Advanced DELETE Operations

Using Multiple Conditions

You can combine multiple conditions using logical operators like AND and OR:

sql
DELETE FROM students 
WHERE age > 20 AND department = 'Physics';

This would delete all Physics students older than 20.

Using LIMIT to Control Deletion

You can limit the number of rows deleted with the LIMIT clause:

sql
DELETE FROM students 
WHERE age < 21
LIMIT 5;

This would delete up to 5 students under 21 years old.

DELETE with ORDER BY

You can also combine DELETE with ORDER BY to determine which rows to delete when using LIMIT:

sql
DELETE FROM students
WHERE department = 'Computer'
ORDER BY age DESC
LIMIT 2;

This deletes the 2 oldest students from the Computer department.

DELETE with JOIN

MySQL allows you to delete records based on matches in multiple tables using JOIN:

Example Database Schema

Let's consider two tables: orders and customers:

customers table:

+----+------------+-----------+
| id | name | status |
+----+------------+-----------+
| 1 | Company A | active |
| 2 | Company B | inactive |
| 3 | Company C | active |
+----+------------+-----------+

orders table:

+----+-------------+------------+--------+
| id | customer_id | order_date | amount |
+----+-------------+------------+--------+
| 1 | 1 | 2023-01-15 | 500.00 |
| 2 | 2 | 2023-01-20 | 200.00 |
| 3 | 2 | 2023-02-05 | 300.00 |
| 4 | 3 | 2023-02-10 | 150.00 |
+----+-------------+------------+--------+

To delete all orders from inactive customers:

sql
DELETE orders
FROM orders
JOIN customers ON orders.customer_id = customers.id
WHERE customers.status = 'inactive';

Output:

Query OK, 2 rows affected (0.09 sec)

This removes orders with ids 2 and 3, since they belong to Company B (inactive).

Safe DELETE Practices

Using Transactions

Transactions allow you to revert changes if something goes wrong:

sql
START TRANSACTION;
DELETE FROM students WHERE age < 18;
-- Check if deletion was successful or if you deleted too many records
-- If everything is good:
COMMIT;
-- If you made a mistake:
-- ROLLBACK;

Testing with SELECT First

Before performing a DELETE, use a SELECT with the same conditions to preview which records will be affected:

sql
-- Preview which records will be deleted
SELECT * FROM students WHERE department = 'Physics';

-- If the results look correct, then run:
-- DELETE FROM students WHERE department = 'Physics';

Real-World Applications

Data Cleaning

Remove duplicate entries from a table:

sql
DELETE t1 FROM contacts t1
INNER JOIN contacts t2
WHERE t1.id > t2.id AND t1.email = t2.email;

This keeps the record with the lowest ID for each email address and deletes duplicates.

Maintenance Tasks

Delete old log entries:

sql
DELETE FROM system_logs
WHERE log_date < DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY);

This removes log entries older than 90 days.

User Management

Delete inactive user accounts:

sql
DELETE FROM users
WHERE last_login < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
AND account_status = 'inactive';

Performance Considerations

For large tables, DELETE operations can be resource-intensive. Consider these approaches:

Batch Deletes

For large deletions, process in smaller batches:

sql
-- Delete in batches of 1000
DELETE FROM large_table
WHERE create_date < '2020-01-01'
LIMIT 1000;
-- Repeat until all matching rows are deleted

Use Indexes

Ensure your WHERE clause uses indexed columns for faster deletion:

sql
-- Add an index if needed
CREATE INDEX idx_order_date ON orders(order_date);

-- Then delete using that column
DELETE FROM orders
WHERE order_date < '2020-01-01';

Error Handling

MySQL may prevent deletion if it would violate foreign key constraints. For example, trying to delete a customer who has associated orders might fail.

To handle this, you can:

  1. Delete child records first
  2. Use ON DELETE CASCADE in your table design
  3. Temporarily disable foreign key checks (use with caution):
sql
SET foreign_key_checks = 0;
DELETE FROM customers WHERE id = 1;
SET foreign_key_checks = 1;
warning

Disabling foreign key checks can lead to data inconsistency. Use this approach only when absolutely necessary and understand the implications.

Summary

The MySQL DELETE statement is a powerful tool for removing data from your database:

  • Basic syntax: DELETE FROM table_name WHERE condition;
  • Always use a WHERE clause unless you intend to empty the entire table
  • You can combine DELETE with JOIN, ORDER BY, and LIMIT
  • Use transactions for safer deletion operations
  • Preview deletions with SELECT statements
  • Consider performance implications for large tables

Remember that DELETE operations are permanent and cannot be undone unless performed within a transaction that hasn't been committed.

Exercises

  1. Create a products table with columns for id, name, price, and category. Insert at least 10 records and write a DELETE statement to remove all products with a price less than $10.

  2. Create two related tables: authors and books. Delete all books by a specific author without deleting the author record.

  3. Write a DELETE statement that removes duplicate email addresses from a subscribers table, keeping only the most recently added record for each email.

Additional Resources

Happy data managing!



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)