Mengenal SQL (Structured Query Language)

Mengenal SQL (Structured Query Language)

SQL adalah bahasa yang digunakan untuk berinteraksi, seperti mengelola dan memanipulasi database relasional (RDBMS). Sederhananya, SQL adalah sebuah bahasa perintah yang digunakan dalam mengelola database RDBMS.

SQL dibagi menjadi beberapa kategori perintah (statements):

  • DDL (Data Definition Language) definisi data
    Perintah ini digunakan untuk membuat dan mengubah struktur tabel, seperti CREATE TABLE, ALTER TABLE, DROP, CREATE INDEX, CREATE VIEW, CREATE SCHEMA,TRUNCATE
  • DML (Data Manipulation Language) – manipulasi data
    Perintah ini digunakan untuk mengelola data di dalam tabel, seperti INSERT, UPDATE, DELETE, dan SELECT.
  • DCL (Data Control Language) – Control Data
    Perintah ini digunakan untuk mengatur hak akses user ke data, seperti GRANT dan REVOKE.
  • TCL (Transaction Control Language) – Transaction Data
    digunakan untuk mengatur transaksi data, seperti COMMIT dan ROLLBACK.

Fungsi - fungsi tambahan pada SQL :

  • Fungsi Agregat melakukan perhitungan terhadap sekumpulan data
    Berikut list fungsi agregat yang biasa digunakan ( tapi ada beberapa versi yang mungkin tidak support )
Fungsi Deskripsi Contoh SQL
COUNT() Menghitung jumlah baris SELECT COUNT(*) FROM transaksi;
SUM() Menjumlahkan nilai dalam kolom SELECT SUM(amount) FROM transaksi;
AVG() Menghitung nilai rata-rata SELECT AVG(amount) FROM transaksi;
MIN() Mengambil nilai terkecil SELECT MIN(amount) FROM transaksi;
MAX() Mengambil nilai terbesar SELECT MAX(amount) FROM transaksi;
GROUP_CONCAT() Menggabungkan nilai menjadi satu string (MySQL) SELECT GROUP_CONCAT(nama_produk) FROM produk;
STRING_AGG() Penggabungan string dengan pemisah (PostgreSQL, SQL Server) SELECT STRING_AGG(nama_produk, ', ') FROM produk;
VAR_POP() Varians populasi SELECT VAR_POP(amount) FROM transaksi;
VAR_SAMP() Varians sampel SELECT VAR_SAMP(amount) FROM transaksi;
STDDEV_POP() Standar deviasi populasi SELECT STDDEV_POP(amount) FROM transaksi;
STDDEV_SAMP() Standar deviasi sampel SELECT STDDEV_SAMP(amount) FROM transaksi;
BIT_AND() Operasi AND bitwise untuk semua nilai (MySQL, PostgreSQL) SELECT BIT_AND(status_flag) FROM transaksi;
BIT_OR() Operasi OR bitwise untuk semua nilai SELECT BIT_OR(status_flag) FROM transaksi;
BOOL_AND() True jika semua nilai adalah true (PostgreSQL) SELECT BOOL_AND(is_active) FROM user;
BOOL_OR() True jika ada minimal satu nilai true SELECT BOOL_OR(is_active) FROM user;
  • Subquery – Query di dalam query, ketika membutuhkan hasil dari query lain sebagai kondisi atau data. Subquery akan dijalankan terlebih dahulu, kemudian hasilnya digunakan oleh query utama. Berfungsi untuk :
    • Memecah query kompleks menjadi bagian-bagian kecil yang lebih mudah dipahami.
    • Mengambil nilai atau daftar nilai untuk digunakan sebagai kondisi di query utama.
    • Menggunakan hasil perhitungan atau filter yang dihasilkan oleh subquery.
