CREATE TABLE SQL: Bikin Tabel Pertama Kamu dari Nol
TL;DR
CREATE TABLE adalah perintah SQL buat bikin tabel baru di database, di mana kamu nentuin nama tabel, daftar kolom, dan tipe data tiap kolom. Struktur dasarnya: CREATE TABLE nama_tabel (kolom1 TIPE, kolom2 TIPE, ...). Kamu juga bisa nambahin constraint kayak PRIMARY KEY untuk identitas unik tiap baris, NOT NULL untuk kolom yang wajib diisi, dan FOREIGN KEY untuk nyambungin tabel satu sama lain.
CREATE TABLE itu perintah buat bikin tabel kosong di database. Kamu kasih nama tabelnya, daftar kolomnya, dan tipe data tiap kolom.
Selama ini kamu mungkin cuma nulis SELECT — baca data yang udah ada. Sekarang giliran kamu yang nyiapin wadahnya.
Aku bakal jalanin dari sintaks paling dasar sampai tabel toko_berkah yang beneran nyambung satu sama lain, plus kesalahan yang bikin tabel kamu nyusahin 3 bulan kemudian.
Gimana sintaks dasar CREATE TABLE?
Tulis CREATE TABLE, nama tabelnya, terus kurung buka yang isinya daftar kolom. Tiap kolom butuh dua hal: nama dan tipe data. Pisahin pakai koma.
CREATE TABLE produk (
produk_id INT,
nama_produk VARCHAR(100),
harga DECIMAL(12,2),
stok INT
);
Jalanin query itu, dan kamu punya tabel produk yang kosong dengan 4 kolom. Belum ada isinya — CREATE TABLE cuma bikin wadahnya.
Cek hasilnya:
SELECT * FROM produk;
-- hasilnya 0 baris, tapi kolomnya udah kelihatan
Buat ngisi datanya, kamu butuh INSERT INTO. Itu perintah lain.
Tipe data apa yang harus dipilih?
Tipe data nentuin apa yang boleh masuk ke kolom itu. Salah pilih tipe, dan kamu bakal ribet setahun ke depan.
| Tipe | Buat apa | Contoh nilai |
|---|---|---|
INT | Angka bulat | 42, 1500, -3 |
DECIMAL(12,2) | Uang dan angka presisi | 25000.50 |
VARCHAR(n) | Teks pendek, panjang kebatas | 'Kopi Gayo 250g' |
TEXT | Teks panjang bebas | Deskripsi produk |
DATE | Tanggal aja | '2026-03-03' |
TIMESTAMP | Tanggal + jam | '2026-03-03 14:30:00' |
BOOLEAN | Ya atau nggak | TRUE, FALSE |
Tiga aturan yang aku pegang:
Uang selalu DECIMAL, jangan FLOAT. FLOAT nyimpen angka secara perkiraan, jadi 0,1 + 0,2 bisa keluar 0,30000000000000004. Buat harga barang itu nggak lucu. DECIMAL(12,2) artinya total 12 digit, 2 di antaranya di belakang koma.
Nomor telepon dan kode pos itu VARCHAR, bukan INT. Nomor HP mulai dari 0, dan INT bakal buang nol di depannya. 081234567890 jadi 81234567890.
Tanggal simpan sebagai DATE, jangan VARCHAR. Kalau disimpan sebagai teks, kamu nggak bisa ngurutin atau ngitung selisih hari tanpa konversi.
Apa itu PRIMARY KEY dan kenapa penting?
PRIMARY KEY adalah kolom yang nilainya unik di tiap baris — nggak boleh kembar, nggak boleh kosong. Fungsinya buat nunjuk satu baris secara pasti waktu kamu mau UPDATE atau DELETE.
CREATE TABLE produk (
produk_id INT PRIMARY KEY,
nama_produk VARCHAR(100),
harga DECIMAL(12,2)
);
Tanpa primary key, gimana kamu ngapus "Kopi Gayo" kalau ada 2 baris dengan nama sama? Kamu nggak bisa. DELETE FROM produk WHERE nama_produk = 'Kopi Gayo' bakal ngapus dua-duanya.
Biar database yang ngisi ID-nya otomatis, tambahin AUTO_INCREMENT (MySQL) atau pakai tipe SERIAL (PostgreSQL):
-- MySQL
produkid INT PRIMARY KEY AUTO_INCREMENT
-- PostgreSQL
produk_id SERIAL PRIMARY KEY
Baris pertama dapat ID 1, kedua dapat 2, dan seterusnya. Kamu nggak usah mikirin lagi.
Baca definisi lengkapnya di glosarium PRIMARY KEY.
Constraint apa aja yang berguna?
Constraint itu aturan yang bikin database nolak data yang salah. Ini pertahanan paling murah — dicek otomatis tiap kali ada data masuk.
| Constraint | Artinya |
|---|---|
NOT NULL | Kolom ini wajib diisi |
UNIQUE | Nilainya nggak boleh kembar |
DEFAULT x | Kalau nggak diisi, otomatis jadi x |
CHECK (kondisi) | Nilai harus lolos kondisi ini |
FOREIGN KEY | Nilainya harus ada di tabel lain |
Versi produk yang udah dikasih constraint:
CREATE TABLE produk (
produk_id INT PRIMARY KEY AUTO_INCREMENT,
nama_produk VARCHAR(100) NOT NULL,
kategori VARCHAR(50),
harga DECIMAL(12,2) NOT NULL CHECK (harga > 0),
stok INT DEFAULT 0,
dibuat_pada TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Sekarang produk tanpa nama bakal ditolak. Harga minus juga ditolak. Kolom stok yang lupa diisi otomatis jadi 0, bukan NULL — dan itu bikin SUM(stok) kamu nggak berantakan nanti.
NULL itu bukan nol. Bedanya dijelasin di glosarium NULL.
Gimana cara nyambungin dua tabel pakai FOREIGN KEY?
FOREIGN KEY ngunci satu kolom supaya nilainya harus ada di tabel lain. Kalau kamu masukin transaksi dengan produk_id = 99 padahal produk 99 nggak ada, database nolak.
CREATE TABLE transaksi (
transaksi_id INT PRIMARY KEY AUTO_INCREMENT,
produk_id INT NOT NULL,
jumlah INT NOT NULL CHECK (jumlah > 0),
tanggal DATE NOT NULL,
kota VARCHAR(50),
FOREIGN KEY (produk_id) REFERENCES produk(produk_id)
);
Baris terakhir bilang: kolom produk_id di tabel ini harus nyocok sama produk_id di tabel produk.
Dua hal yang dijaga foreign key:
- Nggak ada transaksi buat produk hantu yang nggak ada di katalog.
- Kamu nggak bisa asal
DELETEproduk yang masih punya transaksi — database bakal nolak.
Ini juga yang bikin JOIN jadi masuk akal nanti. Detail JOIN ada di halaman INNER JOIN.
Urutan penting: tabel produk harus dibuat duluan. Foreign key nggak bisa nunjuk ke tabel yang belum ada.
Contoh kasus: bikin database toko_berkah dari nol
Toko_berkah jualan sembako di 3 kota. Yang mereka butuh: katalog produk, catatan transaksi, dan data pelanggan.
-- 1. Tabel produk (parent, dibuat duluan)
CREATE TABLE produk (
produk_id INT PRIMARY KEY AUTO_INCREMENT,
nama_produk VARCHAR(100) NOT NULL,
kategori VARCHAR(50) NOT NULL,
harga DECIMAL(12,2) NOT NULL CHECK (harga > 0),
stok INT DEFAULT 0
);
-- 2. Tabel pelanggan
CREATE TABLE pelanggan (
pelanggan_id INT PRIMARY KEY AUTO_INCREMENT,
nama VARCHAR(100) NOT NULL,
no_hp VARCHAR(20) UNIQUE,
kota VARCHAR(50) NOT NULL,
daftar_pada DATE DEFAULT (CURRENT_DATE)
);
-- 3. Tabel transaksi (child, nyambung ke dua tabel di atas)
CREATE TABLE transaksi (
transaksi_id INT PRIMARY KEY AUTO_INCREMENT,
produk_id INT NOT NULL,
pelanggan_id INT,
jumlah INT NOT NULL CHECK (jumlah > 0),
tanggal DATE NOT NULL,
FOREIGN KEY (produk_id) REFERENCES produk(produk_id),
FOREIGN KEY (pelanggan_id) REFERENCES pelanggan(pelanggan_id)
);
Beberapa keputusan yang aku ambil di sini:
no_hppakaiVARCHAR(20)danUNIQUE— biar nol di depan nggak hilang, dan satu nomor cuma bisa dipakai satu pelanggan.pelanggan_iddi transaksi boleh NULL — soalnya pembeli walk-in yang bayar cash nggak selalu ngasih nama.harganggak disimpan di tabel transaksi. Kalau harga produk berubah, transaksi lama tetap kebaca pakai harga baru — dan ini salah buat laporan historis. Toko yang seriusan biasanya nyimpenharga_saat_transaksidi tabel transaksi.
Poin terakhir itu jebakan yang paling sering aku lihat di database UMKM. Data penjualan tahun lalu jadi ikut berubah tiap kali harga barang naik.
Kesalahan umum waktu bikin tabel
- Pakai FLOAT buat harga. Hasil
SUMkamu bakal meleset beberapa rupiah dan kamu bakal bingung berjam-jam. PakaiDECIMAL. - VARCHAR kekecilan.
VARCHAR(20)buat nama produk kelihatan cukup — sampai ada "Minyak Goreng Sania Kemasan Refill 2 Liter". Kasih ruang lebih. - Nggak pasang NOT NULL di kolom yang wajib. Enam bulan kemudian kamu punya 300 baris dengan nama produk kosong dan nggak ada yang tau itu barang apa.
- Nama kolom pakai spasi atau huruf besar campur.
Nama Produkbikin kamu harus nulis backtick tiap query. Pakainama_produk. - Bikin foreign key sebelum tabel tujuannya ada. Urutannya: tabel induk dulu, baru tabel anaknya.
DROP TABLEbuat "benerin" struktur. Itu ngapus semua datanya. PakaiALTER TABLE— bahasannya ada di artikel ALTER TABLE.
Sintaks lengkap tiap database beda tipis. Buat PostgreSQL, cek dokumentasi resmi CREATE TABLE.
FAQ
Apa bedanya CREATE TABLE dan CREATE TABLE IF NOT EXISTS?
CREATE TABLE biasa bakal error kalau tabel dengan nama itu udah ada. CREATE TABLE IF NOT EXISTS diem aja — dia skip pembuatan tabel dan nggak ngasih error. Ini berguna banget di script setup yang dijalanin berulang, misalnya waktu bikin database dari awal. Tapi hati-hati: kalau tabel lama strukturnya beda, IF NOT EXISTS nggak bakal update strukturnya, jadi kamu bisa ketipu ngira tabelnya udah bener.
Kapan pakai VARCHAR dan kapan pakai TEXT?
Pakai VARCHAR kalau panjang teksnya kira-kira ketahuan dan ada batasnya — nama produk, alamat email, kode transaksi. VARCHAR(100) artinya maksimal 100 karakter, dan batas itu sekaligus jadi validasi murah. TEXT dipakai buat teks bebas yang panjangnya nggak ketebak, kayak deskripsi produk atau catatan. Di MySQL, kolom TEXT nggak bisa diindeks penuh dan agak lebih lambat, jadi jangan asal pakai TEXT buat semua kolom.
Apakah setiap tabel wajib punya PRIMARY KEY?
Secara teknis nggak wajib — database bakal terima tabel tanpa PRIMARY KEY. Tapi praktiknya kamu hampir selalu butuh. Tanpa PRIMARY KEY, kamu nggak punya cara nunjuk satu baris spesifik buat di-UPDATE atau di-DELETE, dan data duplikat gampang masuk tanpa ketahuan. Beberapa tool dan framework juga nolak tabel tanpa primary key. Kasih kolom id sebagai PRIMARY KEY, biayanya murah dan nyelametin kamu nanti.
Gimana cara ngubah struktur tabel yang udah terlanjur dibuat?
Pakai ALTER TABLE, bukan bikin ulang. ALTER TABLE bisa nambah kolom, ganti tipe data, hapus kolom, atau nambah constraint tanpa ngilangin data yang udah ada. Bikin ulang tabel dari nol berarti kamu harus backup data, DROP TABLE, CREATE TABLE lagi, terus masukin datanya balik — ribet dan berisiko. ALTER TABLE nyelesaiin itu dalam satu perintah.
Penutup
Tiga hal yang menentukan tabel kamu bakal enak dipakai atau nyusahin:
- Tipe data yang bener. DECIMAL buat uang, VARCHAR buat nomor HP, DATE buat tanggal.
- PRIMARY KEY di tiap tabel. Murah dipasang, mahal kalau nggak ada.
- Constraint yang nolak data kotor di pintu masuk. NOT NULL dan CHECK ngerjain validasi yang kalau nggak, harus kamu urus manual selamanya.
Coba bikin sendiri: tabel karyawan dengan kolom id, nama, jabatan, gaji, dan tanggal masuk. Tentuin sendiri tipe data dan constraint-nya. Itu latihan 5 menit yang ngajarin lebih banyak dari baca 3 artikel.
Lanjutannya: ALTER TABLE buat ngubah struktur tabel yang udah jadi.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.