Database yang kita buat pada chapter sebelumnya masih berupa ruang kosong. Data sesungguhnya hidup di dalam tabel, dan tabel lahir dari perintah CREATE TABLE — keputusan paling berpengaruh yang kita ambil di awal proyek: kolom apa saja yang disimpan, tipe data apa yang dipakai, dan kolom mana yang wajib terisi. Pada Chapter ini kita akan membuat tabel pertama, membedahnya baris per baris, memilih tipe kolom yang tepat, lalu mengenal aturan NOT NULL dan cara menghindari galat tabel yang sudah ada.

Membuat Tabel Pertama #

Kita mulai dari keadaan bersih: buat database latihan dan jadikan aktif, lalu definisikan tabel produk untuk toko alat tulis:

sql
CREATE DATABASE belajar_sql;
USE belajar_sql;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Database changed

Sekarang tabelnya:

sql
CREATE TABLE produk (
  id INT,
  nama VARCHAR(100),
  harga DECIMAL(10,2),
  tanggal_dibuat DATE
);

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

Respons Query OK, 0 rows affected menandakan struktur tabel berhasil dibuat — 0 rows karena CREATE TABLE mendefinisikan struktur, bukan mengisi baris data. Mari kita bedah setiap barisnya:

  1. Baris 1 (CREATE TABLE produk (): Keyword CREATE TABLE diikuti identifier nama tabel produk. Tanda kurung buka membuka daftar definisi kolom.
  2. Baris 2 (id INT): Kolom pertama bernama id bertipe INT — bilangan bulat untuk nomor produk. Setiap definisi kolom selalu berpola nama bertipe.
  3. Baris 3 (nama VARCHAR(100)): Kolom nama bertipe string dengan panjang maksimal 100 karakter.
  4. Baris 4 (harga DECIMAL(10,2)): Kolom harga bertipe angka desimal presisi tetap: total 10 digit, 2 di antaranya di belakang koma.
  5. Baris 5 (tanggal_dibuat DATE): Kolom tanggal tanpa jam. Baris terakhir daftar kolom tidak diakhiri koma.
  6. Baris 6 ();): Tanda kurung tutup dan terminator titik koma menutup statement. Baris-baris sebelumnya diakhiri koma sebagai pemisah antarkolom.

Memilih Tipe Kolom #

Tipe kolom menentukan data apa yang bisa disimpan dan berapa ruang yang dipakai. Empat tipe dasar berikut menutupi sebagian besar kebutuhan tabel pemula:

TipeJenis dataContoh isiCatatan pemakaian
INTBilangan bulat1, -25, 4000Cocok untuk jumlah, stok, dan identifier
VARCHAR(n)String panjang variabel'Buku Tulis'n = panjang maksimal karakter; hanya memakai ruang sesuai isi
DECIMAL(p,s)Desimal presisi tetap19999.99p = total digit, s = digit di belakang koma; wajib untuk nilai uang
DATETanggal'2026-01-15'Format YYYY-MM-DD sesuai standar ISO 8601

Pemilihan tipe yang tepat adalah bentuk validasi pertama data kita. Kolom harga DECIMAL(10,2) menolak teks dan membatasi angka hingga 8 digit di depan koma, sedangkan tanggal_dibuat DATE menolak teks tanggal bebas seperti '15 Januari'. Untuk nilai uang kita selalu memilih DECIMAL, bukan tipe pecahan FLOAT atau DOUBLE, karena DECIMAL menyimpan angka secara persis tanpa pembulatan biner yang bisa menimbulkan selisih kecil pada perhitungan pajak dan diskon.

NULL dan NOT NULL #

Secara bawaan, setiap kolom mengizinkan NULL — kita bisa saja menyimpan baris produk tanpa harga sama sekali. Aplikasi nyata biasanya tidak sefleksibel itu: nomor identitas dan nama tidak boleh kosong. Aturan ini dinyatakan dengan NOT NULL pada definisi kolom:

sql
CREATE TABLE karyawan (
  id INT NOT NULL,
  nama VARCHAR(100) NOT NULL,
  email VARCHAR(100),
  gaji DECIMAL(12,2) NOT NULL,
  tanggal_masuk DATE
);

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

Tabel karyawan mewajibkan id, nama, dan gaji terisi, sementara email dan tanggal_masuk tetap opsional. Server akan menolak baris yang mencoba mengosongkan kolom wajib tersebut. Untuk melihatnya, kita pakai INSERT — perintah penambah baris yang akan dibahas tuntas pada Section Manipulasi Data. Untuk sekarang, cukup pahami bahwa statement berikut mencoba menambah karyawan dengan nama bernilai NULL:

sql
-- @error
INSERT INTO karyawan (id, nama, gaji) VALUES (1, NULL, 5000000);

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

ERROR 1048 (23000): Column 'nama' cannot be null
Bye

Server menolak baris tersebut dengan galat ERROR 1048 (23000): Column 'nama' cannot be null — batasan NOT NULL bekerja persis pada titik ini, sebelum baris tersimpan. Karena seluruh statement gagal, tidak ada data yang setengah tersimpan; kita perbaiki nilainya dan jalankan ulang.

Melihat Tabel Baru #

Tabel baru bisa dipastikan keberadaannya melalui SHOW TABLES:

sql
SHOW TABLES;

Output yang Dihasilkan:

text
+-----------------------+
| Tables_in_belajar_sql |
+-----------------------+
| karyawan              |
| produk                |
+-----------------------+
2 rows in set (0.00 sec)

Dua tabel latihan kita — karyawan dan produk — kini terdaftar di database belajar_sql. Daftar ini hanya menampilkan nama; isi kolomnya akan kita periksa dengan DESC pada chapter Melihat Struktur Tabel.

Galat Tabel Sudah Ada #

Mencoba membuat tabel dengan nama yang sudah terpakai menghasilkan galat:

sql
-- @error
CREATE TABLE produk (id INT);

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

ERROR 1050 (42S01): Table 'produk' already exists
Bye

Galat ERROR 1050 (42S01): Table 'produk' already exists melindungi tabel lama dari penimpaan tidak sengaja — server tidak pernah menghapus objek lama demi CREATE TABLE. Untuk skrip yang dijalankan berulang, MySQL menyediakan klausa IF NOT EXISTS:

sql
CREATE TABLE IF NOT EXISTS produk (id INT);
SHOW WARNINGS;

Output yang Dihasilkan:

text
Query OK, 0 rows affected, 1 warning (0.00 sec)

+-------+------+-------------------------------+
| Level | Code | Message                       |
+-------+------+-------------------------------+
| Note  | 1050 | Table 'produk' already exists |
+-------+------+-------------------------------+
1 row in set (0.00 sec)

Perintah kini selesai dengan Query OK dan satu warning, bukan galat. Tabel lama tetap dipakai apa adanya, dan SHOW WARNINGS menampilkan catatan Table 'produk' already exists sebagai penjelasan kenapa tidak ada tabel baru yang dibuat.

Referensi #

Dua tabel kini berdiri di database belajar_sql, tetapi kita belum bisa melihat isinya dari luar. Chapter berikutnya memperkenalkan periskopnya: DESC, SHOW COLUMNS, SHOW CREATE TABLE, dan katalog information_schema untuk memeriksa struktur tabel apa pun tanpa membuka datanya.