Laporan Praktikum DBD Bab 7 SubQuery dan Indeks

on Minggu, 14 Desember 2014
1. Dasar Teori
SUBQUERY
Subquery adalah statement SELECT yang dilampirkan sebagai klausa dalam SQL Statement yang lain. Untuk penulisan subquery pada SQL
Pada gambar diatas, subquery (inner query) dijalankan sekali sebelum main query. Kemudian hasil dari subquery digunakan oleh main query (outer query).
PENGGUNAAN SUBQUERY
Subquery mengembalikan nilai ke main query. Subquery digunakan untuk menyelesaikan persoalan dimana terdapat suatu nilai yang tidak diketahui (unknown values). Berikut ini diberikan contoh penggunaan subquery.
SELECT last_name
FROM mahasiswa
WHERE salary >
(SELECT salary
FROM mahasiswa
WHERE mahasiswa_id = 149);
Query diatas akan menampilkan nama pegawai yang gajinya lebih dari pegawai dengan nomer pegawai 149. Sebelumnya, gaji dari pegawai dengan nomer pegawai 149 tidak diketahui, untuk itu kita tempatkan sebagai subquery agar nilai yang tidak diketahui tersebut dapat diketahui dan pada ilustrasi gambar diatas nilai gaji dari pegawai 149 adalah 10500.
INDEX
Index pada database digunakan untuk meningkatkan kecepatan akses data. Pada saat query dijalankan, index mencari data dan menentukan nilai ROWID yang membantu menemukan lokasi data secara fisik di disk. Akan tetapi penggunaan index yang tidak tepat, tidak akan meningkatkan unjuk kerja dalam hal ini kecepatan akses data.
Misal digunakan index yang melibatkan tiga buah kolom yang mengurutkan kolom menurut nama, fakultas dan NIM dari tabel mahasiswa, sebagai berikut :
CREATE INDEX idx_nama_fakultas_nim ON mahasiswa(nama, fakultas, nim) TABLESPACE INDX;
Kemudian user melakukan query sebagai berikut :
SELECT * FROM mahasiswa WHERE fakultas=’teknik’;
Pada saat melakukan query ini, index tidak akan digunakan karena kolom pertama (nama) tidak digunakan dalam klausa WHERE. Jika user sering melakukan query ini, maka kolom index harus diurutkan menurut fakultas.
SELECT * FROM mahasiswa WHERE nim BETWEEN 5302411050 AND 5302411105;
Query ini akan melakukan “scan” terhadap sedikit data block jika tabel mahasiswa diatas diurutkan berdasarkan kolom nim.
Alternatif yang lain, bisa digunakan perintah untuk membuat tabel lain yang memiliki urutan yang berbeda dari tabel asal, seperti perintah SQL berikut :
CREATE TABLE mahasiswa_urut AS SELECT * FROM mahasiswa ORDER BY nim;
Pada SQL diatas, tabel mahasiswa_urut berisi data yang sama dengan tabel mahasiswa
hanya datanya terurut berdasarkan kolom nim.
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
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. Berikut
query contoh pengunaan check :
db_contoh=> CREATE TABLE pelanggan (
db_contoh(> nama varchar(35),
db_contoh(> kode_area CHAR(10) CHECK (length(trim(kode_area)) = 2),
db_contoh(> umur INTEGER CHECK (umur >= 0),
db_contoh(> gender CHAR(1) CHECK (gender IN (‘L’, ‘P’)),
db_contoh(> ttl DATE CHECK (ttl BETWEEN ‘1998-01-01′ AND CURRENT_DATE),
db_contoh(> CHECK (upper(trim(nama)) != ‘nita’ OR
db_contoh(> upper(trim(nama)) != ‘jeki’)
db_contoh(> );
CREATE
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;
2. Hasil Praktikum
Tugas praktikum kali ini masih menggunakan tabel pada praktikum sebelumnya :
Berikut ini adalah query hasil praktikum yang dilakukan dengan PostgreSQL
Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Password for user postgres:
psql (9.3.5)
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page “Notes for Windows users” for details.
Type “help” for help.
postgres=# \c linda13650052;
WARNING: Console code page (437) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page “Notes for Windows users” for details.
You are now connected to database “linda13650052″ as user “postgres”.
postgrest=# select nama_fak, count(*) from mahasiswa m, fakultas f where m.i
d_fak=f.id_fak group by nama_fak order by count asc limit 1;
nama_fak | count
———–+——-
PSIKOLOGI | 4
(1 row)
postgrest=# select nama_mah, nama_fak, alamat_mah from mahasiswa m, fakultas
f where m.id_fak=f.id_fak and nama_fak in (select nama_fak from mahasiswa m,fak
ultas f where f.id_fak=m.id_fak and nama_mah=’edi’ and alamat_mah(select alama
t_mah from mahasiswa where nama_mah=’luki’));
nama_mah | nama_fak | alamat_mah
———-+———-+————
wana | SAINTEK | bojonegoro
beno | SAINTEK | jombang
adit | SAINTEK | surabaya
diko | SAINTEK | lombok
edi | SAINTEK | malang
(5 rows)
postgrest=# create index indeex on mahasiswa(alamat_mah);
CREATE INDEX
linda13650052=# create unique index iindex on fakultas(nama_fak);
CREATE INDEX
postgrest=# \d mahasiswa;
Table “public.mahasiswa”
Column | Type | Modifiers
————+——————-+———–
nim_mah | integer | not null
nama_mah | character varying |
alamat_mah | character varying |
id_fak | integer | not null
no_telp | integer |
gender | character varying |
Indexes:
“mahasiswa_pkey” PRIMARY KEY, btree (nim_mah)
“indeex” btree (alamat_mah)
Foreign-key constraints:
“mahasiswa_id_fak_fkey” FOREIGN KEY (id_fak) REFERENCES fakultas(id_fak)
postgrest=# \d fakultas;
Table “public.fakultas”
Column | Type | Modifiers
———-+——————-+———–
id_fak | integer | not null
nama_fak | character varying |
Indexes:
“fakultas_pkey” PRIMARY KEY, btree (id_fak)
“iindex” UNIQUE, btree (nama_fak)
Referenced by:
TABLE “mahasiswa” CONSTRAINT “mahasiswa_id_fak_fkey” FOREIGN KEY (id_fak) RE
FERENCES fakultas(id_fak)
postgrest=# select * from mahasiswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | gender
———+———-+————+——–+———–+——–
14 | luki | ponorogo | 55 | 82576568 | p
16 | wana | bojonegoro | 65 | 887625399 | p
17 | beno | jombang | 65 | 875983640 | l
18 | adit | surabaya | 65 | 823456490 | l
19 | atika | denpasar | 55 | 878561293 | p
20 | diko | lombok | 65 | 845623985 | l
13 | sinta | yogyakarta | 55 | 897652430 | p
12 | edi | malang | 65 | 893453245 | l
15 | erna | jombang | 55 | 893453245 | p
(9 rows)
postgrest=# insert into mahasiswa values(21, ‘andri’, ‘lombok’, 65, 09876364
73, ‘l’);
INSERT 0 1
postgrest=# select * from mahasiswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | gender
———+———-+————+——–+———–+——–
14 | luki | ponorogo | 55 | 82576568 | p
16 | wana | bojonegoro | 65 | 887625399 | p
17 | beno | jombang | 65 | 875983640 | l
18 | adit | surabaya | 65 | 823456490 | l
19 | atika | denpasar | 55 | 878561293 | p
20 | diko | lombok | 65 | 845623985 | l
13 | sinta | yogyakarta | 55 | 897652430 | p
12 | edi | malang | 65 | 893453245 | l
15 | erna | jombang | 55 | 893453245 | p
21 | andri | lombok | 65 | 987636473 | l
(10 rows)
postgrest=# insert into fakultas values(75, ‘SAINTEK’);
ERROR: duplicate key value violates unique constraint “iindex”
DETAIL: Key (nama_fak)=(SAINTEK) already exists.
postgrest=# ALTER TABLE mahasiswa add unique (nama_mah);
ALTER TABLE
postgrest=# \d mahasiswa;
Table “public.mahasiswa”
Column | Type | Modifiers
————+——————-+———–
nim_mah | integer | not null
nama_mah | character varying |
alamat_mah | character varying |
id_fak | integer | not null
no_telp | integer |
gender | character varying |
Indexes:
“mahasiswa_pkey” PRIMARY KEY, btree (nim_mah)
“mahasiswa_nama_mah_key” UNIQUE CONSTRAINT, btree (nama_mah)
“indeex” btree (alamat_mah)
Foreign-key constraints:
“mahasiswa_id_fak_fkey” FOREIGN KEY (id_fak) REFERENCES fakultas(id_fak)
postgrest=# insert into mahasiswa values(22, ‘sasa’, ‘medan’, 65, 0987636473
, ‘l’);
INSERT 0 1
postgrest=# insert into mahasiswa values(22, ‘sasa’, ‘medan’, 65, 0987636473
, ‘l’);
ERROR: duplicate key value violates unique constraint “mahasiswa_pkey”
DETAIL: Key (nim_mah)=(22) already exists.
postgrest=# select nim_mah, nama_mah, alamat_mah, nama_fak into tabel_identi
tas from mahasiswa m, fakultas f where m.id_fak=f.id_fak;
SELECT 11
postgrest=# select * from tabel_identitas;
nim_mah | nama_mah | alamat_mah | nama_fak
———+———-+————+———–
14 | luki | ponorogo | PSIKOLOGI
16 | wana | bojonegoro | SAINTEK
17 | beno | jombang | SAINTEK
18 | adit | surabaya | SAINTEK
19 | atika | denpasar | PSIKOLOGI
20 | diko | lombok | SAINTEK
13 | sinta | yogyakarta | PSIKOLOGI
12 | edi | malang | SAINTEK
15 | erna | jombang | PSIKOLOGI
21 | andri | lombok | SAINTEK
22 | sasa | medan | SAINTEK
(11 rows)
postgrest=# alter table mahasiswa add check (gender in(‘l’, ‘p’));
ALTER TABLE
postgrest=# insert into mahasiswa values(24, ‘isa’, ‘jogja’, 55, 0982736251,
‘s’);
ERROR: new row for relation “mahasiswa” violates check constraint “mahasiswa_ge
nder_check”
DETAIL: Failing row contains (24, isa, jogja, 55, 982736251, s).
postgrest=# insert into mahasiswa values(24, ‘isa’, ‘jogja’, 55, 0982736251,
‘p’);
INSERT 0 1
postgrest=# insert into mahasiswa values(25, ‘ andi++++++’, ‘jogja’, 55,
0982736251, ‘l’);
INSERT 0 1
postgrest=# select * from mahasiswa;
nim_mah | nama_mah | alamat_mah | id_fak | no_telp | gender
———+—————–+————+——–+———–+——–
14 | luki | ponorogo | 55 | 82576568 | p
16 | wana | bojonegoro | 65 | 887625399 | p
17 | beno | jombang | 65 | 875983640 | l
18 | adit | surabaya | 65 | 823456490 | l
19 | atika | denpasar | 55 | 878561293 | p
20 | diko | lombok | 65 | 845623985 | l
13 | sinta | yogyakarta | 55 | 897652430 | p
12 | edi | malang | 65 | 893453245 | l
15 | erna | jombang | 55 | 893453245 | p
21 | andri | lombok | 65 | 987636473 | l
22 | sasa | medan | 65 | 987636473 | l
24 | isa | jogja | 55 | 982736251 | p
25 | andi++++++ | jogja | 55 | 982736251 | l
(13 rows)
postgrest=# select ltrim(nama_mah) from mahasiswa;
ltrim
————
luki
wana
beno
adit
atika
diko
sinta
edi
erna
andri
sasa
isa
andi++++++
(13 rows)
postgrest=# select trim(leading ‘a’ from nama_mah), trim (trailing ‘+’ from
nama_mah) from mahasiswa;
ltrim | rtrim
—————–+———–
luki | luki
wana | wana
beno | beno
dit | adit
tika | atika
diko | diko
sinta | sinta
edi | edi
erna | erna
ndri | andri
sasa | sasa
isa | isa
andi++++++ | andi
(13 rows)
3. Perbandingan antara PostgreSQL dan MySQL
Pada praktikum kali ini, perbedaan antara PostgreSQL dengan MySQL dapat dilihat pada query dalam PostgreSQL dan MySQL diatas. Pada PostgreSQL, saat dilakukan check untuk pengisian kategori ‘gender’ yang tidak sesuai kriteria tidak dapat dilakukan. Sedangkan pada MySQL, meskipun sudah ditambahkan check, masih tetap bisa diisi dengan data pada kategori ‘gender’ yang tidak sesuai dengan keriteria. Perbedaan lain yaitu untuk query menghapus index, jika pada PostgreSQL menggunakan DROP NAMA_INDEX; sedangkan pada MySQL menggunakan ALTER TABLE NAMA_TABEL DROP NAMA_INDEX;. Perbedaan lain yaitu pada penyalinan data, jika di PostgreSQL hanya dengan select nim_mah, nama_mah, alamat_mah, nama_fak into tabel_identitas from mahasiswa m, fakultas f where m.id_fak=f.id_fak; sedangkan pada MySQL menggunakan create table tabel_identitas select nim_mah, nama_mah, alamat_mah, nama_fak from mahasiswa m, fakultas f where m.id_fak=f.id_fak;. Perbedaan juga terjadi pada trim, jika di PostgreSQL penggunaan spasi antara ‘trim’ dan ‘(‘ tidak berpengaruh, ternyata di MySQL karakter spasi antara ‘trim’ dan ‘(‘ sangat berpengaruh.
4. Kesimpulan
Sub Query adalah query nested atau sebuah query yang berada di dalam query. Sub query bisa digunakan untuk select, update, delete, trim, dsb. Index digunakan untuk mempercepat pengaksesan data, karena index akan mempermudah pencarian data saat query dijalankan.
Kritik dan Saran
Untuk soal no 8 kurang bisa dipahami, sehinggan menimbulkan berbagai perbedaan pendapat dan kebingungan untuk menyelesaikannya. Untuk selanjutnya tolong soalnya yang mudah dipahami. Hehe .
Manfaat
Semoga postingan ini bermanfaat bagi pembaca untuk mengetahui sub query dan index.
Daftar Pustaka

0 komentar: