SQL dari Nol
SQL (Structured Query Language) mengatur basis data relasional. Baik Anda memakai SQLite, PostgreSQL, MySQL, atau SQL Server, sebagian besar perintah dasarnya sama. Artikel ini membuat tabel, menambah data, mencari, menggabungkan tabel, mengelompokkan hasil, dan mengubah data, memakai SQLite sehingga tidak perlu server.
Setiap perintah di sini sudah dijalankan dengan SQLite 3.50 dan keluarannya adalah keluaran nyata.
Yang Anda butuhkan
- SQLite (periksa dengan `sqlite3 --version`) atau DB Browser for SQLite yang gratis
Bagaimana tabel saling berhubungan
Membuat tabel dan menambah data
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER
);
CREATE TABLE classes (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE scores (
student_id INTEGER REFERENCES students(id),
subject TEXT,
score INTEGER
);
INSERT INTO classes VALUES (1, 'X-1'), (2, 'X-2');
INSERT INTO students VALUES (1, 'Budi', 1), (2, 'Siti', 1), (3, 'Andi', 2);
INSERT INTO scores VALUES (1, 'Matematika', 85), (1, 'Bahasa Inggris', 70), (2, 'Matematika', 72), (3, 'Matematika', 45), (3, 'Bahasa Inggris', 60);
- `PRIMARY KEY` memberi setiap baris kunci yang unik.
- `NOT NULL` mewajibkan adanya nilai.
- `REFERENCES` menghubungkan tabel, jadi `scores.student_id` harus ada di `students`.
Mencari dengan SELECT dan WHERE
SELECT name FROM students WHERE class_id = 1;
Menggabungkan tabel dengan JOIN
SELECT s.name, c.title FROM students s JOIN classes c ON c.id = s.class_id ORDER BY s.name;
`JOIN` menggabungkan baris dari dua tabel ketika kuncinya cocok. `s` dan `c` adalah nama pendek untuk tabel.
Mengelompokkan dengan GROUP BY
SELECT subject, AVG(score) AS avg_score, COUNT(*) AS n FROM scores GROUP BY subject ORDER BY subject;
Fungsi agregat seperti `AVG`, `COUNT`, dan `SUM` bekerja pada setiap kelompok. Gunakan `HAVING` untuk memfilter setelah pengelompokan:
SELECT student_id, SUM(score) AS total FROM scores GROUP BY student_id HAVING SUM(score) >= 100;
Mengubah dan menghapus data
UPDATE scores SET score = score + 5 WHERE student_id = 3 AND subject = 'Matematika';
DELETE FROM scores WHERE score < 50;
SELECT student_id, subject, score FROM scores ORDER BY student_id, subject;
`UPDATE` menaikkan 45 menjadi 50, sehingga `DELETE` tidak menghapus apa pun. Perhatikan bahwa hasilnya benar untuk urutan pernyataan dijalankan.
Hasil nyata
name
------
Budi
Siti
name title
----- -----
Budi X-1
Andi X-2
Siti X-1
subject avg_score n
-------------- ---------------- -
Bahasa Inggris 65.0 2
Matematika 67.3333333333333 3
student_id total
---------- -----
1 155
3 105
student_id subject score
---------- -------------- -----
1 Bahasa Inggris 70
1 Matematika 85
2 Matematika 72
3 Bahasa Inggris 60
3 Matematika 50
Kesalahan umum
- **Lupa `WHERE` pada `UPDATE` atau `DELETE`:** ini mengubah atau menghapus setiap baris. Jalankan `SELECT` dengan kondisi yang sama terlebih dahulu.
- **Memberi kondisi pada agregat di `WHERE`:** gunakan `HAVING` untuk kondisi pada total.
- **Memakai tanda kutip ganda untuk nilai teks:** SQL standar memakai tanda kutip tunggal `'...'` untuk teks.
- **Mengharapkan `ORDER BY` secara default:** tanpa itu, urutan baris tidak dijamin.
Langkah berikutnya
Rancang tabel Anda sendiri, misalnya produk dan pesanan, dan tulis `JOIN` yang menjumlahkan penjualan per produk. Lalu pelajari indeks dan transaksi, yang penting saat data bertambah banyak.
Ringkasan
SQL mendefinisikan struktur dengan `CREATE`, mengelola data dengan `INSERT`, `UPDATE`, dan `DELETE`, dan mencari dengan `SELECT` bersama `WHERE`, `JOIN`, `GROUP BY`, dan `HAVING`. Menguji pada data contoh kecil membuat efek setiap pernyataan jelas.