Diğer dersleri http://selimkaratas.com.tr/oracle-11g-r2-egitimi-ders-notlari adresinden bulabilirsiniz.
6. Displaying Data from Multiple Tables ( Çoklu tablolar için veri gösterimi) JOIN Farklı tablolardan gerekli sütunları alıp yeni bir rapor oluşturmak amacıyla kullanılır. İlişkili tablolardan yararlanılarak farklı tablolardan yer alan veriler raporlanabilir.
*3 çeşit JOIN vardır:
- Natural JOIN Clause ( Genelde kullanılmaz)
- Using Clause ( Genelde kullanılmaz )
- On Clause ( En çok tercih edilen )
*3 çeşit Outer JOIN vardır:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
*Cross JOIN NATURAL JOINS YARATMA
NATURAL JOİNS
SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations ; /* departments tablosu ve locations tablosundan eşleyeceği kolonları kendi seçer. eşleme yapması için kolon adları aynı olmalı. bundan dolayı çok tercih edilmez. */
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations
WHERE city IN ('London');
-- sonuçlar içinden city="London" olanları listeledik
USING Clause
SELECT employee_id, last_name, location_id, department_id FROM employees JOIN departments USING (department_id) ; /* USING ile istediğiniz kolonu seçebilirsiniz ama yine aynı kolon adlarına sahip olmalı */
SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1800; --d.location_id şeklinde kullanamayız
SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1700;
ON CLAUSE
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id); --department_id kontrolü sağladığından daha doğru sonuç verir -- diğer join'lere göre bu tercih edilir
ÜÇ VE DAHA FAZLA KOLONLU ON CLAUSE
SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id; -- 3 tabloyu birbirine bağlayıp rapor aldık.
Nonequijoins
create table job_grades(grade_level char(3), min_value number(6),max_value number(6)); /* detayına daha sonraki derslerde girilecektir. bu şekilde tablo oluşturuyoruz.*/
insert into job_grades values ('D',0,4000);
insert into job_grades values ('C',4001,8000);
insert into job_grades values ('B',8001,12000);
insert into job_grades values ('A',12001,999999);
--belirli aralıklara sahip değişenlere belirli harfler verdik
SELECT * FROM job_grades ORDER BY 1;
SELECT E.LAST_NAME,E.SALARY,J.GRADE_LEVEL FROM EMPLOYEES E JOIN job_grades J ON E.SALARY BETWEEN J.min_value AND J.max_value ORDER BY 2 DESC; --maaşlarının bulunduğu aralıklara göre harflendirdik
SELF JOINS ON Clause
SELECT worker.last_name emp, manager.last_name mgr FROM employees worker JOIN employees manager ON (worker.manager_id = manager.employee_id); -- Aynı tablodan yaratılacak raporlar için yapılır.
LEFT OUTER JOIN
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) ; /* left outer kısmını yazmadığımızda null sonuçları göstermez. left outer yazdığımız zaman sol taraftaki değişkenin eşleşdiği kolonda null değerini getirdi */
RIGHT OUTER JOIN
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) ; /* sağ taraftaki kolonumuz yani department_name değişkenlerinin karşılığına gelen last_name= null ya da department_id = null olanları da listeledik. */
FULL OUTER JOIN
SELECT e.last_name, d.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id) ; -- her iki tarafta yer alan null değerlerini getirir
CROSS JOINS
select last_name from employees; -- satır adedi: 107'dir
select department_name from departments; -- satır adedi 27'dir
cross işleminin doğrulunu test edebiliriz. 107*27 = 2889 olmalıdır.
SELECT last_name, department_name FROM employees CROSS JOIN departments ; /* farklı tablolardaki kolonlar için çaprazlama işlemi yapılmıştır. Sonuç 2889 çıkmıştır. */
















