Contoh MySQL if else. Panduan Referensi MySQL. Perintah IF Bersarang

Ada dua jenis perintah kontrol cabang di PL/SQL: perintah kondisional dan perintah cabang. Perintah tipe pertama, terdapat di hampir semua program, mengontrol urutan eksekusi kode program tergantung pada kondisi yang ditentukan. Dalam PL/SQL, perintah IF-THEN-ELSE dan CASE termasuk dalam kategori ini. Ada juga yang disebut ekspresi CASE, yang terkadang memungkinkan Anda melakukannya tanpa perintah IF dan CASE. Perintah tipe kedua lebih jarang digunakan: GOTO (lompatan tanpa syarat) dan NULL (tidak melakukan tindakan apa pun).

Perintah JIKA

Perintah IF mengimplementasikan logika eksekusi bersyarat dari perintah program. Dengan bantuannya, Anda dapat mengimplementasikan konstruksi jenis berikut:

  • Jika gajinya antara $10.000 dan $20.000, terapkan bonus $1.500.
  • Jika koleksi berisi lebih dari 100 elemen, hapus kelebihannya.

Perintah IF hadir dalam tiga bentuk, ditunjukkan pada tabel berikut.

Variasi JIKA Karakteristik
JIKA MAKA BERAKHIR JIKA; Bentuk paling sederhana dari perintah IF. Kondisi antara IF dan THEN menentukan apakah kelompok perintah antara THEN dan END IF harus dijalankan. Jika hasil pengujian kondisi adalah FALSE atau NULL, maka kode tidak dijalankan
JIKA MAKA LAIN BERAKHIR JIKA; Penerapan logika “salah satu atau”. Bergantung pada kondisi antara kata kunci IF dan THEN, kode antara THEN dan ELSE atau kode antara ELSE dan END IF akan dieksekusi. Bagaimanapun, hanya satu dari dua kelompok perintah yang dapat dieksekusi yang dijalankan
JIKA MAKA ELSIF LAINNYA BERAKHIR JIKA; Bentuk IF yang terakhir, dan paling kompleks, memilih suatu tindakan dari serangkaian kondisi yang saling eksklusif dan mengeksekusi kelompok perintah yang dapat dieksekusi. Jika Anda menulis pernyataan IF serupa di Oracle9i Rilis 1 atau lebih baru, pertimbangkan untuk menggantinya dengan pernyataan CASE select

kombinasi JIKA-MAKA

Sintaks umum untuk konstruksi IF-THEN adalah:

IF kondisi THEN... urutan perintah yang akan dijalankan... END IF;

Di sini, suatu kondisi adalah variabel Boolean, konstanta, atau ekspresi Boolean dengan hasil TRUE, FALSE, atau NULL. Perintah yang dapat dieksekusi antara kata kunci THEN dan END IF dijalankan jika hasil pengujian kondisi TRUE, dan tidak dijalankan jika FALSE atau NULL.

Logika tiga nilai

Ekspresi Boolean dapat mengembalikan tiga kemungkinan hasil. Jika semua nilai dalam ekspresi Boolean diketahui, maka hasilnya adalah TRUE atau FALSE. Misalnya benar atau salahnya ungkapan like

(2 < 3) AND (5 < 10)

tidak diragukan lagi. Namun, terkadang beberapa nilai dalam sebuah ekspresi ternyata tidak diketahui. Ini mungkin karena kolom database terkait berisi NULL atau dibiarkan kosong. Apa yang seharusnya menjadi hasil ekspresi dengan NULL , misalnya:

2 < NULL

Karena nilai yang hilang tidak diketahui, hanya ada satu jawaban untuk pertanyaan ini: “Tidak diketahui.” Ini adalah inti dari apa yang disebut logika tiga nilai - hasil yang mungkin tidak hanya TRUE dan FALSE, tetapi juga NULL.

Jika Anda ingin mempelajari lebih lanjut tentang logika tiga nilai, saya merekomendasikan artikel Lex de Haan dan Jonathan Gennick "Nulls: Nothing to Worry About" dari Oracle Magazine. Informasi berguna juga dapat ditemukan dalam buku Database in Depth: Relational Theory for the Practitioner oleh S. J. Data. Kita akan kembali ke logika tiga nilai nanti di artikel ini.

