Menu Close

SQL SELECT DISTINCT WHERE ORDER BY LIMIT OFFSET

Redundansi adalah salah satu konsep penting dalam basis data. Data yang "redundan" berarti sebuah data dengan makna yang sama disimpan berulang dalam basis data. Konsep redundansi ini penting untuk pencadangan data dan pemulihan (backup/ recovery) untuk mengantisipasi jika terjadi kegagalan/ kerusakan data.

Namun, duplikasi di dalam basis data dihindari karena mengakibatkan kerepotan dan kebingungan pada saat mengambil dan mengelolanya. Misalnya, jika NIK tersimpan di tabel "Profil" dan "Pengguna", maka perubahan nilai tersebut harus dilakukan di kedua tempat.

Penyaringan dan Pengurutan pada Query SQL

Meskipun basis data telah dirancang dengan baik, dimana setiap baris data dijamin unik, bisa jadi hasil query menampilkan data yang berulang. Sebagai contoh, dalam skenario kepemilikan kendaraan, satu kendaraan hanya dimiliki oleh satu orang, tetapi satu orang bisa memiliki lebih dari satu kendaraan. Dalam penyimpanannya, kombinasi identitas pemilik (NIK) dan nomor kendaraan (plat polisi) dapat digunakan sebagai PRIMARY KEY untuk memastikan setiap baris dalam tabel tetap unik.

Akan tetapi, ketika kita hanya ingin menampilkan daftar NIK pemilik kendaraan, hasil query bisa menunjukkan NIK yang berulang, yaitu untuk pemilik yang memiliki lebih dari satu kendaraan. Untuk menghindari duplikasi ini, SQL menyediakan kata kunci DISTINCT untuk mengeliminasi baris dengan nilai kolom yang sama.

Contoh Tabel: Kepemilikan Kendaraan

NIK Plat_Polisi Nama_Pemilik Jenis_Kendaraan
1234567890 B1234ABC Bejo Mobil
1234567890 B5678DEF Bejo Motor
9876543210 D1234XYZ Surti Mobil
9876543210 D5678UVW Surti Motor
1357913579 H9876JKL Amat Mobil
SELECT NIK
FROM KepemilikanKendaraan;
NIK
1234567890
1234567890
9876543210
9876543210
1357913579

Seperti yang terlihat, NIK Bejo dan Surti muncul dua kali karena mereka memiliki lebih dari satu kendaraan.

SELECT DISTINCT NIK
FROM KepemilikanKendaraan;
NIK
1234567890
9876543210
1357913579

Dengan menggunakan kata kunci DISTINCT, duplikasi NIK dihilangkan, sehingga setiap NIK hanya muncul sekali.

DISTINCT: Tampikan Baris yang Berbeda

Perintah SELECT DISTINCT akan menampilkan baris tanpa duplikasi. Sintaksnya sederhana:

SELECT DISTINCT kolom, kolom_lainnya
FROM nama_tabel
WHERE kondisi;

Selain menggunakan kata kunci DISTINCT untuk menghapus duplikasi secara otomatis, bisa juga menggunakan GROUP BY yang akan dipelajari pada sesi berikutnya.

ORDER BY: Urutkan Berdasarkan

Dalam menyusun berbagai jenis laporan, kebutuhan pengurutan data bisa berbeda-beda. Misalnya, tampilkan data kendaraan sesuai urutan nama pemilik, urut tahun beli, urut nomor kendaraan, dsb. SQL menyediakan cara untuk mengurutkan hasil berdasarkan kolom tertentu dengan menggunakan klausa ORDER BY.

SELECT kolom, kolom_lainnya
FROM nama_tabel
WHERE kondisi
ORDER BY kolom ASC/DESC;

Dengan perintah ini, hasil query akan diurutkan secara alfabetis atau numerik. Pengurutan bisa dilakukan secara meningkat naik (ASCending) atau turun (DEScending). ASC lebih mudah dihafalkan dengan ASZ (A Sampai Z, 0-9). Jika tidak dicantumkan, secara otomatis DBMS akan mengasumsikan pengurutan berdasarkan ASC.

LIMIT & OFFSET: Membatasi Jumlah dan Posisi Baris

Sebuat tabel dapat berisi ribuan bahkan jutaan baris. Klausa LIMIT dan OFFSET berguna untuk mengambil sebagian dari hasil query. Klausa LIMIT membatasi jumlah baris yang diambil dan OFFSET menunjukkan berapa baris pertama yang dilewati.

SELECT kolom, kolom_lainnya
FROM nama_tabel
WHERE kondisi
ORDER BY kolom ASC/DESC
LIMIT jumlah_baris OFFSET mulai_dari_baris;

Fitur ini paling sering digunakan pada kasus pagination atau pengelolaan daftar hasil query menjadi halaman. Sebagai contoh, situs media sosial menampilkan daftar foto yang diurutkan berdasarkan popularitas dan waktu. Setiap halaman diwakili oleh kumpulan baris yang diambil menggunakan perintah LIMIT dan OFFSET.

-- 10 baris saja
SELECT foto FROM catatan LIMIT 10;
-- lewati 10 baris pertama
SELECT foto FROM catatan LIMIT 10 OFFSET 10;
SELECT foto FROM catatan LIMIT 10 OFFSET 20;

Kapan LIMIT dan OFFSET dieksekusi dalam [[urutan pemrosesan perintah query]]? Umumnya, klausa ini dieksekusi paling akhir.

Latihan

id judul penulis tahun jenis
1 "Senja di Jakarta" "Mochammad Ali" 1963 "Sastra"
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"
3 "Bumi Manusia" "Pramoedya Ananta Toer" 1980 "Sastra"
4 "Negeri 5 Menara" "Ahmad Fuadi" 2009 "Inspirasi"
5 "Habibie & Ainun" "Bacharuddin Jusuf Habibie" 2010 "Biografi"
6 "Laskar Pelangi 2" "Andrea Hirata" 2007 "Fiksi"
7 "Anak Semua Bangsa" "Pramoedya Ananta Toer" 1981 "Sastra"
8 "Edensor" "Andrea Hirata" 2011 "Fiksi"
9 "Rumah Kaca" "Pramoedya Ananta Toer" 1985 "Sastra"
10 "Dilan 1990" "Pidi Baiq" 2014 "Fiksi"
  1. Tampilkan daftar penulis, urut abjad, tanpa duplikat.
  2. Tampilkan empat buku rilis terakhir, urutkan dari terkini hingga terlama.
  3. Tampilkan lima buku pertama urut abjad.
  4. Tampilkan lima buku berikutnya.

Pembahasan

1. Tampilkan daftar penulis, urut abjad, tanpa duplikat.

SELECT DISTINCT penulis
FROM Buku
ORDER BY penulis ASC;
penulis
"Ahmad Fuadi"
"Andrea Hirata"
"Bacharuddin Jusuf Habibie"
"Mochammad Ali"
"Pidi Baiq"
"Pramoedya Ananta Toer"

Penulis "Andrea Hirata" dan "Pramoedya Ananta Toer" muncul beberapa kali di tabel, namun dengan DISTINCT, kita menghilangkan duplikat.

2. Tampilkan empat buku rilis terakhir, urutkan dari terkini hingga terlama.

SELECT judul, tahun
FROM Buku
ORDER BY tahun DESC
LIMIT 4;
judul tahun
"Dilan 1990" 2014
"Edensor" 2011
"Habibie & Ainun" 2010
"Negeri 5 Menara" 2009

Ingat: ASC (ASZ: A sampai Z, 0 s.d. 9). Pengurutan berdasarkan rilis terkini hingga terlama berarti diurutkan dari tahun terbesar hingga terkecil.

3. Tampilkan lima buku pertama urut abjad.

SQL:

SELECT judul
FROM Buku
ORDER BY judul ASC
LIMIT 5;
judul
"Anak Semua Bangsa"
"Bumi Manusia"
"Dilan 1990"
"Edensor"
"Habibie & Ainun"

4. Tampilkan lima buku berikutnya.

SELECT judul
FROM Buku
ORDER BY judul ASC
LIMIT 5 OFFSET 5;
judul
"Laskar Pelangi"
"Laskar Pelangi 2"
"Negeri 5 Menara"
"Rumah Kaca"
"Senja di Jakarta"

Ingat: OFFSET x = lewati x baris.

SQL SELECT WHERE LIKE

Teks atau string adalah tipe data yang paling sering disimpan dalam basis data. Terdapat operator SQL khusus digunakan pada kolom yang bertipe teks. Operator ini bertujuan membantu dalam pencarian string, diantaranya adalah sebagai berikut:

  1. = (Sama Dengan)
    Operator = digunakan untuk membandingkan string, huruf besar atau kecil sangat berpengaruh. Jika ingin menemukan data yang benar-benar sama, gunakan tanda "=". Misalnya, menemukan buku yang judulnya "Laskar Pelangi":

    SELECT * FROM buku WHERE judul = "Laskar Pelangi";
    
  2. != atau <> (Tidak Sama Persis)
    Operator != atau <> digunakan untuk menemukan data yang tidak sesuai dengan kriteria tertentu. Misalnya, kita ingin mencari semua buku yang bukan ditulis oleh Andrea Hirata:

    SELECT * FROM buku WHERE penulis != "Andrea Hirata";
    
  3. LIKE (Perbandingan String Tak Sensitif Huruf Besar/Kecil)
    Operator LIKE digunakan untuk membandingkan string tanpa memperhatikan huruf besar atau kecil. Misalnya, untuk mencari buku dengan judul yang mengandung kata "Pelangi" tanpa memperhatikan apakah ditulis dengan huruf besar atau kecil:

    SELECT * FROM buku WHERE judul LIKE "laskar pelangi";
    
  4. NOT LIKE
    Kebalikan dari LIKE, NOT LIKE digunakan mencari data yang tidak sesuai dengan kriteria teks tertentu. Misalnya, mencari semua buku yang tidak mengandung kata "Menara", tidak peduli huruf besar/ kecil:

    SELECT * FROM buku WHERE judul NOT LIKE "negeri 5 menara";
    
  5. % (Wildcard untuk Sederet Karakter Apapun)
    Wildcard berarti karakter apapun. Penanda % sangat berguna dalam mengabaikan data yang mengandung sederet karakter apapun dalam string. Penanda ini hanya berlaku untuk operator LIKE. Misalnya, kita ingin menemukan semua buku yang judulnya mengandung huruf "M" di mana saja (diawali dan diakhiri sederet karakter apapun):

    SELECT * FROM buku WHERE judul LIKE "%M%";
    

Judul berikut akan menjadi bagian dari hasil query:

  • Bumi Manusia
  • Momentum
  • Hitam
  1. _ (Wildcard untuk Satu Karakter)
    Penanda _ dalam operator LIKE digunakan untuk mengabaikan satu karakter apapun string. Misalnya, mencari buku dengan judul dimana karakter ketiga boleh apapun.:

    SELECT * FROM buku WHERE judul LIKE "Bu_i%";
    

