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.

Leave a Reply