Perintah IF bersyarat berikut membandingkan dua nilai numerik. Perhatikan bahwa jika salah satunya adalah NULL, maka hasil seluruh ekspresi adalah NULL (jika gaji NULL, maka give_bonus tidak dijalankan):

JIKA gaji > 40000 MAKA give_bonus (employee_id,500); AKHIR;

Terdapat pengecualian terhadap aturan bahwa NULL dalam ekspresi Boolean menghasilkan NULL. Beberapa operator dan fungsi diimplementasikan secara khusus sehingga menghasilkan hasil TRUE dan FALSE (tetapi bukan NULL) ketika dioperasikan pada NULL. Misalnya, untuk memeriksa nilai NULL, Anda dapat menggunakan konstruksi IS NULL:

JIKA gaji > 40000 ATAU gaji NULL MAKA give_bonus (employee_id,500); AKHIR;

Dalam contoh ini, kondisi gaji IS NULL mengembalikan TRUE jika gaji tidak mengandung nilai dan FALSE sebaliknya.

Untuk mendeteksi kemungkinan nilai NULL dan menanganinya, akan lebih mudah menggunakan operator seperti IS NULL dan IS NOT NULL, atau fungsi COALESCE dan NVL2. Untuk setiap variabel dalam setiap ekspresi Boolean yang Anda tulis, pikirkan apa yang akan terjadi jika variabel tersebut berisi NULL .

Kata kunci IF, THEN, dan END IF tidak perlu berada pada baris terpisah. Pada perintah IF, jeda baris tidak penting, sehingga contoh di atas dapat ditulis seperti ini:

JIKA gaji > 40000 MAKA give_bonus (employee_id,500); AKHIR;

Menempatkan seluruh perintah dalam satu baris sangat cocok untuk konstruksi IF sederhana seperti contoh di atas. Tetapi perintah apa pun yang agak rumit akan lebih mudah dibaca ketika setiap kata kunci ditempatkan pada baris terpisah. Misalnya, jika Anda menulis penggalan berikut dalam satu baris, akan cukup sulit untuk memahaminya. Tidak mudah untuk memahaminya meskipun ditulis dalam tiga baris:

JIKA gaji > 40000 MAKA MASUKKAN KE Employee_bonus (eb_employee_id, eb_bonus_amt) VALUES (employee_id, 500); UPDATE emp_employee SET emp_bonus_given=1 WHERE emp_employee_id=employee_id; AKHIR;

Dan perintah yang sama dapat dibaca secara normal ketika dipecah menjadi beberapa baris:

JIKA gaji > 40000 MAKA MASUKKAN KE Employee_bonus (eb_employee_id, eb_bonus_amt) VALUES (employee_id, 500);

UPDATE emp_employee SET emp_bonus_given=1 WHERE emp_employee_id=employee_id; AKHIR;

Masalah keterbacaan menjadi lebih penting ketika menggunakan kata kunci ELSE dan ELSIF serta perintah IF bertingkat. Oleh karena itu, untuk membuat logika perintah IF sejelas mungkin, kami menyarankan untuk menggunakan semua opsi indentasi dan pemformatan. Dan para programmer yang harus memelihara program Anda akan sangat berterima kasih kepada Anda.

Desain IF-THEN-ELSE

Konstruksi IF-THEN-ELSE digunakan ketika memilih salah satu dari dua tindakan yang saling eksklusif. Format perintah IF versi ini adalah:

kondisi IF THEN… rangkaian perintah untuk hasil TRUE… ELSE… rangkaian perintah untuk hasil FALSE/NULL… END IF;

Di sini kondisinya adalah variabel logis, konstanta, atau ekspresi logis. Jika nilainya TRUE, maka perintah yang terletak di antara kata kunci THEN dan ELSE akan dijalankan, dan jika FALSE atau NULL, perintah antara kata kunci ELSE dan END IF akan dijalankan.

Penting untuk diingat bahwa konstruksi IF-THEN-ELSE selalu mengeksekusi salah satu dari dua kemungkinan urutan perintah. Setelah urutan yang sesuai selesai, kontrol ditransfer ke perintah yang muncul segera setelah kata kunci END IF.

Konstruksi IF-THEN-ELSE berikut memperluas contoh IF-THEN yang diberikan pada bagian sebelumnya:<= 40000 THEN give_bonus (employee_id, 0); ELSE give_bonus (employee_id, 500); END IF;

