1770 kata
9 menit

Belajar SQL Dasar: CREATE TABLE, Tipe Data, dan Primary Key

Pada artikel sebelumnya, kita sudah berhasil memasang MySQL dan menghubungkannya ke DBeaver.

Bahkan, kita sudah mencoba menjalankan query sederhana seperti SELECT VERSION() dan SELECT NOW().

Tapi kalau dipikir-pikir, sampai sekarang database kita belum punya data sendiri.

Kita baru berhasil menyapa MySQL, belum benar-benar memintanya bekerja.

Nah, pada Bab 3 Series Database BapakGabut ini, kita akan mulai membuat database dan tabel menggunakan SQL.

Kita juga akan mengenal tipe data, primary key, dan beberapa aturan penting yang membantu menjaga struktur data tetap rapi.

Supaya pembahasannya tidak hanya teori, kita akan menggunakan contoh aplikasi toko online sederhana.

Database yang kita buat sekarang akan digunakan lagi pada bab-bab berikutnya. Jadi, sebaiknya simpan query yang kita pelajari.

Apa Itu SQL?#

SQL adalah singkatan dari Structured Query Language.

SQL merupakan bahasa yang digunakan untuk berinteraksi dengan database relasional.

Dengan SQL, kita bisa membuat tabel, menambahkan data, mengambil data, memperbarui data, hingga mengatur hubungan antartabel.

Secara umum, perintah SQL sering dikelompokkan berdasarkan fungsinya.

KelompokFungsiContoh
DDLMengatur struktur databaseCREATE, ALTER, DROP
DMLMengelola dataINSERT, UPDATE, DELETE
DQLMengambil dataSELECT
DCLMengatur hak aksesGRANT, REVOKE
TCLMengendalikan transaksiCOMMIT, ROLLBACK

Pembagian ini merupakan pengelompokan yang umum digunakan dalam pembelajaran SQL. Beberapa referensi memasukkan SELECT ke dalam DML, bukan memisahkannya sebagai DQL.

Untuk sekarang, kita akan fokus pada DDL (Data Definition Language), khususnya perintah CREATE DATABASE dan CREATE TABLE.

Membuat Database dengan CREATE DATABASE#

Langkah pertama adalah membuat database untuk aplikasi toko online kita.

Buka DBeaver, pilih koneksi MySQL yang sudah dibuat pada Bab 2, kemudian buka SQL Editor.

Jalankan query berikut:

CREATE DATABASE db_toko_bapakgabut;

Perintah CREATE DATABASE digunakan untuk membuat database baru.

Sedangkan db_toko_bapakgabut merupakan nama database yang kita tentukan.

Nama tersebut bukan aturan wajib dari MySQL. Kamu bisa menggunakan nama lain, tetapi untuk mengikuti series ini sebaiknya gunakan nama yang sama agar contoh query pada bab berikutnya tetap cocok.

Setelah berhasil, database baru akan tersedia di MySQL.

Jika belum terlihat pada Database Navigator DBeaver, coba lakukan refresh.

Bagaimana Kalau Database Sudah Ada?#

Jika query tadi dijalankan lagi, MySQL bisa menampilkan error karena database dengan nama tersebut sudah tersedia.

Untuk menghindarinya, kita bisa menggunakan:

CREATE DATABASE IF NOT EXISTS db_toko_bapakgabut;

Bagian IF NOT EXISTS meminta MySQL membuat database hanya jika database dengan nama tersebut belum ada.

Perlu diingat, perintah ini tidak otomatis memperbaiki atau mengubah struktur database yang sudah ada.

Memilih Database dengan USE#

Setelah database dibuat, kita perlu menentukan database yang akan digunakan.

Jalankan:

USE db_toko_bapakgabut;

Perintah USE memilih database aktif untuk sesi koneksi MySQL tersebut.

Dengan begitu, ketika kita membuat tabel tanpa menyebutkan nama database secara lengkap, MySQL akan menggunakan db_toko_bapakgabut.

Kita juga bisa memeriksa database yang sedang aktif menggunakan:

SELECT DATABASE();

Jika berhasil, hasilnya adalah:

db_toko_bapakgabut

Di DBeaver, pastikan SQL Editor menggunakan koneksi yang benar. Jika membuka editor baru atau berpindah koneksi, periksa kembali database aktifnya.

Mengenal Struktur Tabel#

Sebelum membuat tabel, kita perlu menentukan informasi apa saja yang akan disimpan.

Untuk toko online sederhana, kita mulai dengan dua tabel:

  1. produk, untuk menyimpan informasi barang yang dijual.
  2. pelanggan, untuk menyimpan informasi pelanggan.

Tabel produk akan memiliki struktur berikut:

