Fatih Sultan Mehmet Vakıf Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü Veritabanı Yönetim Sistemleri Dersi 2015-2016 Bahar Yarıyılı Laboratuvar SQL çalışmaları Yrd. Doç. Dr. Ali NİZAM --Tüm personel kayıtlarını seçiniz. SELECT* ; --Özel kolonların seçimi, birleştirme ve artimetik işlemler --Personelin adı ve soyadını isim kolonunda gösteriniz. --Toplam maaşını bularak gösteriniz. SELECT first_name ' ' last_name isim, salary, commission_pct, salary+commıssıon_pct "Toplam Maaş" ; --Tarih aritmetiği (gün üzerinedir.) SELECT TRUNC(sysdate-hire_date), hire_date+10, sysdate, TRUNC(sysdate-TO_DATE('01/01/1980')), TO_CHAR(sysdate,'Month') ; --Mükerrer kayıtları eleme --Count kullanımı select distinct first_name,last_name ;
--Personel adetlerini bulunuz. --Count kullanımı SELECT COUNT( *) ; --Toplam tekil değer sayısının count ile bulunması SELECT COUNT(DISTINCT first_name last_name) ; --Özel bir kolon ve geri kalan kolonların tümüyle seçimi. select salary,employees.* ; --Kısıtlama yapmak --İsmi 'Ahmet' olan kişileri bulunuz. where first_name = 'Ahmet'; --Bölümü 100, (manager_id=100 veya emloyee_id 100'de büyük kişileri bulunuz.) where department_id=100 AND (manager_id=100 OR employee_id>100); --İsmi ahmet olmayanları bulunuz where first_name <> 'Ahmet'; --İsmi ahmet olmayanları bulma ikinci yöntem where first_name!= 'Ahmet'; --Desen arama LIKE --İsmi 'A' harfi ile başlayan personelleri bulunuz. where first_name like 'A%', --Desen arama escape karakter kullanımı where first_name like '%, \' escape '\';
--Tırnak kullanımı select '''Ahmet''in''', '''' from dual; --between operatörü --Son 10 yılda işe girmiş olanlar. WHERE hire_date BETWEEN sysdate-3650 AND sysdate; --NULL Aritmetiği --manager_id boş olmayanları bulunuz. WHERE manager_id IS NOT NULL; --Bir önceki örneğin alternatif çözümü (NVL fonksyonu) WHERE NOT NVL(manager_id,0) =0; --in operatörü --90,100,60 birimlerinde çalışan personellerin bulunması select department_id,e.* e where department_id IN (90,100,60,NULL); --NOT in sorun oluşturabilecek kullanım örneği select department_id,e.* e where department_id NOT IN (90,100,60,NULL); --Unvanı SA_MAN veya SA_REP olan kişileri bulunuz (OR ve IN kullanarak)
select * where job_id IN ('SA_MAN','SA_REP'); select * where job_id = 'SA_MAN' OR job_id='sa_rep'; --Maaşı 5000 den büyük ve commisyon alamamış kişileri bulunuz. select * where salary>5000 and commission_pct IS NULL; --Maaşı 3000 ve 5000 aralığında olan ve 2006 yılında işe girmiş kişileri bulunuz. select * where salary between 3000 AND 5000 and TO_CHAR(hire_date,'YYYY')='2006'; --Geçmiş tarihlerde mart ayında işe giren kişileri bulunuz. select * where TO_CHAR(hire_date,'MM')='03'; -- Toplam maaşı 10000 i geçmeyen kişileri bulunuz. (Toplam Maaş = Maaş + Comm * maaş ) select * where (salary+(commission_pct*salary))<10000; --3. harfi n ve 4. harfi a olan kişileri bulunuz.
where first_name like ' na%'; --Geçmişte IT_PROG ve AC_ACCOUNT görevlerini yapmış kişilerin id lerini bulunuz. select * from job_history j where job_id IN ('IT_PROG','AC_ACCOUNT') --Sıralama işlemi --Maaşı 10000'den büyük personelleri maaşa göre sıralayarak getiriniz. SELECT first_name,(salary+(commission_pct*salary)) maas WHERE maas>10000 ORDER BY maas --Gruplama --Personelleri birimlere göre gruplandırınız. SELECT 'Departman ID :' department_id,job_id, SUM(salary), MIN(salary), MAX(salary),COUNT(*) GROUP BY department_id, job_id ORDER BY department_id --Tek grup --En büyük ve toplam maaşı bulunuz. SELECT MAX(salary), SUM(salary) --Grupları kısıtlama -- Toplam olarak 100000 $ üzerinde maaş ödenenen birimleri bulunuz. SElect department_id, SUM(salary) GROUP BY department_id HAVING SUM(salary) > 100000
ORDER BY department_id --Grupları kısıtlamam -- Toplam olarak 100000 $ üzerinde maaş ödenenen birimleri bulunuz. SElect department_id, SUM(salary) GROUP BY department_id HAVING SUM(salary) > 100000 ORDER BY department_id; -İsmi çift olanların bulunması select first_name,count(*) group by first_name having count(*)>1 order by count(*) desc; Alt Sorgu örnekleri --10 nolu birimin yöneticisinin id numarasının bulunması where employee_ıd = ( 10 nolu birimin yöneticisinin id) (10 nolu birimin yöneticisinin idsi) select manager_id from departments where department_id=10 --Bütünleşik çözüm where employee_ıd = (select manager_id from departments where department_id=10) --'South San Francisco'daki birimlerin ismi select location_id from locations where city='south San Francisco';
Bütünleşik Çözüm select * from departments where location_id=(select location_id from locations where city='south San Francisco') Ortalamanın üzerinde maaş alan kişilerin bulunması select * where salary>(select AVG(salary) ) IT_PROG le aynı maaş ve komisyonu alan FI_ACCOUNT ünvanlı kişilerin buluması where job_id='fi_account' AND (salary,nvl(commission_pct,0)) IN (SELECT salary,nvl(commission_pct,0) WHERE job_id='it_prog') --Birimlerdeki en yüksek ortalama maaşın değerini bulunuz. select * from ( where job_id='it_prog') select max(ortalama) from (SELECT department_id,avg(salary) ortalama GROUP BY department_id); --İkinci çözüm select max(avg(salary)) GROUP BY department_id ; --Kendi birimi ortalaması üzerinde maaş alan kişiler ust where salary>(select AVG(salary) alt WHERE alt.department_ıd=ust.department_ıd ) --Kendi amiriyle aynı birimde çalışan kişileri bulunuz.
select * ust where department_id=(select department_id WHERE employee_id=ust.manager_id); --1700 nolu lokasyonda çalışan kişilerin isimlerini bulunuz. where department_id IN (select department_id FROM departments WHERE location_id=1700) --Seattle'da çalışan kişilerin isimlerini bulunuz. where department_id IN (select department_id FROM departments WHERE location_id IN (select location_id from locations where city='seattle')) --Kimsenin çalışmadığı birimleri bulunuz. select * from departments where department_id NOT IN (SELECT NVL(department_id,0) ); --Lab 3 --Geçmişte «SA_REP» olarak çalışan personellerin isimlerini bulunuz. WHERE employee_id IN (SELECT employee_id FROM job_history WHERE job_id='sa_rep' ) --Birden fazla birim olan yerlerin isimlerini bulunuz. FROM locations
WHERE location_id IN (SELECT location_id FROM departments GROUP BY location_id HAVING count(*)>1) --En yüksek maaş alan 5 adet personeli bulunuz. (rownum kullanılacaktır.) --Yanlış çözüm FROM (SELECT first_name,last_name,salary,rownum x ORDER BY salary DESC) where x<6 --Doğru çözüm select rownum,first_name,last_name,salary from (SELECT first_name,last_name,salary ORDER BY salary DESC ) WHERE rownum<6 --Ortalama maaşı en yüksek 5 birimi bulunuz. FROM departments WHERE department_id IN (SELECT department_id FROM (SELECT department_id,avg(salary) ort_maas GROUP BY department_id ORDER BY ort_maas DESC) WHERE rownum<6) --Hiç iş değiştirmeyen personelleri bulunuz. (job_history) WHERE employee_id NOT IN (SELECT employee_id FROM job_history) --Biriminde kendi ünvanında başka çalışan olmayan kişileri bulunuz. a WHERE 'x' NOT IN (SELECT 'x' WHERE employee_id<>a.employee_id AND department_id=a.department_id
AND job_id=a.job_id) --1700 Nolu mekanda yaşayan ve «Stock Manager» ünvanlı kişileri bulunuz. a WHERE department_id IN (SELECT department_id FROM departments WHERE location_id=1700) AND job_id=(select job_id FROM jobs WHERE job_title='accountant') --Seattle da çalışan kişileri bulunuz. --Alt Sorgu kullanınız. (Exist) e WHERE EXISTS ( FROM departments d WHERE e.department_id=d.department_id and EXISTS ( FROM locations l WHERE l.location_id=d.location_id AND city='seattle')) --Klasik e, departments d, locations l WHERE e.department_id=d.department_id AND l.location_id=d.location_id AND city='seattle' --ANSI e JOIN departments d ON e.department_id=d.department_id
JOIN locations l ON l.location_id=d.location_id WHERE city='seattle' --ANSI e INNER JOIN departments d USING (department_id) INNER JOIN locations l USING (location_id) WHERE city='seattle' e NATURAL JOIN departments d NATURAL JOIN locations l WHERE city='seattle' --Birimde çalışan kişilerin sayılarını birim isimleriyle bulunuz. SELECT department_name,adet FROM departments, (SELECT department_id,count(*) adet e GROUP BY department_id) dept_adet WHERE departments.department_id=dept_adet.department_id SELECT e.department_id,department_name,count(*) adet e, departments d WHERE e.department_id=d.department_id GROUP BY e.department_id,department_name ORDER BY adet desc SELECT department_id,department_name,count(*) adet e INNER JOIN departments d USING (department_id) GROUP BY department_id,department_name ORDER BY adet desc
--Her birimde en düşük maaş alan kişileri bulunuz. (birim_adi, personel_adi, maas) emp, (SELECT e.department_id,d.department_name,min(salary) en_dusuk_maas e, departments d WHERE e.department_id=d.department_id GROUP BY e.department_id,department_name) min_dept WHERE emp.department_id=min_dept.department_id AND emp.salary=min_dept.en_dusuk_maas CREATE VIEW min_dept AS (SELECT e.department_id,d.department_name,min(salary) en_dusuk_maas e, departments d WHERE e.department_id=d.department_id GROUP BY e.department_id,department_name) FROM min_dept, employees e WHERE min_dept.department_id=e.department_id AND salary=en_dusuk_maas --Birimlerde unvanlara verilen ortalama maaşları birim ve unvan ismiyle gösteriniz. SELECT e.department_id, d.department_name, j.job_id, j.job_title, MIN(salary) e, departments d, jobs j WHERE e.department_id=d.department_id AND e.job_id=j.job_id GROUP BY e.department_id, d.department_name, j.job_id, j.job_title --Çalıştığı birimin ve unvanın en düşük maaşı eşit olan personelleri bulunuz. e, (SELECT e.department_id,min(salary) en_dusuk_maas e GROUP BY e.department_id) dd, (SELECT e.job_id,min(salary) en_dusuk_maas e GROUP BY e.job_id ) ud WHERE e.department_id=dd.department_id AND e.salary=dd.en_dusuk_maas AND e.job_id=ud.job_id AND e.salary=ud.en_dusuk_maas
--Maaşı 1000 TL üzerinde olan Seattle'daki personellerin maaşlarına %10 zam yapınız. WHERE department_id IN (SELECT department_id FROM locations WHERE city='seattle') AND salary>1000; WHERE department_id IN (SELECT department_id FROM departments WHERE location_id IN (SELECT location_id FROM locations WHERE city='seattle')) AND salary>1000; UPDATE employees SET salary=salary*1.1 WHERE department_id IN (SELECT department_id FROM departments WHERE location_id IN (SELECT location_id FROM locations WHERE city='seattle')) AND salary>1000; --Personelleri bir önceki çalıştıkları işlere atayan(max) UPDATE işlemini yazınız. UPDATE calisan c SET job_id = (SELECT MAX(job_id) FROM job_history jh WHERE jh.employee_id=c.employee_id) WHERE employee_id IN (SELECT employee_id FROM job_history) --Hareket Yönetimi giriş Örnekleri UPDATE calisan
SET salary=8500 WHERE employee_id=100 commit FROM calisan WHERE employee_id=100 rollback ilk malzeme maiktar(100), para (500) --HArekt başlangıcı INSERT satıs fisi 3, 150TL UPDATE malzeme miktarı 97 UPDATE toplam para --commit, 650TL commit FROM calisan WHERE employee_id=100 FOR UPDATE NOWAIT --Aşağıdaki konutların hangisi kalıcı olarak saklanır? INSERT UPDATE COMMIT UPDATE SAVEPOINT A: INSERT UPDATE ROLLBACK TO SAVEPOINT A COMMIT: