Suwito Pomalingo | Seize The Day

Best Practices Penulisan Kode SQL Yang Baik
Pengantar
Sebagai seorang programmer, tentunya harus membuat baris-baris kode/programnya rapih dan mudah untuk dibaca. Membuat kode yang rapih (Clean Code) akan membuatnya lebih mudah dibaca dan dipahami. Terlebih lagi jika Anda membuat program bersama tim (Pair programming), maka tentu hal ini akan sangat membantu rekan kerja untuk lebih memahami kode yang Anda buat. Selain itu, dengan membuat baris kode yang rapih lebih memudahkan untuk proses debugging, dievaluasi, dan dapat direproduksi.
Pada tulisan ini saya akan berbagi tips untuk menulis kode SQL dengan rapih. Untuk beberapa bahasa pemrograman seperti Python, ada baiknya mengikuti aturan standar untuk membuat gaya penulisan seperti yang dituliskan dalam PEP8 (ini akan saya ulas di tulisan lainnya).
Catatan: Query SQL ditulis menggunakan PostgreSQL
(1) Penggunaan Huruf Besar (Kapital) pada Keywords (kata kunci) dan Function (fungsi)
Tips pertama ini adalah menulis Kata Kunci dan Function menggunakan huruf besat (kapital). Tips ini mungkin sudah sering Anda lakukan, namun masih banyak yang tidak mengikuti aturan standar ini. Meskipun hal ini sederhana, namun akan membuat kode Anda terlihat lebih mudah dibaca.
Perhatikan perbedaan penulisan di bawah ini. Function dan Keyword akan lebih mudah dipahami ketika menuliskan dengan huruf besar.
Penulisan yang tidak disarankan:
select name, date_trunc(register_date, week) from customers
Coba tulis dengan format di bawah ini. Penulisan akan lebih mudah dibaca:
SELECT name, DATE_TRUNC(register_date, WEEK) FROM customers
(2) Indentasi dan Alignment
Sebelumnya coba perhatikan kedua penulisan kode di bawah ini:
SELECT name, height, age, salary, CASE WHEN age<18 THEN "child" ELSE
"adult" END AS child_or_adult
FROM People LEFT JOIN Income USING (name)
WHERE height<=200 and age<=65
Jika kita lihat, penulisannya sudah menggunakan tips pada nomor 1, namun kode ini akan sulit dibaca ketika penulisannya sudah sangat panjang. Nah, untuk kasus ini maka kode perlu diindentasi dan disejajarkan secara vertikal. Hal ini akan mempermudah seseorang yang belum pernah melihat kode Anda untuk meavigasinya. Perhatikan kode dibawah yang sudah dilakukan proses indentasi dan alignment.
SELECT
name
, height
, age
, salary
, CASE WHEN age < 18 THEN "child"
ELSE "adult"
END AS child_or_adult
FROM
People
LEFT JOIN
Income USING (name)
WHERE
height <= 200
AND age <= 65
(3) Terapkan Tipe Case (tipe penulisan) yang konsisten untuk skema, tabel, kolom
Dalam pemrograman ada beberapa tipe penulisan, yakni:
- camelCase
- PascalCase
- snake_case
Terlepas dari apa preferensi Anda, namun penting untuk memastikan bahwa Anda konsisten menerapkan salah satu tipe penulisan pada seluruh kode Anda.
Perhatikan penulisan di bawah ini yang mana menggunakan semua jenis tipe penulisan.
SELECT
firstName
, LastName
, child_or_adult
FROM
customers
Bandingkan dengan penulisan yang ini:
SELECT
first_name
, last_name
, child_or_adult
FROM
customers
(4) Hindari SELECT *
Ini adalah tip sangat penting, tidak hanya untuk pemformatan atau aturan gaya penulisan, namun juga untuk optimasi query (akan dibahas pada artikel lain).
Bahkan jika Anda akan menggunakan hampir setiap kolom dalam sebuah tabel, sebaiknya tuliskan kolom yang Anda perlukan. Mengapa? Saat tabel berkembang misal jika kolom ditambahkan/diubah menjadi lebih banyak, menentukan nama kolom akan memudahkan untuk mengidentifikasi potensi bug di masa mendatang.
Sebaiknya dituliskan:
SELECT
name
, height
, age
, salary
FROM
customers
(5) Modularisasi Kode dengan Common Table Expressions (CTE)
Menggunakan Common Table Expressions (atau CTE) sangat berguna untuk memodulasi dan memecah kode Anda. Pada dasarnya dalam CTE, kita akan membuat tabel sementara yang memungkinkan untuk “melakukan query pada sebuah query”.
Jika Anda ingin mengetahui mengenai CTE lebih detail, silahkan klik disini Common Table Expressions
Perhatikan kode ini:
SELECT
name
, salary
FROM
People
WHERE
name IN (SELECT DISTINCT
name
FROM
population
WHERE
country = "Canada"
AND city = "Toronto")
AND salary >= (SELECT
AVG(salary)
FROM
salaries
WHERE
gender = "Female")
Bandingkan dengan ini:
with toronto_ppl as (
SELECT DISTINCT
name
FROM
population
WHERE
country = "Canada"
AND city = "Toronto"
)
, avg_female_salary as (
SELECT
AVG(salary) as avg_salary
FROM
salaries
WHERE
gender = "Female"
)
SELECT
name
, salary
FROM
People
WHERE
name IN(SELECT name FROM toronto_ppl)
AND salary >= (SELECT avg_salary FROM avg_female_salary)
Dengan CTE akan memudahkan untuk mengetahui bahwa klausa WHERE memfilter nama di Toronto. CTE berguna tidak hanya untuk memecah kode menjadi blok yang lebih kecil, tetapi juga dapat menetapkan nama variabel untuk setiap CTE ( misal diatas nama variabel toronto_ppl dan avg_female_salary).
(6) Descriptive Variable Names
Saat membuat nama variabel, perlu dijelaskan atau dideskripsikan variabel tersebut. Dengan model penulisan CTE pada tips nomor 5, hanya dengan membaca nama variabel itu sendiri, jelas bahwa CTE pertama mengambil orang dari Toronto dan CTE kedua mendapatkan gaji rata-rata wanita.
with table_one as (
SELECT DISTINCT
name
FROM
population
WHERE
country = "Canada"
AND city = "Toronto"
)
, table_two as (
SELECT
AVG(salary) as var_1
FROM
salaries
WHERE
gender = "Female"
)
SELECT
name
, salary
FROM
People
WHERE
name IN(SELECT name FROM table_one)
AND salary >= (SELECT var_1 FROM table_two)
(7) Sederhanakan Kode menggunakan Temporary Functions
Temporary functions adalah cara yang bagus untuk:
- Memecah kode
- Menulis kode yang bersih (clean code)
- Memungkinkan kode dapat digunakan lagi.
Perhatikan kode di bawah ini:
SELECT name
, CASE WHEN tenure < 1 THEN "analyst"
WHEN tenure BETWEEN 1 and 3 THEN "associate"
WHEN tenure BETWEEN 3 and 5 THEN "senior"
WHEN tenure > 5 THEN "vp"
ELSE "n/a"
END AS seniority
FROM employees
Anda dapat menggunakan Temporary Function untuk mengcapture clausa CASE.
CREATE TEMPORARY FUNCTION seniority(tenure INT64) AS (
CASE WHEN tenure < 1 THEN "analyst"
WHEN tenure BETWEEN 1 and 3 THEN "associate"
WHEN tenure BETWEEN 3 and 5 THEN "senior"
WHEN tenure > 5 THEN "vp"
ELSE "n/a"
END
);
SELECT name
, seniority(tenure) as seniority
FROM employees
Dengan Temporary Function, query akan jauh lebih sederhana dan mudah dibaca, dan fungsi yang dibuat (seniority) dapat digunakan kembali.
(8) Komentar yang Bermakna
Berikut adalah aturan terpenting saat menulis komentar: “TULIS KOMENTAR HANYA JIKA DIPERLUKAN“.
Dengan mengikuti tujuh tips sebelumnya (menggunakan nama deskriptif, kode modularisasi, menulis kode bersih, dll.), Anda tidak perlu menulis banyak komentar.
Meskipun demikian, komentar berguna dan mungkin diperlukan, ketika kode itu sendiri tidak dapat menjelaskan apa yang ingin Anda capai.
Berikut adalah contoh komentar buruk:
# Getting names of people in Toronto, Canada
with table1 as (
SELECT DISTINCT name
FROM population
WHERE country = "Canada"
AND city = "Toronto"
)
# Getting the average salary of females
, table2 as (
SELECT AVG(salary) as var1
FROM salaries
WHERE gender = "Female"
)
Contoh diatas adalah komentar yang buruk karena memberi tahu kita apa yang sudah kita ketahui dengan membaca kode itu sendiri. Ingat, komentar biasanya menjawab “mengapa” Anda melakukan sesuatu daripada “apa” yang Anda lakukan.
Nah.. demikian tips untuk menulis kode SQL yang baik. Pada dasarnya gaya penulisan kembali pada diri programmer sendiri. Namun tips diatas perlu dipertimbangkan untuk mengimprove gaya pemrograman Anda.