Records

Membuat Kueri SQL

Melakukan pengambilan data dari database merupakan salah satu tugas dasar dari berbagai role di bidang data. Pengambilan data menggunakan pernyataan SELECT. Meskipun sekilas terdengar sederhana, penggunaan SELECT ini bisa dibilang rumit karena memungkinkan kamu untuk melakukan pembuatan berbagai kueri yang sangat fleksibel dengan berbagai ketentuan yang mengikutinya.

Pernyataan SELECT memiliki beragam ketentuan sebagai berikut:

  • Untuk memilih data yang berbeda dengan baris lainnya, kamu bisa menggunakan operator DISTICNT
  • Pengurutan data menggunakan ketentuan ORDER BY
  • Membuat filter baris data menggunakan ketentuan WHERE
  • Memilih sebagian data dari sebuah tabel menggunakan LIMIT atau FETCH
  • Mengelompokkan beberapa baris menjadi kelompok menggunakan GROUP BY
  • Membuat filter kelompok menggunakan HAVING
  • Melakukan join tables menggunakan INNER JOIN, LEFT JOIN, FULL OUTER JOIN, atau CROSS JOIN.
  • Melakukan operasi terhadap suatu set menggunakan UNION, INTERSECT, dan EXCEPT

Sintaksis pernyataan SELECT

Sintaksis paling sederhana dalam penggunaan SELECT adalah untuk mengambil data dari satu tabel. Berikut ilustrasi singkatnya:

SELECT
    daftar_kolom
FROM
    nama_tabel;

Pada potongan skrip di atas, kamu bisa memilih sebuah kolom atau beberapa kolom yang dipisahkan dengan tanda koma di antara nama kolom. Jika kamu ingin memilih seluruh kolom, kamu bisa menggunakan tanda bintang untuk menggantikan nama kolom. Selanjutnya kamu bisa menyertakan nama tabel dari database yang memiliki data yang ingin kamu ambil. Sebenarnya penggunaan FROM ini adalah opsional. Kamu bisa juga hanya menggunakan pernyataan SELECT jika kamu tidak ingin mengambil data dari tabel manapun.

Proses eksekusi kueri pada PostgreSQL akan mengecek pernyataan FROM sebelum mengecek pernyataan SELECT. Perlu diingat bahwa kata kunci pada SQL adalah case-insensitive, artinya SELECT, Select, maupun select memiliki makna yang sama. Namun, untuk kenyamanan bersama, sudah menjadi kesepakatan tak tertulis untuk menggunakan huruf kapital pada kata kunci untuk memudahkan pembacaan kueri.

Contoh Penggunaan SELECT

Pada contoh-contoh selanjutnya, saya akan menggunakan contoh database bernama dvdrental yang bisa kamu unduh di halaman neon. Sesuai namanya, data ini berisikan data transaksi peminjaman DVD, bisnis peminjaman DVD ini laris sebelum berbagai layanan streaming film berlangganan masuk di pasaran. tabase dvdrental memiliki daftar tabel sebagai berikut:

tablename    |
--------+
actor        |
store        |
address      |
category     |
city         |
country      |
customer     |
film_actor   |
film_category|
inventory    |
language     |
rental       |
staff        |
payment      |
film         |

Untuk keperluan tulisan ini, saya akan menggunakan tabel customer yang memiliki daftar kolom sebagai berikut:

column_name|
----------+
customer_id|
store_id   |
first_name |
last_name  |
email      |
address_id |
activebool |
create_date|
last_update|
active     |

1. Mengambil data dari satu kolom

SELECT
    first_name
FROM
    customer;

Cuplikan hasil:

first_name|
----------+
Jared     |
Mary      |
Patricia  |
Linda     |
Barbara   |
Elizabeth |
Jennifer  |
...

2. Mengambil data dari beberapa kolom

SELECT
	customer_id ,
	first_name ,
	last_name ,
	address_id
FROM
	customer;

Cuplikan hasil:

customer_id|first_name|last_name |address_id|
-----------+----------+----------+----------+
        524|Jared     |Ely       |       530|
          1|Mary      |Smith     |         5|
          2|Patricia  |Johnson   |         6|
          3|Linda     |Williams  |         7|
          4|Barbara   |Jones     |         8|
          5|Elizabeth |Brown     |         9|
          ...

3. Mengambil data dari semua kolom

SELECT
	*
FROM
	customer;

Cuplikan hasil:

customer_id|store_id|first_name|last_name |email                                |address_id|activebool|create_date|last_update            |active|
-----------+--------+----------+----------+-------------------------------------+----------+----------+-----------+-----------------------+------+
        524|       1|Jared     |Ely       |jared.ely@sakilacustomer.org         |       530|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          1|       1|Mary      |Smith     |mary.smith@sakilacustomer.org        |         5|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          2|       1|Patricia  |Johnson   |patricia.johnson@sakilacustomer.org  |         6|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          3|       1|Linda     |Williams  |linda.williams@sakilacustomer.org    |         7|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          4|       2|Barbara   |Jones     |barbara.jones@sakilacustomer.org     |         8|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          5|       1|Elizabeth |Brown     |elizabeth.brown@sakilacustomer.org   |         9|true      | 2006-02-14|2013-05-26 14:49:45.738|     1|
          ...

Perlu diingat bahwa penggunaan simbol bintang/asterisk pada tergolong yang perlu dihindari khususnya jika skrip kueri kamu disematkan pada kode aplikasi karena:

  • Performa database. Kamu bisa saja mengambil lebih banyak data dari yang dibutuhkan.
  • Performa aplikasi. Pengambilan data yang sebenarnya tidak diperlukan akan meningkatkan arus baca tulis server sehingga waktu respon aplikasi bisa menurun.

4. Mengambil data dengan ekspresi/operator

Kita akan menggunakan operator concatenate || untuk menggabungkan kolom first_name dan last_name.

SELECT
	first_name || ' ' || last_name,
    address_id
FROM
	customer;

cuplikan hasil:

?column?          |address_id|
------------------+----------+
Jared Ely         |       530|
Mary Smith        |         5|
Patricia Johnson  |         6|
Linda Williams    |         7|
Barbara Jones     |         8|
...

Pada cuplikan hasil kueri kolom pertama memiliki nama ?column?. Hal ini dikarenakan kita tidak melakukan penyematan nama alias. Kita dapat memperbaikinya dengan sintaksis sebagai berikut:

expressions AS column_alias

Skrip penuhnya bisa dituliskan juga sebagai berikut:

SELECT
	first_name || ' ' || last_name full_name,
    address_id
FROM
	customer;

sehingga cuplikan hasilnya

full_name         |address_id|
------------------+----------+
Jared Ely         |       530|
Mary Smith        |         5|
Patricia Johnson  |         6|
Linda Williams    |         7|
Barbara Jones     |         8|
...

5. Mengambil data tanpa menggunakan FROM

Penggunaan kata kunci FROM pada kueri bersifat opsional. Salah satu contoh kasus penggunaan kueri tanpa FROM adalah penggunaan fungsi NOW():

SELECT NOW();

hasilnya

now                          |
-----------------------------+
2024-11-07 15:56:39.119 +0700|

Penggunaan Alias pada kolom

Penggunaan alias pada nama kolom memungkinkan kamu untuk menentukan suatu nama sementara untuk suatu kolom atau eskpresi dari daftar yang dipilih. Berikut sintaksis penggunaan alias pada kolom:

SELECT nama_kolom AS nama_alias
FROM nama_tabel

Pada contoh tersebut nama_alias ditujukan untuk mengganti nama_kolom. Perlu diperhatikan juga bahwa kata kunci AS bersifat opsional sehingga kamu bisa menuliskannya sebagai berikut:

SELECT nama_kolom nama_alias
FROM nama_tabel

Secara singkat, pembahasan tentang alias pada nama kolom juga sudah dibahas pada di atas pada bagian Contoh penggunaan SELECT di poin 4. Mengambil data dengan ekspresi/operator.

Mengurutkan data dengan ORDER BY