pada contoh ini pegawai yang gajinya lebih dari 40.000 akan mendapat bonus sebesar 500, sedangkan sisanya tidak akan mendapat bonus. Atau masih ditugaskan? Apa jadinya jika karena alasan tertentu gaji seorang karyawan NULL? Dalam hal ini, perintah yang mengikuti kata kunci ELSE akan dijalankan, dan karyawan akan menerima bonus hanya karena karyawan bergaji tinggi. Karena kita tidak dapat memastikan bahwa gaji tidak akan sama dengan NULL dalam keadaan apa pun, kita perlu melindungi terhadap masalah tersebut dengan menggunakan fungsi NVL:

JIKA NVL(gaji,0)<= 40000 THEN give_bonus (employee_id, 0); ELSE give_bonus (employee_id, 500); END IF;

Fungsi NVL mengembalikan nol jika gaji adalah NULL. Hal ini menjamin karyawan dengan gaji NULL akan menerima bonus nol (Anda tidak akan iri!).

BENDERA LOGIS

Lebih mudah menggunakan variabel Boolean sebagai flag sehingga ekspresi Boolean yang sama tidak perlu dievaluasi beberapa kali. Ingatlah bahwa hasil dari ekspresi seperti itu dapat ditetapkan ke variabel boolean. Misalnya, sebagai ganti

JIKA:customer.order_total > max_allowable_order MAKA order_exceeds_balance:= BENAR; LAINNYA order_exceeds_balance:= SALAH; AKHIR;

Anda dapat menggunakan ekspresi yang lebih sederhana berikut ini (asalkan tidak ada variabel yang NULL):

Order_exceeds_balance:= :customer.order_total > max_allowable_order;

Sekarang, jika di suatu tempat dalam kode program Anda perlu memeriksa apakah jumlah pesanan (order_total) tidak melebihi nilai maksimum yang diperbolehkan (max_allowable_order), konstruksi IF yang sederhana dan mudah dipahami sudah cukup:

JIKA pesanan_melebihi_saldo MAKA ...

Jika Anda belum pernah bekerja dengan variabel boolean sebelumnya, teknik ini mungkin memerlukan waktu untuk dikuasai. Namun biayanya akan sepadan, karena hasilnya akan menjadi kode yang lebih sederhana dan lebih mudah dipahami.

Desain IF-THEN-ELSIF

Bentuk perintah IF ini berguna untuk mengimplementasikan logika dengan beberapa alternatif tindakan dalam satu perintah IF. Biasanya, ELSIF digunakan dengan alternatif yang saling eksklusif (yaitu, hanya satu kondisi yang benar saat menjalankan perintah IF). Sintaks umum untuk formulir IF ini adalah:

IF kondisi-1 THEN perintah-1 ELSIF kondisi-N THEN perintah-N END IF;

Beberapa programmer mencoba menulis ELSIF sebagai ELSEIF atau ELSE IF. Ini adalah kesalahan sintaksis yang sangat umum.

Secara formal, konstruksi IF-THEN-ELSIF adalah salah satu cara untuk mengimplementasikan fungsionalitas perintah CASE di PL/SQL. Tentunya jika Anda menggunakan Oracle9i lebih baik menggunakan perintah CASE yang akan dibahas lebih lanjut pada artikel berikutnya.

Pada setiap bagian ELSIF (kecuali bagian ELSE), kondisi harus diikuti dengan kata kunci THEN. Bagian ELSE dari IF-ELSIF berarti "jika tidak ada kondisi yang benar", yaitu, jika tidak ada kondisi yang BENAR, perintah yang mengikuti ELSE akan dijalankan. Perlu diingat bahwa bagian ELSE bersifat opsional - konstruksi IFELSIF hanya dapat terdiri dari bagian IF dan ELSIF. Jika tidak ada kondisi yang BENAR, maka tidak ada perintah blok IF yang dijalankan.

JIKA gaji ANTARA 10.000 DAN 20.000 MAKA give_bonus(employee_id, 1500); Gaji ELSIF ANTARA 20000 DAN 40000 LALU give_bonus(employee_id, 1000); Gaji ELSIF > 40000 LALU give_bonus(employee_id, 500); LAINNYA berikan_bonus(id_karyawan, 0); AKHIR;

