Lewati ke konten utama

SQL DELETE: Cara Menghapus Data dengan Aman

Pahami cara menggunakan SQL DELETE untuk menghapus rekaman dalam tabel. Pelajari sintaks kunci, alur kerja keamanan, dan teknik optimasi untuk menangani dataset besar.
Diperbarui 5 Jun 2026  · 9 mnt baca

Menghapus data adalah operasi yang berpotensi berisiko dalam SQL. Satu perintah yang ditulis dengan buruk dapat mengganggu relasi antar tabel atau bahkan menghapus seluruh dataset.

Dalam tutorial ini, saya akan menunjukkan cara kerja pernyataan DELETE, cara menggunakannya dengan benar, dan bagaimana menghindari kesalahan umum, seperti menghapus seluruh dataset, seperti yang baru saja saya sebutkan. 

Jika Anda baru dalam SQL, mulailah dengan kursus Introduction to SQL kami atau kursus Intermediate SQL jika Anda sudah memiliki sedikit pengalaman. 

Apa yang Dilakukan DELETE dalam SQL?

Sebelum melihat sintaksnya, penting untuk memahami apa yang sebenarnya dilakukan pernyataan DELETE. Berikut adalah beberapa pembedaan cara menghapus data dalam SQL.

SQL DELETE vs. menghapus baris secara konseptual

Pernyataan DELETE menghapus satu atau beberapa baris dari sebuah tabel sambil mempertahankan struktur tabel. Dengan demikian, skema tabel, yang mencakup nama kolom, tipe data, indeks, dan constraint, tetap utuh. Setelah penghapusan, tabel masih ada dan siap menerima data baru.

Bayangkan seperti menghapus entri dari buku besar, bukan merobek halamannya. Skema tetap sama; hanya rekaman terpilih yang dihapus.

SQL DELETE vs. DROP vs. TRUNCATE

Meskipun DELETE, DROP, dan TRUNCATE sama-sama menghapus data dalam beberapa bentuk, mereka memiliki tujuan yang sangat berbeda. Tabel berikut merangkum penggunaan masing-masing pernyataan:

Fitur

DELETE

TRUNCATE

DROP

Jenis Perintah

DML (Data Manipulation Language)

DDL (Data Definition Language)

DDL (Data Definition Language)

Cakupan

Menghapus baris tertentu (menggunakan klausa WHERE)

Menghapus semua baris dari sebuah tabel

Menghapus seluruh tabel beserta datanya.

Kecepatan

Lebih lambat (menghapus baris demi baris)

Lebih cepat (membebaskan halaman)

Seketika

Dapat Dibalik

Dapat di-rollback

Tidak dapat dibalik

Tidak dapat dibalik.

Struktur Tabel

Dipertahankan

Dipertahankan (dan mereset ID)

Dihapus seluruhnya

Sintaks Dasar SQL DELETE

Sekarang setelah Anda memahami cara kerja pernyataan DELETE, mari kita lihat sintaksnya dan bagaimana menerapkannya. 

Menghapus baris tertentu dengan WHERE

Klausa WHERE menentukan cakupan operasi DELETE. Klausa WHERE selalu diperlukan karena memberi tahu database tepatnya baris mana yang harus dihapus.

-- Basic DELETE syntax
DELETE FROM table_name
WHERE condition;

Menghapus semua baris dalam sebuah tabel

Jika Anda menghilangkan klausa WHERE dalam pernyataan DELETE, SQL menganggap Anda ingin menargetkan setiap baris dalam tabel. Jika Anda tidak sengaja melakukan ini, mesin database akan menelusuri setiap rekaman dan menghapusnya. Untuk setiap baris yang dihapus, dibuat entri dalam log transaksi. Jika Anda memiliki jutaan baris, ini bisa sangat lambat dan menyebabkan file log membengkak.

Praktik Aman SQL DELETE

Karena operasi DELETE bisa bersifat permanen, menerapkan praktik penghapusan yang aman akan membantu Anda memperlambat, memverifikasi niat, dan merencanakan cara memulihkan jika/ketika terjadi kesalahan.

Pratinjau baris sebelum menghapus

Sebelum menjalankan pernyataan DELETE, selalu pratinjau baris yang akan Anda hapus menggunakan pernyataan SELECT dengan kondisi WHERE yang sama yang Anda rencanakan untuk digunakan dalam DELETE. Jika pernyataan SELECT mengembalikan terlalu banyak baris, atau baris yang salah, Anda dapat memperbaiki kondisinya sebelum terjadi kerusakan. 