KolomTipe DataKeterangan
id_produkINTID unik produk
nama_produkVARCHAR(100)Nama produk
hargaDECIMAL(12,2)Harga produk
stokINTJumlah stok
created_atDATETIMEWaktu data dibuat

Sedangkan tabel pelanggan:

KolomTipe DataKeterangan
id_pelangganINTID unik pelanggan
nama_pelangganVARCHAR(100)Nama pelanggan
emailVARCHAR(150)Email pelanggan
tanggal_daftarDATETanggal pendaftaran

Kenapa data produk dan pelanggan dipisahkan?

Karena keduanya merupakan jenis informasi yang berbeda.

Dengan memisahkannya ke tabel masing-masing, struktur database menjadi lebih mudah dipahami dan dikembangkan.

Nanti ketika kita membuat tabel pesanan, kedua tabel tersebut bisa dihubungkan melalui relasi.

Mengenal Tipe Data MySQL#

Setiap kolom pada tabel MySQL harus memiliki tipe data.

Tipe data menentukan jenis nilai yang dapat disimpan dalam kolom tersebut.

Misalnya, nama produk cocok disimpan sebagai teks, sedangkan jumlah stok cocok disimpan sebagai angka bulat.

Mari kita kenali beberapa tipe data yang sering digunakan.

1. INT untuk Angka Bulat#

INT digunakan untuk menyimpan bilangan bulat.

Contohnya:

stok INT

Kolom tersebut dapat menyimpan nilai seperti 10, 25, atau 100.

Tipe ini cocok untuk jumlah stok, ID numerik, atau nilai lain yang tidak membutuhkan pecahan.

Namun, tidak semua angka sebaiknya menggunakan INT.

Nomor telepon, misalnya, lebih cocok disimpan sebagai teks karena dapat mengandung angka nol di depan, tanda tambah, dan tidak digunakan untuk operasi matematika.

2. VARCHAR untuk Teks#

VARCHAR digunakan untuk menyimpan teks dengan panjang bervariasi hingga batas yang ditentukan.

Contohnya:

nama_produk VARCHAR(100)

Artinya, kolom tersebut dapat menyimpan teks hingga 100 karakter sesuai aturan karakter set yang digunakan.

Tipe ini cocok untuk nama produk, nama pelanggan, email, dan informasi teks lainnya.

3. DECIMAL untuk Nilai Desimal yang Presisi#

Untuk menyimpan harga, kita menggunakan:

harga DECIMAL(12,2)

DECIMAL(12,2) berarti nilai memiliki maksimal 12 digit secara keseluruhan, dengan 2 digit di belakang koma desimal.

Contohnya:

15000.00
27500.50
125000.75

Kenapa tidak menggunakan FLOAT?

Karena FLOAT merupakan tipe bilangan floating-point yang bersifat aproksimasi.

Untuk nilai uang yang membutuhkan representasi desimal secara tepat, DECIMAL umumnya lebih sesuai.

Perlu diingat, DECIMAL membantu menjaga ketepatan penyimpanan nilai desimal, tetapi aturan pembulatan dan perhitungan bisnis tetap perlu dirancang dengan benar.

4. DATE untuk Tanggal#

DATE digunakan untuk menyimpan tanggal tanpa informasi waktu.

Contohnya:

tanggal_daftar DATE

Nilai tanggal MySQL biasanya ditulis dalam format:

2026-10-10

Format tersebut mengikuti pola tahun-bulan-hari.

5. DATETIME untuk Tanggal dan Waktu#

DATETIME digunakan untuk menyimpan tanggal sekaligus waktu.

Contohnya:

created_at DATETIME

Nilainya dapat berbentuk:

2026-10-10 09:30:00

Tipe ini cocok untuk mencatat waktu pembuatan atau perubahan data.

Berbeda dengan TIMESTAMP, tipe DATETIME tidak melakukan konversi zona waktu secara otomatis berdasarkan pengaturan zona waktu sesi MySQL.

Untuk tutorial ini, kita cukup menggunakan DATETIME.

Membuat Tabel Produk dengan CREATE TABLE#

Sekarang kita mulai membuat tabel pertama.

Pastikan database db_toko_bapakgabut sudah dipilih.

Kemudian jalankan:

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;

Query tersebut membuat tabel bernama produk dengan lima kolom.

Mari kita bahas bagian-bagian pentingnya.

PRIMARY KEY#

Perhatikan bagian:

id_produk INT AUTO_INCREMENT PRIMARY KEY

PRIMARY KEY digunakan untuk menentukan kolom atau kombinasi kolom yang mengidentifikasi setiap baris secara unik.

Pada tabel produk, kita menggunakan id_produk sebagai primary key.

Artinya, tidak boleh ada dua produk dengan nilai id_produk yang sama.

Kolom primary key juga tidak boleh bernilai NULL.

AUTO_INCREMENT#

