SQLite: Menguasai Perintah SELECT


Pada tutorial ini, kita akan membahas secara lengkap satu bagian dari Data Manipulation Language (DML) yaitu membuat query dengan perintah SELECT khususnya pada database SQLite. Meskipun demikian, secara umum cara yang sama juga berlaku untuk RDBMS yang lainnya.
Pembahasan akan dimulai dari penggunaan dasar SELECT hingga teknik-teknik lanjutan. Kita akan mempelajari cara membuat query SELECT untuk memilih kolom tertentu, menggunakan klausa WHERE untuk memfilter data, mengurutkan hasil dengan ORDER BY, serta menggabungkan data dari beberapa tabel menggunakan JOIN. Dengan memahami konsep dan penerapan perintah SELECT, diharapkan dapat melakukan pengelolaan dananalisis data dalam basis data SQLite dengan lebih efektif.
Tutorial ini akan menggunakan data transaksi pembelian dari suatu retail. Jika ingin mencoba dengan data yang sama silahkan mengunduhnya pada tautan berikut : transaksi.db. Database terdiri dari beberapa tabel, namun pada bagian ini kita fokus pada tabel sales_log saja.
Dasar-Dasar SELECT
Memilih Semua Kolom
SQL
-- memilih semua kolom dari tabel sales_log SELECT * FROM sales_log;
# OUTPUT
nomor_urut sales_id segment payment_mode shipment_mode product quantity sales
1 CA-2019-160304 COR OL STD FURN-01 1 73.94
2 CA-2019-125206 CON OL FRS OFFS-01 2 114.46
3 US-2019-116365 COR OL STD TECH-04 2 30.08
4 CA-2019-105207 COR COD STD FURN-03 7 1592.85
5 US-2019-164630 COR OL STD TECH-01 4 959.968
... ... .. ... ... . ...
3002 CA-2020-156720 CON OL STD OFFS-06 3 388.024
3003 CA-2020-151450 CON COD STD OFFS-06 3 2975.51Memilih Kolom Tertentu
Kita dapat menyeleksi beberapa kolom saja pada perintah SELECT dengan menuliskan nama-nama kolom yang akan diambil.
SQL
-- memilih beberapa kolom tertentu SELECT segment, product, sales FROM sales_log
# OUTPUT segment product sales COR FURN-01 73.94 CON OFFS-01 114.46 COR TECH-04 30.08 COR FURN-03 1592.85 COR TECH-01 959.968 ... ... ... CON OFFS-06 388.024 CON OFFS-06 2975.51
Memilih nilai unik (DISTINCT)
SQL
-- mengunakan DISTINCT untuk mendapatkan nilai unik -- jika lebih dari 1 kolom maka menghasilkan kombinasi unik SELECT DISTINCT segment, payment_mode FROM sales_log;
# OUTPUT segment payment_mode COR OL CON OL COR COD HOM COD CON COD CON CD COR CD HOM OL HOM CD
Membatasi jumlah hasil (LIMIT)
SQL
-- menggunakan LIMIT untuk membatasi hasil SELECT * FROM sales_log LIMIT 5;
# OUTPUT nomor_urut sales_id segment payment_mode shipment_mode product quantity sales 1 CA-2019-160304 COR OL STD FURN-01 1 73.94 2 CA-2019-125206 CON OL FRS OFFS-01 2 114.46 3 US-2019-116365 COR OL STD TECH-04 2 30.08 4 CA-2019-105207 COR COD STD FURN-03 7 1592.85 5 US-2019-164630 COR OL STD TECH-01 4 959.968
Melangkahi beberapa baris (OFFSET)
SQL
-- menggunakan OFFSET untuk melewati 3 baris pertama -- pengambilan akan dimulai pada baris ke-4 -- dan membatasi hasil sebanyak 5 baris SELECT nomor_urut, segment, sales FROM sales_log LIMIT 5 OFFSET 3;
# OUTPUT
nomor_urut segment sales
4 COR 1592.85
5 COR 959.968
6 COR 4.672
7 COR 191.472
8 HOM 34.58Nama Alias (AS)
Jika diperlukan kita dapat memberikan nama alias untuk suatu kolom. Nama alias diberikan menggunakan klausul AS diikuti nama alias. Namun dalam praktiknya, kata AS dapat dihapus dan memberikan nama alias langsung setelah nama kolom.
SQL
-- memberikan nama alias untuk beberapa kolom
SELECT nomor_urut,
payment_mode AS pembayaran,
shipment_mode AS pengiriman,
sales nilai
FROM sales_log
LIMIT 5# OUTPUT
nomor_urut pembayaran pengiriman nilai
1 OL STD 73.94
2 OL FRS 114.46
3 OL STD 30.08
4 COD STD 1592.85
5 OL STD 959.968Pengurutan Data (ORDER BY)
Data yang diambil dapat diurutkan menggunakan klausul ORDER BY. Pengurutan dapat dilakukan secara menaik ASC (default) maupun menurun (DESC). Pengurutan juga dapat dilakukan secara hirarki untuk lebih dari 1 kolom.
Mengurutkan secara menaik (ASC)
SQL
-- mengurutkan berdasarkan nilai `sales` ascending SELECT sales_id, product, quantity, sales FROM sales_log ORDER BY sales
# OUTPUT
sales_id product quantity sales
CA-2019-168361 OFFS-02 1 0.836
CA-2019-169922 OFFS-02 4 1.344
CA-2019-114748 OFFS-03 1 1.408
CA-2019-132409 OFFS-03 1 1.504
CA-2019-108364 OFFS-02 5 1.8
... ... . ...
CA-2020-166709 TECH-01 3 5517.97
US-2019-107440 TECH-02 7 9099.93SQL
-- Mengambil 5 baris dengan sales terbesar SELECT sales_id, sales FROM sales_log ORDER BY sales DESC LIMIT 5
# OUTPUT
sales_id sales
US-2019-107440 9099.93
CA-2020-166709 5517.97
CA-2019-158841 4749.95
CA-2019-100300 4476.8
CA-2020-118892 4439.174Mengurutkan berdasarkan 2 kolom
Data diurutkan secara menurun (dari terbesar ke terkecil) berdasarkan kolom quantity, kemudian untuk setiap nilai quantity yang sama data diurutkan lagi berdasarkan kolom sales secara menaik (dari terkecil ke terbesar).
SQL
-- mengurutkan data berdasarkan 2 kolom SELECT sales_id, quantity, sales FROM sales_log ORDER BY quantity DESC, sales ASC LIMIT 10
# OUTPUT
sales_id quantity sales
CA-2019-141887 14 54.992
CA-2020-164028 14 249.58
CA-2020-152702 14 271.604
CA-2019-140571 14 319.76
CA-2020-169859 14 391.96
CA-2019-116596 14 427.644
US-2019-103674 14 437.472
CA-2020-130036 14 1131.888
CA-2020-114524 13 95.468
CA-2020-147942 13 166.68Filter Data (WHERE)
Data yang diambil dapat difilter berdasarkan berbagai kondisi. Kondisi-kondisi ini dapat menggunakan operator seperti:
- Untuk data numerik dapat menggunakan
"="(sama dengan),"<>"(tidak sama dengan),">"(lebih besar dari),"<"(lebih kecil dari),">="(lebih besar sama dengan),"<="(lebih kecil sama dengan). IN/NOT IN, menyeleksi/tidak berdasarkan daftar nilai yang diberikanBETWEEN/NOT BETWEENmenyeleksi/tidak berdasarkan rentang nilai yang diberikan (inklusif)LIKE/NOT LIKEmenyeleksi/tidak berdasarkan pattern yang diberikanREGXP, menyeleksi berdasarkan regular expression yang diberikanIS NULL/IS NOT NULL, menyeleksi berdasarkan nilai NULL atau tidak NULLOR, menggabungkan 2 atau lebih kondisi dan bernilai benar jika setidaknya 1 kondisi saja terpenuhiAND, menggabungkan 2 atau lebih kondisi dan bernilai benar jika dan hanya jika semua kondisi benar
Filter dengan 1 kondisi
Contoh, mengambil data dengan nilai sales lebih dari atau sama dengan 4000:
SQL
-- mengambil data dengan sales >= 4000 SELECT sales_id, sales FROM sales_log WHERE sales >=4000
# OUTPUT
sales_id sales
CA-2019-158841 4749.95
US-2019-107440 9099.93
CA-2019-100300 4476.8
CA-2020-118892 4439.174
US-2020-102183 4330.552
CA-2020-166709 5517.97Filter dengan kondisi ‘LIKE’, ‘BETWEEN’, ‘<‘ dan ‘AND’
Contoh berikut yaitu mengambil data dengan beberapa kondisi dengan klausul LIKE, BETWEEN, AND dan >:
SQL
-- menyeleksi dengan beberapa kondisi SELECT sales_id, product, quantity, sales FROM sales_log WHERE product LIKE "FURN%" AND quantity BETWEEN 5 AND 10 AND sales > 2000 ORDER BY quantity DESC
# OUTPUT
sales_id product quantity sales
CA-2019-113831 FURN-03 10 2275.5
CA-2020-118892 FURN-02 9 4439.174
CA-2020-123967 FURN-03 9 2694.62
CA-2019-107104 FURN-01 8 3406.664
CA-2020-149559 FURN-02 8 2101.272
US-2020-162558 FURN-03 7 2335.116
US-2019-164196 FURN-03 6 2678.94
CA-2019-122903 FURN-02 5 3504.9
CA-2020-150091 FURN-01 5 2185.9Filter dengan kondisi ‘LIKE’, ‘IN’, ‘=’ dan ‘AND’
Contoh berikut yaitu mengambil data dengan beberapa kondisi dengan klausul LIKE, IN, AND dan =:
SQL
-- menyeleksi dengan beberapa kondisi
SELECT * FROM sales_log
WHERE
sales_id LIKE "%2020%" AND
shipment_mode IN ("FRS", "SEC") AND
segment = "CON"
LIMIT 5# OUTPUT nomor_urut sales_id segment payment_mode shipment_mode product quantity sales 504 CA-2019-120200 CON OL FRS OFFS-09 2 11.632 1320 CA-2020-147207 CON OL SEC OFFS-01 3 415.144 1326 US-2020-123862 CON CD SEC OFFS-01 3 101.02 1339 CA-2020-138779 CON CD FRS TECH-03 5 89.92 1340 US-2020-104661 CON CD FRS TECH-04 8 102.592
Operasi dan Fungsi Kolom
Kolom baru dapat ditambahkan misalnya dengan melakukan operasi pada 1 atau beberapa kolom yang ada. Contoh operator matematika yang bisa dilakukan meliputi "+", "-", "*", "/" dan sebagainya.
Selain operator tersebut, terdapat beberapa fungsi yang juga dapat digunakan yaitu:
ABS: Mengembalikan nilai absolut dari suatu angka,ABS(column_name)ROUND: Membulatkan angka ke bilangan desimal terdekat,ROUND(column_name, decimal)CEIL: Mengembalikan nilai integer yang lebih besar dari atau sama dengan argumen,CEIL(column_name)FLOOR: Mengembalikan nilai integer yang lebih kecil dari atau sama dengan argumen,FLOOR(column_name)EXP: Mengembalikan nilai eksponensial dari argumen,EXP(column_name)LOG: Mengembalikan logaritma natural dari argumen,LOG(column_name)POWER: Mengembalikan nilai pangkat dari argumenPOWER(column_name, exponent)SQRT: Mengembalikan akar kuadrat dari argumen,SQRT(column_name)SIGN: Mengembalikan tanda (1 untuk positif, 0 untuk nol, -1 untuk negatif) dari argumenSIGN(column_name)RAND: Mengembalikan angka acak antara 0 dan 1,RAND()
Adapun untuk data teks terdapat beberapa operasi sebagai berikut:
LENGTH: Mengembalikan panjang teks :LENGTH(column_name)UPPER: Mengonversi teks menjadi huruf kapital:UPPER(column_name)LOWER: Mengonversi teks menjadi huruf kecil:LOWER(column_name)TRIM: Menghapus spasi di awal dan akhir teks:TRIM(column_name)LTRIM: Menghapus spasi di awal teks:LTRIM(column_name)RTRIM: Menghapus spasi di akhir teks:RTRIM(column_name)CONCAT: Menggabungkan dua atau lebih string:CONCAT(column1, column2)REPLACE: Mengganti substring dalam teks dengan teks lain:REPLACE(column_name, 'old_string', 'new_string')INSTR: Mengembalikan posisi dari substring dalam teks:INSTR(column_name, 'substring')SUBSTR: Mengambil sub-bagian teks dari teks:SUBSTR(column_name, start_index, length)LEFT: Mengambil sejumlah karakter dari awal teks:LEFT(column_name, length)RIGHT: Mengambil sejumlah karakter dari akhir teks:RIGHT(column_name, length)
SQL
-- membuat kolom baru hasil operasi kolom lain SELECT SUBSTR(sales_id, 4, 4) AS Tahun, sales/quantity AS Harga, sales AS Nilai, sales * 0.1 AS PPN FROM sales_log LIMIT 5
# OUTPUT Tahun Harga Nilai PPN 2019 73.94 73.94 7.394 2019 57.23 114.46 11.446 2019 15.04 30.08 3.008 2019 227.55 1592.85 159.285 2019 239.992 959.968 95.9968
Fungsi Agregasi
Fungsi agregasi digunakan untuk menghitung nilai agregat dari satu atau lebih baris dalam hasil kueri. Berikut adalah beberapa fungsi agregasi yang umum digunakan dalam SQLite:
COUNT: Menghitung jumlah baris dalam kolom,COUNT(column_name)SUM: Menghitung total jumlah nilai dalam kolom,SUM(column_name)AVG: Menghitung rata-rata dari nilai dalam kolom,AVG(column_name)MIN: Mengembalikan nilai minimum dalam kolom,MIN(column_name)MAX: Mengembalikan nilai maksimum dalam kolom,MAX(column_name)GROUP_CONCAT: Menggabungkan nilai-nilai dalam grup menjadi satu stringGROUP_CONCAT(column_name)
SQL
-- Menghitung jumlah baris SELECT COUNT(*) FROM sales_log; -- COUNT(*): 3003 -- menghitung total sales SELECT SUM(sales) FROM sales_log; -- SUM(sales): 815770.8943 -- menghitung rata-rata sales SELECT AVG(sales) FROM sales_log; -- AVG(sales): 271.651979453879 -- mencari nilai minimum sales SELECT MIN(sales) FROM sales_log; -- MIN(sales): 0.836 -- mencari nilai maksimum sales SELECT MAX(sales) FROM sales_log; -- MAX(sales): 9099.93
Agregasi Data (GROUP BY)
Perintah GROUP BY berguna untuk mengelompokkan data berdasarkan fungsi agregasi tertentu. Misal untuk memperoleh nilai rata-rata sales menurut product. mencari nilai tertinggi sales menurut shipment_mode dan sebaginya. GROUP BY juga dapat dilakukan secara bertingkat untuk bebeberapa kolom sekaligus.
Misal untuk memperoleh banyaknya penjualan untuk masing-masing shipment_mode:
SQL
-- Grouping data menurut shipment_mode SELECT shipment_mode AS Mode, COUNT(sales_id) AS Jumlah FROM sales_log GROUP BY shipment_mode
# OUTPUT Mode Jumlah FRS 499 SAM 163 SEC 568 STD 1773
Contoh lainnya, untuk memperoleh total quantity dan sales menurut segment:
SQL
-- Grouping data menurut segment SELECT segment, SUM(quantity) AS tot_qty, ROUND(SUM(sales), 2) AS tot_sales FROM sales_log GROUP BY segment ORDER BY segment DESC
# OUTPUT segment tot_qty tot_sales HOM 2147 145511.87 COR 3579 269036.12 CON 5853 401222.91
SQL
-- Grouping data menurut shipment_mode dan payment_mode SELECT shipment_mode, payment_mode, ROUND(AVG(sales), 2) AS avg_sales FROM sales_log GROUP BY shipment_mode, payment_mode
# OUTPUT shipment_mode payment_mode avg_sales FRS CD 239.72 FRS COD 220.04 FRS OL 314.03 SAM CD 208.26 SAM COD 334.36 SAM OL 378.92 SEC CD 268.25 SEC COD 276.24 SEC OL 258.65 STD CD 264.27 STD COD 287.76 STD OL 258.06
Filter Hasil Grup dengan HAVING
Hasil pengelompokan menggunakan GROUP BY dapat di filter dengan menambahkan klausul HAVING.
SQL
-- Grouping data menurut shipment_mode dan payment_mode SELECT shipment_mode, payment_mode, ROUND(AVG(sales), 2) AS avg_sales FROM sales_log GROUP BY shipment_mode, payment_mode HAVING avg_sales > 300
# OUTPUT shipment_mode payment_mode avg_sales FRS OL 314.03 SAM COD 334.36 SAM OL 378.92
Kombinasi Tabel (JOIN)
Klausul JOIN dapat digunakan untuk mengombinasikan data dari dua tabel atau lebih. Terdapat beberapa mode penggunaan klausul JOIN seperti yang diilustrasikan pada gambar di bawah ini.


Contoh INNER JOIN (1)
Pada database ini, terdapat tabel shipment yang terdiri dari dua kolom yaitu shipment_id dan description. Pada bagian sebelumnya, kita hanya menampilkan data menggunakan shipment_id saja ( pada tabel sales_log yaitu kolom shipment_mode). Dengan mengambil informasi dari tabel shipment kita dapat menampilkan hasil yang lebih informatif.
SQL
-- Inner Join
SELECT
A.sales_id,
A.shipment_mode,
B.descriptions,
ROUND(A.sales) as sales
FROM sales_log A
INNER JOIN shipment B
ON A.shipment_mode = B.shipment_id
LIMIT 10# OUTPUT sales_id shipment_mode Descriptions sales CA-2019-160304 STD Standard Class 73.94 CA-2019-125206 FRS First Class 114.46 US-2019-116365 STD Standard Class 30.08 CA-2019-105207 STD Standard Class 1592.85 US-2019-164630 STD Standard Class 959.97 CA-2019-158211 STD Standard Class 4.67 CA-2019-134474 SEC Second Class 191.47 CA-2019-101938 STD Standard Class 34.58 CA-2019-158806 STD Standard Class 23.08 US-2019-100461 STD Standard Class 1565.88
Contoh INNER JOIN (2)
Pada data base juga terdapat tabel category yang terdiri dari dua kolom yaitu category_id dan descriptions. Selanjutnya terdapat tabel product yang terdiri dari 3 kolom yaitu cat_id (foreign key dari category_id), product_id dan descriptions. Kita dapat menampilkan deskripsi kategori dan produk secara lengkap dengan menggabungkan kedua tabel. (Karena category.category_id sama dengan product.cat_id maka pada contoh di bawah ini hanya kita tampilkan saja dari tabel category)
SQL
-- Inner Join SELECT A.*, B.product_id, B.descriptions FROM category A INNER JOIN product B ON A.category_id=B.cat_id
# OUTPUT category_id descriptions product_id Descriptions FURN Furniture FURN-01 Bookcases FURN Furniture FURN-02 Chairs FURN Furniture FURN-03 Tables FURN Furniture FURN-04 Furnishings OFFS Office Supplies OFFS-01 Storage OFFS Office Supplies OFFS-02 Binders OFFS Office Supplies OFFS-03 Art OFFS Office Supplies OFFS-04 Paper OFFS Office Supplies OFFS-05 Envelopes OFFS Office Supplies OFFS-06 Fasteners OFFS Office Supplies OFFS-07 Appliances OFFS Office Supplies OFFS-08 Labels OFFS Office Supplies OFFS-09 Supplies TECH Technology TECH-01 Copiers TECH Technology TECH-02 Machines TECH Technology TECH-03 Phones TECH Technology TECH-04 Accessories
Contoh INNER JOIN (3)
Pada query di bawah ini, kita menampilkan agregasi total quantity dan total sales berdasarkan payment. Karena pada tabel sales hanya terdapat kolom payment_mode (berisi kode payment_id), sehingga kita perlu mendapatkan deskripsinya dengan melakukan JOIN tabel payment. Meskipun secara khusus pada contoh di bawah ini kita menggunakan LEFT JOIN, namun penggunaan INNER JOIN juga akan memberikan hasil yang sama.
SQL
-- Left Join SELECT A.payment_id, A.descriptions, SUM(B.quantity) AS Tot_Qty, ROUND(SUM(B.sales), 2) AS Tot_Sales FROM payment A LEFT JOIN sales_log B ON A.payment_id = B.payment_mode GROUP BY A.payment_id, A.descriptions ORDER BY Tot_Sales
# OUTPUT payment_id descriptions Tot_qty Tot_sales CD Card (Credit or Debit) 2460 165643.94 OL Online 4192 298523.88 COD Cash on Delevery 4927 351603.07
Ringkasan
Dalam tutorial ini, kita telah membahas berbagai aspek SQLite, khususnya untuk mengambil data menggunakan query SELECT. Kita juga mengeksplorasi berbagai klasul seperti pengurutan dengan ORDER BY, filter data dengan WHERE hingga menggabungkan beberapa tabel menggunakan JOIN. Dengan pemahaman ini, semoga menjadi dasar yang kuat untuk melakukan berbagai operasi dan manipulasi data dengan query SELECT pada SQLite secara efektif.