Sebagai contoh, kueri di bawah ini memeriksa baris dengan pesanan dibatalkan sebelum 2023-01-01, lalu menggunakan filter yang sama untuk menghapus rekaman tersebut.

-- Step 1: Preview the targets
SELECT * FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

-- Step 2: Once you've verified the list, convert to DELETE
DELETE FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

Menggunakan transaksi dan rollback

Jika Anda membungkus operasi DELETE di dalam sebuah transaksi, ini memungkinkan Anda menjalankan perintah, melihat berapa banyak baris yang terpengaruh, lalu memutuskan apakah akan menjadikannya permanen atau membatalkannya sepenuhnya. Anda kemudian dapat menggunakan ROLLBACK untuk mengembalikan data ke keadaan sebelumnya.

Kueri di bawah ini menghapus baris yang memenuhi syarat secara sementara dan kemudian memulihkannya, memungkinkan Anda mengonfirmasi dampaknya tanpa kehilangan data.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Inspect the affected row count
ROLLBACK;

Anda kemudian dapat menggunakan kueri berikut untuk secara permanen menghapus pengguna yang terakhir masuk sebelum 1 Januari 2020.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Confirm deletion of the required rows
COMMIT;

Namun, Anda harus mencatat bahwa ROLLBACK hanya mungkin jika Anda belum melakukan commit transaksi.

SQL DELETE dengan Join dan Subkueri

Dalam database dunia nyata, data jarang berdiri sendiri. Dalam banyak kasus, Anda mungkin perlu menghapus baris berdasarkan nilai yang disimpan di tabel lain, akun yang kedaluwarsa, rekaman yatim, atau entitas terkait yang tidak lagi berlaku.

Menghapus baris berdasarkan tabel lain

Menggunakan subkueri adalah pendekatan paling portabel dan paling luas didukung untuk menghapus baris berdasarkan tabel lain. Cara ini berfungsi di hampir semua varian SQL. Misalnya, kueri di bawah ini menghapus pengguna tidak aktif dari tabel Users yang memiliki akun dinonaktifkan dari tabel Accounts.

-- Delete users whose accounts have been deactivated
DELETE FROM Users
WHERE AccountId IN (
    SELECT AccountId
    FROM Accounts
    WHERE Status = 'DEACTIVATED'
);

Anda juga dapat menggunakan Join untuk menghapus baris dalam database, tetapi sintaksnya berbeda-beda menurut database, seperti yang akan kita lihat di bagian berikutnya.

Sintaks DELETE khusus database

Walaupun gagasan pernyataan DELETE sama dalam SQL, setiap database memiliki sintaks berbeda saat menggunakan JOIN untuk menghapus baris dari satu tabel berdasarkan tabel lain.

SQL Server menempatkan tabel target setelah pernyataan DELETE, lalu melakukan join di FROM. Pada contoh di bawah, alias setelah DELETE (u) menentukan tabel mana yang dihapus.

-- SQL Server: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

Di PostgreSQL, USING bertindak seperti JOIN. Hanya baris dari tabel target (Users) yang dihapus.

-- PostgreSQL: Delete users linked to deactivated accounts
DELETE FROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
  AND Accounts.Status = 'DEACTIVATED';

MySQL mengizinkan penghapusan multi-tabel tetapi memerlukan penamaan tabel secara eksplisit. Anda harus menempatkan tabel yang akan dihapus sebelum klausa FROM.

-- MySQL: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

Saya merekomendasikan mengikuti kursus Joining Data in SQL untuk mempelajari berbagai jenis join dalam SQL dan cara bekerja dengan berbagai tabel terkait di database.

SQL DELETE dan Integritas Referensial

Seperti yang kini kita ketahui, tabel jarang berdiri sendiri dalam database relasional. Mereka sering terhubung menggunakan foreign key. Karena keterkaitan ini, menghapus baris di satu tabel dapat menimbulkan konsekuensi yang tidak diinginkan.

Foreign key dan error constraint

Ketika sebuah tabel direferensikan oleh sebuah foreign key, database memberlakukan aturan tentang apa yang terjadi ketika Anda mencoba menghapus baris induk. Secara bawaan, sebagian besar database mencegah penghapusan jika baris terkait masih ada di tabel anak.

