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
atauFETCH
- Mengelompokkan beberapa baris menjadi kelompok menggunakan
GROUP BY
- Membuat filter kelompok menggunakan
HAVING
- Melakukan join tables menggunakan
INNER JOIN
,LEFT JOIN
,FULL OUTER JOIN
, atauCROSS JOIN
. - Melakukan operasi terhadap suatu set menggunakan
UNION
,INTERSECT
, danEXCEPT
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.