CREATE TABLE SQL: Bikin Tabel Pertama Kamu dari Nol
Blog/Tutorial SQL/CREATE TABLE SQL: Bikin Tabel Pertama Kamu dari Nol

CREATE TABLE SQL: Bikin Tabel Pertama Kamu dari Nol

BimaBima
·3 Maret 2026·11 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

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.

TipeBuat apaContoh nilai
INTAngka bulat42, 1500, -3
DECIMAL(12,2)Uang dan angka presisi25000.50
VARCHAR(n)Teks pendek, panjang kebatas'Kopi Gayo 250g'
TEXTTeks panjang bebasDeskripsi produk
DATETanggal aja'2026-03-03'
TIMESTAMPTanggal + jam'2026-03-03 14:30:00'
BOOLEANYa atau nggakTRUE, 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.

ConstraintArtinya
NOT NULLKolom ini wajib diisi
UNIQUENilainya nggak boleh kembar
DEFAULT xKalau nggak diisi, otomatis jadi x
CHECK (kondisi)Nilai harus lolos kondisi ini
FOREIGN KEYNilainya 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 DELETE produk 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_hp pakai VARCHAR(20) dan UNIQUE — biar nol di depan nggak hilang, dan satu nomor cuma bisa dipakai satu pelanggan.
  • pelanggan_id di transaksi boleh NULL — soalnya pembeli walk-in yang bayar cash nggak selalu ngasih nama.
  • harga nggak 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 nyimpen harga_saat_transaksi di 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

  1. Pakai FLOAT buat harga. Hasil SUM kamu bakal meleset beberapa rupiah dan kamu bakal bingung berjam-jam. Pakai DECIMAL.
  2. VARCHAR kekecilan. VARCHAR(20) buat nama produk kelihatan cukup — sampai ada "Minyak Goreng Sania Kemasan Refill 2 Liter". Kasih ruang lebih.
  3. 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.
  4. Nama kolom pakai spasi atau huruf besar campur. Nama Produk bikin kamu harus nulis backtick tiap query. Pakai nama_produk.
  5. Bikin foreign key sebelum tabel tujuannya ada. Urutannya: tabel induk dulu, baru tabel anaknya.
  6. DROP TABLE buat "benerin" struktur. Itu ngapus semua datanya. Pakai ALTER 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.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel Terkait

7 SQL Client Gratis Terbaik buat Analis Data (2026)
Tutorial SQL
10 Juli 2026•9 menit baca

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.

BimaBima
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Tutorial SQL
7 Juli 2026•9 menit baca

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.

BimaBima
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Tutorial SQL
4 Juli 2026•11 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

Copyright © 2026 - All rights reserved

LINKS
SupportPricingDatasetBlogAffiliates
LEGAL
Terms of servicesPrivacy policy
Ngulik Data
DatasetLeaderboardBlogStore