Ketika kita membuat kueri, penggunaan SELECT akan memberikan hasil yang tidak terurut. Untuk mendapatkan data yang sudah berurutan, kamu dapat menggunakan ORDER BY pada kueri. Berikut sintaksis penggunaan ORDER BY:

SELECT
    select_list
FROM
    table_name
ORDER BY
    expression1 [ASC | DESC],
    expression2 [ASC | DESC],
    expression3 [ASC | DESC],
    ...;

Pada contoh kueri tersebut, kamu bisa menempatkan kolom atau ekspresi yang akan digunakan sebagai dasar pengurutan oleh kata kunci ORDER BY. Jika kamu ingin mengurutkan hasil kueri berdasarkan beberapa kolom sekaligus, kamu harus memisahkannya dengan tanda koma (,) di antara nama kolom atau ekspresi. Pengurutan dapat dilakukan secara menaik, dari nilai terendah ke nilai tertinggi, maupun sebaliknya, menurun. Secara bawaan kueri akan menggunakan opsi menaik (ascending).

PostgreSQL akan melakukan pengurutan setelah melakukan pengecekan terhadap SELECT. Secara berurutan, pengecekan yang akan dilakukan oleh postgreSQL adalah: FROM, SELECT, dan ORDER BY. Kamu bisa juga menggunakan nama alias untuk mengurutkan data.

1. Mengurutkan data berdasarkan satu kolom

SELECT
	first_name,
	last_name 
FROM
	customer
ORDER BY
	first_name;

Ingat bahwa secara bawaan, pengurutan dilakukan secara menaik (ASC) sehingga tidak perlu ditulis.

Cuplikan hasil kueri:

first_name |last_name  |
-----------+-----------+
Aaron      |Selby      |
Adam       |Gooch      |
Adrian     |Clary      |
Agnes      |Bishop     |
Alan       |Kahn       |
Albert     |Crouse     |
Alberto    |Henning    |
Alex       |Gresham    |

2. Mengurutkan data berdasarkan beberapa kolom

Pengurutan data dapat dilakukan dengan lebih dari satu kolom sekaligus. Berikut kueri untuk mengambil data first_name dan last_name dengan pengurutan first_name secara menurun dan diikuti dengan last_name secara menurun juga.

SELECT
	first_name,
	last_name
FROM
	customer
ORDER BY
	first_name DESC,
	last_name DESC;

cuplikan hasil kueri:

first_name|last_name   |
----------+------------+
Zachary   |Hite        |
Yvonne    |Watkins     |
Yolanda   |Weaver      |
Wilma     |Richards    |
Willie    |Markham     |
Willie    |Howell      |
William   |Satterfield |
Willard   |Lumpkin     |

Terlihat pada nama depan Willie, dilakukan pengurutan menurun pada nama belakang sehingga Markham berada lebih dulu sebelum Howell.

3. Mengurutkan data berdasarkan expression

Selain menggunakan kolom, pengurutan juga dapat menggunakan expressions sebagai acuannya. Berikut contoh pengurutan data dengan menggunakan fungsi LENGTH() yang akan memberikan nilai panjang dari suatu string.

SELECT
	last_name ,
	LENGTH(last_name) len
FROM
	customer
ORDER BY
	len DESC ;

Pada skrip tersebut saya mengambil kolom last_name dan menggunakan fungsi LENGTH() dengan kolom last_name sebagai input serta alias len pada ekspresi tersebut. Pengurutan data dilakukan secara menurun terhadap ekspresi len. Cuplikan hasil kueri:

last_name   |len|
------------+---+
Westmoreland| 12|
Christenson | 11|
Satterfield | 11|
Butterfield | 11|
Quintanilla | 11|
Scarborough | 11|
Billingsley | 11|

4. Mengurutkan data NULL

Ada kondisi saat data yang kita miliki memiliki nilai NULL. Kondisi tersebut bisa jadi ada data yang hilang. Ketika mengurutkan kolom yang memiliki nilai NULL, kamu bisa mengurutkan nilai NULL secara khusus dengan menggunakan NULLS FIRST atau NULLS LAST. Pengurutan secara bawaan menggunakan NULLS LAST.