Judul berikut akan menjadi bagian dari hasil query:

  • Bumi Manusia
  • Budi
  1. IN (…) (String Ada dalam Daftar)
    Operator IN digunakan untuk mencari data yang sesuai dengan salah satu dari beberapa nilai dalam daftar. Misalnya, kita ingin menemukan buku yang ditulis oleh "Pramoedya Ananta Toer" atau "Andrea Hirata":

    SELECT * FROM buku WHERE penulis IN ("Pramoedya Ananta Toer", "Andrea Hirata");
    
  2. NOT IN (…) (String Tidak Ada di Daftar)
    Sebaliknya, jika ingin mencari data yang tidak ada dalam daftar nilai tertentu, gunakan NOT IN. Misalnya, mencari semua buku yang bukan ditulis oleh "Mochammad Ali atau "Ahmad Fuadi":

    SELECT * FROM buku WHERE penulis NOT IN ("Mochammad Ali", "Ahmad Fuadi");
    

Latihan:

id judul penulis tahun jenis
1 "Senja di Jakarta" "Mochammad Ali" 1963 "Sastra"
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"
3 "Bumi Manusia" "Pramoedya Ananta Toer" 1980 "Sastra"
4 "Negeri 5 Menara" "Ahmad Fuadi" 2009 "Inspirasi"
5 "Habibie & Ainun" "Bacharuddin Jusuf Habibie" 2010 "Biografi"
  1. Temukan Buku Berjudul "Laskar Pelangi"
  2. Temukan Buku yang Ditulis oleh "Pramoedya Ananta Toer"
  3. Tampilkan Buku dan Penulis yang Bukan Ditulis oleh "Pramoedya Ananta Toer"
  4. Temukan Buku dengan Judul yang Dimulai dengan "Negeri"
  5. Temukan Semua Buku dengan Judul yang Diakhiri oleh "Pelangi"

Pembahasan:

  1. Temukan Buku Berjudul "Laskar Pelangi"
SELECT * FROM buku 
WHERE judul = 'Laskar Pelangi';
id judul penulis tahun jenis
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"
  1. Temukan Buku yang Ditulis oleh "Pramoedya Ananta Toer"
SELECT * FROM buku 
WHERE penulis = 'Pramoedya Ananta Toer';
id judul penulis tahun jenis
3 "Bumi Manusia" "Pramoedya Ananta Toer" 1980 "Sastra"
  1. Tampilkan Buku dan Penulis yang Bukan Ditulis oleh "Pramoedya Ananta Toer"
SELECT judul, penulis FROM buku 
WHERE penulis != 'Pramoedya Ananta Toer';
judul penulis
"Senja di Jakarta" "Mochammad Ali"
"Laskar Pelangi" "Andrea Hirata"
"Negeri 5 Menara" "Ahmad Fuadi"
"Habibie & Ainun" "Bacharuddin Jusuf Habibie"
  1. Temukan Buku dengan Judul yang Dimulai dengan "Negeri"
SELECT * FROM buku 
WHERE judul LIKE 'Negeri%';
id judul penulis tahun jenis
4 "Negeri 5 Menara" "Ahmad Fuadi" 2009 "Inspirasi"
  1. Temukan Buku dengan Judul yang Diakhiri oleh "Pelangi"
SELECT * FROM buku 
WHERE judul LIKE '%Pelangi';
id judul penulis tahun jenis
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"

SQL SELECT WHERE

SQL Menyaring Baris berdasarkan Kondisi/ Batasan

SELECT digunakan untuk memilih kolom tertentu dari sebuah tabel. Namun, bagaimana jika tabel tersebut berisi ratusan juta baris data? Membaca seluruh baris akan sangat tidak efisien, bahkan mungkin mustahil. Baris tertentu disaring agar tidak ditampilkan dengan menggunakan klausa WHERE dalam query SQL. Klausa ini diterapkan ke setiap baris data dengan memeriksa nilai kolom tertentu, menentukan apakah baris tersebut harus dimasukkan dalam hasil atau tidak.

Contoh Query dengan Saringan WHERE

SELECT kolom, kolom_lain, …
FROM nama_tabel
WHERE kondisi
    AND/OR kondisi_lain
    AND/OR …;

Klausa yang lebih kompleks disusun dengan menggabungkan beberapa kata kunci logika AND atau OR (misalnya, tahun >= 2000 AND jenis = "Sastra"). Berikut ini adalah beberapa operator berguna yang dapat digunakan untuk data numerik (misalnya, bilangan bulat atau titik mengambang):

Operator Jenis Kondisi Contoh SQL
=, !=, <, <=, >, >= Operator numerik kolom != 5
BETWEEN … AND … Angka berada dalam rentang dua nilai kolom BETWEEN 3.3 AND 5.5
NOT BETWEEN … AND … Angka tidak berada dalam rentang kolom NOT BETWEEN 3 AND 5
IN (…) Angka ada dalam daftar kolom IN (3, 5, 7)
NOT IN (…) Angka tidak ada dalam daftar kolom NOT IN (3, 5, 7)

Dengan menuliskan klausa untuk membatasi hasil baris yang ditampilkan, query berjalan lebih cepat karena jumlah data yang tidak diperlukan menjadi berkurang.

SQL sebenarnya tidak mengharuskan penulisan kata kunci dalam huruf kapital. Namun, secara konvensi atau kesepakatan, penulisan kapital membantu memisahkan kata kunci SQL dari nama kolom dan tabel, membuat query lebih mudah dibaca.

Latihan:

  1. Temukan buku dengan kolom id bernilai 4
  2. Tampilkan buku terbitan tahun 2000 dan 2010
  3. Tampilkan buku yang BUKAN terbitan tahun 2000 dan 2010
  4. Temukan buku yang diterbitkan sebelum tahun 2010

Pembahasan:

  1. Temukan buku dengan kolom id bernilai 4
SELECT * FROM Buku WHERE id = 4;

Ekspektasi Hasil: Satu baris (id adalah primary key) yang menampilkan seluruh kolom dari buku dengan id 4.

primary key adalah satu set kolom yang nilainya unique, tidak mungkin sama pada baris lain; dan not null atau mandatory atau required yaitu harus ada nilainya)

id judul penulis tahun jenis
4 "Negeri 5 Menara" Ahmad Fuadi 2009 Inspirasi
  1. Tampilkan buku terbitan tahun 2000 dan 2010
SELECT * FROM Buku WHERE tahun BETWEEN 2000 AND 2010;

Ekspektasi Hasil: Seluruh kolom dengan baris yang merupakan buku dengan tahun terbit antara 2000 dan 2010.

id judul penulis tahun jenis
2 "Laskar Pelangi" Andrea Hirata 2005 Fiksi
4 "Negeri 5 Menara" Ahmad Fuadi 2009 Inspirasi
5 "Habibie & Ainun" Bacharuddin Jusuf Habibie 2010 Biografi
  1. Tampilkan buku yang BUKAN terbitan tahun 2000 dan 2010
SELECT * FROM Buku WHERE tahun NOT IN (2000, 2010);

Ekspektasi Hasil: Seluruh kolom dengan baris yang merupakan buku dengan tahun terbit tidak dalam daftar (2000, 2010).

id judul penulis tahun jenis
1 "Senja di Jakarta" Mochammad Ali 1963 Sastra
3 "Bumi Manusia" Pramoedya Ananta Toer 1980 Sastra
  1. Temukan buku yang diterbitkan sebelum tahun 2010
SELECT * FROM Buku WHERE tahun < 2010;

Ekspektasi Hasil: Seluruh kolom dengan baris yang merupakan buku dengan tahun terbit sebelum (dan tidak termasuk) 2010.

Pengantar SQL – Bahasa untuk Menjelajahi Basisdata

SQL (Structured Query Language) adalah bahasa yang dirancang agar siapa saja, baik yang memiliki latar belakang teknis atau tidak, dapat mengakses, memanipulasi, dan mengubah data dari basis data relasional. Karena kesederhanaannya, SQL menjadi pondasi penyimpanan data yang aman dan dapat diandalkan untuk jutaan situs web dan aplikasi mobile di seluruh dunia.

Pernah dengar SQLite, MySQL, Postgres, Oracle, dan Microsoft SQL Server?

Semua sistem ini mendukung standar bahasa SQL yang umum, meski masing-masing punya fitur tambahan dan jenis penyimpanan yang berbeda. Namun, apa yang akan kita pelajari di sini adalah fondasi SQL yang berlaku secara umum.

Sebelum mempelajari ke sintaks SQL, perlu paham dulu apa itu basis data relasional.

Relasional diambil dari istilah matematika yaitu relation. Bayangkan kumpulan tabel dua dimensi, mirip dengan lembar kerja Excel. Setiap tabel memiliki kolom dengan nama tetap dan telah ditentukan sebelum mengisinya, mewakili atribut atau properti. Sedangkan baris berisikan data-data.

Istilah berikut memiliki arti yang sangat mendekati antar satu dengan yang lain.

  • Tabel ~ Relation ~ Objects ~ Sheets
  • Kolom ~ Attribute ~ Property ~ Field
  • Baris ~ Tuple ~ Instance ~ Record

Struktur basis data tanpa isinya disebut sebagai skema. Sedangkan isi dari table mencerminkan status dari informasi yang tersimpan, sehingga disebut state.

Sebagai contoh, bayangkan sebuah instansi mencatat kendaraan dinas yang digunakan oleh para pejabat. Di tabel Kendaraan Dinas, terdapat kolom-kolom seperti model kendaraan, jenis, jumlah roda, dan kapasitas mesin.

Id Merek/Model # Roda Kapasitas Mesin (CC) Jenis
1 Toyota Land Cruiser 4 4500 SUV
2 Mercedes-Benz S Class 4 3000 Sedan
3 Honda CR-V 4 2400 SUV
4 Yamaha NMAX 2 155 Motor
5 Lexus LS 500 4 3500 Sedan Mewah

Tabel ini hanya satu dari sekian banyak tabel yang terdapat dalam sebuah database. Di tabel lain, kita bisa mencatat informasi tentang "pejabat yang menggunakan kendaraan", "nomor polisi kendaraan", atau "status perawatan".

Apa Pentingnya Mempelajari SQL
Dengan SQL, Anda bisa menjawab berbagai pertanyaan penting tentang data. Misalnya, “Berapa banyak kendaraan dinas yang memiliki kapasitas mesin di atas 3000cc?” atau “Berapa model kendaraan dinas yang berasal dari merek Jepang?” Jawaban dari pertanyaan-pertanyaan ini dapat membantu kita dalam mengambil keputusan penting bagi perusahaan.

Praktikum ini akan dimulai dengan pengenalan berbagai bagian dari query SQL.
Kita akan belajar bagaimana menyusun query untuk mengambil data dari tabel yang sudah ada. Setelah itu, berlatih mengubah tabel (atau skema) dan bahkan membuat tabel baru dari nol. Setiap pelajaran diakhiri dengan latihan interaktif agar Anda bisa langsung mencoba dan bereksperimen dengan kode SQL.

Jika sudah familiar dengan SQL, Anda bisa langsung lompat ke bagian yang lebih lanjut, tapi sangat disarankan untuk tetap mengikuti pelajaran dari awal agar mendapatkan pemahaman yang lebih kuat.

SQL SELECT

Seperti berjalan di tengah pasar yang ramai dengan berbagai pilihan. Jangan borong semua; cukup pilih yang dibutuhkan. SELECT dalam SQL digunakan untuk mengambil data tertentu dari hamparan informasi yang luas dalam database.

