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 empat macam tipe database yaitu hirarki, jaringan, relasional, dan objek. 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. 1
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. Untuk praktikum ini, mahasiswa dapat menggunakan iSQL*Plus maupun SQL*Plus. iSQL*Plus adalah aplikasi berbasis HTML yang digunakan untuk mengetikkan perintah SQL. Tampilannya sebagai berikut:
Fungsi tombol-tombol yang terdapat pada iSQL*Plus adalah: Tombol Execute digunakan untuk menjalankan perintah SQL Tombol Load Script digunakan untuk membuka file berekstensi .sql ke workspace Tombol Save Script digunakan untuk menyimpan perintah SQL yang tertulis di workspace menjadi file berekstensi .sql Tombol Clear untuk membersihkan workspace 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
Danny Kriestanto, S.Kom., M.Eng
2
SQL. Bagian “kolom” dipakai apabila perintah DISTINCT digunakan tapi dapat juga digunakan tanpa perintah DISTINCT (contoh pada praktik nomor 12). 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. Untuk lebih jelas, kerjakan praktik nomor 3 sampai 7. 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. Untuk lebih jelas, kerjakan praktik nomor 8 dan 9. 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. Untuk lebih jelasnya, kerjakan praktik nomor 10 dan 11.
Danny Kriestanto, S.Kom., M.Eng
3
Struktur Tabel Untuk melihat struktur tabel, dapat digunakan perintah SQL berikut: DESC[RIBE] nama_tabel; 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. Untuk lebih jelasnya, kerjakan praktik nomor 14 dan 15. Pada bagian kondisi terdapat beberapa operator perbandingan yang dapat digunakan, seperti yang terdapat pada tabel berikut. Operator = > >= < <= <> != ^= BETWEEN … AND … IN(set)
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 Berada di antara 2 value
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 Agar lebih jelas, kerjakan praktik nomor 16 hingga 23.
Danny Kriestanto, S.Kom., M.Eng
4
Logika Kondisi Logika kondisi menggabungkan hasil dari dua komponen kondisi sehingga menghasilkan satu kondisi. Operatornya seperti pada tabel berikut. Operator AND
OR
NOT
Arti Menghasilkan TRUE apabila kedua komponen benar Menghasilkan TRUE apabila salah satu komponen benar Menghasilkan TRUE apabila kondisinya false
Kerjakan praktik nomor 24 hingga 26. 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 Kerjakan praktik nomor 27 dan 28.
Operator Operator aritmetika Operator penggabungan Operator perbandingan IS [NOT] NULL, LIKE, [NOT] IN [NOT] BETWEEN Kondisi logika NOT Kondisi logika AND Kondisi logika OR
Klausa ORDER BY Digunakan untuk mengurutkan data hasil SQL. Terdapat dua macam pengurutan yakni:
Danny Kriestanto, S.Kom., M.Eng
5
-
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. Agar lebih jelas, kerjakan praktik nomor 29 hingga 32. PRAKTEK Kerjakan, amati hasilnya, dan analisa apa yang dikerjakan perintah berikut ini: 1. SELECT * FROM departments; 2. SELECT department_id, location_id FROM departments; 3. SELECT last_name, salary, salary + 300 FROM employees; 4. SELECT last_name, salary, 12 * salary + 100 FROM employees; 5. SELECT last_name, salary, 12 * (salary + 100) FROM employees; 6. SELECT last_name, job_id, salary, commission_pct FROM employees; 7. SELECT last_name, 12 * salary * commission_pct FROM employees; 8. SELECT last_name AS nama, commission_pct komisi FROM employees; 9. SELECT last_name “Nama”, salary * 12 “Gaji Tahunan” FROM employees; 10. SELECT last_name || job_id AS “Pegawai” FROM employees; 11. SELECT last_name || ‘ memiliki ID pekerjaan: ‘ || job_id AS “Detil Pegawai” FROM employees; 12. SELECT DISTINCT department_id FROM employees; 13. DESCRIBE employees; 14. SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90;
Danny Kriestanto, S.Kom., M.Eng
6
15. SELECT last_name, job_id, department_id FROM employees WHERE last_name = ‘Whalen’; 16. SELECT last_name, job_id, department_id, hire_date FROM employees WHERE hire_date = ’01-JAN-95’; 17. SELECT last_name, job_id, department_id, salary FROM employees WHERE salary >= 6000; 18. SELECT last_name, salary FROM employees WHERE salary <= 3000; 19. SELECT last_name, salary FROM employees WHERE salary BETWEEN 2500 AND 3500; 20. SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201); 21. SELECT first_name FROM employees WHERE first_name LIKE ‘S%’; 22. SELECT first_name FROM employees WHERE first_name LIKE ‘_o%’; 23. SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL; 24. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 AND job_id LIKE ‘%MAN%’; 25. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE ‘%MAN%’; 26. SELECT last_name, job_id FROM employees WHERE job_id NOT IN (‘IT_PROG’, ‘ST_CLERK’, ‘SA_REP’); 27. SELECT last_name, job_id, salary FROM employees WHERE job_id = ‘SA_REP’ OR job_id = ‘AD_PRES’ AND salary > 15000;
Danny Kriestanto, S.Kom., M.Eng
7
28. SELECT last_name, job_id, salary FROM employees WHERE (job_id = ‘SA_REP’ OR job_id = ‘AD_PRES’) AND salary > 15000; 29. SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date; 30. SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date DESC; 31. SELECT employee_id, last_name, salary * 12 gajitahunan FROM employees ORDER BY gajitahunan; 32. SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;
Danny Kriestanto, S.Kom., M.Eng
8
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. 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. Untuk lebih jelas, kerjakan praktik nomor 2 dan 3. Penyebutan nama tabel dapat dijadikan alias untuk mempermudah pengetikan query. Kerjakan dan perhatikan praktik nomor 4.
Danny Kriestanto, S.Kom., M.Eng
9
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. Kerjakan dan perhatikan praktik nomor 5. Selain equijoin, Oracle juga memiliki non-equijoin. Kondisi non-equijoin mengandung sesuatu selain operator sama dengan (=) seperti operator <, >, atau juga BETWEEN. Perhatikan praktik nomor 6. 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. Untuk lebih jelasnya, kerjakan dan perhatikan praktik nomor 7 dan 8. 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. Kerjakan dan amati praktik nomor 9 hingga 11 untuk dapat lebih memahaminya. Join juga dapat dilakukan pada satu tabel yang sama. Perhatikan praktik nomor 12.
Danny Kriestanto, S.Kom., M.Eng
10
Untuk mempermudah penulisan pada equijoin, dapat digunakan klausa USING. Klausa USING digunakan untuk mencocokkan satu kolom ketika terdapat lebih dari satu kolom yang sama. Kerjakan praktik nomor 13, kerjakan juga nomor 14 dan 15 dan perhatikan perbedaannya.
PRAKTIK Kerjakan, amati hasilnya, dan analisa apa yang dikerjakan perintah berikut ini: 1. SELECT last_name, department_name namadep FROM employees, departments; 2. 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; 3. SELECT last_name, employees.department_id, department_name FROM employees, departments WHERE employees.department_id = departments.department_id AND last_name=’Matos’; 4. 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; 5. 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; 6. SELECT e.last_name, e.salary, j.grade_level FROM employees e, job_grades j WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal; 7. SELECT e.last_name, e.department_id, d.department_name FROM employees e, departments d WHERE e.employee_id = d.department_id; 8. SELECT e.last_name, d.department_id, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id; 9. SELECT e.last_name, e.department_id, d.department_name
Danny Kriestanto, S.Kom., M.Eng
11
FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); 10. 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); 11. SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); 12. SELECT pekerja.last_name || ‘ bekerja pada ‘ || manager.last_name FROM employees pekerja, employees manager WHERE pekerja.manager_id = manager.employee_id; 13. SELECT employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id); 14. SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400; 15. SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400;
Danny Kriestanto, S.Kom., M.Eng
12