A.  Dasar Teori
1.      Select Into Statement
Query select into statement merupakan query SQL yang digunakan untuk mengopi informasi dari tabel ke tabel yang lain tanpa membuat tabel sebelumnya.
SELECT INTO mengambil data dari tabel database dan memasukkan ke tabel lain.
Perhatikan contoh di bawah ini SELECT INTO:
SELECT FirstName, LastName, DateOfBirth
INTO UsersBackup
FROM Users
Bagian pertama dari pernyataan tampak familiar dan hanya memilih beberapa kolom.
Bagian kedua dari pernyataan SQL adalah bagian penting, yang menentukan untuk memasukkan baris ke dalam tabel UsersBackup. Bagian terakhir menentukan tabel mana yang akan diambil datanya untuk dimasukkan ke tabel yang dipilih. Contoh ini mengasumsikan bahwa baik tabel Users maupun tabel UsersBackup memiliki struktur yang identik.
2.      Sub Query
Subquery (Subselect) adalah pernyataan SELECT yang merupakan bagian dari pernyataan lain, misal : INSERT. Pernyataan ORDER BY, FOR UPDATE OF, UNION, INTERSECT atau EXCEPT tidak termasuk dalam pernyataan ini. Subquery menghasilkan sebuah tabel yang merupakan bagian dari tabel atau view yang diidentifikasikan pada klausa FROM. Pembagian ini dapat digambarkan seperti urutan operasi, dimana hasil dari suatu operasi adalah input bagi operasi lain.
Subquery diperlukan pada saat hasil query tidak berhasil dilakukan dengan hanya melalui satu tabel saja, juga pada saat hasil suatu query
digunakan pada klausa WHERE query lainnya. Hasil yang diperoleh dari SUBSELECT tidak dapat ditampilkan oleh “main” SELECT.
Urutan operasi pada Subquery adalah :
1. klausa FROM
2. klausa WHERE
3. klausa GROUP BY
4. klausa HAVING
5. klausa SELECT
SUBQUERY – Coding
Fungsi :
Pada klausa kondisi (WHERE atau HAVING), akses lain seperti
SELECT dapat melibatkan beberapa tabel. Ada beberapa cara untuk
menggabungkan SELECT tambahan pada klausa SELECT atau HAVING
·         Perbandingan aritmatik (=, >, <)
·         ANY (dikombinasikan dengan =, >=, <=)
·         SOME (dikombinasikan dengan =, >=, <=)
·         IN
3.      Indeks
Sebuah indeks dapat dibuat pada tabel untuk menemukan data lebih cepat dan efisien. User tidak bisa melihat indeks, indeks hanya digunakan untuk memepercepat pencarian. Biasanya indeks digunakan pada kolom yang sering digunakan.
Membuat indeks. Boleh terdapat duplikasi:
CREATE INDEX index_nameON table_name (column_name)
Membuat Indeks, tidak boleh terdapat duplikasi:
CREATE UNIQUE INDEX index_nameON table_name (column_name)
4.      Kolom Unik

Unique berfungsi untuk menjaga agar tidak terjadinya duplikasi nilai (kesamaan data) dalam sebuah kolom, hal ini dapat ditangani dengan membuat sebuah indeks unik atau fungsi unik sendiri pada kolom yang dimaksud. Unique ini sering digunakan dalam pembuatan bukan primary key namun membutuhkan cek dupikasi agar tidak ada yang sama, karena dalam primary key sudah otomatis mempunyai sifat unik. Berikut Struktur SQL saat pembuatan tabel baru :
CREATE TABLE nama_tabel (nama_kolom tipe_data unique);
Ketika tabel sudah ada kita bisa menggunakan cara seperti pada BAB. 2 berikut struktur SQL nya :
ALTER TABLE nama_tabel ADD UNIQUE (nama_kolom);
Untuk menghapus unique berikut caranya :
ALTER TABLE nama_table DROP CONSTRAINT NAMA_CONSTRAIN
5.      Check

Check berfungsi untuk melakukan pembatasan nilai masukan dalam sebuah kolom, sebagai contoh misalkan kita ingin agar kolom gender yang terdiri dari satu karakter hanya memiliki dua pilihan karakter yaitu M (male) atau F (Fimale) ini dapat kita seting dengan menggunakan CHECK. Dengan menggunakan CHECK maka sebuah kolom hanya bisa diisi dengan data yang memenuhi kriteria dalam CHECK.
6.      Penggunaan Trim

Suatu ketika pasti akan memiliki data yang di dalamnya terdapat spasi kosong yang tidak diperlukan, misalnya spasi ganda. Jika ada masalah seperti ini, kita dapat membersihkan spasi-spasi kosong yang tidak diperlukan menggunakan fungsi TRIM, RTRIM, dan LTRIM. Ketiga fungsi ini memiliki bentuk penggunaan sebagai berikut :
- RTRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kanan (Right) String.
- LTRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kiri (Left) String.
- TRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kiri, kanan, maupun tengah String

Berikut Struktur SQL nya :
Select trim(nama_kolom) from nama_tabel;
Dalam penggunaannya, fungsi TRIM memiliki tiga opsi. Ketiga opsi ini dapat digunakan untuk menentukan karakter apa yang akan dihapus dari suatu String. Jadi, fungsi TRIM juga dapat menghilangkan karakter tertentu (bukan spasi kosong saja) dari suatu string. Opsinya sebagai berikut :
- LEADING : merupakan opsi untuk menghilangkan karakter terpilih yang ada di sebelah kiri. Parameter Leading diartikan sebagai sufik dari karakter yang ada.
- TRAILING : merupakan opsi untuk menghilangkan karakter terpilih yang ada di sebelah kanan String. Parameter Trailing diartikan sebagai sufik dari karakter yang ada.
- BOTH : merupakan opsi yang dapat menangani parameter Leading maupun Trailing.
Berikut Struktur SQL nya :
Select trim(LEADING ‘karakter, misal : -’ from nama_kolom) from nama_tabel;


sumber: http://ilab.gunadarma.ac.id/modul/NewPTA2011-2012/MySQL/m7.pdf
http://elib.unikom.ac.id/files/disk1/371/jbptunikompp-gdl-galihherma-18526-15-10.sub-%29.pdf
http://ocw.stikom.edu/course/download/2014/07/Pertemuan-SQL-6.1.pdf
http://www.1keydata.com/sql/sql-trim.html
http://anessinaga.staff.ipb.ac.id/?p=242
          
                    B. Hasil Praktikum
Seperti biasanya, saya akan menjawab soal praktikum yang diberikan di bagian hasil praktikum ini.
Tugas praktikum kali ini masih menggunakan tabel pada praktikum sebelumnya :
1.      Tampilkan nama fakultas dan jumlah mahasiswa yang mampunyai ketentuan nama fakultas yang dimunculkan dengan jumlah mahasiswanya terkecil!
2.      Tampilkan nama mahasiswa, nama fakultas, alamat dengan syarat nama fakultas sama dengan edi dan alamatnya tidak sama dengan luki!
3.      Buatlah index di tabel mahasiswa(alamat). Kemudian buat lagi index yang bersifat unik pada tabel fakultas(fak_nama) kemudian amati perbedaannya ketika memasukkan data yang sama!
4.      Buat kolom nama di mahasiswa menjadi unik dan inputkan 2 data yang sama. Kemudian amati perbedaannya !
5.      Pindahkan data dari tabel mahasiswa, fakultas ambil kolom nim, nama mahasiswa, alamat, nama fakultas ke tabel baru yang dinamai “tabel identitas”.
6.      Buatlah contoh penggunaan check pada sub bab pembahasan CHECK. Kemudian masukkan beberapa data baik yang sesuai dengan criteria check maupun yang bukan dan amati perbedaannya.
7.      Inputkan data di tabel mahasiswa dimana pada kolom nama sebelum inputkan karakter dahulukan dengan spasi dan di akhiri dengan tanda “+” seperti berikut : “ andi cahyono++++”. kemudian munculkan seluruh data dan hilangkan spasi didepan!
8.      Munculkan data mahasiswa dengan hilangkan karakter “+” di akhir data dan karakter “a” di awal kata pada kolom nama!
·         Menggunakan PostgreSQL (PSQL)
1.      Untuk menjawabnya, kita lihat dulu data di tabel mahasiswa dengan perintah select*from mahasiswa. Sehingga muncul seperti di bawah ini.