Sebagai contoh, jika Anda memiliki tabel Orders yang mereferensikan tabel Customers, menghapus pelanggan yang masih memiliki pesanan akan gagal dengan error constraint. Ini melindungi database dari berisi rekaman yatim yang tidak lagi memiliki induk yang valid.

Penghapusan berantai (cascading deletes)

Jika Anda ingin menghapus data terkait secara otomatis, Anda perlu secara eksplisit mendefinisikan aturan berantai yang menginstruksikan database cara menangani data terkait. ON DELETE CASCADE memberi tahu database untuk secara otomatis menghapus baris anak terkait saat baris induk dihapus.

Misalnya, kueri di bawah ini menginstruksikan database untuk secara otomatis menghapus semua baris di tabel Orders yang mereferensikan seorang pelanggan ketika pelanggan tersebut dihapus dari tabel Customers.

-- Parent table
CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    Name VARCHAR(100)
);

-- Child table with a cascading foreign key
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT,
    OrderDate DATE,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (CustomerId)
        REFERENCES Customers(CustomerId)
        ON DELETE CASCADE
);

Keuntungan pendekatan ini adalah menjaga database tetap bersih tanpa memerlukan beberapa pernyataan DELETE manual. Namun, Anda harus menggunakannya dengan hati-hati karena satu penghapusan dapat memicu reaksi berantai di banyak tabel, menghapus jauh lebih banyak data daripada yang diharapkan. Misalnya, Anda mungkin menghapus satu baris di tabel Departments dan tanpa sengaja menghapus 500 baris di tabel Employees.

Pertimbangan Kinerja Saat Menghapus Data

Saat Anda menggunakan pernyataan DELETE, Anda akan melihat bahwa menghapus beberapa baris berlangsung seketika, tetapi menjadi lambat jika Anda memiliki jutaan baris. Pertimbangkan praktik terbaik berikut untuk menghapus rekaman dengan aman:

DELETE vs. TRUNCATE untuk tabel besar

Seperti yang kita lihat sebelumnya, DELETE dan TRUNCATE sama-sama menghapus rekaman dengan cara berikut:

  • DELETE: Menelusuri setiap baris, memeriksa apakah memenuhi kriteria, menghapusnya, dan mencatat perubahan dalam log transaksi. Ini berat sumber daya dan lambat untuk dataset yang sangat besar. Memungkinkan pemfilteran dengan klausa WHERE dan mendukung rollback.

  • TRUNCATE: Menghapus semua baris sekalian dengan pencatatan minimal. Jauh lebih cepat tetapi tidak dapat difilter, biasanya tidak dapat di-rollback, dan diblokir oleh constraint foreign key.

Penghapusan bertahap (batch) dan operasi berdurasi lama

Jika Anda menghapus jutaan baris dalam satu pernyataan, itu dapat memperlambat aplikasi Anda secara signifikan dan bahkan menyebabkan database crash jika tidak ditangani dengan benar. Untuk mengurangi risiko ini, selalu hapus dataset besar secara bertahap (batch).

Penghapusan batch menghapus sejumlah baris terbatas setiap kali, misalnya beberapa ribu per operasi. Ini memungkinkan database tetap responsif dan memudahkan pemantauan kemajuan. Jika terjadi sesuatu yang salah, Anda dapat menghentikan proses tanpa harus me-rollback transaksi yang sangat besar.

Kesalahan Umum SQL DELETE

Berikut adalah kesalahan umum yang harus Anda waspadai saat menggunakan pernyataan DELETE untuk menghapus baris di tabel Anda:

Lupa klausa WHERE

Melupakan klausa WHERE adalah kesalahan paling umum saat menggunakan DELETE. Tanpanya, pernyataan akan menghapus setiap baris dalam tabel. Selalu pastikan Anda menggunakan klausa WHERE untuk menentukan baris yang akan dihapus. Sebagai langkah pencegahan, gunakan kebiasaan SELECT-sebelum-DELETE yang kita bahas sebelumnya untuk melihat barisnya sebelum menghapus.

Menganggap DELETE dapat dibalik

Kesalahpahaman umum lainnya adalah data yang dihapus selalu dapat dipulihkan. Anda harus mencatat bahwa, secara bawaan, pernyataan DELETE, setelah di-commit, menandai data sebagai dihapus secara fisik dari disk, kecuali Anda memiliki cadangan, replika, atau log audit.

Anda hanya dapat "membatalkan" perintah DELETE jika:

  • Dijalankan di dalam transaksi.
  • Transaksi belum di-commit.
  • Database dan storage engine mendukung rollback.

SQL DELETE di Lingkungan Produksi

Dalam sistem produksi, operasi DELETE lebih mengenai kontrol, visibilitas, dan akuntabilitas dibandingkan sekadar sintaks. Di lingkungan seperti ini, tujuannya bukan hanya menghapus data, tetapi melakukannya dengan aman dan sengaja.

Kontrol akses dan perizinan

Dalam lingkungan profesional, kemampuan untuk menghapus data harus mengikuti Prinsip Hak Istimewa Paling Minimal (Principle of Least Privilege). Tidak setiap pengguna atau akun layanan aplikasi boleh memiliki izin DELETE

Sebagian besar pengguna "Read-Only" atau alat pelaporan harus secara eksplisit ditolak hak ini. Sebagian besar perusahaan biasanya mensyaratkan “Peer Review,” di mana orang kedua harus memverifikasi klausa WHERE dari skrip delete manual sebelum dieksekusi di produksi.

Saya sarankan Anda mencoba jalur keterampilan SQL Server for Database Administrators jika Anda secara rutin merancang atau memelihara database sebagai bagian dari pekerjaan. 

Audit dan soft delete

Banyak sistem produksi menghindari hard delete karena risikonya. Sebagai gantinya, mereka menggunakan soft delete, di mana sebuah baris ditandai sebagai dihapus. Misalnya, Anda dapat menggunakan stempel waktu deleted_at atau flag is_deleted alih-alih menghapus rekaman secara fisik.

Soft delete memudahkan pemulihan, mendukung audit, dan mempertahankan data historis untuk tujuan debugging dan kepatuhan.

Kesimpulan

Hal terpenting yang perlu diingat adalah: Selalu definisikan klausa WHERE yang jelas, pratinjau baris yang terpengaruh dengan SELECT, dan gunakan transaksi kapan pun memungkinkan. Di sistem produksi, setiap penghapusan harus disengaja dan dapat diaudit. Perlakukan DELETE dengan kehati-hatian yang sama seperti saat Anda melakukan perubahan skema atau deployment, maka perintah ini akan tetap menjadi alat yang berguna, bukan kesalahan yang mahal.

Saya merekomendasikan mengikuti kursus Database Design, di mana Anda akan belajar membuat dan mengelola database serta memilih DBMS yang sesuai dengan kebutuhan Anda. Saya juga merekomendasikan mencoba jalur karier Associate Data Engineer in SQL untuk mempelajari dasar-dasar rekayasa data dan gudang data. 


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Penulis teknis Data Science dengan pengalaman langsung dalam analitik data, business intelligence, dan data science. Saya menulis konten praktis berfokus industri tentang SQL, Python, Power BI, Databricks, dan rekayasa data, yang berakar pada pekerjaan analitik dunia nyata. Tulisan saya menjembatani kedalaman teknis dan dampak bisnis, membantu para profesional mengubah data menjadi keputusan yang meyakinkan.

FAQ SQL DELETE

Apa bedanya DELETE dengan TRUNCATE atau DROP?

DELETE menghapus baris yang dipilih, TRUNCATE menghapus semua baris dengan cepat, dan DROP menghapus tabel itu sendiri.

Mengapa klausa WHERE penting dalam DELETE?

Tanpa klausa WHERE, DELETE menghapus semua baris, berisiko menyebabkan kehilangan data secara total.

Mengapa beberapa operasi DELETE gagal?

Constraint foreign key mencegah penghapusan jika baris anak yang bergantung masih ada tanpa aturan berantai.

Bagaimana saya bisa mempratinjau dengan aman apa yang akan dihapus?

Gunakan pernyataan SELECT dengan kondisi WHERE yang sama untuk meninjau baris yang terpengaruh terlebih dahulu sebelum menghapus.

Bagaimana cara menghapus dataset besar dengan aman?

Gunakan penghapusan batch untuk menghapus baris secara bertahap, agar terhindar dari transaksi berdurasi lama dan masalah kinerja.

Topik

Pelajari SQL bersama DataCamp

Kursus

Manipulasi Data di SQL

4 Hr
324.1K
Kuasai kueri SQL yang kompleks yang diperlukan untuk menjawab berbagai pertanyaan ilmu data dan menyiapkan set data yang kuat untuk analisis di PostgreSQL.
Lihat DetailRight Arrow
Mulai Kursus
Lihat Lebih BanyakRight Arrow
Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat Lebih BanyakLihat Lebih Banyak