Bayangkan sebuah perpustakaan digital berisi ribuan buku. Buku dengan judul tertentu atau karya penulis favorit dapat ditemukan dengan perintah SELECT.

Berikut sebuah tabel sederhana bernama Buku yang berisi koleksi buku perpustakaan:

id judul penulis tahun jenis
1 "Senja di Jakarta" "Mochammad Ali" 1963 "Sastra"
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"
3 "Bumi Manusia" "Pramoedya Ananta Toer" 1980 "Sastra"
4 "Negeri 5 Menara" "Ahmad Fuadi" 2009 "Inspirasi"
5 "Habibie & Ainun" "Bacharuddin Jusuf Habibie" 2010 "Biografi"

Latihan:

  1. Tampilkan semua informasi tentang setiap buku.
  2. Tampilkan judul dari setiap buku.
  3. Tampilkan judul dan penulis dari setiap buku.
  4. Hitung jumlah buku yang ada di perpustakaan.
  5. Temukan genre unik.

Pembahasan:

  1. Tampilkan semua informasi tentang setiap buku.
SELECT * FROM Buku;
id judul penulis tahun jenis
1 "Senja di Jakarta" "Mochammad Ali" 1963 "Sastra"
2 "Laskar Pelangi" "Andrea Hirata" 2005 "Fiksi"
3 "Bumi Manusia" "Pramoedya Ananta Toer" 1980 "Sastra"
4 "Negeri 5 Menara" "Ahmad Fuadi" 2009 "Inspirasi"
5 "Habibie & Ainun" "Bacharuddin Jusuf Habibie" 2010 "Biografi"
  1. Tampilkan judul dari setiap buku.
SELECT judul FROM Buku;
judul
"Senja di Jakarta"
"Laskar Pelangi"
"Bumi Manusia"
"Negeri 5 Menara"
"Habibie & Ainun"
  1. Tampilkan judul dan penulis dari setiap buku.
SELECT judul, penulis FROM Buku;
judul penulis
"Senja di Jakarta" "Mochammad Ali"
"Laskar Pelangi" "Andrea Hirata"
"Bumi Manusia" "Pramoedya Ananta Toer"
"Negeri 5 Menara" "Ahmad Fuadi"
"Habibie & Ainun" "Bacharuddin Jusuf Habibie"
  1. Hitung jumlah buku yang ada di perpustakaan.
SELECT COUNT(*) AS jumlah_buku FROM Buku;
jumlah_buku
5

Perintah SELECT dapat dikombinasikan dengan fungsi agregat seperti COUNT() untuk melakukan perhitungan.

Misalnya, jika Anda ingin mengetahui rata-rata tahun terbit buku-buku di perpustakaan:

SELECT AVG(tahun) AS rerata_tahun FROM Buku;
rerata_tahun
1993.4
  1. Temukan genre unik.
SELECT DISTINCT jenis FROM Buku;
jenis
"Sastra"
"Fiksi"
"Inspirasi"
"Biografi"

Kata kunci DISTINCT digunakan untuk membuang data yang duplikat, yaitu Sastra yang seharusnya tampil dua kali.

Menjalankan Aplikasi Tanpa Instalasi dengan Docker

Ingin mencoba nginx, ruby, atau golang tapi males repot menginstal dan menghapusnya nanti? Dengan Docker, kita bisa langsung menjalankan aplikasi tanpa harus pusing dengan proses instalasi atau bersih-bersih setelahnya.

Mengunduh image bikinan orang lain

image adalah semacam "installer". Dari image ini, kita bisa menginstallnya sebagai container, yaitu aplikasi yang siap dijalankan. Kita bisa membuat image sendiri, tapi konfigurasi dan proses build membutuhkan waktu lama. Dengan kepakaran yang terbatas, lebih praktis memanfaatkan image bikinan orang lain.

image yang telah dibangun oleh orang lain dapat diperoleh dari Docker Hub. Semacam toko aplikasi atau "App Store" yang di dalamnya telah diorganisasi dengan rapi. Misalnya, kategori "Language & Frameworks" berisikan image dari bahasa php atau ruby yang lumayan ribet jika menginstall secara manual.

Namun, berkat docker kita bisa dengan mudah gunakan image tersebut dengan docker pull NAMA_IMAGE. Contohnya:

docker pull ruby

Kemudian mengecek daftar image dengan perintah

docker image ls
REPOSITORY      TAG               IMAGE ID       CREATED       SIZE
ruby            latest            dc4e58bf5fd5   5 weeks ago   1.46GB

Menghapus image

Image yang tidak dipakai lebih baik dihapus daripada menghabiskan ruang.

Misalnya terdapat image dengan nama nginx. Dua cara menghapusnya, yaitu:

  • Cara intuitif
docker image rm nginx
  • Cara cepat (rmi = remove image)
docker rmi nginx

Menjalankan container

Image adalah sekumpulan aplikasi yang tersedia namun belum siap digunakan, semacam "installer".

Sebelum dijalankan, image perlu dipasang/ diinstall ke sistem sebagai container.

Sebuah image dapat dipasang sebagai beberapa container.

Terdapat dua jenis kontainer:

  1. Kontainer layanan siaga: kontainer dengan layanan latar (background service)
  2. Kontainer buruh: kontainer aplikasi

Kontainer Layanan Siaga

Aplikasi semacam server web, menjalankan proses latar. Di balik layar (tanpa antar muka), proses tersebut berjalan standby menunggu permintaan dari pengguna.

Biasanya aplikasi semacam ini menerima permintaan melalui protokol TCP/IP (aplikasi jaringan) dan HTTP (aplikasi web).

Contohnya, aplikasi nginx memonitor port 80 (bisa diganti di konfigurasi). Selama hidupnya, nginx akan menguasai port 80 sehingga aplikasi lain tidak dapat menggunakannya (port binding).

Perintah berikut akan melakukan tiga hal:

  • Mengunduh image nginx dari "Docker Hub" jika belum tersedia di komputer lokal.
  • Membuat container baru dengan nama otomatis
  • Menjalankan container tersebut.
docker run -d -p 80:80 nginx

-d atau --detachmenandakan bahwa proses dijalankan dilatar ("detach" berarti pengguna tidak perlu menunggu dan menanti sampai kisah ini berakhir).

[!important] Dalam dunia sistem komputer, kita juga mengenal istilah daemon, yaitu proses yang bergentayangan di balik layar.

nginx mangkal di port 80 di dalam kontainer dan siap siaga. Namun, untuk meminta data dari nginx, kita perlu masuk ke dalam kontainer tersebut. Ini akan kita bahas lain waktu. Kita pelajari dulu cara mengakses layanan ini tanpa masuk-masuk.

-p atau --publish berarti layanan yang ada di dalam kontainer akan dipublikasikan oleh host (komputer yang menjalankan kontainer), sehingga bisa diakses tanpa harus masuk ke dalam kontainer.

Kita bisa menggunakan browser dan mengambil file yang tersedia melalui broser dengan alamat URL http://127.0.0.1:80 atau http://127.0.0.1 (:80 adalah port default untuk protokol HTTP).

# Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to [nginx.org](http://nginx.org/).  
Commercial support is available at [nginx.com](http://nginx.com/).

_Thank you for using nginx._

Orang siaga ada batasnya, ada masa-masa dimana aplikasi membutuhkan "me time".

Apakah aplikasi sedang siaga? Pertanyaan bisa dijawab dengan mudah menggunakan perintah berikut:

docker ps

ps adalah perintah umum di linux yang merupakan singkatan dari proses status.

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                NAMES
24b57acffb5b   nginx                           "/docker-entrypoint.…"   16 minutes ago   Up 16 minutes   0.0.0.0:80->80/tcp   pedantic_sinoussi

Dari luaran di atas, proses dari kontainer nginx sedang berjalan dengan port yang dipublikasikan di 0.0.0.0:80.

[!note] Dalam jaringan dengan TCP-IP, setiap komputer diberi nama menggunakan alamat IP.

Alamat khusus "127.0.0.1" (loopback interface) digunakan untuk menyebut "komputer ini" secara spesific.

Sedangkan "0.0.0.0" (unspecified address) menunjukkan bahwa aplikasi akan melayani "siapapun".

Layanan web sudah berjalan, tapi bagaimana jika file HTML nya ada di laptop (host).

Bayangkan kontainer seperti sebuah komputer yang ada didalam komputer yang sedang kita gunakan. Terdapat dua sistem penyimpanan file, satu di container, dan satu lagi di host.

Supaya layanan nginx dapat membaca file yang ada di host, docker membutuhkan pemetaan dari sistem file host dengan container.

Docker menyediakan parameter -v atau --volume untuk memetakan volume yang ada di host ke container. Pada linux, volume adalah lokasi logis sebuah media penyimpanan. Misalnya kita memiliki sebuah media penyimpanan fisik yaitu sebuah harddisk. Harddisk dapat dipartisi menjadi dua volume. Pada Microsoft Windows, volume adalah drive, misalnya drive C dan D. Alamat dari sebuah volume biasa disebut path, misalnya c:\ dan d:\.

Sehingga, path dibutuhkan untuk menyampaikan memberitahu pemetaan lokasi penyimpanan dari host ke container.

Sintaksnya adalah -v host_path:container_path

Pertama, siapkan dulu dokumen html di komputer yang sedang dipakai. ~/ adalah lokasi data dari user yang sedang login.

Misalnya, ketika login sebagai user aku di Linux,

  • maka ~/ sama dengan /home/aku
  • atau pada MacOS lokasinya adalah /Users/aku
mkdir -p ~/Projects/html
vim ~/Projects/html/index.html

Lalu jalankan layanan nginx dengan memetakan:

  • Dari lokasi ~/Projects/html pada host
  • Ke /usr/share/nginx/html dalam container

Secara default, nginx akan menyajikan semua file yang ada di /usr/share/nginx/html. Lebih detail dijelaskan pada dokumentasi image nginx di hub.docker.com/_/nginx

docker run -d -p 80:80 --name nginxdocker -v ~/Projects/html:/usr/share/nginx/html nginx

Cek di browser http://127.0.0.1 dan pastikan tampilannya sama dengan isi dari ~/Projects/html/index.html.

Kontainer Buruh

Berbeda dengan nginx yang menyediakan layanan siaga, aplikasi semacam php dan ruby hanya bekerja ketika diperintah.

[!tip] Hal ini sangat jarang dilakukan karena biasanya kita menggunakan docker untuk menyediakan layanan.

Ssaat development, semua aplikasi (php, ruby) biasanya sudah terinstall.

Contohnya, menjalankan aplikasi ruby dalam mode interactive dan tty -it, langsung dari dalam kontainer. Dalam mode interactive -i, klien docker akan menunggu masukan (input). Ditambah mode tty -t, docker juga akan menampilkan luaran (output) dari aplikasi yang dijalankan.

docker run -it ruby
irb(main):003> x="hello"
=> "hello"
irb(main):004> puts x
hello
=> nil
irb(main):005> exit

Cocok buat coba-coba tanpa merusak sistem di komputer lokal.

Menjalankan aplikasi di dalam kontainer

Bayangkan container sebagai komputer di dalam komputer yang sedang kita gunakan. Komputer yang menjalankan container, disebut sebagai host.

Jika dalam host kita menjalankan aplikasi ruby dengan perintah berikut (-e menandakan eksekusi argumen berikutnya, yaitu "puts 'hello'"):

ruby -e "puts 'hello'" 

Aplikasi di dalam kontainer dapat dijalankan secara langsung, dengan perintah yang mirip, dengan menjalankan docker run nama_image.

[!note] Ingat: docker run Membuat dan menjalankan kontainer baru dari image

docker run ruby ruby -e "puts 'hello'" 

Setelah aplikasi di dalam kontainer selesai dieksekusi, proses kontainer akan distop namun kontainer TIDAK dihapus.

Cek sendiri kalau tidak percaya.

docker ps
docker container ls -a

Dalam contoh berikut, terdapat tiga container yang telah berhenti Exited (0) dengan nama flamboyant_hellman, admiring_panini, xenodochial_driscoll.

Docker selalu membuat kontainer baru dengan nama otomatis karena kita tidak memberikan nama.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
f1678868ff5d   ruby      "ruby -e 'puts 'hell…"   37 seconds ago   Exited (0) 36 seconds ago             flamboyant_hellman
c4c40fd1dbeb   ruby      "ruby -e 'puts 'hell…"   39 seconds ago   Exited (0) 39 seconds ago             admiring_panini
6029346e8df7   ruby      "ruby -e 'puts 'hell…"   43 seconds ago   Exited (0) 42 seconds ago             xenodochial_driscoll

Kalau mau bersih-bersih, docker rm bisa dipakai untuk menghapusnya:

docker rm NAMA_CONTAINER

Atu jalur gampang nan berbahaya, hapus semua docker yang sudah tidak berjalan dengan prune (pangkas).

docker container prune

Sekarang, bagaimana caranya agar setiap menjalankan docker run, tidak menghasilkan kontainer baru.

Cara pertama adalah dengan otomatis menghapus container setelah dijalankan, dengan memberi tanda --rm

docker run --rm ruby ruby -e "puts 'hello'" 

Cara kedua adalah dengan memberikan nama kontainer dengan argumen --name.
Berikut sintaksnya:

docker run --name NAMA_CONTAINER NAMA_IMAGE PERINTAH

Sebagai contoh:

docker run --name rubydocker ruby ruby -e "puts 'hello'" 

Setiap perintah di atas dijalankan, maka docker akan mencoba memanfaatkan container yang sudah ada dengan nama yang diberikan.

docker container ls -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
7d9ffbc6aab7   ruby      "ruby -e 'puts 'hell…"   27 seconds ago   Exited (0) 26 seconds ago             rubydocker

Disini hanya terdapat satu kontainer bernama rubydocker.

Perintah docker run yang sama, tidak dapat dijalankan lagi karena kontainer ini sudah ada.

❯ docker run --name rubydocker ruby ruby -e "puts 'hello'"
docker: Error response from daemon: Conflict. The container name "/rubydocker" is already in use by container "7d9ffbc6aab70355725fb8e57c1c63475d8fb0834f6ce83c5658b13c6fd9edc0". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

Sehingga, untuk memanfaatkan kembali kontainer ini digunakan perintah docker start NAMA_CONTAINER.

Namun, pada "kontainer buruh", proses ini hanya berjalan sesaat kemudian keluar lagi, karena tidak ada perintah yang diberikan.

Perintah dapat diberikan dengan menggunakan operasi pipe |. Sintaksnya perintah_pertama | perintah_kedua. Proses dari perintah pertama akan menjadi masukan bagi perintah kedua.

docker start rubydocker | ruby -e "puts 'hello'"

Mulai ribet kan?
Demi kenyamanan bersama, perintah panjang ini bisa dijadikan pendek dengan alias.

alias druby="docker start rubydocker | ruby $1"

Sehingga bisa perintahnya menjadi

druby -e "puts 'hello'"

Sekarang kita bisa menjalankan perintah ruby tanpa harus menginstallnya.

Misal terdapat skrip hello.rb pada komputer. Skrip ini bisa dijalankan dengan perintah:

druby hello.rb

Tapi ingat, setiap eksekusi perintah ini akan ada biaya tambahan (overhead cost) untuk menjalankan container.

❯ time druby test.rb
hello
docker start rubydocker  0.01s user 0.01s system 9% cpu 0.233 total
ruby test.rb  0.04s user 0.01s system 96% cpu 0.055 total

❯ time ruby test.rb
hello
ruby test.rb  0.04s user 0.01s system 95% cpu 0.055 total

Ringkasan

Kontainer Layanan

Contoh: Menjalankan server web nginx

  1. Siapkan dokumen html
mkdir -p ~/Projects/html
vim ~/Projects/html/index.html
  1. Lalu jalankan layanan
docker run -d -p 80:80 --name nginxdocker -v ~/Projects/html:/usr/share/nginx/html nginx
  1. Cek di browser http://127.0.0.1

Kontainer Buruh

Menjalankan aplikasi: berikut contoh untuk ruby. Bisa diterapkan untuk aplikasi lain, tinggal mengganti ruby dengan php, python, dll.

docker run --name rubydocker ruby ruby -e "puts 'hello'" 

alias druby="docker start rubydocker | ruby $1"

druby -e "puts 'hello'"
druby hello.rb

Bonus

Aplikasi biasanya dikemas sebagai image dalam sistem operasi Debian, yang dilengkapi dengan paket lengkap sehingga ukurannya cukup besar. Namun, kebutuhan dasar aplikasi umumnya dapat dipenuhi dengan paket yang lebih ringan dari distribusi seperti Debian Bookworm atau Linux Alpine.

Contohnya, aplikasi ruby yang dikemas dalam Debian Bookworm dapat dijalankan dengan menambahkan tag slim, sehingga nama imagenya menjadi ruby:slim. Tag selengkapnya dapat di cek di hub.docker.com/_/ruby

docker run --name rubydockerslim ruby:slim ruby -e "puts 'hello'"

Berikut adalah perbandingan ukuran aplikasi yang didistribusikan dengan tag latest, alpine atau slim:

REPOSITORY   TAG      IMAGE ID       CREATED        SIZE

nginx        latest   048e09038596   10 days ago    197MB
nginx        alpine   577a23b5858b   10 days ago    50.8MB

php          latest   910138e230ec   2 weeks ago    530MB
php          alpine   b6ec2c8a30cb   2 weeks ago    96.7MB

ruby         latest   febc5e18cba3   5 weeks ago    1GB
ruby         slim     137ca6ff3afb   5 weeks ago    212MB
ruby         alpine   e78475f17fab   5 weeks ago    92.5MB

Cara Login MyITS Pakai Handphone Baru – Memasang Microsoft Multi Factor Authentication (MFA)

"Authentication" dilakukan untuk memastikan orang yang mau masuk ke sistem adalah yang otentik, asli, tulen. Otentikasi biasanya dilakukan berbasis:

  • Who you are — dengan pemindaian sidik jari
  • What you have — kunci fisik, handphone
  • What you know — kode pin, password

"What you know" adalah basis otentikasi yang paling lemah, karena sangat mudah ditransfer dan dicuri. Mencuri password tidak sesulit mencuri jari.

Oleh karena itu, dibutuhkan faktor otentikasi lain (multi factor authentication) untuk meningkatkan keamanan. Dengan MFA, sistem melakukan verifikasi dengan beberapa faktor autentikasi selain password, yaitu dengan dua mekanisme: authentikasi di sistem atau di klien (gawai/ laptop pengguna).

Mekanisme pertama adalah memasukkan kode sekali pakai (one-time password) ke sistem. Biasanya kode ini dikirim melalui SMS, email, atau ditampilkan berkala pada aplikasi Authenticator.

Mekanisme kedua dengan memasukkan kode di gawai/ laptop. Sistem menampilkan kode dilayar dan pengguna harus memasukkan kode tersebut di aplikasi Authenticator.

Pengguna sistem yang sedang di luar negeri sering kesulitan membaca SMS. Sehingga, Aplikasi Authenticator menjadi sangat penting untuk memperoleh kode sekali pakai.

Tiga aplikasi Authenticator yang sering dipakai adalah

Install salah satu, kemudian daftarkan aplikasi tersebut ke server MFA. MyITS menggunaan Microsoft Azure untuk melayani otentikasi multi faktor.

Pertama, buka Microsoft Azure di Web Browser:
https://aka.ms/mysecurityinfo

Login menggunakan email ITS, menggunakan handphone yang sudah terdaftar sebelumnya.

Jika belum pernah menggunakan MFA sebelumnya, daftarkan no HP di my.its.ac.id, atau hubungi Service Desk ITS

Selanjutnya, tambahkan metode otentikasi menggunakan Aplikasi Authenticator. Berikut langkahnya:

  1. Klik "Add sign-in method"
  2. Pilih "Authenticator App"
  3. Scan QR code dari app

Tambah Metode Sign-in Microsoft MFA.gif

Informasi tambahan

Docker di MacOS

Docker sangat berguna untuk mengemas aplikasi serta dependensinya menjadi image yang dijalankan sebagai container. Kita bisa memasang Aplikasi di komputer lain (macOS, Linux, Windows ) tanpa ribet setting ulang, tanpa drama "Kemarin di komputer saya bisa kok!"

Proses deployment lebih mudah. Image dapat dibangun di laptop, dibagikan lewat Docker Hub dan pull ke server.

Instalasi Docker di MacOS sangat mudah. Beberapa diskusi di forum menyarankan untuk menggunakan OrbStack dibanding Docker Desktop. Katanya sih lebih cepat, ringan, dan mudah digunakan.

Installer bisa didapatkan dari situs resmi OrbStack,
tetapi saya lebih suka menginstall dari terminal menggunakan perintah berikut:

brew install --cask orbstack

Setelah instalasi berhasil, buka aplikasi OrbStack untuk mengaktifkan layanan docker daemon yang dibutuhkan untuk "memproses" perintah docker.


Perintah untuk membangun image dari Dockerfile dapat dijalankan:

docker build -t aplikasi .

Melihat daftar image yang sudah dibuat:

docker image ls

Image tersebut dapat pasang sebagai container baru dengan:

docker run -d -p 80:80 aplikasi

Menampilkan daftar container yang aktif:

docker container ls

Serta mengecek container yang sedang menyala:

docker ps

Sebagai pengguna kasual-profesional, saya lebih suka OrbStack dibandingkan Docker Desktop karena aplikasi ini tidak semena-mena memasang untuk dijalankan setiap awal booting (bisa diatur di "Setting" Cmd+, -> "Start at login"). Selain itu, fiturnya lebih mudah dipahami dan lebih mudah dimatikan. Dan, sepertinya benar terasa lebih ringan.

Docker Desktop dan OrbStack membutuhkan service atau "background process", yang berjalan di balik layar meskipun tidak dipakai. Padahal, lumayan juga penggunaan sumber daya yang dibutuhkan untuk menjaga service tetap standby.

Sehingga demi penghematan maksimal, kaum fakir memori dan CPU akan sering menutup aplikasi. Namun, menutup aplikasi dengan menekan tombol silang atau Cmd+W hanya akan menyembunyikan antarmuka.

Menonaktifkan aplikasi sepenuhnya dapat dilakukan dengan Cmd+Q atau menuju ke menu OrbStack dan memilih Quit OrbStack. Jangan kuatir, ketika aplikasi dijalankan nanti, maka service juga akan dinyalakan secara otomatis.