AUTO_INCREMENT membuat MySQL menghasilkan nilai angka berikutnya secara otomatis ketika kita menambahkan data tanpa menentukan nilai ID secara eksplisit.

Misalnya, produk pertama memperoleh ID 1, produk kedua 2, dan seterusnya pada tabel baru.

Namun, jangan menganggap AUTO_INCREMENT selalu menghasilkan nomor yang berurutan tanpa celah.

Nilai ID bisa memiliki lompatan, misalnya akibat transaksi yang dibatalkan atau operasi insert tertentu.

Jadi, AUTO_INCREMENT cocok untuk menghasilkan identifier, bukan untuk menjamin nomor urut tanpa celah.

NOT NULL#

Perhatikan:

nama_produk VARCHAR(100) NOT NULL

NOT NULL berarti kolom tersebut tidak boleh menyimpan nilai NULL.

Dengan aturan ini, MySQL akan menolak penyimpanan NULL pada kolom nama_produk.

Namun, NOT NULL tidak otomatis melarang teks kosong seperti ''.

Kalau aplikasi ingin memastikan nama produk benar-benar diisi, kita tetap membutuhkan validasi yang sesuai.

DEFAULT#

Pada kolom stok, kita menggunakan:

stok INT NOT NULL DEFAULT 0

Artinya, jika kita menambahkan produk tanpa menentukan nilai stok, MySQL akan menggunakan nilai default 0.

Sedangkan:

created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

Meminta MySQL mengisi waktu saat ini sebagai nilai default ketika baris baru dibuat dan kolom tersebut tidak diberi nilai secara eksplisit.

ENGINE=InnoDB#

Pada bagian akhir terdapat:

ENGINE=InnoDB

InnoDB adalah storage engine MySQL yang mendukung transaksi dan foreign key.

Kita memilih InnoDB karena pada bab berikutnya akan belajar relasi tabel dan transaksi.

Membuat Tabel Pelanggan#

Setelah tabel produk berhasil dibuat, sekarang kita membuat tabel pelanggan.

Jalankan:

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;

Tabel ini mempunyai empat kolom.

id_pelanggan menjadi primary key, sedangkan nama_pelanggan, email, dan tanggal_daftar menyimpan informasi pelanggan.

Mungkin kamu bertanya, kenapa email belum diberi aturan UNIQUE?

Untuk latihan awal, kita sengaja menggunakan struktur yang sederhana.

Pada aplikasi nyata, email yang digunakan sebagai identitas akun biasanya membutuhkan aturan keunikan sesuai kebutuhan sistem.

Tetapi perlu diingat, aturan keunikan email juga harus mempertimbangkan normalisasi nilai dan kebijakan aplikasi.

Melihat Tabel yang Sudah Dibuat#

Setelah kedua query berhasil, kita bisa melihat daftar tabel dengan:

SHOW TABLES;

Hasilnya seharusnya memuat:

pelanggan
produk

Untuk melihat struktur tabel produk, jalankan:

DESCRIBE produk;

Atau:

DESC produk;

MySQL akan menampilkan informasi seperti nama kolom, tipe data, apakah kolom mengizinkan NULL, key, dan nilai default.

Kita juga bisa melihat perintah pembentukan tabel menggunakan:

SHOW CREATE TABLE produk;

Perintah ini berguna ketika kita ingin mengetahui struktur tabel secara lebih lengkap, termasuk constraint dan pengaturan lainnya.

Di DBeaver, kamu juga bisa melihat tabel melalui Database Navigator setelah melakukan refresh.

Mengenal Constraint dalam Database#

Tadi kita sudah menggunakan beberapa aturan pada tabel.

Aturan tersebut dikenal sebagai constraint.

Constraint membantu menjaga data agar memenuhi ketentuan yang sudah ditetapkan.

Contohnya:

Constraint atau atributFungsi
PRIMARY KEYMengidentifikasi setiap baris secara unik
NOT NULLMelarang nilai NULL
UNIQUEMencegah nilai duplikat sesuai aturan keunikan
DEFAULTMenentukan nilai bawaan jika tidak diberikan
FOREIGN KEYMenjaga hubungan referensial antartabel

Perlu diperhatikan, DEFAULT adalah bagian dari definisi nilai bawaan kolom dan AUTO_INCREMENT merupakan atribut kolom MySQL; keduanya tidak selalu dikelompokkan sebagai constraint dalam pengertian formal.

Pada bab ini kita menggunakan aturan dasar terlebih dahulu.

Foreign key akan dibahas lebih lanjut ketika mempelajari relasi tabel.

Kesalahan Umum Saat Membuat Tabel#

Ada beberapa kesalahan yang sering terjadi ketika baru belajar SQL.

1. Lupa Memilih Database#

Misalnya, kamu langsung menjalankan CREATE TABLE tanpa memilih database aktif.

MySQL dapat menampilkan pesan:

No database selected

Solusinya, jalankan:

USE db_toko_bapakgabut;

Kemudian ulangi perintah pembuatan tabel.

2. Menjalankan CREATE TABLE Dua Kali#

Jika tabel sudah ada, menjalankan perintah CREATE TABLE dengan nama yang sama akan menghasilkan error.

Untuk membuat tabel hanya jika belum tersedia, kita bisa menggunakan:

CREATE TABLE IF NOT EXISTS contoh (
id INT PRIMARY KEY
);

Tetapi ingat, IF NOT EXISTS tidak otomatis menyesuaikan struktur tabel lama dengan struktur yang baru kita tulis.

3. Salah Memilih Tipe Data#

Misalnya, menyimpan harga menggunakan VARCHAR.

Secara teknis, kita bisa menyimpan teks angka seperti '15000', tetapi operasi matematika dan pengurutan dapat menjadi tidak sesuai dengan yang diharapkan jika data diperlakukan sebagai teks.

Karena itu, gunakan tipe data yang sesuai dengan makna informasi.

4. Menggunakan Nama Kolom yang Tidak Jelas#

Nama seperti data1, nilai2, atau kolom_baru mungkin terlihat praktis saat membuat tabel.

Tetapi beberapa bulan kemudian, kita sendiri bisa lupa maksudnya.

Lebih baik gunakan nama yang menggambarkan isi data, seperti nama_produk, harga, atau tanggal_daftar.

5. Menghapus Tabel Tanpa Memahami Dampaknya#

MySQL memiliki perintah:

DROP TABLE nama_tabel;

Perintah tersebut digunakan untuk menghapus tabel.

Jangan menjalankannya pada tabel yang masih berisi data penting.

Dalam MySQL, operasi DDL seperti DROP TABLE umumnya menyebabkan implicit commit dan tidak dapat dibatalkan menggunakan ROLLBACK biasa.

Jadi, jangan menganggap semua perubahan database bisa dikembalikan hanya dengan mengetik ROLLBACK.

Latihan Mandiri#

Sekarang coba lakukan latihan berikut.

Latihan 1

Buat database bernama db_latihan_bapakgabut.

Latihan 2

Pilih database tersebut sebagai database aktif.

Latihan 3

Buat tabel kategori_produk dengan kolom:

KolomTipe DataAturan
id_kategoriINTPRIMARY KEY, AUTO_INCREMENT
nama_kategoriVARCHAR(100)NOT NULL

Latihan 4

Tampilkan daftar tabel dan periksa struktur tabel kategori_produk.

Coba kerjakan sendiri terlebih dahulu sebelum melihat jawabannya.

Pembahasan Latihan#

Berikut salah satu penyelesaiannya:

CREATE DATABASE IF NOT EXISTS db_latihan_bapakgabut;
USE db_latihan_bapakgabut;
CREATE TABLE kategori_produk (
id_kategori INT AUTO_INCREMENT PRIMARY KEY,
nama_kategori VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
SHOW TABLES;
DESCRIBE kategori_produk;

Jika query berhasil, berarti kamu sudah bisa membuat database, memilih database aktif, membuat tabel, dan memeriksa strukturnya.

Satu hal penting: setelah latihan selesai, kembalilah ke database utama sebelum melanjutkan bab berikutnya.

Jalankan:

USE db_toko_bapakgabut;

Dengan begitu, kita tidak keliru membuat tabel berikutnya di database latihan.

Kesimpulan#

Pada Bab 3 ini, kita sudah mulai menggunakan SQL untuk membuat struktur database sendiri.

Beberapa hal yang sudah kita pelajari:

  1. SQL digunakan untuk berinteraksi dengan database relasional.
  2. CREATE DATABASE digunakan untuk membuat database.
  3. USE digunakan untuk memilih database aktif.
  4. CREATE TABLE digunakan untuk membuat tabel.
  5. Tipe data menentukan jenis nilai yang dapat disimpan.
  6. PRIMARY KEY membantu mengidentifikasi setiap baris secara unik.
  7. AUTO_INCREMENT, NOT NULL, dan DEFAULT membantu mengatur perilaku kolom.
  8. InnoDB mendukung transaksi dan foreign key.

Sekarang kita sudah memiliki database db_toko_bapakgabut dengan dua tabel:

  • produk
  • pelanggan

Keduanya masih kosong, tetapi strukturnya sudah siap digunakan.

Pada Bab 4, kita akan mulai mengisi dan mengelola data menggunakan operasi CRUD: INSERT, SELECT, UPDATE, dan DELETE.

Karena punya tabel tanpa data itu seperti punya warung lengkap dengan rak, tetapi belum ada barang yang dijual.

Sampai jumpa di artikel berikutnya, Gabuters!

Bagian 3 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