Perangkap sintaksis IF

Ingat beberapa aturan mengenai penggunaan perintah IF:

  • Setiap perintah IF harus memiliki konstruk END IF yang berpasangan. Ketiga versi perintah ini harus ditutup secara eksplisit dengan kata kunci END IF.
  • Ingatlah untuk memisahkan kata kunci END dan IF dengan spasi. Jika Anda memasukkan ENDIF dan bukan END IF, kompiler akan menghasilkan pesan kesalahan yang membingungkan:
ORA-06550: baris 14, kolom 4: PLS-00103: Menemukan simbol ";" ketika mengharapkan salah satu dari yang berikut:
  • Kata kunci ELSIF hanya boleh mengandung satu huruf "E". Jika Anda menentukan ELSEIF dan bukan kata kunci ELSIF, kompiler tidak akan memperlakukannya sebagai bagian dari pernyataan IF. Ini menafsirkannya sebagai nama variabel atau prosedur.
  • Titik koma hanya ditempatkan setelah kata kunci END IF. Tidak ada titik koma setelah kata kunci THEN, ELSE dan ELSIF. Ini bukan perintah terpisah yang dapat dieksekusi dan, tidak seperti END IF , tidak dapat menghentikan perintah PL/SQL. Jika Anda menambahkan titik koma setelah kata kunci ini, kompiler akan menampilkan pesan kesalahan.

Kondisi IF-ELSIF selalu diproses dari awal hingga akhir. Jika kedua kondisi BENAR, maka perintah kondisi pertama akan dijalankan. Dalam konteks contoh saat ini, gaji sebesar $20.000 akan dinilai sebagai bonus sebesar $1.500, meskipun gaji sebesar $20.000 juga akan memenuhi syarat untuk mendapatkan bonus sebesar $1.000 (tes ANTARA mencakup batasan). Jika ada kondisi yang benar, kondisi lainnya tidak dicentang sama sekali.

Perintah CASE memecahkan masalah premium dengan lebih elegan daripada solusi IF-THEN-ELSIF di bagian ini (lihat bagian Perintah dan Ekspresi CASE).

Meskipun kondisi yang tumpang tindih diperbolehkan dalam perintah IF-THEN-ELSIF, sebaiknya hindari kondisi tersebut jika memungkinkan. Dalam contoh saya, spesifikasi aslinya agak ambigu mengenai nilai batas (seperti 20.000). Dengan asumsi bahwa pekerja dengan bayaran lebih rendah harus menerima bonus yang lebih tinggi (yang menurut saya masuk akal), saya akan menyingkirkan ANTARA dan menggunakan logika lebih sedikit/lebih (lihat di bawah). Perhatikan juga bahwa tidak ada bagian ELSE - saya mengabaikannya hanya untuk menunjukkan bahwa ini opsional:

JIKA gaji >= 10.000 DAN gaji<= 20000 THEN give_bonus(employee_id, 1500); ELSIF salary >20000 DAN gaji<= 40000 THEN give_bonus(employee_id, 1000); ELSIF salary >40000 LALU give_bonus(employee_id, 400); AKHIR;

Dengan mengambil langkah-langkah untuk mencegah kondisi yang tumpang tindih di IF-THEN-ELSIF , saya menghilangkan kemungkinan (dan bahkan kemungkinan besar) sumber kesalahan bagi pemrogram yang akan mengerjakan kode tersebut setelah saya. Saya juga menghilangkan kemungkinan terjadinya kesalahan acak dengan menyusun ulang bagian ELSIF. Namun, perhatikan bahwa jika gaji adalah NULL, tidak ada kode yang akan dieksekusi karena tidak ada klausa ELSE.

Bahasanya tidak mengharuskan istilah ELSIF saling eksklusif. Selalu pertimbangkan kemungkinan bahwa suatu nilai dapat cocok dengan dua kondisi atau lebih, sehingga urutan kondisi ELSIF mungkin penting.

Perintah IF Bersarang

Perintah IF dapat disarangkan satu sama lain. Contoh berikut menunjukkan perintah IF dengan beberapa tingkatan bersarang:

JIKA kondisi1 MAKA JIKA kondisi2 MAKA perintah2 LAIN JIKA kondisi3 MAKA perintah3 ELSIF kondisi4 MAKA perintah4 END IF;

