Structured Query Language
DDL (Data Definition Language)
31 Mei 2006
© 2006, M. Ramadhan
1
Pendahuluan Yang akan dibahas: Bahasa basis data: DDL, DML Mengenal SQL: standar, manfaat SQL: Data Definition Language • • • •
31 Mei 2006
Membuat, mengubah, menghapus basis data Membuat, mengubah, menghapus tabel Membuat, mengubah, menghapus view Membuat dan mengubah index © 2006, M. Ramadhan
2
Tujuan Mahasiswa diharapkan : Mengetahui kegunaan bahasa basis data. Mampu membedakan antara DDL dgn DML. Mengetahui sejarah, standar, dan manfaat SQL. Mampu menuliskan pernyataan SQL untuk mendefinisikan, mengubah dan menghapus basis data, tabel, dan view. Mampu menuliskan pernyataan SQL untuk mendefinisikan dan menghapus index. 31 Mei 2006
© 2006, M. Ramadhan
3
Bahasa Basis Data Memungkinkan pengguna:
• Membuat dan mengubah skema basis data. • Mengelola data seperti menambah, mengubah dan menghapus data. Oleh karena itu, bahasa basis data terdiri
atas dua komponen, yaitu: • DDL (Data Definition Language) • DML (Data Manipulation Language)
31 Mei 2006
© 2006, M. Ramadhan
4
DDL (Data Definition Language) Bahasa untuk mendefinisikan skema atau
memodifikasi skema yang ada. Hasilnya: sekumpulan tabel yang disebut kamus data (data dictionary). Kamus data (disebut juga katalog, direkori) mengintegrasikan metadata. Metadata mendeskripsikan objek dalam basis data: definisi record, item data, dsb.
31 Mei 2006
© 2006, M. Ramadhan
5
DML (Data Manipulation Language) Bahasa untuk memanipulasi data, yaitu
untuk: • • • •
Menyisipkan data baru ke dalam basisdata Memodifikasi data dalam basisdata Menemukan kembali data dalam basisdata Menghapus data dari dalam basisdata
Ada dua jenis DML, yaitu:
• DML prosedural • DML non-prosedural 31 Mei 2006
© 2006, M. Ramadhan
6
DML prosedural dan non-prosedural DML prosedural: bahasa yang
memungkinkan pengguna memerintahkan sistem secara tepat bagaimana memanipulasi data. DML non-prosedural: bahasa yang memungkinkan user menyatakan data apa yang dibutuhkan dan bukan bagaimana data diperoleh. Contoh: SQL, QBE
31 Mei 2006
© 2006, M. Ramadhan
7
Mengenal SQL Bahasa standar untuk basis data relasional Lebih dari 100 DBMS mendukung SQL Diusulkan pertama kali oleh D. Chamberlin,
1974, peneliti di Lab. Riset IBM, San Jose, dengan nama SEQUEL (Structured English Query Language) Versi revisi SEQUEL/2 didefinisikan th. 1976 dan namanya berubah menjadi SQL. Hingga kini masih banyak orang melafalkan SQL sebagai ‘see-quel’ 31 Mei 2006
© 2006, M. Ramadhan
8
Standar SQL 1986, SQL standar dibakukan oleh ANSI
(American National Standards Institute) 1987, SQL standar diadopsi sebagai standar internasional oleh International Standard Organization (ISO) 1989, ISO mempublikasikan addendum yang mendefinisikan ‘Integrity Enhancement Feature’ 1992, revisi oleh ISO menghasilkan SQL2, disebut juga SQL-92 (ISO, 1992). 1999, standar SQL3 atau SQL-99
31 Mei 2006
© 2006, M. Ramadhan
9
Tools >< SQL DBMS masa kini telah menyediakan tools yang
mudah digunakan tanpa harus mengetikkan pernyataan SQL untuk: • mendefinisikan, mengubah, dan menghapus skema basis data. • menambah, mengubah, dan menghapus data. Walaupun demikian, pemahaman terhadap SQL memberikan banyak manfaat. 31 Mei 2006
© 2006, M. Ramadhan
10
Manfaat SQL Source code SQL dapat disimpan dan di-run
pada sistem yang sama atau berbeda untuk memperoleh objek basis data yang sama. Pernyataan SQL dapat ditanamkan ke dalam bahasa prosedural dan memenuhi kebutuhan pemrograman operasi basis data. Memberikan pemahaman yang lebih baik sebagai fundasi penggunaan tools visual sehingga penggunaan tools tersebut lebih efektiv. 31 Mei 2006
© 2006, M. Ramadhan
11
SQL: Data Definition Language Yang akan dibahas: Membuat, mengubah, menghapus basis data Membuat, mengubah, menghapus tabel Membuat, mengubah, menghapus view Membuat, menghapus index Create Database Alter Database Create Table Alter Table Create View Alter View Create Index 31 Mei 2006
© 2006, M. Ramadhan
Drop Database Drop Table Drop View Drop Index 12
Mendefinisikan Basis data Basis data adalah container tempat tabel
terkait, view, index dan objek lainnya. Pernyataan SQL: Create Database NamaBasisData Misalnya mendefinisikan basis data MyBooks: Create Database MyBooks Gunakan klausa Set untuk setting basis data,
misalnya basis data hanya untuk dibaca saja: Create Database MyBooks Set Read_Only 31 Mei 2006
© 2006, M. Ramadhan
13
Mengubah dan Menghapus Basis data Basis data yang ada dapat diubah, misalnya
mengganti nama MyBooks menjadi Bukuku: Alter Database MyBooks Modify Name = Bukuku Mengubah setting basis data dengan klausa Set, misalnya Alter Database MyBooks Set Read_Write Menghapus basis data: Drop Database NamaBasisData 31 Mei 2006
© 2006, M. Ramadhan
14
Mendefinisikan Tabel (1) Gunakan syntax berikut: Create Table NamaTabel (NamaKolom1 TipeData1,
: : NamaKolomN TipeDataN) Contoh, mendefinisikan tabel Buku: Create Table Buku (ISBN Char(10), Judul VarChar(25), ThTerbit Integer) 31 Mei 2006
© 2006, M. Ramadhan
15
Konvensi Nama Dalam MS SQL Server, aturan nama sbb:
• Maksimum 128 karakter • Terdiri atas huruf dan boleh diikuti dengan angka, simbol khusus: _(garis bawah), #, $, @ • Jangan menggunakan kata kunci SQL. Bila terpaksa, tulis nama di antara dua tanda petik ganda “ “ atau di antara dua kurung siku [ ]. Sebaiknya hanya menggunakan huruf dan
angka supaya tidak timbul masalah pada multiplatform dan atau multisistem. 31 Mei 2006
© 2006, M. Ramadhan
16
Tipe Data Character, Text Exact Numeric Approximate Numerics Money Date, Time Bit, Binary, Image
31 Mei 2006
© 2006, M. Ramadhan
17
Tipe Data: Character (1) Tipe Data
Keterangan
Char(panjang) Character(panjang)
String dengan panjang tetap, 1 s.d 8000 karakter. Jika panjang diabaikan, nilai default 1. String karakter NChar(panjang) Unicode dengan NCharacter(panjang) panjang tetap, 1 s.d National Char(panjang) 4000. Jika panjang National Character(panjang) diabaikan, default 1. 31 Mei 2006
© 2006, M. Ramadhan
18
Tipe Data: Character (2) Tipe Data
Keterangan
String dengan panjang Char Varying(panjang) Character Varying(panjang) variabel, 1 s.d 8000 karakter. Jika panjang VarChar(panjang) diabaikan, nilai default 1. String karakter Unicode NChar Varying(panjang) NCharacter Varying(panjang) dengan panjang variabel, 1 s.d 4000. Jika VarChar(panjang) National Char Varying(panjang) National Character Varying(panjang) 31 Mei 2006
© 2006, M. Ramadhan
panjang diabaikan, nilai default 1. 19
Tipe Data: Text Tipe Data
Keterangan
Text
Data teks dengan panjang variabel sampai 2.147.483.647 karakter.
NText National Text
Data teks Unicode dengan panjang variabel sampai 1.072.741.823 karakter atau 2.147.483.647 byte.
31 Mei 2006
© 2006, M. Ramadhan
20
Tipe Data: Exact Numerics Tipe Data
Jangkauan Harga
Ukuran (byte)
BigInt
(-263)s.d (263-1) (-9,223,372,036,854,775,808) s.d (9,223,372,036,854,775,807) (-231)s.d (231-1) Int (-2,147,483,648) s.d (2,147,483,647) Integer SmallInt (-215)s.d (215-1) (-32,768) s.d (32,767) TinyInt 31 Mei 2006
0 s.d (28-1) atau 0 s.d 255 © 2006, M. Ramadhan
8 4 2 1 21
Tipe Data: Approximate Numerics Tipe Data Float(n)
Real Float(24)
31 Mei 2006
Jangkauan Harga
Keterangan
- 1.79E+308 s.d n = 1 s.d 24: 4 byte -2.23E-308, 0, dan presisi 7 digit 2.23E-308 s.d n = 25 s.d 53: 8 byte 1.79E+308 presisi 15 digit - 3.40E + 38 s.d -1.18E - 38, 0, dan 4 byte 1.18E - 38 s.d 3.40E + 38
© 2006, M. Ramadhan
22
Tipe Data: Money Tipe Data Money
SmallMoney
31 Mei 2006
Jangkauan Harga
Ukuran (byte)
-922,337,203,685,477.5808 s.d 922,337,203,685,477.5807
8
- 214,748.3648 s.d 214,748.3647
4
© 2006, M. Ramadhan
23
Tipe Data: Date, Time Tipe Data DateTime
SmallDateTime
31 Mei 2006
Jangkauan Harga 1 Januari 1753 s.d 31 Desember 9999 1 Januari 1900 s.d 6 Juni 2079
© 2006, M. Ramadhan
Akurasi (Ketelitian) 3.33 milidetik
1 menit
24
Tipe Data: Bit, Binary, Image Tipe Data
Keterangan
Bit
Berharga 1, 0, atau NULL
Binary(n)
Data biner dg panjang tetap, n berharga 1 s.d 8000. Ukuran n byte. Jika panjang diabaikan, nilai default 1. varbinary (n) Data biner dg panjang variabel, n berBinary Varying(n) harga 1 s.d 8000. Ukuran n byte. Jika panjang diabaikan, nilai default 1. Data biner dg panjang variabel, dari 0 Image s.d (231-1) atau(2,147,483,647) byte 31 Mei 2006
© 2006, M. Ramadhan
25
Null, Harga Default Null berarti data aktual tidak diketahui. Harga default adalah harga yang diberikan oleh
sistem ketika baris baru ditambahkan. Pada pernyataan Create Table, setelah nama kolom tambahkan: • ekspresi Null untuk kolom yang boleh kosong • ekspresi Not Null u/ kolom yg tak boleh kosong • klausa Default harga bila diperlukan.
31 Mei 2006
© 2006, M. Ramadhan
26
Contoh penggunaan Null dan harga default Create Table Buku (ISBN Char(10) Not Null, Judul VarChar(25) Null Default ‘ ‘, ThTerbit Integer Null Default Null);
Pernyataan di atas mendefinisikan tabel Buku dengan kolom: ISBN tidak boleh kosong, Judul boleh kosong dengan harga default ‘ ‘ ThTerbit boleh kosong dgn nilai default Null 31 Mei 2006
© 2006, M. Ramadhan
27
Menambah Kolom Baru Gunakan syntax berikut: Alter Table NamaTabel Add NamaKolomBaru TipeData Tambahkan ekspresi Null dan atau klausa Default bila diperlukan. Menambahkan kolom IdPenerbit bertipe integer dan boleh Null ke dalam tabel Buku:
Alter Table Buku Add IdPenerbit Integer Null 31 Mei 2006
© 2006, M. Ramadhan
28
Menghapus Kolom Gunakan syntax berikut:
Alter Table NamaTabel Drop NamaKolom Misalnya mnghapus kolom ThTerbit dari
dalam tabel Buku: Alter Table Buku Drop ThTerbit
31 Mei 2006
© 2006, M. Ramadhan
29
Mengubah Kolom Untuk mengubah tipe data, ukuran, boleh Null
atau tidak suatu kolom, gunakan syntax: Alter Table NamaTabel Alter Column NamaKolom Mengubah kolom ThTerbit bertipe Integer, boleh Null, nilai Default Null, menjadi bertipe SmallInt, tidak boleh Null, Default 2000: Alter Table Buku Alter Column ThTerbit SmallInt Not Null Default 2000 31 Mei 2006
© 2006, M. Ramadhan
30
Constraints Constraint dibutuhkan untuk menjamin
integritas basis data. Pada pernyataan Create Table, dapat ditambahkan empat jenis constraint: • • • •
31 Mei 2006
Primary key Unique Foreign key Check
© 2006, M. Ramadhan
31
Primary key Pada SQL Server 2000: Setelah pendefinisian kolom terakhir, tambahkan Constraint NamaConstraint Primary Key (NamaKolom)
Pernyataan Constraint NamaConstraint boleh
diabaikan. Jumlah NamaKolom maksimum 16 buah (composite key). Setelah NamaKolom dapat ditambahkan pernyataan Asc untuk menaik atau Desc untuk menurun. 31 Mei 2006
© 2006, M. Ramadhan
32
Unique Unique mirip primary key, namun kolomnya
boleh Null. Setelah pendefinisian kolom terakhir, tambahkan Constraint NamaConstraint Unique (NamaKolom)
Pernyataan Constraint NamaConstraint boleh
tidak ditulis. Jumlah NamaKolom maks. 16 buah (komposit). Sebh tabel dpt memiliki 250 unique constraint. Setelah NamaKolom dapat ditambahkan pernyataan Asc untuk menaik atau Desc untuk menurun 31 Mei 2006
© 2006, M. Ramadhan
33
Contoh penggunaan primary key dan unique Create Table Buku (ISBN Char(10) Not Null, Judul VarChar(25) Null Default ‘ ‘, ThTerbit Integer Null Default Null, constraint IsbnPk Primary Key (ISBN), constraint JudThUq Unique(Judul,ThTerbit));
Pernyataan di atas mendefinisikan tabel Buku : Primary key ISBN Kombinasi Judul dan ThTerbit unik (tidak boleh ada yang sama harganya) 31 Mei 2006
© 2006, M. Ramadhan
34
Foreign key (1) Foreign key adalah sebuah kolom atau lebih
dalam sebuah tabel yang harganya cocok dengan harga primary key atau unique constraint dalam tabel lain (atau tabel dirinya sendiri) yang terkait. Setiap kolom foreign key harus memiliki tipe data dan ukuran yang sama dengan kolom primary key atau kolom unique constraint yang diacu. 31 Mei 2006
© 2006, M. Ramadhan
35
Foreign key (2) Pada SQL Server 2000: Setelah pendefinisian kolom terakhir, tambahkan Constraint NamaConstraint Foreign Key (NamaKolom) References NamaTabelAcuan (NamaKolom)
Pernyataan Constraint NamaConstraint boleh
diabaikan. Sebuah tabel dapat memiliki hingga 253 buah foreign key
31 Mei 2006
© 2006, M. Ramadhan
36
Contoh penggunaan foreign key Create Table Buku (ISBN Char(10) Not Null, Judul VarChar(25) Null Default ‘ ‘, ThTerbit Integer Null Default Null, IdPenerbit Integer Not Null, constraint ISBNpk Primary Key (ISBN), constraint IdPenerbitFk Foreign Key (IdPenerbit) References Penerbit (IdPenerbit), constraint JudThUq Unique(Judul,ThTerbit));
31 Mei 2006
© 2006, M. Ramadhan
37
Check Constraint (1) Digunakan untuk menjamin validitas harga
suatu kolom sesuai dg domain kolom tsb. Pernyataan Check (kriteria) ditulis setelah pendefinisian kolom. Create Table Buku (ISBN Char(10) Not Null, Judul VarChar(25) Null Default ‘ ‘, ThTerbit Integer Null Default Null Check (ThTerbit >= 1990)); 31 Mei 2006
© 2006, M. Ramadhan
38
Check Constraint (2) Cara lain dengan menulis pernyataan Constraint NamaConstraint Check (kriteria)
setelah pendefinisian kolom terakhir. Create Table Buku (ISBN Char(10) Not Null, Judul VarChar(25) Null Default ‘ ‘, ThTerbit Integer Null Default Null, constraint ISBNpk Primary Key (ISBN), constraint ThTerbitCk Check (ThTerbit >= 1990));
31 Mei 2006
© 2006, M. Ramadhan
39
Menambah Constraint Syntax: Alter Table NamaTabel Add Constraint NamaConstraint TipeConstraint
Format penulisan TipeConstraint bergantung pd
jenis constraint, sama dg format pendefinisiannya Misalnya menambahkan foreign key pada tabel Buku yang terhubung dg tabel Penerbit: Alter Table Buku Add constraint IdPenerbitFk Foreign Key (IdPenerbit) References Penerbit (IdPenerbit) 31 Mei 2006
© 2006, M. Ramadhan
40
Menghapus Constraint Syntax:
Alter Table NamaTabel Drop Constraint NamaConstraint Misalnya menghapus constraint foreign key IdPenerbitFk dari tabel Buku: Alter Table Buku Drop constraint IdPenerbitFk
31 Mei 2006
© 2006, M. Ramadhan
41
View (1) Definisi: Tabel basis (base table) adalah sebuah tabel yang secara fisik disimpan dalam basis data. View adalah hasil dinamis dari sebuah atau lebih operasi terhadap tabel basis. View adalah tabel virtual yang secara aktual tidak ada dalam basis data, tetapi dihasilkan berdasarkan permintaan user sesuai dengan kebutuhannya. 31 Mei 2006
© 2006, M. Ramadhan
42
View (2) Tujuan: Memberikan keamanan dg menyembunyikan sebagian basis data terhadap user tertentu. Memungkinkan user mengakses data sesuai dengan kebutuhannya, sehingga data yang sama dapat dilihat dengan cara berbeda oleh user yang berbeda, pada waktu yang sama. Menyederhanakan operasi rumit terhadap tabel basis (base table). 31 Mei 2006
© 2006, M. Ramadhan
43
View (3) View digunakan untuk:
• Memilih sekumpulan baris tertentu dari sebuah tabel (proses seleksi). • Memilih sekumpulan kolom tertentu dari sebuah tabel (proses proyeksi). • Men-join-kan beberapa tabel. • Menggabungkan baris beberapa tabel menggunakan operasi union.
31 Mei 2006
© 2006, M. Ramadhan
44
View (4) Proses proyeksi, misalnya: Membuat view JudulTh untuk menampilkan kolom Judul dan ThTerbit dari tabel Buku : Create View JudulTh As Select Judul, ThTerbit From Buku
31 Mei 2006
© 2006, M. Ramadhan
45
View (5) Proses seleksi, misalnya: Membuat view BukuBaru untuk menampilkan semua kolom tabel Buku yang terbit tahun 2005 ke atas: Create View BukuBaru As Select * From Buku Where (ThTerbit >= 2005) 31 Mei 2006
© 2006, M. Ramadhan
46
View (6) Proses proyeksi dan seleksi, misalnya: Membuat view JudulTh05 untuk menampilkan kolom Judul dan ThTerbit dari tabel Buku yang terbit pada tahun 2005 : Create View JudulTh05 As Select Judul, ThTerbit From Buku Where (ThTerbit = 2005) 31 Mei 2006
© 2006, M. Ramadhan
47
View (7) Definisi view dapat juga dibuat berdasarkan
view yang telah didefinisikan sebelumnya. Membuat view JudulTh05 untuk menampilkan kolom dari view JudulTh yang terbit pada tahun 2005 : Create View JudulTh05 As Select * From JudulTh Where (ThTerbit = 2005) 31 Mei 2006
© 2006, M. Ramadhan
48
View (8) Join dua tabel atau lebih yang terhubung: Misalnya menampilkan kolom Judul dari tabel Buku dan kolom Nama dari tabel Penerbit yang terhubung melalui kolom Idpenerbit : Create View BukuPenerbit As Select Buku.Judul, Penerbit.Nama From Buku Join Penerbit On Buku.IdPenerbit = Penerbit.IdPenerbit
31 Mei 2006
© 2006, M. Ramadhan
49
View (9) Create View BukuPenerbit As Select Buku.Judul, Penerbit.Nama From Buku Join Penerbit On Buku.IdPenerbit = Penerbit.IdPenerbit
Memberikan hasil yang sama dengan : Create View BukuPenerbit As Select Buku.Judul, Penerbit.Nama From Buku, Penerbit Where Buku.IdPenerbit = Penerbit.IdPenerbit 31 Mei 2006
© 2006, M. Ramadhan
50
View (10) Apa hasil dari pernyataan SQL berikut?
Create View BukuPenerbit As Select Buku.Judul, Penerbit.Nama From Buku, Penerbit
31 Mei 2006
© 2006, M. Ramadhan
51
View (11) Menggabungkan baris dari dua tabel atau lebih. Misalnya menggabungkan Nama dan NoTelp dari
tabel Pengarang dengan Nama dan NoTelp dari tabel Penerbit: Select Nama, NoTelp From Pengarang Union Select Nama, NoTelp From Penerbit 31 Mei 2006
© 2006, M. Ramadhan
52
View (12) Mengubah View nenggunakan Alter View dengan syntax yg sama dengan Create View Misalnya, mengubah view BukuBaru dengan kriteria sebelumnya (ThTerbit >= 2005) menjadi (ThTerbit >= 2006) :
Alter View BukuBaru As Select * From Buku Where (ThTerbit >= 2006) 31 Mei 2006
© 2006, M. Ramadhan
53
Kriteria / Kondisi (1) Antara lain digunakan pada pernyataan: Constraint … Check (kriteria) Select … From … Where (kriteria) Kriteria/kondisi adalah ekspresi boolean, menghasilkan harga True atau False Ekspresi boolean menggunakan operator per-
bandingan yang membandingkan dua harga: > >= < <= = <> Contoh: ThTerbit >= 1990 ThTerbit = 2005 31 Mei 2006
© 2006, M. Ramadhan
54
Kriteria / Kondisi (2) Untuk ekspresi boolean yang lebih rumit,
gunakan operator logika berikut: Not Between
And In
Or Like
Contoh: ThTerbit >= 1990 And ThTerbit <= 2005 ThTerbit Between 1990 And 2005 Judul Like ‘%Visual Basic%’ NIM Like ‘_ _04%’ ThTerbit In(1999,2002,2005) 31 Mei 2006
© 2006, M. Ramadhan
55
Index (1) Index dibuat untuk meningkatkan kinerja dan
efisiensi penyaringan, pencarian dan pengurutan baris berdasarkan kolom tertentu. Secara internal, SQL Server membuat index ketika misalnya: • pernyataan DML, misalnya pernyataan select dieksekusi. • primary key dispesifikasikan • unique constraint dispesifikasikan. 31 Mei 2006
© 2006, M. Ramadhan
56
Index (2) Membuat index, syntax: Create Index NamaIndex On NamaTabel (NamaKolom1,NamaKolom2,…) Jumlah kolom maksimum 16 buah Setelah NamaKolom dapat ditambahkan Desc untuk menurun atau Asc untuk menaik (default) Index tak dapat dilakukan pada kolom bertipe Text, NText, Image. Panjang total maksimum untuk semua kolom
adalah 900 byte. 31 Mei 2006
© 2006, M. Ramadhan
57
Index (3) Membuat indeks ThIsbnIx untuk tabel Buku berdasarkan kolom ThTerbit dan ISBN:
Create Index ThIsbnIx On Buku (ThTerbit, ISBN)
31 Mei 2006
© 2006, M. Ramadhan
58
Menghapus Yang Dihapus Syntax Pernyataan SQL Basis data
Drop Database NamaBasisData
Tabel
Drop Table NamaTabel
View
Drop View NamaView
Index
Drop index NamaIndex
31 Mei 2006
© 2006, M. Ramadhan
59
Daftar Istilah DDL
Tipe Data
DML
Primary key constraint
SQL
Foreign key constraint
Basis Data
Unique constraint
Tabel
Check constraint
Baris
View
Kolom
Index
31 Mei 2006
© 2006, M. Ramadhan
60
Yang Sudah Dipelajari Bahasa basis data: DDL, DML Mengenal SQL: standar, manfaat Membuat, mengubah, menghapus basis data Membuat, mengubah, menghapus tabel
• Konvensi nama • Tipe data
• Constraint • Harga default
Membuat, mengubah, menghapus view Membuat dan mengubah index 31 Mei 2006
© 2006, M. Ramadhan
61
Daftar Pustaka Connolly, Thomas., et.al., 2002. Database System. Wokingham England, AddisonWesley Publishing Company. Vieira, Robert, 2006. Beginning SQL Server 2005 Programming. Indianapolis, Wiley Publishing, Inc. Otey, Michael dan Conte, Paul, 2001. SQL Server Developer's Guide, Berkeley, Osborne / McGraw-Hill. 31 Mei 2006
© 2006, M. Ramadhan
62
TAMAT © 2006, M. Ramadhan
31 Mei 2006
© 2006, M. Ramadhan
63