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.
| Kelompok | Fungsi | Contoh |
|---|---|---|
| DDL | Mengatur struktur database | CREATE, ALTER, DROP |
| DML | Mengelola data | INSERT, UPDATE, DELETE |
| DQL | Mengambil data | SELECT |
| DCL | Mengatur hak akses | GRANT, REVOKE |
| TCL | Mengendalikan transaksi | COMMIT, 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_bapakgabutDi 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:
produk, untuk menyimpan informasi barang yang dijual.pelanggan, untuk menyimpan informasi pelanggan.
Tabel produk akan memiliki struktur berikut:
| Kolom | Tipe Data | Keterangan |
|---|---|---|
| id_produk | INT | ID unik produk |
| nama_produk | VARCHAR(100) | Nama produk |
| harga | DECIMAL(12,2) | Harga produk |
| stok | INT | Jumlah stok |
| created_at | DATETIME | Waktu data dibuat |
Sedangkan tabel pelanggan:
| Kolom | Tipe Data | Keterangan |
|---|---|---|
| id_pelanggan | INT | ID unik pelanggan |
| nama_pelanggan | VARCHAR(100) | Nama pelanggan |
| VARCHAR(150) | Email pelanggan | |
| tanggal_daftar | DATE | Tanggal 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 INTKolom 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.0027500.50125000.75Kenapa 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 DATENilai tanggal MySQL biasanya ditulis dalam format:
2026-10-10Format tersebut mengikuti pola tahun-bulan-hari.
5. DATETIME untuk Tanggal dan Waktu
DATETIME digunakan untuk menyimpan tanggal sekaligus waktu.
Contohnya:
created_at DATETIMENilainya dapat berbentuk:
2026-10-10 09:30:00Tipe 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 KEYPRIMARY 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 NULLNOT 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 0Artinya, jika kita menambahkan produk tanpa menentukan nilai stok, MySQL akan menggunakan nilai default 0.
Sedangkan:
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMPMeminta 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=InnoDBInnoDB 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:
pelangganprodukUntuk 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 atribut | Fungsi |
|---|---|
| PRIMARY KEY | Mengidentifikasi setiap baris secara unik |
| NOT NULL | Melarang nilai NULL |
| UNIQUE | Mencegah nilai duplikat sesuai aturan keunikan |
| DEFAULT | Menentukan nilai bawaan jika tidak diberikan |
| FOREIGN KEY | Menjaga 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 selectedSolusinya, 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:
| Kolom | Tipe Data | Aturan |
|---|---|---|
| id_kategori | INT | PRIMARY KEY, AUTO_INCREMENT |
| nama_kategori | VARCHAR(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:
- SQL digunakan untuk berinteraksi dengan database relasional.
CREATE DATABASEdigunakan untuk membuat database.USEdigunakan untuk memilih database aktif.CREATE TABLEdigunakan untuk membuat tabel.- Tipe data menentukan jenis nilai yang dapat disimpan.
PRIMARY KEYmembantu mengidentifikasi setiap baris secara unik.AUTO_INCREMENT,NOT NULL, danDEFAULTmembantu mengatur perilaku kolom.- InnoDB mendukung transaksi dan foreign key.
Sekarang kita sudah memiliki database db_toko_bapakgabut dengan dua tabel:
produkpelanggan
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!
Bagikan Artikel
Buat poster berbagi atau salin tautan artikel ini.
Lanjut membaca
Coba jalur lain
Pilihan konsisten dari artikel lain
Terakhir diperbarui pada , 20 hari yang lalu
Sebagian konten mungkin sudah tidak berlaku