SQL- JOIN

Merhaba,
Bu yazımda join türlerinden bahsedeceğim. Bunun için öncelikle en az iki tane tablo olmalı elimizde, oluşturalım:
CREATE TABLE EMPLOYEES(
EMPLOYEE_ID     NUMBER,
TITLE                       VARCHAR2 );
CREATE TABLE DEPARTMENTS(
EMPLOYEE_ID         NUMBER,
DEPARMENT_ID     NUMBER);
insert into employees(employee_id, title) values(1, ‘senior expert’), (2, ‘expert’), (3, null);
insert into departments(employee_id, department_id) values(2, 15), (4, 17);
Böylece tablolar ve kayıtları oluşturulmuş oldu.Şimdi bu tablolarla 3 farklı şekilde join yapabilirim:
  1. select * from employees join departments using(employee_id);
    ya da
    select * from employees natural join departments;
first
2. select * from employees e, departments d where e.employee_id=D.EMPLOYEE_ID;
3. select * from employees e join departments d on E.EMPLOYEE_ID = d.employee_id;
second
Birinci join ile employees tablosundaki alanlara ek olarak departments tablosunda olup employees talosunda olmayan alanlar da yer alır. Diğer iki sorguda ise, ilk tabloyla aynı alanların olup olmamasına bakılmaksızın bütün alanlar yer alır.
Üç sorguda da dönen kayıtlar employee_id’si her iki tabloda da olan kayıtlardır.
Şimdi LEFT JOIN ile benzer işlemleri yapalım:
select * from employees left outer join departments using (employee_id);  leftouter
select * from employees e left join departments d on e.employee_id = d.employee_id;
leftjoin
Bu sorguların sounucunda dönen kayıtların hepsi Left Join yazısının sol tarafında kalan tabloya aittir. Sol taraftaki tablonun alanlarına ek olarak sağdaki tablonun alanları (column) da görüntülenir sorgu sonucunda. Dönen kayıtlar için bu alanları değeri var is döner, yoksa da null görünür.
Eğer ‘*’ simgesini yani bütün alanları değil de sadece sol taraftaki tabloya ait bir alana ait kayıtların dönmesini isteseydik, left join sorgusunu kullanmak gereksiz olurdu. Örneğin alttaki iki sorgu aynı kayıtları döndürür:
select e.title from employees e left join departments d on e.employee_id=d.employee_id;
select e.title from employees e;
title
Benzer özellikler RIGHT JOIN için de geçerlidir, o yüzden tekrardan değinmeyeceğim.
Bir de FULL OUTER JOIN ile nasıl bir sonuç döner onu görelim:
select * from employees full outer join departments using(employee_id);
fullouter
Bu başlık altında bir de union, union all, intersect, minus kavramlarına bakmanızı tavsiye ederim. Bununla ilgili güzel bir blog yazısına denk gelmiştim, burada paylaşıyorum.

Kolay gelsin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

%d blogcu bunu beğendi:
search previous next tag category expand menu location phone mail time cart zoom edit close