AKHIR; AKHIR; Logika yang kompleks seringkali tidak mungkin diimplementasikan tanpa pernyataan IF yang disarangkan, namun penggunaannya memerlukan kehati-hatian yang ekstrim. Pernyataan IF bertingkat, seperti loop bersarang, membuat program sulit dibaca dan di-debug. Dan jika Anda akan menggunakan perintah IF dengan lebih dari tiga tingkat sarang, pertimbangkan apakah Anda dapat mempertimbangkan kembali logika program dan mengimplementasikan persyaratan dengan cara yang lebih sederhana. Jika Anda tidak menemukannya, pertimbangkan untuk membuat satu atau lebih modul lokal yang menyembunyikan perintah IF internal. Keuntungan utama struktur IF bersarang adalah mereka. Kondisi dari perintah IF bagian dalam diuji hanya jika nilai ekspresi pada kondisi bagian luar adalah TRUE. Jadi, alasan yang jelas untuk pernyataan IF bertumpuk adalah untuk menguji kondisi internal hanya jika kondisi lain benar. Misalnya kode untuk menghitung bonus bisa ditulis seperti ini:

IF award_bonus(employee_id) THEN IF print_check (employee_id) THEN DBMS_OUTPUT.PUT_LINE("Cek dikeluarkan untuk " || Employee_id);

AKHIR; AKHIR;

Ini adalah penerapan yang masuk akal karena sebuah pesan harus ditampilkan untuk setiap bonus yang diperoleh, namun jika tidak ada bonus yang diperoleh, pesan dengan jumlah nol tidak akan ditampilkan.

Komputasi yang Dipercepat

PL/SQL menggunakan evaluasi kondisi yang lebih cepat; dengan kata lain, tidak perlu mengevaluasi semua ekspresi dalam kondisi IF. Misalnya, ketika mengevaluasi ekspresi dalam pernyataan IF berikut, PL/SQL berhenti memproses dan segera mengeksekusi cabang ELSE jika kondisi pertama adalah FALSE atau NULL:

JIKA kondisi1 DAN kondisi2 MAKA... LAIN... AKHIR JIKA;

PL/SQL membatalkan evaluasi jika condition_1 adalah FALSE atau NULL karena cabang THEN dijalankan hanya jika seluruh ekspresi benar, dan kedua subekspresi harus TRUE agar hal ini terjadi. Segera setelah ditemukan bahwa setidaknya satu subekspresi berbeda dari TRUE , pemeriksaan lebih lanjut tidak diperlukan - cabang THEN tetap tidak akan dipilih.

Saat mempelajari perilaku akselerasi evaluasi di PL/SQL, saya menemukan sesuatu yang menarik: perilakunya bergantung pada konteks ekspresi. Mari kita ambil perintah berikut:

My_boolean:= kondisi1 DAN kondisi2

Berbeda dengan perintah IF, jika kondisi1 adalah NULL, evaluasi percepatan tidak akan diterapkan. Mengapa? Karena hasilnya bisa NULL atau FALSE tergantung kondisi2nya. Untuk instruksi IF, baik NULL maupun FALSE mengarah ke cabang ELSE, sehingga evaluasi dapat dilakukan lebih cepat. Namun penugasan harus mengetahui nilai akhirnya, dan evaluasi percepatan dalam hal ini hanya dapat (dan akan) terjadi jika kondisi1 adalah FALSE .

Akselerasi operasi OR bekerja dengan cara yang serupa: jika operan OR pertama dari klausa IF adalah TRUE, PL/SQL segera mengeksekusi cabang THEN:

JIKA kondisi1 ATAU kondisi2 MAKA... LAIN... AKHIR JIKA;

Komputasi yang dipercepat dapat berguna jika salah satu kondisinya sangat intensif pada prosesor atau memori. Kondisi seperti ini harus ditempatkan di akhir ekspresi majemuk:

Simple_condition diuji terlebih dahulu, dan jika hasilnya cukup untuk menentukan hasil akhir operasi AND (yaitu, jika hasilnya FALSE), kondisi yang lebih mahal tidak akan diuji, dan melewatkan pengujian akan meningkatkan kinerja aplikasi.