Sebagai contoh, saya akan menggunakan urutan data berikut:

num   |
------+
     1|
     1|
     2|
     3|
     5|
[NULL]|
     8|
[NULL]|

Saya akan mengurutkan data dengan menaruh nilai NULL di awal dengan kueri:

SELECT
	num
FROM
	order_null_demo 
ORDER BY num NULLS FIRST ;

Berikut hasil kueri tersebut:

num   |
------+
[NULL]|
[NULL]|
     1|
     1|
     2|
     3|
     5|
     8|

Penggunaan SELECT DISTINCT

Ada saatnya data kita masih memiliki baris yang duplikat entah karena kesalahan aplikasi, data pipeline atau lainnya. Penggunaan SELECT DISTINCT bisa dimanfaatkan untuk menghilangkan duplikasi pada hasil kueri. Pernyataan tersebut akan menampilkan satu baris data untuk setiap kelompok hasil baris yang duplikat. Berikut merupakan sintaksis dari penggunaan SELECT DISTINCT:

SELECT
    DISTINCT kolom1
FROM
    nama_tabel;

Pernyataan SELECT DISTINCT juga bisa digunakan pada lebih dari satu kolom.

Pada PostgreSQL, terdapat juga pernyataan DISTINCT ON yang akan memberikan hasil baris yang tidak duplikat berdasarkan entri pertama dari satu atau lebih kolom pada hasil kueri.

Agar lebih jelas, saya akan menggunakan tabel jadwal_belajar berikut sebagai ilustrasi:

id|hari  |materi   |
--+------+---------+
 1|[NULL]|python   |
 2|Senin |SQL      |
 3|Selasa|Python   |
 4|Rabu  |SQL      |
 5|Rabu  |SQL      |
 6|Kamis |Statistik|
 7|Kamis |Airflow  |
 8|Jumat |[NULL]   |
 9|[NULL]|[NULL]   |
10|[NULL]|[NULL]   |

1. Penggunaan SELECT DISTINCT pada satu kolom

SELECT
	DISTINCT materi
FROM
	jadwal_belajar;

keluaran dari kueri di atas:

materi   |
---------+
[NULL]   |
python   |
Airflow  |
Python   |
SQL      |
Statistik|

perhatikan bahwa terdapat dua buah materi python dan Python, karena SELECT DISTINCT tidak case-sensitive.

2. Penggunaan SELECT DISTINCT pada beberapa kolom

SELECT
	DISTINCT hari,
	materi
FROM
	jadwal_belajar
ORDER BY
	hari,
	materi;

keluaran dari kueri di atas:

hari  |materi   |
------+---------+
Jumat |[NULL]   |
Kamis |Airflow  |
Kamis |Statistik|
Rabu  |SQL      |
Selasa|Python   |
Senin |SQL      |
[NULL]|python   |
[NULL]|[NULL]   |

Dengan menggunakan SELECT DISTINCT pada beberapa kolom, kita bisa mendapatkan data tanpa duplikasi dengan tingkat detail yang dibutuhkan.

3. Penggunaan SELECT DISTINCT ON

PostgreSQL memiliki pernyataan SELECT DISTINCT ON ( expression [, ...] ) yang akan menyimpan baris pertama dari setiap set yang duplikat. berikut contoh kueri:

SELECT
	DISTINCT ON
	(materi) hari,
	materi
FROM
	jadwal_belajar;

Hasil dari kueri tersebut:

hari  |materi   |
------+---------+
Kamis |Airflow  |
Selasa|Python   |
Senin |SQL      |
Kamis |Statistik|
[NULL]|python   |
Jumat |[NULL]   |

Kueri tersebut memberikan hasil tanpa baris duplikat di kolom materi saja sedangkan kolom hari masih memberikan hasil duplikat karena kueri hanya melakukan pemilihan tanpa duplikat di kolom materi.

Setelah kita mempelajari pembuatan kueri, pada pos selanjutnya saya akan membahas tentang melakukan filtering data pada kueri.