SQL (Structured Query Language) adalah bahasa umum yang digunakan oleh hampir setiap database relasional serius di planet ini—dari PostgreSQL, MySQL, dan SQLite hingga sistem komersial seperti SQL Server dan Oracle. Ini memungkinkan Anda untuk mendefinisikan struktur data, menyimpan data, mengkuerinya secara efisien, dan menegakkan aturan tentang bagaimana data tersebut berperilaku.
Berikut adalah tur mendalam sekitar 2.500 kata tentang SQL: apa itu, bagaimana cara kerjanya, dan cara menggunakannya dengan baik dalam sistem nyata.
SQL adalah bahasa deklaratif: Anda menjelaskan apa data yang Anda inginkan, dan database memutuskan bagaimana cara mendapatkannya. Tutorial seperti panduan SQL di W3Schools dan seri SQL W3Schools.in memperkenalkan SQL sebagai bahasa standar untuk menyimpan, memanipulasi, dan mengambil data di banyak mesin database.
Karena SQL distandarisasi dan didukung secara luas, Anda dapat menggunakan model mental yang sama untuk:
Sebagian besar data bisnis sehari-hari—pesanan, pengguna, pembayaran, log, analitik—akhirnya disimpan dalam tabel yang dapat Anda kueri dengan SQL.
SQL distandarisasi oleh keluarga standar ISO/IEC 9075, yang mendefinisikan bahasa inti dan banyak ekstensi opsional. Standar telah berevolusi melalui versi seperti SQL-86, SQL-92, SQL:1999, SQL:2003, dan hingga SQL:2023. Artikel seperti ikhtisar ANSI tentang standar SQL ISO/IEC 9075:2023 menjelaskan bagaimana standar ANSI dan ISO selaras seiring waktu.
Standar itu sendiri dibagi menjadi beberapa bagian, seperti:
Anda dapat melihat daftar lengkap di halaman katalog ISO untuk SQL dan di sumber seperti pembagian Modern SQL dari bagian standar.
Dalam praktiknya, setiap database mengimplementasikan dialeknya sendiri:
Konsep inti—tabel, baris, kolom, join, agregat—dapat dipindahkan, tetapi sistem non-trivial apa pun akan melibatkan pembelajaran keunikan dan fitur dialek tertentu.
Pada intinya, SQL dirancang di sekitar model relasional: data hidup dalam tabel (relasi), di mana setiap baris mewakili fakta dan setiap kolom menggambarkan atribut.
Elemen tipikal meliputi:
customers, ordersid, name, order_date, total_amountid)orders.customer_id → customers.id)Panduan normalisasi—seperti tutorial normalisasi DigitalOcean atau penjelasan freeCodeCamp tentang 1NF, 2NF, 3NF—merangkum desain relasional yang baik sebagai meminimalkan redundansi dan mencegah anomali pembaruan dengan membagi data menjadi tabel yang terstruktur dengan baik dan menghubungkannya dengan kunci.
Ketika Anda mengkueri dengan SQL, pada dasarnya Anda bertanya kepada database: "Dari tabel-tabel ini, di bawah kondisi ini, baris dan kolom apa yang harus saya lihat?"
Pernyataan SELECT adalah kuda kerja SQL dan mungkin perintahnya yang paling kompleks. Referensi SELECT SQLite menyebutnya "perintah paling rumit dalam bahasa SQL", dan baik dokumentasi SELECT MySQL maupun tutorial seperti panduan SELECT SQLite Tutorial membahas banyak opsi yang dimilikinya.
SELECT id, name
FROM customers;Bagian kunci:
SELECT mencantumkan kolom (atau * untuk semua kolom, meskipun biasanya lebih baik eksplisit).FROM memilih satu atau lebih tabel.WHERE memfilter baris.ORDER BY mengurutkan hasil.LIMIT membatasi berapa banyak baris yang Anda lihat.SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50;Tutorial pengantar seperti tutorial SQL W3Schools dan ikhtisar W3Schools MySQL tentang perintah umum menggunakan SELECT untuk menunjukkan bagaimana Anda mengekstrak data dari tabel dalam satu ekspresi yang dapat dibaca.
SQL bersinar ketika Anda menggabungkan filtering dan ekspresi langsung dalam kueri:
SELECT
id,
total_amount,
total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
AND total_amount >= 100
ORDER BY total_amount DESC;Klausa WHERE dapat menggunakan operator perbandingan (=, <>, >, <), operator logika (AND, OR, NOT), pencocokan pola (LIKE, ILIKE), dan lainnya. Database seperti MySQL mendokumentasikan kumpulan fungsi dan operator bawaan yang kaya untuk operasi numerik, string, tanggal/waktu, JSON, dan lainnya.
Anda juga dapat:
IN untuk mencocokkan dengan daftar: WHERE status IN ('paid', 'refunded')BETWEEN untuk rentang: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'IS NULL / IS NOT NULL untuk menangani nilai yang hilangTutorial dan manual yang baik menekankan bahwa ekspresi muncul di banyak klausa— WHERE, ORDER BY, HAVING, dan bahkan SELECT itu sendiri. Dokumentasi MySQL menyoroti ini di bagian evaluasi ekspresi dalam bab fungsi dan operator.
Database nyata jarang menyimpan semuanya dalam satu tabel. Sebaliknya, Anda menormalisasi data ke beberapa tabel dan menggabungkannya ketika Anda mengkueri. Join dibahas secara luas di sumber seperti halaman W3Schools tentang join SQL, tutorial join GeeksforGeeks, ikhtisar join TutorialsPoint, dan panduan interaktif seperti tutorial join SQL di SQL Practice Online.
SELECT
id,
c.name,
o.order_date,
o.total_amount
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;Jenis join umum:
Penjelasan visual dan berbasis kode, seperti artikel "SQL joins explained" DbSchema atau contoh join LearnSQL.com, adalah cara yang bagus untuk membangun intuisi yang kuat tentang bagaimana join berperilaku.
Untuk merangkum data—total, rata-rata, hitungan—Anda menggunakan fungsi agregat (COUNT, SUM, AVG, MIN, MAX) dengan GROUP BY:
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;Referensi seperti bab fungsi dan operator MySQL dan dokumentasi PostgreSQL tentang fungsi agregat dan jendela mengkatalogkan fungsi bawaan yang dapat Anda gunakan dalam ekspresi ini.
SQL modern juga mendukung fungsi jendela, yang memungkinkan Anda menghitung agregat di atas "jendela" geser baris sambil tetap mengembalikan baris individual—misalnya, total berjalan atau peringkat. Fungsi jendela masuk ke SQL melalui amandemen ke SQL:1999, kemudian diintegrasikan ke SQL:2003, seperti yang diringkas dalam catatan tentang standar SQL:1999 dan SQL:2003.
SELECT
customer_id,
order_date,
total_amount,
SUM(total_amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS running_total
FROM orders;Jenis kueri ini sangat kuat untuk analisis langsung di database.
SQL tidak hanya untuk mengkueri; ini juga mendefinisikan bentuk data Anda melalui pernyataan Data Definition Language (DDL), yang didokumentasikan dengan baik di bagian seperti panduan Definisi Data PostgreSQL dan bab pernyataan SQL MySQL.
Perintah DDL umum:
CREATE DATABASE my_app; – membuat databaseCREATE TABLE customers (...); – mendefinisikan tabelALTER TABLE customers ADD COLUMN phone TEXT; – mengubah struktur tabelDROP TABLE customers; – menghapus tabelCREATE TABLE customers (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN NOT NULL DEFAULT TRUE
);Poin penting:
PRIMARY KEY, UNIQUE, NOT NULL, ekspresi CHECKSetiap manual RDBMS utama— bagian bahasa SQL PostgreSQL, manual referensi MySQL, dan referensi bahasa SQLite—menekankan untuk berpikir hati-hati tentang DDL, karena keputusan skema sulit diubah nanti.
Database SQL umumnya mengimplementasikan properti ACID—Atomicity, Consistency, Isolation, Durability—melalui transaksi:
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE id = 1;
UPDATE accounts
SET balance = balance + 200
WHERE id = 2;
COMMIT;Jika sesuatu gagal antara BEGIN dan COMMIT, transaksi dapat dirollback sehingga perubahan menengah tidak bocor ke database.
Bagian MySQL tentang pernyataan transaksional dan penguncian membahas START TRANSACTION, COMMIT, ROLLBACK, dan savepoint, sementara bab PostgreSQL tentang kontrol konkurensi dan manajemen transaksi menjelaskan bagaimana tingkat isolasi dan MVCC bekerja di balik layar.
Kendala—seperti kunci asing atau kendala cek—adalah cara database untuk menegakkan aturan bisnis:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);Jika digunakan dengan baik, mereka mengubah database Anda menjadi penjaga invarian, mencegah data tidak valid di sumbernya daripada hanya mengandalkan logika aplikasi.
Membuat skema dengan benar seringkali lebih penting daripada kueri yang cerdas. Normalisasi adalah proses menyusun tabel untuk mengurangi redundansi dan meningkatkan konsistensi. Tutorial seperti:
Progresi tipikal:
Over-normalisasi dapat merusak kinerja dan memperumit kueri; tim pragmatis sering menormalisasi ke 3NF dan kemudian denormalisasi secara selektif (misalnya, caching agregat) di mana kinerja memerlukannya.
Indeks adalah alat utama untuk membuat kueri SQL cepat. Mereka adalah struktur data bantu yang memungkinkan database melompat langsung ke baris yang relevan daripada memindai seluruh tabel.
Sumber yang sangat dihormati tentang pengindeksan adalah Use The Index, Luke! oleh Markus Winand, buku online gratis yang sepenuhnya fokus pada kinerja SQL dan strategi pengindeksan. Halaman utama situs, UseTheIndexLuke.com, dan artikel seperti "Indexing LIKE filters" dan "More indexes, slower INSERT" menjelaskan kapan indeks membantu dan kapan merugikan.
Ide kunci:
WHERE email = ..., WHERE created_at >= ...).(customer_id, created_at) bekerja dengan baik untuk WHERE customer_id = ? AND created_at >= ?.SELECT, UPDATE, dan DELETE dengan filter, tetapi memperlambat penyisipan karena setiap penyisipan harus memperbarui semua indeks yang relevan.Panduan seperti artikel MSSQLTips tentang merancang indeks SQL Server menunjukkan bagaimana pilihan dan urutan kolom dalam indeks memengaruhi kueri nyata.
Aturan praktis:
EXPLAIN ANALYZE database untuk melihat bagaimana kueri dieksekusi.Sementara dasar-dasarnya tetap stabil, SQL modern telah berkembang secara signifikan:
WITH memungkinkan kueri yang lebih dapat dibaca dan modular:WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT customer_id, COUNT(*)
FROM recent_orders
GROUP BY customer_id;Standar SQL sendiri telah menambahkan bagian untuk XML, array multidimensi, dan kueri grafik properti, seperti yang didokumentasikan dalam katalog standar SQL ISO dan dalam artikel tentang evolusi SQL seperti artikel standar SQL ANSI.
SQL modern cukup kuat sehingga banyak aplikasi dapat mendorong logika kompleks—hierarki, analitik, pemrosesan acara—ke lapisan database.
Karena SQL tetap fundamental untuk pekerjaan data, ada ekosistem sumber belajar yang kaya:
Strategi pembelajaran praktis:
WHERE, ORDER BY, dan LIMIT.GROUP BY.EXPLAIN.Jika Anda dapat membaca dan menulis SQL dengan nyaman, Anda dapat memeriksa data langsung di produksi, membuat laporan tanpa mengekspor ke spreadsheet, men-debug logika aplikasi dengan melihat tabel yang mendasarinya, dan berkolaborasi lebih efektif dengan insinyur dan analis.
SQL berada di persimpangan unik: berusia lebih dari 40 tahun, tetapi sangat relevan dalam sistem cloud-native dan analitik berat saat ini. Standar ISO/IEC 9075 dan banyak bagiannya terus berevolusi, sementara database open-source seperti PostgreSQL, MySQL, dan SQLite mendorong fitur praktis dan peningkatan kinerja.
Jika Anda bekerja dengan data—pengembang, analis, ilmuwan data, atau manajer produk—SQL adalah bahasa bersama yang memungkinkan Anda mengajukan pertanyaan langsung ke database. Layak dipelajari sekali, dan membayar untuk sisa karier Anda.
Pemformatan SQL adalah proses mengatur kueri SQL dengan indentasi yang tepat, jeda baris, dan casing kata kunci untuk meningkatkan keterbacaan dan pemeliharaan.
Pemformat kami mendukung beberapa dialek SQL termasuk MySQL, PostgreSQL, SQL Server, SQLite, Oracle, dan banyak lainnya.
Ya! Semua pemformatan SQL terjadi sepenuhnya di browser Anda. Kueri Anda tidak pernah meninggalkan komputer Anda, memastikan privasi dan keamanan lengkap.
Ya, Anda dapat memformat beberapa pernyataan SQL sekaligus. Pemformat akan menangani setiap pernyataan dengan tepat berdasarkan dialek yang dipilih.
Pemformat akan mencoba memformat SQL Anda bahkan jika mengandung kesalahan sintaks. Namun, Anda mungkin melihat pesan kesalahan untuk SQL yang tidak valid yang tidak dapat diuraikan. Selalu validasi SQL Anda dengan sistem database Anda.