Jenis Subquery & Deskripsi Contoh SQL
Subquery di WHERE
Subquery digunakan sebagai kondisi filter di klausa WHERE.
SELECT * FROM karyawan WHERE departemen_id IN (SELECT id FROM departemen WHERE nama='IT');
Subquery di FROM
Subquery digunakan sebagai tabel sementara di klausa FROM.
SELECT dept, AVG(salary) FROM (SELECT departemen_id AS dept, gaji AS salary FROM karyawan) AS sub GROUP BY dept;
Subquery di SELECT
Subquery menghasilkan nilai untuk satu kolom di klausa SELECT.
SELECT nama, (SELECT COUNT(*) FROM proyek WHERE proyek.karyawan_id = karyawan.id) AS total_proyek FROM karyawan;
Correlated Subquery
Subquery yang bergantung pada nilai dari query utama (berkorelasi).
SELECT nama FROM karyawan k WHERE EXISTS (SELECT 1 FROM proyek p WHERE p.karyawan_id = k.id);
Non-Correlated Subquery
Subquery yang berdiri sendiri, tidak bergantung pada query utama.
SELECT nama FROM karyawan WHERE departemen_id IN (SELECT id FROM departemen WHERE lokasi='Jakarta');
Nested Subquery
Subquery berada di dalam subquery lain (bertingkat).
SELECT * FROM karyawan WHERE departemen_id IN (SELECT id FROM departemen WHERE lokasi_id IN (SELECT id FROM lokasi WHERE kota='Jakarta'));
  • Indexing (Indeks) – mempercepat pencarian data terutama di kolom yang sering digunakan untuk pencarian.
    Tanpa dilakukan indexing, setiap kali pencarian data, SQL akan membaca seluruh baris. Contohnya, pencarian data user dengan kolom ID, nama, email, alamat, phone. Misal pencarian berdasarkan email, maka SQL akan mencari dari seluruh kolom ( id, nama, email, alamat dst). Dengan index, kita mendaftarkan email sebagai indexing sehingga ketika pencarian, SQL hanya fokus ke index email saja. Hal ini akan membantu dalam performance Database.
    Terdapat macam - macam jenis indexing Data :
Jenis Index Deskripsi Contoh SQL
Single-column Index Index hanya pada satu kolom untuk mempercepat pencarian/filter. CREATE INDEX idx_user_id ON transaksi(user_id);
Composite Index Index pada dua atau lebih kolom sekaligus. Urutan kolom memengaruhi hasil. CREATE INDEX idx_user_date ON transaksi(user_id, created_at);
Unique Index Mencegah nilai duplikat di kolom tertentu. CREATE UNIQUE INDEX idx_email_unique ON user(email);
Primary Key Index Dibuat otomatis saat mendefinisikan PRIMARY KEY. (Otomatis saat buat id INT PRIMARY KEY)
Full-text Index Untuk pencarian teks (kata/frasa) dalam kolom teks panjang. CREATE FULLTEXT INDEX idx_konten ON artikel(konten);
Spatial Index Untuk data geografis/spasial (koordinat, lokasi). CREATE SPATIAL INDEX idx_lokasi ON lokasi(koordinat);
Partial Index Index hanya pada subset baris tertentu (PostgreSQL). CREATE INDEX idx_active_user ON user(email) WHERE is_active = true;
Expression Index Index berdasarkan ekspresi/fungsi, bukan langsung kolom (PostgreSQL, SQLite). CREATE INDEX idx_lower_email ON user(LOWER(email));
  • View – merupakan tabel virtual berdasarkan query.
    View tidak menyimpan data, tapi menyimpan definisi query. View biasa digunakan untuk menjadikan satu tabel "penglihatan" padahal terdiri dari beberapa tabel.
    View membantu untuk mengurangi beban berat pada sistem saat menjalankan query. CREATE VIEW [Nama View] AS [Query Data]
Tabel Yang dimiliki
--------------------
user     (id, nama)
transaksi(id, user_id, amount, tanggal)

Query Langsung
--------------------
SELECT u.nama, t.amount, t.tanggal
FROM user u
JOIN transaksi t ON u.id = t.user_id;

Implementasi View
--------------------
CREATE VIEW v_user_transaksi AS
SELECT u.nama, t.amount, t.tanggal
FROM user u
JOIN transaksi t ON u.id = t.user_id;

Penggunaan View
--------------------
SELECT * FROM v_user_transaksi;
  • Stored Procedures – Kumpulan perintah SQL yang disimpan di database dan bisa dipanggil berulang.
    DELIMITER perlu ditulis secara eksplisit saat membuat prosedur, terutama jika kamu menjalankannya lewat command line, file SQL. Secara default, MySQL menganggap ; sebagai akhir dari perintah SQL. Tapi dalam prosedur, kita sering menulis banyak baris yang juga pakai ;. Kalau tidak diganti, MySQL akan salah mengira prosedur sudah selesai di tengah jalan.
    Dengan DELIMITER //, kamu mengubah sementara pemisah perintah dari ; menjadi //, supaya semua isi prosedur bisa ditulis tanpa konflik.
DELIMITER //

CREATE PROCEDURE total_transaksi_sukses()
BEGIN
  SELECT SUM(amount) FROM transaksi WHERE status = 'success';
END;
//

DELIMITER ;
  • Trigger – Otomatis dijalankan saat ada aksi tertentu (INSERT, UPDATE, DELETE).
CREATE TRIGGER log_insert_transaksi
AFTER INSERT ON transaksi
FOR EACH ROW
INSERT INTO log_transaksi(user_id, log_time)
VALUES (NEW.user_id, NOW());
  • JSON Support – memungkinkan penyimpanan dan query data semi-terstruktur. Beberapa RDBMS seperti MySQL dan PostgreSQL mendukung kolom JSON.
INSERT INTO transaksi(user_id, amount, notes)
VALUES (101, 150000, '{"gateway":"XPay","response":{"code":200,"msg":"ok"}}');

SELECT * FROM transaksi
WHERE JSON_EXTRACT(notes, '$.response.code') = 200;

Tabel Fungsi pada SQL

Command / Keyword Fungsi / Keterangan
SELECT Mengambil data dari tabel.
FROM Menentukan tabel sumber data.
WHERE Menyaring baris berdasarkan kondisi tertentu.
DISTINCT Menghapus duplikat dari hasil query.
JOIN Menggabungkan baris dari dua atau lebih tabel berdasarkan relasi antar kolom.
INNER JOIN Mengambil baris yang cocok di kedua tabel.
LEFT JOIN Mengambil semua baris dari tabel kiri dan yang cocok dari tabel kanan.
RIGHT JOIN Mengambil semua baris dari tabel kanan dan yang cocok dari tabel kiri.
FULL JOIN Mengambil semua baris dari kedua tabel, cocok atau tidak.
GROUP BY Mengelompokkan hasil berdasarkan satu atau lebih kolom.
HAVING Menyaring data hasil GROUP BY, seperti WHERE tapi setelah agregasi.
ORDER BY Mengurutkan hasil query berdasarkan satu atau lebih kolom.
LIMIT / TOP Membatasi jumlah baris yang ditampilkan.
OFFSET Melewati sejumlah baris pertama dalam hasil query.
UNION Menggabungkan hasil dari dua query, hanya baris unik.
UNION ALL Sama seperti UNION, tetapi tidak menghapus duplikat.
INSERT INTO Menambahkan data baru ke dalam tabel.
UPDATE Memperbarui data yang sudah ada.
DELETE Menghapus baris dari tabel.
CREATE TABLE Membuat tabel baru.
ALTER TABLE Mengubah struktur tabel (tambah kolom, ubah tipe, dll).
DROP TABLE Menghapus tabel dari database.
CREATE VIEW Membuat tampilan virtual dari query.
CREATE INDEX Membuat index untuk mempercepat pencarian.
TRUNCATE Menghapus semua data dari tabel tanpa menghapus strukturnya.
EXPLAIN Menunjukkan bagaimana query dijalankan oleh mesin database (untuk analisis performa).
IN / NOT IN Mengecek apakah nilai ada di dalam daftar.
BETWEEN Mengecek apakah nilai berada dalam rentang tertentu.
LIKE Pencocokan pola (wildcard) untuk string.
IS NULL / IS NOT NULL Mengecek apakah kolom bernilai NULL atau tidak.
CASE WHEN THEN Percabangan logika di dalam query (seperti IF-ELSE).
EXISTS / NOT EXISTS Mengecek apakah subquery menghasilkan baris atau tidak.
WITH (CTE) Membuat Common Table Expression untuk subquery yang bisa dipanggil ulang.
MERGE Operasi UPSERT (update atau insert sekaligus) di beberapa DBMS.
ROLLBACK Membatalkan transaksi yang belum selesai.
COMMIT Menyimpan perubahan transaksi secara permanen.
SAVEPOINT Menandai titik dalam transaksi untuk rollback parsial.
GRANT Memberikan hak akses kepada user/database role.
REVOKE Mencabut hak akses dari user/database role.
ANALYZE Mengumpulkan statistik untuk optimasi query (PostgreSQL).
VACUUM Membersihkan dan mengoptimasi database (PostgreSQL).
CHECK Constraint untuk validasi data di kolom.
CAST / CONVERT Mengubah tipe data menjadi tipe lain.
FETCH Mengambil sejumlah baris hasil query menggunakan cursor.
PIVOT Mengubah baris menjadi kolom (transformasi data, di beberapa DBMS).
UNPIVOT Mengubah kolom menjadi baris (transformasi data, di beberapa DBMS).