SQL Server :: Transact– SQL #1 Laboratorium Perancangan/Pemrograman Basis Data Komposisi oleh Budi Prayitno Februari 2012 Batam
Daftar SQL Statement SELECT Data Manipulation Language [DML] INSERT UPDATE DELETE CREATE Data Definition Language [DDL] ALTER DROP TRUNCATE GRANT Data Control Language [DCL] REVOKE COMMIT Transaction Control ROLLBACK BEGIN TRANSACTION END TRANSACTION
SELECT Statement Dasar SELECT * | {[DISTINCT] column | expression [alias],...} FROM table; SELECT berisi column yang ditampilkan FROM berisi table dari mana column terkait dipilih
Memilih Semua Column SELECT * FROM departments; DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_IDLOCATION_ID 10Administration Marketing Purchasing Human Resources Shipping IT
Memilih Column Tertentu SELECT department_id, location_id FROM departments; DEPARTMENT_IDLOCATION_ID
Kaidah Penulisan SQL Tidak case–sensitive kecuali diapit tanda petik tunggal “’”atau petik ganda “”” Dapat dituliskan dalam satu atau lebih baris Kata kunci tidak dapat disingkat atau dipisah Clause biasanya ditulis dalam baris terpisah Indentasi digunakan untuk mempermudah pembacaan SQL statement dapat diakhiri dengan “;”
Ekspresi Aritmatika +Penambahan –Pengurangan *Perkalian /Pembagian Presedensi: [* /] [+ –]
Penggunaan Operator Aritmatika SELECT first_name, last_name, salary, salary FROM employees; FIRST_NAMELAST_NAMESALARYSALARY+300 DonaldOConnell DouglasGrant JenniferWhalen MichaelHartstein PatFay SusanMavris
Pendefinisian Column Alias Mengubah tampilan header Dapat digunakan terhadap ekspresi/kalkulasi Digunakan menggunakan kata kunci “AS” atau langsung mengikuti nama column Memerlukan tanda petik ganda “”” jika alias mengandung spasi, karakter khusus atau ketika dimaksudkan sebagai case– sensitive
Penggunaan Column Alias SELECT first_name nama, comission_pct AS komisi FROM employees; SELECT first_name AS “Nama”, salary * 12 “Gaji Tahunan” FROM employees;
Operator Konkatenasi Menghubungkan column atau string dengan column atau string lain Direpresentasikan dengan “+” Menghasilkan string SELECT first_name + ‘adalah seorang’ + job_id FROM employees;
Duplikasi Row SELECT department_id FROM employees; SELECT DISTINCT department_id FROM employees; DEPARTMENT_ID DEPARTMENT_ID
WHERE Clause Membatasi pemilihan row pada SELECT menggunakan WHERE clause SELECT * | {[DISTINCT]} column | expression [alias],...} FROM table [WHERE condition(s)]; WHERE clause diposisikan tepat setelah FROM clause
Penggunaan WHERE SELECT employee_id, first_name, job_id, department_id FROM employees WHERE department_id = 90;
Operator Perbandingan =Sama dengan >Lebih besar >=Lebih besar atau sama dengan !>Tidak lebih besar <Lebih kecil <=Lebih kecil atau sama dengan !<Tidak lebih kecil !=<>Tidak sama dengan BETWEEN … AND …Berada di antara dua nilai INSama dengan nilai dalam daftar LIKECocok dengan pola tertentu IS NULLMerupakan nilai NULL
Penggunaan Operator Perbandingan SELECT first_name, salary FROM empoyees WHERE salary = 2500; memberikan hasil yang sama dengan: SELECT first_name, salary FROM empoyees WHERE salary BETWEEN 2500 AND 3500;
Operator IN SELECT employee_id, first_name || last_name emp_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201);
Operator LIKE SELECT first_name, last_name FROM employees WHERE first_name LIKE ‘S%’ AND last_name NOT LIKE ‘_a%’;
Operator IS NULL SELECT employee_id, manager_id FROM employees WHERE manager_id IS NULL;
Operator Logika ANDMengembalikan TRUE jika kedua operand bernilai TRUE ORMengembalikan TRUE jika salah satu atau kedua operand bernilai TRUE NOTNegasi, mengembalikan TRUE jika operand bernilai FALSE, dan sebaliknya Digunakan bersama operator lain tidak berdiri sendiri
Penggunaan Operator Logika SELECT employee_id, FROM employees WHERE salary >= AND (job_id LIKE ‘%MGR%’ OR job_id LIKE ‘%MAN%’) AND departement_id NOT IN (50, 80);
ORDER BY Clause Berguna untuk mengurutkan row yang dipilih berdasarkan column yang ditentukan pada ORDER BY clause ASC: membesar, merupakan nilai default DESC: mengecil Diposisikan paling akhir pada SELECT statement
ORDER BY Clause SELECT * | {[DISTINCT] column | expression [alias],...} FROM table; [WHERE condition(s)] [ORDER BY {column, expression, alias} [ASC | DESC]];
Penggunaan ORDER BY Clause SELECT first_name, job_id, department_id, hire_date, salary * 12 annual_salary FROM employees WHERE 1 = 1 ORDER BY hire_date DESC, annual_salary;
Character Function LOWER Case–Manipulation Function UPPER SUBSTRING Character–Manipulation Function LEN PATINDEX LTRIM | RTRIM STUFF
Character Function LOWER (‘SQL Query’)sql query UPPER (‘SQL Query’)SQL QUERY SUBSTRING (‘HelloWorld’, 1, 5)Hello LEN (‘HelloWorld’)10 PATINDEX (‘%loWo%’, ‘HelloWorld’)4 STUFF (‘abcdef’, 2, 3, ‘ijklm’)aijklmnef LTRIM ( ‘ HelloWorld’)HelloWorld
Penggunaan Character Function SELECT employee_id, first_name + last_name AS name, job_id, LEN (last_name), PATINDEX (‘%a%’, last_name) FROM employees WHERE SUBSTRING (job_id, 4, 3) = ‘REP’;
Number Function ROUND ( , 2)123.45
Date Function DATEDIFFSelisih di antara 2 tanggal DATEADDMenambahkan hari kalender ke tanggal CONVERTFormat tanggal
Nested Function Fungsi dapat bersarang hingga kedalaman tidak terhingga Fungsi bersarang dievaluasi mulai hingga yang terdalam hingga terluar F3 ({F2 ({F1 ({arg1,...}),...}),...}) LOWER (CONCAT (SUBSTR (first_name, 1, 1), last_name))
Group Function AVG COUNT MAX MIN STDEV SUM VAR
Group Function EMPLOYEE_IDSALARY MAX (SALARY) 24000
Penggunaan Group Function SELECT AVG (salary), MAX (salary), MIN (salary), SUM (salary) FROM employees WHERE job_id LIKE ‘%REP%’ MIN dan MAX dapat digunakan untuk tipe data numeric, string dan date
COUNT Function SELECT COUNT (*) FROM employees WHERE department_id = 50; SELECT COUNT (comission_pct) FROM employees WHERE department_id = 80; SELECT COUNT (DISTINCT department_id) FROM employees;
NULL pada Group Function Group function mengabaikan nilai NULL pada column SELECT AVG (comission_pct) FROM employees; Untuk menyertakan column bernilai NULL, gunakan NVL SELECT AVG (NVL (comission_pct, 0)) FROM employees;
GROUP BY Clause Mengakomodasi keberadaan group function, namun tidak mandatory SELECT [column,] group_function (column),... FROM table [WHERE condition] [GROUP BY column] [ORDER BY column];
Penggunaan GROUP BY Clause SELECT department_id, AVG (salary)... column pada GROUP BY clause tidak mandatory pada SELECT clause SELECT AVG (salary) FROM employees GROUP BY department_id ORDER BY department_id;
Penggunaan GROUP BY Clause Menggunakan lebih dari satu column pada GROUP BY clause: SELECT department_id dept_id, job_id, SUM (salary) FROM employees GROUP BY department_id, job_id;
Penggunaan GROUP BY Clause Column yang bukan group function pada SELECT clause mandatory didefinisikan pada GROUP BY clause: SELECT department_id, COUNT (employee_id) FROM employees; ERROR at line 1: ORA-00937: not a single–group group function
Penggunaan GROUP BY Clause Group function tidak dapat digunakan pada WHERE clause: SELECT department_id, AVG (salary) FROM employees WHERE AVG (salary) > 8000 GROUP BY department_id; ERROR at line 3: ORA-00934: group function is not allowed here
HAVING Clause SELECT [column,] group_function (column),... FROM table [WHERE condition] [GROUP BY column] [HAVING group_condition] [ORDER BY column];
HAVING Clause SELECT department_id, MAX (salary) FROM employees GROUP BY department_id HAVING MAX (salary) > 10000; SELECT job_id, SUM (salary) payroll FROM employees WHERE job_id NOT LIKE ‘%REP%’ GROUP BY job_id HAVING SUM (salary) > ORDER BY job_id;
Nested Group Function SELECT MAX (AVG (salary)) FROM employees GROUP BY department_id;
Pengambilan Data dari Beberapa Table EMPLOYEE_IDFIRST_NAMEDEPARTMENT_ID 198Donald50 199Douglas Michael20 202Pat20 203Susan40 DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_ID 10Administration200 20Marketing Human Resources203 50Shipping121 60IT103 EMPLOYEE_IDFIRST_NAMEDEPARTMENT_IDDEPARTMENT_NAME 198Donald50Shipping 199Douglas50Shipping Michael20Marketing 202Pat20Marketing 203Susan40Human Resources
Jenis JOIN INNER JOIN sama dengan JOIN LEFT OUTER JOIN sama dengan LEFT JOIN RIGHT OUTER JOIN sama dengan RIGHT JOIN FULL OUTER JOIN sama dengan FULL JOIN CROSS JOIN
JOIN Clause SELECT table1.column, table2.column FROM table1 [JOIN table2 USING (column_name)] | [JOIN table2 ON (table1.column_name = table2.column_name)] | [LEFT | RIGHT | FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)] | [CROSS JOIN table2];
NATURAL JOIN Didasarkan pada semua column pada kedua table yang memiliki nama yang sama Menampilkan row dari kedua table yang memiliki nilai yang sama pada column yang didefinisikan Jika terdapat column dengan nama yang sama namun tipe data yang berbeda, maka terjadi error
NATURAL JOIN SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations;
USING Clause Digunakan untuk memodifikasi NATURAL JOIN untuk mendefinisikan column yang digunakan untuk equijoin seandainya terdapat column dengan nama yang sama namun tidak digunakan
USING dan ON Clause SELECT d.department_id, d.department_name, d.location_id, l.city FROM departments d JOIN locations l USING (location_id); memberikan hasil yang sama dengan: ON (d.location_id = l.location_id);
JOIN Lebih Lanjut SELECT e.first_name + e.last_name, d.department_name FROM employees e JOIN departments d ON (e.department_id = d.department_id)... JOIN locations l ON (d.location_id = l.location_id)... AND e.manager_id = 149;
Non-Equijoin SELECT e.first_name + e.last_name AS name, e.salary, j.grade_level FROM employees e JOIN job_grades g ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;
OUTER JOIN JOIN yang mengembalikan tidak hanya baris yang memenuhi, namun juga yang tidak memenuhi, persyaratan JOIN Diterapkan pada sisi kiri [LEFT], sisi kanan [RIGHT] atau kedua sisi [FULL] persyaratan JOIN
Penggunaan OUTER JOIN SELECT e.first_name, d.department_name FROM employees e LEFT OUTER JOIN departments d... RIGHT OUTER JOIN departments d... FULL OUTER JOIN departments d ON e.department_id = d.department_id;
LEFT OUTER JOIN EMPLOYEE_IDFIRST_NAMEDEPARTMENT_ID 198Donald50 199Douglas50 200Andreas70 201Michael20 202Pat20 203Susan40 DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_ID 10Administration200 20Marketing201 30Finance202 40Human Resources203 50Shipping121 60IT103 EMPLOYEE_IDFIRST_NAMEDEPARTMENT_IDDEPARTMENT_NAME 198Donald50Shipping 199Douglas50Shipping 200Andreas70 201Michael20Marketing 202Pat20Marketing 203Susan40Human Resources
EMPLOYEE_IDFIRST_NAMEDEPARTMENT_IDDEPARTMENT_NAME 10Administration 198Donald50Shipping 199Douglas50Shipping 201Michael20Marketing 202Pat20Marketing 30Finance 203Susan40Human Resources 60IT RIGHT OUTER JOIN EMPLOYEE_IDFIRST_NAMEDEPARTMENT_ID 198Donald50 199Douglas50 200Andreas70 201Michael20 202Pat20 203Susan40 DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_ID 10Administration200 20Marketing201 30Finance202 40Human Resources203 50Shipping121 60IT103
FULL OUTER JOIN EMPLOYEE_IDFIRST_NAMEDEPARTMENT_ID 198Donald50 199Douglas50 200Andreas70 201Michael20 202Pat20 203Susan40 DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_ID 10Administration200 20Marketing201 30Finance202 40Human Resources203 50Shipping121 60IT103 EMPLOYEE_IDFIRST_NAMEDEPARTMENT_IDDEPARTMENT_NAME 10Administration 198Donald50Shipping 199Douglas50Shipping 200Andreas 201Michael20Marketing 202Pat20Marketing 30Finance 203Susan40Human Resources 60IT
CROSS JOIN SELECT e.first_name, d.department_name FROM employees e CROSS JOIN departments d memberikan hasil yang sama dengan: SELECT e.first_name, d.department_name FROM employees e, departments d * perhatikan statement kedua tanpa WHERE clause
CROSS JOIN EMPLOYEE_IDFIRST_NAMEDEPARTMENT_ID 198Donald50 199Douglas50 200Andreas70 DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_ID 10Administration200 20Marketing201 30Finance202 EMPLOYEE_IDFIRST_NAMEDEPARTMENT_IDDEPARTMENT_NAME 198Donald10Administration 198Donald20Marketing 198Donald30Finance 199Douglas10Administration 199Douglas20Marketing 199Douglas30Finance … 200Andreas30Finance
INSERT Statement Dasar INSERT INTO table (column1, column2,..., columnN) VALUES (value1, value2, …, valuesN); Jika column tidak disebutkan, maka semua column diisi terurut dari pertama hingga terakhir VALUES berisi nilai yang dimasukkan ke column
INSERT … SELECT … INSERT INTO tableX (column1, column2,..., columnN) SELECT columnA, columnB, …, columnM FROM tableY WHERE condition(s); Table sumber tableY dapat berbeda dari table tujuan tableX Faktor penentu keberhasilan eksekusi hanya kesamaan tipe data dan ukuran data
Penggunaan INSERT INSERT INTO employees (employee_id, last_name, salary) VALUES (999, Duke, 15000); INSERT INTO employees (employee_id, last_name, salary) SELECT 999, Duke, salary FROM employees WHERE employee_id = 198;
UPDATE Statement Dasar UPDATE table SET column1 = value1[, …, columnN = valueM] WHERE condition(s); Jika WHERE clause tidak dispesifikasikan, maka column yang disebutkan pada semua row dalam table akan diubah nilainya SET clause dapat mengubah satu atau lebih column dalam satu UPDATE statement Satu UPDATE statement dapat mengubah hanya satu row data
Penggunaan UPDATE UPDATE employees SET first_name = ‘Duke’, last_name = ‘Hazard’, = WHERE employee_id = 198;
DELETE Statement Dasar DELETE table WHERE condition(s); Jika WHERE clause tidak dispesifikasikan, maka semua row dalam table akan dihapus DELETE statement digunakan untuk menghapus satu atau lebih row dalam satu table saja
Penggunaan DELETE DELETE employees WHERE employee_id = 198;