Namun jika pengoperasian program Anda bergantung pada evaluasi kondisi kedua - misalnya, karena efek samping dari pemanggilan fungsi tersimpan yang dipanggil dalam kondisi tersebut - maka Anda harus mempertimbangkan kembali struktur kode Anda. Saya percaya bahwa ketergantungan pada efek samping tidak diinginkan.


Pembaruan terakhir: 26/05/2018

KASUS

Fungsi CASE menguji kebenaran serangkaian kondisi dan, bergantung pada hasil pengujian, dapat mengembalikan hasil tertentu. Fungsi ini mengambil bentuk berikut:

KASUS KETIKA kondisi_1 MAKA hasil_1 KETIKA kondisi_2 MAKA hasil_2 ................................. KETIKA kondisi_N MAKA kondisi_N AKHIR

Mari kita ambil tabel Produk berikut sebagai contoh:

CREATE TABLE Produk (Id INT AUTO_INCREMENT PRIMARY KEY, ProductName VARCHAR(30) BUKAN NULL, Produsen VARCHAR(20) BUKAN NULL, ProductCount INT DEFAULT 0, Harga DECIMAL BUKAN NULL);

Mari kita query tabel ini dan gunakan fungsi CASE:

PILIH Nama Produk, Jumlah Produk, KASUS KETIKA ProductCount = 1 MAKA "Item hampir habis" KETIKA ProductCount = 2 MAKA "Item hampir habis" KETIKA ProductCount = 3 MAKA "Stok" LAIN "Item tinggi" AKHIR SEBAGAI Kategori DARI Produk;

fungsi JIKA

Fungsi IF mengembalikan salah satu dari dua nilai bergantung pada hasil ekspresi kondisional. Bentuk umum fungsinya seperti ini:

JIKA(kondisi, nilai_1, nilai_2)

Jika kondisi yang diteruskan sebagai parameter pertama benar, maka nilai pertama dikembalikan, jika tidak, nilai kedua dikembalikan. Misalnya:

PILIH NamaProduk, Produsen, IF(ProductCount > 3, "Banyak Produk", "Beberapa Produk") DARI Produk;

JIKANULL

Fungsi IFNULL memeriksa nilai beberapa ekspresi. Jika NULL, maka fungsi mengembalikan nilai yang diteruskan sebagai parameter kedua:

IFNULL(ekspresi, nilai)

Misalnya, ambil tabel berikut

CREATE TABLE Klien (Id INT AUTO_INCREMENT PRIMARY KEY, Nama Depan VARCHAR(20) BUKAN NULL, Nama Belakang VARCHAR(20) BUKAN NULL, Telepon VARCHAR(20) NULL, Email VARCHAR(20) NULL); MASUKKAN KE Klien (Nama Depan, Nama Belakang, Telepon, Email) NILAI ("Tom", "Smith", "+36436734", NULL), ("Bob", "Simpson", NULL, NULL);

Dan kami menggunakan fungsi IFNULL saat menerima data:

PILIH Nama Depan, Nama Belakang, IFNULL(Telepon, "tidak ditentukan") SEBAGAI Telepon, IFNULL(Email, "tidak diketahui") SEBAGAI Email DARI Klien;

BERSATU

Fungsi COALESCE mengambil daftar nilai dan mengembalikan nilai pertama yang bukan NULL:

COALESCE(ekspresi_1, ekspresi_2, ekspresi_N)

Misalnya, pilih pengguna dari tabel Klien dan tentukan di kontak mereka nomor telepon atau alamat email, jika bukan NULL:

PILIH Nama Depan, Nama Belakang, COALESCE(Telepon, Email, "tidak ditentukan") SEBAGAI Kontak DARI Klien;

Artinya, dalam hal ini nomor telepon dikembalikan jika teridentifikasi. Jika tidak ditentukan, maka alamat email dikembalikan. Jika alamat email tidak ditentukan, maka string "tidak ditentukan" akan dikembalikan.

IFNULL(expr1,expr2) Jika expr1 bukan NULL, maka IFNULL() mengembalikan nilai expr1, jika tidak expr2. Tergantung pada konteksnya, fungsi IFNULL() dapat mengembalikan nilai numerik atau string: mysql> SELECT IFNULL(1,0);

Tipe pengembalian akan sama (INTEGER, DOUBLE, atau STRING) dengan nilai pengembalian pertama (ekspresi setelah pernyataan THEN pertama).

  • Sergei Savenkov

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat