Arsitektur Basis Data Oracle Oracle pertama kali dicetuskan oleh Larry Elisson beserta dua temannya pada tahun 1977. Nama ‘Oracle’ diambil dari proyek milik CIA di mana dia sebelumnya bekerja. (Wikipedia) Sebuah server Oracle merupakan sebuah DBMS yang menyediakan pendekatan terintegrasi dan komprehensif dalam mengatur informasi. Secara struktur, sebuah DBMS Oracle atas dua bagian besar, yakni: Oracle Instance dan Oracle Database.
SGA merupakan sebuah struktur memori di server yang berfungsi sebagai cache berbagai informasi seperti data-buffer, perintah SQL, dan informasi mengenai user. Sebagai tambahan, terdapat juga redo-log yang bersifat online yang berfungsi untuk menyimpan sejarah transaksi. Semua proses dapat juga menyimpan redo-log yang online ini menjadi archive-log yang bersifat offline.
1 Danny Kriestanto, S.Kom., M.Eng
Oracle menyimpan data secara logika dalam bentuk tablespace dan secara fisik dalam bentuk datafile.
Di dalam sebuah tablespace dapat banyak segment, misalnya index segment, data segment, dan lain-lain. Dan tiap-tiap segment tersebut terdiri dari berbagai extent. Extent terdiri dari kelompok blok-blok data yang berdekatan. Blok-blok data tersebut membentuk unit dasar penyimpanan data.
2 Danny Kriestanto, S.Kom., M.Eng
Perkenalan SQL Sebuah database adalah sekumpulan informasi yang disusun dengan baik. Untuk mengatur sebuah database, dibutuhkan sebuah Database Management System (DBMS). DBMS merupakan program untuk menyimpan, mengambil, dan memodifikasi data dalam database karena permintaan user. Ada lima macam tipe database yaitu hirarki, jaringan, relasional, objek, dan dimensional. Ada beberapa terminologi dalam database relasional (yang digunakan oleh Oracle), yaitu: 1. Row, atau baris, mempresentasikan semua data dari sebuah tabel. Sebuah seharusnya diidentifikasikan dengan sebuah kunci primer (primary key). 2. Kolom, atau atribut yang berisi salah satu jenis nilai dari row. 3. Primary key, atau kunci primer, yang HARUS terdiri atas satu nilai unik. 4. Foreign key, atau kunci tamu, merupakan kolom yang mendefinisikan bagaimana tabel dapat berhubungan satu dengan yang lain. 5. Field (pada Oracle) dapat ditemukan sebagai titik pertemuan antara baris dan kolom dan hanya terdapat satu nilai di dalamnya. Untuk mengakses data pada database diperlukan perintah khusus yang dikenal dengan naman SQL. Ada beberapa jenis perintah SQL pada Oracle, yakni: 1. Pengambilan data, yakni: SELECT. 2. Data Manipulation Language (DML), yakni: INSERT, UPDATE, DELETE, dan MERGE. 3. Data Definition Language (DDL), yakni: CREATE, ALTER, DROP, RENAME, dan TRUNCATE. 4. Kontrol transaksi, yakni: COMMIT dan ROLLBACK. 5. Data Control Language (DCL), yakni: GRANT dan REVOKE. Ada beberapa hal yang perlu diperhatikan dalam menulis perintah SQL: 1. Perintah SQL tidak case-sensitive. Artinya, huruf besar dan kecil tidak dibedakan. 3 Danny Kriestanto, S.Kom., M.Eng
2. Perintah SQL dapat lebih dari 1 baris. 3. Kata-kata kunci tidak boleh dipotong atau dipisahkan pada baris yang berbeda. 4. Klausa pada umumnya diletakkan pada baris yang berbeda. 5. Inden dapat digunakan untuk memudahkan dalam pembacaan. Perintah dasar SELECT SELECT * | {[DISTINCT] kolom | ekspresi [alias], … } FROM nama_tabel; Keterangan: Setelah perintah SELECT, gunakan tanda * untuk memilih semua kolom yang ada pada tabel. Perintah DISTINCT digunakan untuk menghilangkan duplikasi pada hasil SQL. Bagian “kolom” dipakai apabila perintah DISTINCT digunakan tapi dapat juga digunakan tanpa perintah DISTINCT. Contoh: 1. SELECT * FROM employees; 2. SELECT DISTINCT * FROM departments; 3. SELECT department_id, location_id FROM departments; Ekspresi Aritmetika SQL juga mengenal beberapa ekspresi aritmetika, yaitu: Operator Deskripsi + Penjumlahan Pengurangan * Perkalian / Pembagian Dari keempat operator tersebut, urutan prioritas pengerjaannya adalah: *, /, +, Dengan demikian, operasi dengan menggunakan “/” akan didahulukan apabila terdapat operator “+” dan/atau “-“ di dalam SQL, demikian halnya apabila terdapat operasi perkalian dan pembagian maka operator “*” akan didahulukan sebelum operasi “/”, dan seterusnya. Contoh:
4 Danny Kriestanto, S.Kom., M.Eng
1. SELECT last_name, salary, salary + 300 FROM employees; 2. SELECT last_name, salary, 12 * salary + 100 FROM employees; 3. SELECT last_name, salary, 12 * (salary + 100) FROM employees; Penggunaan Alias Selain itu, setiap kolom dapat dibuat aliasnya. Alias merupakan penamaan ulang dari sebuah kolom, dan sangat berguna untuk kolom yang melakukan perhitungan. Penulisan alias dilakukan setelah menyebutkan nama kolom dan dapat menggunakan kata kunci AS di antara nama kolom dan nama alias. Penulisan alias membutuhkan tanda petik ganda apabila dalam nama kolom yang baru terdapat spasi, karakter special, atau menggunakan huruf besar dan kecil. Contoh: 1. SELECT last_name AS nama, commission_pct komisi FROM employees; 2. SELECT last_name “Nama”, salary * 12 “Gaji Tahunan” FROM employees; Perintah Concate Dalam SQL dapat juga digunakan operator penggabungan (concatenate) untuk menggabungkan kolom atau kata dengan kolom lain. Operator ini direpresentasikan dengan dua garis tegak lurus ( || ). Untuk menggabungkan dengan kalimat, digunakan tanda petik tunggal. Contoh: 1. SELECT last_name || job_id AS “Pegawai” FROM employees; 2. SELECT last_name || ‘ memiliki ID pekerjaan: ‘ || job_id AS “Detil Pegawai” FROM employees; Struktur Tabel Untuk melihat struktur tabel, dapat digunakan perintah SQL berikut: DESC[RIBE] nama_tabel;
5 Danny Kriestanto, S.Kom., M.Eng
Contoh: DESCRIBE departments; Membatasi dan Mengurutkan Data Salah satu cara untuk membatasi penampilan data adalah dengan memberikan syarat/kondisi pada klausa WHERE. Perintah dasar SQL-nya adalah sebagai berikut; SELECT * | {[DISTINCT] kolom/ekspresi [alias], …} FROM nama_tabel WHERE kondisi; Pada kolom dengan nilai berupa string, pada bagian kondisi menggunakan tanda petik tunggal. Contoh: 1. SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90; 2. SELECT last_name, job_id, department_id FROM employees WHERE last_name = ‘Whalen’; Pada bagian kondisi terdapat beberapa operator perbandingan yang dapat digunakan, seperti yang terdapat pada tabel berikut. Operator = > >= < <= <> != ^=
Arti Sama dengan Lebih besar dari Lebih besar atau sama dengan Kurang dari Kurang dari atau sama dengan Tidak sama dengan Tidak sama dengan Tidak sama dengan 6
Danny Kriestanto, S.Kom., M.Eng
BETWEEN Berada di antara 2 value … AND … IN(set) Yang cocok dengan salah satu yang terdapat dalam set LIKE Yang cocok dengan pola karakter tertentu IS NULL Jika value-nya merupakan merupakan nilai null Contoh: 1. SELECT last_name, job_id, department_id, hire_date FROM employees WHERE hire_date = ’01-JAN-95’; 2. SELECT last_name, job_id, department_id, salary FROM employees WHERE salary >= 6000; 3. SELECT last_name, salary FROM employees WHERE salary <= 3000; 4. SELECT last_name, salary FROM employees WHERE salary BETWEEN 2500 AND 3500; 5. SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201); 6. SELECT first_name FROM employees WHERE first_name LIKE ‘S%’; 7. SELECT first_name FROM employees WHERE first_name LIKE ‘_o%’; 8. SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; Logika Kondisi Logika kondisi menggabungkan hasil dari dua komponen kondisi sehingga menghasilkan satu kondisi. Operatornya seperti pada tabel berikut. Operator AND
Arti Menghasilkan TRUE apabila kedua komponen benar 7
Danny Kriestanto, S.Kom., M.Eng
OR
NOT
Menghasilkan TRUE apabila salah satu komponen benar Menghasilkan TRUE apabila kondisinya false
Contoh: 1. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 AND job_id LIKE ‘%MAN%’; 2. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE ‘%MAN%’; 3. SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201); 4. SELECT last_name, job_id FROM employees WHERE job_id NOT IN (‘IT_PROG’, ‘ST_CLERK’, ‘SA_REP’); Tata Urutan Hak Pada Operator Semua operator yang telah dijelaskan di atas memiliki urutan tertentu dalam pengerjaannya, yang ditunjukkan pada tabel di bawah ini. Urutan ini dapat dilanggar dengan menggunakan tanda kurung pada bagian perintah yang akan dikerjakan terlebih dahulu. Urutan Pengerjaan 1 2 3 4 5 6 7 8
Operator Operator aritmetika Operator penggabungan Operator perbandingan IS [NOT] NULL, LIKE, [NOT] IN [NOT] BETWEEN Kondisi logika NOT Kondisi logika AND Kondisi logika OR 8
Danny Kriestanto, S.Kom., M.Eng
Contoh: 1. SELECT last_name, job_id, salary FROM employees WHERE job_id = ‘SA_REP’ OR job_id = ‘AD_PRES’ AND salary > 15000; 2. SELECT last_name, job_id, salary FROM employees WHERE (job_id = ‘SA_REP’ OR job_id = ‘AD_PRES’) AND salary > 15000;
Klausa ORDER BY Digunakan untuk mengurutkan data hasil SQL. Terdapat dua macam pengurutan yakni:
ASC: urut naik, secara default digunakan
DESC: urut turun
Perintah ORDER BY dituliskan pada bagian akhir dari pernyataan SELECT. Sintaksnya sebagai berikut. SELECT * | {[DISTINCT] kolom/ekspresi [alias], …} FROM nama_tabel [WHERE kondisi] [ORDER BY {kolom, ekspresi} [ASC|DESC]]; Perintah ini juga dapat digunakan untuk mengurutkan kolom berdasarkan alias kolom maupun untuk mengurutkan lebih dari satu kolom. Contoh: 1. SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date; 2. SELECT last_name, job_id, department_id, hire_date FROM employees 9 Danny Kriestanto, S.Kom., M.Eng
ORDER BY hire_date DESC; 3. SELECT employee_id, last_name, salary * 12 gajitahunan FROM employees ORDER BY gajitahunan; 4. SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;
10 Danny Kriestanto, S.Kom., M.Eng
Query Banyak Tabel Ada kalanya untuk mendapatkan data tertentu dibutuhkan query yang mengakses lebih dari satu tabel. Ketikkan kedua perintah berikut pada SQL Editor atau pada prompt SQL> DESC employees; DESC departments; Seperti yang telah dijelaskan pada pembahasan sebelumnya, kedua perintah tersebut menunjukkan struktur tabel employees dan departments. Perhatikan struktur kedua tabel tersebut. Kolom employee_id dan department_id terdapat pada tabel employees, dan ternyata kolom department_id juga terdapat pada tabel departments. Agar supaya kedua tabel tersebut dapat menampilkan data dalam satu query, kedua tabel tersebut harus dihubungkan. Cartesian Product Sebuah Cartesian product tercipta ketika kondisi join tidak disebutkan atau invalid. Untuk menghindari terjadinya Cartesian product, selalu masukkan kondisi join yang valid di klausa WHERE. Untuk lebih jelas mengenai Cartesian product, kerjakan praktik nomor 1. Contoh:
SELECT last_name, department_name namadep FROM employees, departments;
Untuk menggabungkan dua tabel pada Oracle digunakan perintah sebagai berikut. SELECT tabel1.kolom, tabel2.kolom FROM tabel1, tabel2 WHERE tabel1.kolom1 = tabel2.kolom2; Sintaks di atas disebut juga dengan nama equijoin. Kerjakan dan perhatikan contoh berikut.
11 Danny Kriestanto, S.Kom., M.Eng
Contoh:
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id;
SELECT last_name, employees.department_id, department_name FROM employees, departments WHERE employees.department_id = departments.department_id AND last_name=’Matos’;
Penyebutan nama tabel dapat dijadikan alias untuk mempermudah pengetikan query. Kerjakan dan perhatikan contoh berikut. Contoh:
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e, departments d WHERE e.department_id = d.department_id;
Untuk menggabungkan lebih dari dua tabel dibutuhkan kondisi sebanyak (n-1) dimana n adalah banyaknya tabel yang akan dihubungkan. Jadi, untuk menghubungkan 3 buah tabel dibutuhkan 2 kondisi join, untuk menggabungkan 4 tabel dibutuhkan 3 kondisi join, dst. Contoh:
SELECT e.last_name, d.department_name, L.city FROM employees e, departments d, location L WHERE e.department_id = d.department_id AND d.location_id = L.location_id;
Selain equijoin, Oracle juga memiliki non-equijoin. Kondisi non-equijoin mengandung sesuatu selain operator sama dengan (=) seperti operator <, >, atau juga BETWEEN. Contoh:
SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.employee_id = d.department_id; 12
Danny Kriestanto, S.Kom., M.Eng
Bentuk join yang lain adalah Outer Join. Outer join pada umumnya digunakan untuk menampilkan yang tidak memiliki hubungan induk-anak pada tabel-tabel yang berhubungan. Sintaksnya sebagai berikut. SELECT tabel1.kolom, tabel2.kolom FROM tabel1, tabel2 WHERE tabel1.kolom(+) = tabel2.kolom; SELECT tabel1.kolom, tabel2.kolom FROM tabel1, tabel2 WHERE tabel1.kolom = tabel2.kolom(+); Sintak tabel1.kolom=tabel2.kolom(+) merupakan sintak outer join yang ditempatkan di salah satu sisi (bukan keduanya) pada klausa WHERE. Tanda (+) diletakkan pada sisi yang tidak sempurna (misalnya, terdapat nilai null di dalamnya). Selain itu, outer join tidak boleh menggunakan operator IN dan OR. Contoh:
SELECT e.last_name, d.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id;
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id);
Sedikit tambahan tentang outerjoin, selain dua macam sintaks tersebut, terdapat tiga macam outer join yaitu: LEFT OUTER JOIN, RIGHT OUTER JOIN, dan FULL OUTER JOIN. FULL OUTER JOIN tidak akan dibahas disini. Contoh:
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);
SELECT e.last_name, e.department_id, d.department_name 13
Danny Kriestanto, S.Kom., M.Eng
FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); Join juga dapat dilakukan pada satu tabel yang sama. Contoh:
SELECT pekerja.last_name || ‘ bekerja pada ‘ || manager.last_name FROM employees pekerja, employees manager WHERE pekerja.manager_id = manager.employee_id;
Untuk mempermudah penulisan pada equijoin, dapat digunakan klausa USING. Klausa USING digunakan untuk mencocokkan satu kolom ketika terdapat lebih dari satu kolom yang sama. Contoh:
SELECT employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id);
SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400;
SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400;
14 Danny Kriestanto, S.Kom., M.Eng