Dari gambar tersebut, jumlah mahasiswa paling sedikit yaitu dari fakultas dengan id_fak 3 dan 4 yaitu fakultas humaniora dan tarbiyah.
Untuk menampilkan nama fakultas dan jumlah mahasiswa yang mampunyai ketentuan nama fakultas yang dimunculkan dengan jumlah mahasiswanya terkecil, maka struktur querynya select nama_fak, count(*) as jumlah from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak group by fakultas.nama_fak having count(*)<2;
2.      Untuk menampilkan nama mahasiswa, nama fakultas, alamat dengan syarat nama fakultas sama dengan edi (saya menggunakan rizki) dan alamatnya tidak sama dengan luki, maka struktur querynya select nama_mah, nama_fak, alamat_mah from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak and nama_fak in (select nama_fak from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak and nama_mah='rizki') and alamat_mah <> (select alamat_mah from mahasiswa where nama_mah='luki');
3.      Pertama kita buat index di tabel mahasiswa(alamat) dengan struktur query create index alamat_mah_index on mahasiswa(alamat_mah); lalu untuk melihat strkturnya kita ketik
\d mahasiswa;

Kemudian buat lagi index yang bersifat unik pada tabel fakultas(fak_nama) dengan struktur query create unique index nama_fak_index on fakultas(nama_fak); lalu untuk melihat strukturnya ketik \d fakultas;

kemudian kita amati perbedaannya ketika memasukkan data yang sama misalnya pada kolom alamat_mah di tabel fakultas sudah terdapat alamat Surabaya, sekarang kita coba masukkan data dengan alamat yang sama yaitu surabaya, namun dengan primary key yang berbeda. insert into mahasiswa values(21, 'ani', 'surabaya', '086435756438', 2, 'P');
dan untuk tabel fakultas juga kita masukkan data yang sama pada kolom nama_fak misalnya Saintek yang sudah tersimpan namun dengan primary key yang berbeda di tabel fakultas dengan struktur query insert into fakultas values(3, 'Saintek');

insert pertama akan berhasil sedangkan insert kedua di tabel fakultas akan gagal karena kolom nama_fak merupakan indeks yang unik dan tidak boleh ada yang sama.
4.      Membuat kolom nama di mahasiswa menjadi unik, kita ketikkan alter table mahasiswa add unique(nama_mah); lalu kita inputkan 2 data yang sama. Misalnya nama ani sudah ada, lalu kita masukkan lagi dengan mengetikkan perintah insert into mahasiswa values(22, 'ani', 'tulungagung', '086435756438', 1, 'P); Maka hasilnya akan seperti di bawah ini.
5.      Untuk memindahkan data dari tabel mahasiswa, fakultas dengan mengambil kolom nim, nama mahasiswa, alamat, nama fakultas ke tabel baru yang dinamai “tabel identitas” maka perintahnya adalah select nim_mah, nama_mah, alamat_mah, nama_fak into identitas from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak; sehingga akan muncul tabel identitas seperti di bawah ini, dengan perintah select*from identitas;
6.      Berikut ini contoh penggunaan check pada sub bab pembahasan CHECK. Kita ketikkan perintah create table pelanggan (nama varchar(35), kode_area char(10) check (length(trim(kode_area))=2), umur integer check (umur>=0), gender char(1) check (gender in ('L', 'P')), ttl date check (ttl between '1998-01-01' and current_date), check (upper(trim(nama)) !='nita' or upper(trim(nama)) !='jeki'));

Kemudian kita masukkan data baik yang sesuai dengan criteria check  misalnya insert into pelanggan values('mely', '45', 17, 'P', '1999-08-09'); dan ternyata berhasil kita insertkan.

Kemudian kita masukkan data yang tidak sesuai dengan criteria check  misalnya  insert into pelanggan values('mely', '453', 17, 'p', '1997-08-09'); dan ternyata insert tidak berhasil karena kode pos lebih dari 2 karakter (batasan pada check) yang sudah didefinisikan sebelumnya. Tahun lahir juga melebihi batas yang ada, sehingga insert tersebut tidak berhasil dilakukan.

7.      Pada tabel mahasiswa, kita masukkan data dengan karakter didahulukan dengan spasi dan di akhiri dengan tanda “+” seperti berikut : “ andi cahyono++++”. Kali ini saya akan memakai “  jaya+++” dengan insert into mahasiswa values(23, '  jaya+++', 'tulungagung', '086435756438', 1, 'L');  

kemudian kita munculkan seluruh data dengan enghilangkan spasi didepan dengan perintah select nim_mah, ltrim(nama_mah), alamat_mah, no_telp, id_fak, gender from mahasiswa;

8.      Untuk memuunculkan data mahasiswa dengan hilangkan karakter “+” di akhir data dan karakter “a” di awal kata pada kolom nama, kita dapat mengetikkan select nim_mah, trim(both '+ a' from nama_mah), alamat_mah, no_telp, id_fak, gender from mahasiswa; seperti dibawah ini

·         Menggunakan MySQL (phpMyAdmin)
1.      Untuk menjawabnya, kita lihat dulu data di tabel mahasiswa dengan perintah select*from mahasiswa. Sehingga muncul seperti di bawah ini.
Dari gambar tersebut, jumlah mahasiswa paling sedikit yaitu dari fakultas dengan id_fak 3 dan 4 yaitu fakultas humaniora dan tarbiyah.
Untuk menampilkan nama fakultas dan jumlah mahasiswa yang mampunyai ketentuan nama fakultas yang dimunculkan dengan jumlah mahasiswanya terkecil, maka struktur querynya select nama_fak, count(*) as jumlah from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak group by fakultas.nama_fak having count(*)<2;
Sehingga hasilnya seperti di bawah ini.

2.      Untuk menampilkan nama mahasiswa, nama fakultas, alamat dengan syarat nama fakultas sama dengan edi (saya menggunakan rizki) dan alamatnya tidak sama dengan luki, maka struktur querynya select nama_mah, nama_fak, alamat_mah from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak and nama_fak in (select nama_fak from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak and nama_mah='rizki') and alamat_mah <> (select alamat_mah from mahasiswa where nama_mah='luki');
Sehingga hasilnya seperti di bawah ini.

3.      Pertama kita buat index di tabel mahasiswa(alamat) dengan struktur query create index alamat_mah_index on mahasiswa(alamat_mah);

Kemudian buat lagi index yang bersifat unik pada tabel fakultas(fak_nama) dengan struktur query create unique index nama_fak_index on fakultas(nama_fak);

kemudian kita amati perbedaannya ketika memasukkan data yang sama misalnya pada kolom alamat_mah di tabel fakultas sudah terdapat alamat Surabaya, sekarang kita coba masukkan data dengan alamat yang sama yaitu surabaya, namun dengan primary key yang berbeda. insert into mahasiswa values(21, 'ani', 'surabaya', '086435756438', 2, 'P');

Insert akan sukses dan muncul seperti di bawah imi setelah diklik go.

dan untuk tabel fakultas juga kita masukkan data yang sama pada kolom nama_fak misalnya Saintek yang sudah tersimpan namun dengan primary key yang berbeda di tabel fakultas dengan struktur query insert into fakultas values(3, 'Saintek');

proses insert akan gagal karena kolom nama_fak merupakan indeks yang unik dan tidak boleh ada yang sama.seperti di bawah ini

4.      Membuat kolom nama di mahasiswa menjadi unik, kita ketikkan alter table mahasiswa add unique(nama_mah);


lalu kita inputkan 2 data yang sama. Misalnya nama ani sudah ada, lalu kita masukkan lagi dengan mengetikkan perintah insert into mahasiswa values(22, 'ani', 'tulungagung', '086435756438', 1, 'P);

Maka hasilnya akan gagal seperti di bawah ini. Karena kolom nama bersifat unik dan tidak boleh sama.

5.      Untuk memindahkan data dari tabel mahasiswa, fakultas dengan mengambil kolom nim, nama mahasiswa, alamat, nama fakultas ke tabel baru yang dinamai “tabel identitas” maka perintahnya adalah select nim_mah, nama_mah, alamat_mah, nama_fak into identitas from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak; sehingga akan muncul tabel identitas seperti di bawah ini, dengan perintah select*from identitas; 

Namun, hasilnya akan gagal karena mysql tidak bisa mengenali syntax tersebut seperti pada postgresql

6.      Berikut ini contoh penggunaan check pada sub bab pembahasan CHECK. Kita ketikkan perintah create table pelanggan (nama varchar(35), kode_area char(10) check (length(trim(kode_area))=2), umur integer check (umur>=0), gender char(1) check (gender in ('L', 'P')), ttl date check (ttl between '1998-01-01' and current_date), check (upper(trim(nama)) !='nita' or upper(trim(nama)) !='jeki'));
Nomor6 buat tabel check
Kemudian kita masukkan data baik yang sesuai dengan criteria check  misalnya insert into pelanggan values('mely', '45', 17, 'P', '1999-08-09'); dan ternyata berhasil kita insertkan.
Nomor6 insert memenuhi check
Kemudian kita masukkan data yang tidak sesuai dengan criteria check  misalnya  insert into pelanggan values('mely', '453', 17, 'p', '1997-08-09'); dan ternyata insert tidak berhasil karena kode pos lebih dari 2 karakter (batasan pada check) yang sudah didefinisikan sebelumnya. Tahun lahir juga melebihi batas yang ada, sehingga insert tersebut tidak berhasil dilakukan.
Nomor6 insert tidak memenuhi
7.      Pada tabel mahasiswa, kita masukkan data dengan karakter didahulukan dengan spasi dan di akhiri dengan tanda “+” seperti berikut : “ andi cahyono++++”. Kali ini saya akan memakai “  jaya+++” dengan insert into mahasiswa values(23, '  jaya+++', 'tulungagung', '086435756438', 1, 'L');  

Lalu kita lihat dengan mengetik select*from mahasiswa;

kemudian kita munculkan seluruh data dengan enghilangkan spasi didepan dengan perintah select nim_mah, ltrim(nama_mah), alamat_mah, no_telp, id_fak, gender from mahasiswa;

Sehingga hasilnya seperti di bawah ini

8.      Untuk memuunculkan data mahasiswa dengan hilangkan karakter “+” di akhir data dan karakter “a” di awal kata pada kolom nama, kita dapat mengetikkan select nim_mah, trim(both '+ a' from nama_mah), alamat_mah, no_telp, id_fak, gender from mahasiswa; seperti dibawah ini
Gambar nomor8
C.    Evaluasi Perbandingan DBMS

Pada bagian ini, kita akan mencoba membandingkan perbedaan dan persamaan diantara kedua DBMS. Dari nomor 1 sampai nomor 4, DBMS PostgreSQL dan MySQL memiliki struktur query yang sama serta hasil yang sama.
Namun, pada waktu sampai nomor 5, terjadi perbedaan, pada DBMS MySQL, tidak bisa menerima perintah select into, hal ini mungkin terjadi karena PostgreSQL terkadang lebih unggul dalam beberapa query yang tidak bisa dijalankan oleh DBMS MySQL seperti Object Oriented nya.
Kemudian pada nomor6, juga terjadi perbedaan karena fungsi check pada PostgreSQL yang bisa digunkan, tidak bisa digunakan karena setelah dicoba memasukkan data yang diluar dari check, ternyata masih bisa diinsertkan. Hal ini menunjukkan bahwa check tidak bisa digunakan pada MySQL.
Lalu pada nomor 8 juga terdapat perbedaan, karena fungsi trim pada MySQL juga tidak bisa berfungsi. Karena penggunaan trim pada MySQL harus diikuti nama String, bukan nama kolom seperti pada PostgreSQL.
Sehingga pada praktikum kali ini, PostgreSQL lebih unggul karena dapat melakukan fungsi-fungsi yang lebih memudahkan user.
 
D.    Keslimpulan, Kritik, Saran dan Manfaat

1.      Kesimpulan
Setelah melakukan praktikum ini, saya dapat mengambil kesimpulan bahwa Sub Query dalam SQL merupakan sebuah query di dalam query atau disebut juga query bersarang (nested query). Pada praktikum ini kita juga mempelajari tentan select into, indeks, kolom unik, check serta penggunaan trim.
              2. Saran
Diperlukan pembelajaran lebih lanjut mengenai sub query dan indeks  dalam database menggunakan PostgreSQL maupu MySQL agar praktikan dapat menguasai kedua DBMS tersebut dalam membuat database yang lebih baik.
              3. Kritik
Dalam laporan ini, masih banyak terdapat kekurangan karena terbatasnya pengetahuan saya dalam menguasai 2 DBMS yang digunakan dalam praktikum ini.       
               4. Manfaat
Manfaat yang akan didapat pembaca dalam laporan ini antara lain dapat mengetahui struktur query dalam sub query. Pembaca juga dapat mengetahui fungsi dari select into, indeks, kolom unik, check serta penggunaan trim. Pembaca juga dapat mengetahui persamaan dan perbedaan dari kedua DBMS tersebut.