2351 kata
12 menit

Belajar SQL CRUD: INSERT, SELECT, UPDATE, dan DELETE

Pada Bab 3, kita sudah berhasil membuat database db_toko_bapakgabut beserta dua tabel: produk dan pelanggan.

Strukturnya sudah ada. Kolomnya sudah ada. Primary key juga sudah disiapkan.

Tapi ada satu masalah.

Tabelnya masih kosong.

Ibarat membuka toko, kita sudah punya bangunan, rak, dan meja kasir. Sayangnya, belum ada barang yang dijual dan belum ada pelanggan yang datang.

Nah, pada Bab 4 Series Database BapakGabut ini, kita akan mulai mengelola data menggunakan operasi CRUD.

CRUD merupakan singkatan dari:

  • Create: menambahkan data baru.
  • Read: membaca atau mengambil data.
  • Update: mengubah data yang sudah ada.
  • Delete: menghapus data.

Dalam MySQL, operasi tersebut umumnya dilakukan menggunakan perintah INSERT, SELECT, UPDATE, dan DELETE.

Kita akan mempraktikkannya langsung melalui DBeaver menggunakan database toko online yang sudah dibuat pada bab sebelumnya.

Kenapa CRUD Penting?#

Hampir semua aplikasi yang menyimpan informasi menggunakan operasi CRUD.

Misalnya, pada aplikasi toko online:

Aktivitas PenggunaOperasi CRUDPerintah SQL
Admin menambahkan produkCreateINSERT
Pengunjung melihat katalogReadSELECT
Admin mengubah harga produkUpdateUPDATE
Admin menghapus produkDeleteDELETE

Contoh lain, ketika kamu mengubah alamat pengiriman pada sebuah aplikasi, sistem kemungkinan menjalankan operasi update pada data yang tersimpan.

Ketika membuka riwayat transaksi, aplikasi melakukan operasi read.

Jadi, memahami CRUD bukan sekadar menghafal empat perintah SQL.

Kita sedang mempelajari dasar komunikasi antara aplikasi dan database.

Persiapan: Gunakan Database dari Bab 3#

Buka DBeaver dan hubungkan ke MySQL Server yang sudah dipasang pada Bab 2.

Kemudian buka SQL Editor.

Pastikan database yang digunakan adalah:

USE db_toko_bapakgabut;

Pada Bab 3, kita sudah membuat tabel produk dengan struktur berikut:

CREATE TABLE produk (
id_produk INT AUTO_INCREMENT PRIMARY KEY,
nama_produk VARCHAR(100) NOT NULL,
harga DECIMAL(12,2) NOT NULL,
stok INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

Dan tabel pelanggan:

CREATE TABLE pelanggan (
id_pelanggan INT AUTO_INCREMENT PRIMARY KEY,
nama_pelanggan VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
tanggal_daftar DATE NOT NULL
) ENGINE=InnoDB;

Kedua perintah CREATE TABLE di atas hanya sebagai pengingat struktur.

Tidak perlu menjalankannya lagi jika tabel sudah dibuat pada Bab 3.

Untuk memastikan tabel tersedia, jalankan:

SHOW TABLES;

Jika tabel produk dan pelanggan sudah muncul, kita siap melanjutkan.

1. INSERT — Menambahkan Data Baru#

Perintah INSERT digunakan untuk menambahkan baris baru ke dalam tabel.

Bentuk dasarnya:

INSERT INTO nama_tabel (kolom1, kolom2)
VALUES (nilai1, nilai2);

Kita perlu menentukan tabel tujuan, kolom yang ingin diisi, dan nilai yang akan disimpan.

Menambahkan Satu Produk#

Coba jalankan:

INSERT INTO produk (nama_produk, harga, stok)
VALUES ('Keyboard Mechanical', 350000, 15);

Query tersebut menambahkan satu produk dengan informasi:

KolomNilai
nama_produkKeyboard Mechanical
harga350000
stok15

Kenapa kita tidak mengisi id_produk?

Karena kolom tersebut menggunakan AUTO_INCREMENT. MySQL akan menghasilkan nilai ID secara otomatis.

Kenapa created_at juga tidak diisi?

Karena kolom tersebut mempunyai nilai default CURRENT_TIMESTAMP.

Jadi, kita hanya perlu mengisi kolom yang memang membutuhkan nilai dari pengguna atau aplikasi.

Menambahkan Beberapa Produk Sekaligus#

Daripada menjalankan satu query untuk setiap produk, kita bisa memasukkan beberapa baris menggunakan satu perintah INSERT.

Jalankan:

INSERT INTO produk (nama_produk, harga, stok)
VALUES
('Mouse Wireless', 150000, 25),
('Monitor 24 Inch', 1750000, 8),
('USB Flashdisk 64GB', 85000, 40),
('Headset Gaming', 275000, 12);

Dengan satu query, kita menambahkan empat produk.

Ini disebut multi-row INSERT.

Cara ini lebih praktis ketika kita ingin memasukkan beberapa baris sekaligus.

Perlu diingat, jika query yang sama dijalankan berulang kali, MySQL dapat menambahkan produk yang sama lebih dari sekali karena kita belum membuat aturan keunikan pada nama produk.

Untuk mengikuti contoh hasil pada artikel ini, jalankan query data awal hanya sekali.

Menambahkan Data Pelanggan#

Sekarang kita isi tabel pelanggan.

INSERT INTO pelanggan (
nama_pelanggan,
email,
tanggal_daftar
)
VALUES
('Andi', 'andi@example.com', '2026-10-01'),
('Budi', 'budi@example.com', '2026-10-02'),
('Citra', 'citra@example.com', '2026-10-03'),
('Dina', 'dina@example.com', '2026-10-04');

Kita sudah menambahkan empat pelanggan.

Alamat example.com di sini digunakan sebagai data contoh, bukan alamat email pelanggan sungguhan.

Sekarang database toko online kita mulai memiliki isi.

Belum ada transaksi penjualan, tetapi setidaknya rak toko sudah terisi dan pelanggan mulai berdatangan.

2. SELECT — Membaca Data dari Database#

Setelah data berhasil ditambahkan, kita perlu melihat hasilnya.

Perintah SELECT digunakan untuk mengambil data dari database.

Bentuk paling sederhana:

SELECT * FROM produk;

Tanda * berarti mengambil seluruh kolom dari tabel.

Jika sebelumnya tabel kosong dan semua query INSERT berhasil dijalankan sekali, hasilnya kurang lebih seperti berikut:

id_produknama_produkhargastok
1Keyboard Mechanical350000.0015
2Mouse Wireless150000.0025
3Monitor 24 Inch1750000.008
4USB Flashdisk 64GB85000.0040
5Headset Gaming275000.0012

Tabel di atas hanya menampilkan beberapa kolom agar mudah dibaca. Query SELECT * sebenarnya juga mengambil kolom created_at.

Nilai ID yang kamu peroleh mungkin berbeda jika tabel sebelumnya sudah pernah diisi atau ada percobaan INSERT lain.

Memilih Kolom Tertentu#

Tidak semua kebutuhan mengharuskan kita mengambil seluruh kolom.

Misalnya, kita hanya ingin menampilkan nama produk dan harga.

SELECT nama_produk, harga
FROM produk;

Hasilnya hanya berisi dua kolom tersebut.

Dalam aplikasi nyata, memilih kolom yang diperlukan umumnya lebih baik daripada selalu menggunakan SELECT *, terutama ketika tabel memiliki banyak kolom atau data yang sensitif.

Menggunakan WHERE untuk Memfilter Data#

Bagaimana kalau kita hanya ingin mencari produk tertentu?

Gunakan WHERE.

SELECT *
FROM produk
WHERE nama_produk = 'Mouse Wireless';

Query tersebut mengambil baris produk yang nama produknya sama dengan Mouse Wireless, sesuai aturan perbandingan string dan collation yang digunakan MySQL.

Kita juga bisa menggunakan operator perbandingan.

Contohnya, menampilkan produk dengan harga lebih dari Rp200.000:

SELECT nama_produk, harga
FROM produk
WHERE harga > 200000;

Beberapa operator yang sering digunakan:

OperatorArti
=Sama dengan
<> atau !=Tidak sama dengan
>Lebih besar
<Lebih kecil
>=Lebih besar atau sama dengan
<=Lebih kecil atau sama dengan

Menggabungkan Kondisi dengan AND dan OR#

Kita juga bisa menggunakan lebih dari satu kondisi.

Misalnya, mencari produk dengan harga di atas Rp100.000 dan stok minimal 10:

SELECT nama_produk, harga, stok
FROM produk
WHERE harga > 100000
AND stok >= 10;

Kedua kondisi harus terpenuhi karena kita menggunakan AND.

Kalau ingin mengambil produk yang memenuhi salah satu kondisi, gunakan OR.

SELECT nama_produk, harga, stok
FROM produk
WHERE harga < 100000
OR stok < 10;

Query tersebut menampilkan produk yang harganya di bawah Rp100.000 atau stoknya kurang dari 10.

Jika menggabungkan AND dan OR dalam query yang lebih kompleks, gunakan tanda kurung agar maksud kondisinya jelas.

Menggunakan LIKE untuk Pencarian Teks#

Misalnya, kita ingin mencari produk yang namanya mengandung kata Gaming.

SELECT *
FROM produk
WHERE nama_produk LIKE '%Gaming%';

Karakter % merupakan wildcard yang mewakili nol atau lebih karakter.

Dengan pola tersebut, MySQL mencari nilai yang mengandung teks Gaming.

Perlu diperhatikan, sensitivitas huruf besar dan kecil bergantung pada collation kolom yang digunakan.

Contoh pola lain:

PolaMakna
'Mouse%'Diawali Mouse
'%Gaming'Diakhiri Gaming
'%USB%'Mengandung USB

Pencarian seperti ini berguna untuk fitur pencarian sederhana.

Namun, untuk data besar, strategi pencarian dan penggunaan index perlu dipertimbangkan agar query tetap efisien.

Mengurutkan Data dengan ORDER BY#

Secara default, kita tidak boleh mengandalkan urutan baris hasil query tanpa ORDER BY.

Kalau ingin menampilkan produk dari harga termurah ke termahal, gunakan:

SELECT nama_produk, harga
FROM produk
ORDER BY harga ASC;

ASC berarti urutan menaik.

Sebaliknya, untuk harga termahal:

SELECT nama_produk, harga
FROM produk
ORDER BY harga DESC;

DESC berarti urutan menurun.

Kita juga bisa mengurutkan berdasarkan lebih dari satu kolom.

SELECT nama_produk, harga, stok
FROM produk
ORDER BY harga DESC, nama_produk ASC;

Membatasi Hasil dengan LIMIT#

Bayangkan tabel produk berisi ribuan barang.

Kita mungkin hanya ingin melihat lima produk pertama berdasarkan harga tertinggi.

SELECT nama_produk, harga
FROM produk
ORDER BY harga DESC
LIMIT 5;

LIMIT 5 membatasi jumlah baris hasil menjadi maksimal lima.

Penggunaan ORDER BY penting jika kita ingin hasil yang konsisten berdasarkan urutan tertentu.

Pada aplikasi dengan banyak data, kombinasi ORDER BY dan LIMIT sering digunakan sebagai bagian dari mekanisme pagination.

Mengambil Data Pelanggan#

Sekarang coba ambil data dari tabel pelanggan.

SELECT
nama_pelanggan,
email,
tanggal_daftar
FROM pelanggan
ORDER BY tanggal_daftar DESC;

Query tersebut menampilkan pelanggan berdasarkan tanggal pendaftaran terbaru terlebih dahulu.

Kalau beberapa pelanggan memiliki tanggal yang sama, urutan antarmereka tidak dijamin kecuali kita menambahkan kolom pengurutan lain, misalnya id_pelanggan.

3. UPDATE — Mengubah Data yang Sudah Ada#

Dalam aplikasi, informasi tidak selalu tetap.

Harga produk bisa berubah, stok bisa bertambah, dan informasi pelanggan bisa diperbarui.

Untuk mengubah data, kita menggunakan UPDATE.

Bentuk dasarnya:

UPDATE nama_tabel
SET nama_kolom = nilai_baru
WHERE kondisi;

Bagian paling penting untuk diperhatikan adalah WHERE.

Mengubah Harga Produk#

Misalnya, harga Mouse Wireless berubah dari Rp150.000 menjadi Rp135.000.

Sebelum mengubah data, periksa dahulu:

SELECT *
FROM produk
WHERE nama_produk = 'Mouse Wireless';

Jika hasilnya sesuai, jalankan:

UPDATE produk
SET harga = 135000
WHERE nama_produk = 'Mouse Wireless';

Kemudian periksa kembali:

SELECT nama_produk, harga
FROM produk
WHERE nama_produk = 'Mouse Wireless';

Harga produk seharusnya sudah berubah.

Perlu diperhatikan, jika terdapat beberapa baris dengan nama Mouse Wireless, query tersebut akan mengubah semuanya.

Karena itu, pada aplikasi nyata, update biasanya lebih aman dilakukan berdasarkan identifier unik seperti primary key.

UPDATE Berdasarkan Primary Key#

Misalnya, kita sudah mengetahui id_produk dari hasil query sebelumnya.

Kita dapat menggunakan:

UPDATE produk
SET harga = 135000
WHERE id_produk = 2;

Contoh tersebut mengasumsikan Mouse Wireless memiliki ID 2.

Jangan langsung menggunakan angka ID dari artikel tanpa memeriksa data di database sendiri.

Nilai AUTO_INCREMENT dapat berbeda tergantung riwayat pengisian tabel.

Mengubah Lebih dari Satu Kolom#

Kita juga bisa memperbarui beberapa kolom sekaligus.

UPDATE produk
SET
harga = 325000,
stok = 20
WHERE nama_produk = 'Keyboard Mechanical';

Query tersebut mengubah harga dan stok Keyboard Mechanical.

Mengubah Nilai Berdasarkan Nilai Sebelumnya#

Misalnya, stok USB Flashdisk bertambah 10 unit.

Daripada menghitung nilainya secara manual, kita bisa menulis:

UPDATE produk
SET stok = stok + 10
WHERE nama_produk = 'USB Flashdisk 64GB';

Jika sebelumnya stok berjumlah 40, setelah query berhasil nilainya menjadi 50.

Pola seperti ini sering digunakan untuk perubahan nilai numerik.

Tetapi dalam sistem transaksi nyata, pengurangan stok harus dirancang dengan kontrol yang tepat agar tidak terjadi masalah ketika beberapa transaksi berjalan bersamaan.

Kita akan membahas konsep transaksi lebih lanjut pada Bab 7.

Bahaya UPDATE Tanpa WHERE#

Perhatikan query berikut:

UPDATE produk
SET harga = 10000;

Query tersebut tidak memiliki kondisi WHERE.

Artinya, MySQL akan mencoba mengubah harga seluruh baris pada tabel produk menjadi 10000, jika operasi diizinkan oleh pengaturan sesi dan tidak ada kendala lain.

Jangan jalankan query tersebut pada tabel latihan utama.

Beberapa client atau konfigurasi MySQL dapat mengaktifkan safe update mode, tetapi jangan mengandalkannya sebagai satu-satunya perlindungan.

Biasakan memeriksa kondisi menggunakan SELECT sebelum menjalankan UPDATE.

4. DELETE — Menghapus Data#

Perintah DELETE digunakan untuk menghapus baris dari tabel.

Bentuk dasarnya:

DELETE FROM nama_tabel
WHERE kondisi;

Seperti UPDATE, penggunaan WHERE sangat penting.

Menghapus Produk Tertentu#

Misalnya, kita ingin menghapus produk Headset Gaming.

Pertama, periksa data yang akan dihapus:

SELECT *
FROM produk
WHERE nama_produk = 'Headset Gaming';

Jika hasilnya benar, jalankan:

DELETE FROM produk
WHERE nama_produk = 'Headset Gaming';

Kemudian periksa kembali:

SELECT *
FROM produk
WHERE nama_produk = 'Headset Gaming';

Jika tidak ada baris yang dikembalikan, berarti produk tersebut sudah tidak ditemukan dalam tabel.

Untuk aplikasi nyata, sebaiknya gunakan primary key agar baris yang dihapus dapat ditentukan dengan lebih tepat.

Bahaya DELETE Tanpa WHERE#

Perhatikan query berikut:

DELETE FROM produk;

Tanpa WHERE, perintah tersebut mencoba menghapus seluruh baris dalam tabel.

Struktur tabelnya tetap ada, tetapi isinya dapat menjadi kosong.

Jangan menjalankan contoh ini pada database utama yang sedang kita gunakan untuk mengikuti series.

Apalagi kalau datanya sudah dipakai aplikasi lain.

Menghapus seluruh data hanya karena lupa menulis WHERE bukan pengalaman belajar yang menyenangkan.

Apakah DELETE Bisa Dibatalkan?#

Jawabannya bergantung pada pengaturan transaksi dan apakah perubahan sudah di-commit.

Pada MySQL dengan InnoDB, operasi DELETE dapat di-rollback jika dilakukan dalam transaksi yang masih aktif dan belum di-commit.

Namun, pada konfigurasi autocommit yang umum digunakan, perintah DELETE dapat langsung di-commit setelah berhasil.

Jadi, jangan berasumsi bahwa data yang sudah terhapus selalu bisa dikembalikan menggunakan ROLLBACK.

Untuk data penting, diperlukan strategi backup dan pengendalian transaksi yang tepat.

5. Perbedaan DELETE, TRUNCATE, dan DROP#

Ketiga perintah ini sering dianggap sama oleh pemula, padahal fungsinya berbeda.

PerintahDampak
DELETE FROM tabel WHERE ...Menghapus baris sesuai kondisi
DELETE FROM tabelMenghapus seluruh baris tanpa menghapus struktur tabel
TRUNCATE TABLE tabelMengosongkan tabel menggunakan operasi DDL
DROP TABLE tabelMenghapus tabel beserta definisinya

TRUNCATE TABLE di MySQL umumnya lebih cepat untuk mengosongkan tabel besar dalam kondisi yang sesuai dan mereset penghitung AUTO_INCREMENT.

Namun, TRUNCATE merupakan operasi DDL yang menyebabkan implicit commit dan tidak dapat dibatalkan menggunakan ROLLBACK biasa.

DROP TABLE juga merupakan operasi DDL yang menghapus definisi tabel.

Untuk latihan CRUD, kita cukup menggunakan DELETE dengan kondisi yang jelas.

Tidak perlu mencoba TRUNCATE atau DROP pada tabel utama.

6. Urutan Aman Saat Mengubah atau Menghapus Data#

Salah satu kebiasaan penting ketika bekerja dengan database adalah memeriksa target sebelum melakukan perubahan.

Misalnya, kita ingin mengubah harga produk.

Langkah pertama:

SELECT id_produk, nama_produk, harga
FROM produk
WHERE nama_produk = 'Monitor 24 Inch';

Periksa apakah data yang muncul memang produk yang dimaksud.

Jika sudah mengetahui ID yang benar, lakukan perubahan berdasarkan ID tersebut.

Contoh, jika hasil pemeriksaan menunjukkan id_produk = 3:

UPDATE produk
SET harga = 1650000
WHERE id_produk = 3;

Lalu verifikasi:

SELECT id_produk, nama_produk, harga
FROM produk
WHERE id_produk = 3;

Cara ini lebih aman dibandingkan langsung menjalankan UPDATE tanpa memeriksa target.

Tetapi ingat, pemeriksaan SELECT sebelum UPDATE saja belum menjamin keamanan dalam sistem yang memiliki banyak pengguna atau transaksi bersamaan.

Untuk operasi penting, aplikasi tetap membutuhkan transaksi, validasi, dan mekanisme konkurensi yang sesuai.

7. Latihan Mandiri CRUD#

Sekarang waktunya mencoba sendiri.

Gunakan database db_toko_bapakgabut.

Sebelum memulai, pastikan kamu memahami bahwa query latihan berikut akan mengubah data pada tabel yang sedang digunakan.

Jika ingin mencoba tanpa memengaruhi hasil latihan utama, kamu dapat menggunakan database latihan terpisah dengan struktur tabel yang sama.

Latihan 1 — INSERT#

Tambahkan satu produk baru:

  • Nama: Webcam HD
  • Harga: Rp425.000
  • Stok: 7

Latihan 2 — SELECT#

Tampilkan nama produk dan harga untuk semua produk dengan harga di atas Rp200.000.

Urutkan dari harga paling mahal.

Latihan 3 — UPDATE#

Ubah stok Webcam HD menjadi 12.

Latihan 4 — DELETE#

Hapus Webcam HD dari tabel produk.

Pastikan kamu memeriksa data yang akan dihapus terlebih dahulu.

Coba kerjakan sebelum melihat pembahasannya.

Pembahasan Latihan#

Jawaban Latihan 1#

INSERT INTO produk (nama_produk, harga, stok)
VALUES ('Webcam HD', 425000, 7);

Jawaban Latihan 2#

SELECT nama_produk, harga
FROM produk
WHERE harga > 200000
ORDER BY harga DESC;

Jawaban Latihan 3#

Periksa produk terlebih dahulu:

SELECT id_produk, nama_produk, stok
FROM produk
WHERE nama_produk = 'Webcam HD';

Kemudian ubah stok:

UPDATE produk
SET stok = 12
WHERE nama_produk = 'Webcam HD';

Jika terdapat lebih dari satu produk dengan nama yang sama, gunakan id_produk hasil pemeriksaan sebagai kondisi UPDATE.

Jawaban Latihan 4#

Periksa dahulu:

SELECT id_produk, nama_produk
FROM produk
WHERE nama_produk = 'Webcam HD';

Kemudian hapus:

DELETE FROM produk
WHERE nama_produk = 'Webcam HD';

Jika nama produk tidak unik, gunakan primary key agar hanya baris yang dimaksud yang dihapus.

Setelah itu, verifikasi hasilnya menggunakan SELECT.

8. Hubungan CRUD dengan Backend API#

Mungkin kamu bertanya, apakah nanti aplikasi web benar-benar menjalankan query seperti ini?

Jawabannya: ya, konsepnya sama.

Misalnya, sebuah backend menyediakan endpoint untuk mengelola produk.

HTTP MethodEndpointOperasi Database
POST/api/produkINSERT
GET/api/produkSELECT
GET/api/produk/:idSELECT dengan kondisi
PUT/PATCH/api/produk/:idUPDATE
DELETE/api/produk/:idDELETE

Tabel tersebut menunjukkan pola yang umum digunakan dalam REST API, bukan aturan wajib untuk setiap aplikasi.

Ketika pengguna menekan tombol tambah produk pada frontend, backend menerima request, memvalidasi data, lalu menjalankan operasi database yang sesuai.

Namun, ada satu hal penting.

Jangan menyusun query SQL dengan menggabungkan langsung input pengguna ke dalam string SQL.

Cara tersebut dapat membuka celah SQL injection.

Gunakan parameterized query atau prepared statement yang disediakan library database.

Kita tidak membahas implementasi Node.js secara lengkap di bab ini karena fokus kita masih pada SQL.

Tetapi sekarang kamu sudah bisa melihat hubungan antara query yang dijalankan di DBeaver dan operasi yang dilakukan aplikasi sehari-hari.

Kesimpulan#

Pada Bab 4 ini, kita sudah mempelajari empat operasi dasar database.

INSERT digunakan untuk menambahkan data baru.

SELECT digunakan untuk membaca data, termasuk melakukan filter, pencarian, pengurutan, dan pembatasan hasil.

UPDATE digunakan untuk mengubah data yang sudah tersimpan.

DELETE digunakan untuk menghapus baris tertentu.

Kita juga sudah mempelajari pentingnya menggunakan kondisi WHERE, memeriksa target perubahan, dan berhati-hati terhadap operasi yang dapat memengaruhi banyak baris sekaligus.

Sekarang database toko online kita tidak lagi sekadar kumpulan tabel kosong.

Kita sudah memiliki data produk dan pelanggan yang dapat dikelola menggunakan SQL.

Pada Bab 5, kita akan mempelajari relasi tabel MySQL, foreign key, dan JOIN.

Kita akan mulai menghubungkan pelanggan dengan pesanan serta produk yang dibeli.

Karena kalau toko online sudah punya produk dan pelanggan, langkah berikutnya tentu membuat mereka bisa bertransaksi.

Sampai jumpa di artikel berikutnya, Gabuters!

Bagian 4 dari 8Tulisan ini bagian dari seri

Bagikan Artikel

Buat poster berbagi atau salin tautan artikel ini.

Lanjut membaca

Bacaan terkait

Berdasarkan tag dan kategori yang sama

Coba jalur lain

Pilihan konsisten dari artikel lain