Oracle Ders 18 – Join – 01 Equality Join

Merhaba Arkadaslar,
Bir kac yazim boyunca JOIN konusunu isleyecegiz. Baslamadan once bir bir kac aciklamada bulunmak istiyorum. Iliskisel veritabaninin avantaji , birden cok tablo kullanarak gereksiz veri tekrarini onlemekir ( data redundancy). Bu yapinin kullanabilmesi icin tablolarin birbiriyle birlesme (join) islemi yapilmasi gerekmektedir.

Orneklere baslamadan once tablolarimizi ayarlayalim ,  bir onceki derste verdigim tablo kodlarini calistirdiktan sonra bu kodlari calistirin : oracle ders 18 sql queries

Kartezyan Birlestirme ( Cartesian Join)
Cartesian Join , Cartesian Product ve Cross Join olarak da isimlendirilir. Bu Join islemi matematikteki kartezyan carpim mantigi ile aynidir. 2 tablo dusunelim , ilk tablodaki her bir kayit diger tablodaki her bir kayit ile isleme girer /eslesir/carpilir.

01 oracle ders 18 cartesian join

Tablodan inceledigimizde Cartesian Joinin yapisi cok daha anlasilir olacaktir. Her bir kayit diger bir kayitla isleme girmistir.

create table table1 ( 
column1 varchar2(20)
);

create table table2 ( 
column2 varchar2(20)
);

insert into table1 values('Record1');
insert into table1 values('Record2');
insert into table1 values('Record3');

insert into table2 values('RecordA');
insert into table2 values('RecordB');
insert into table2 values('RecordC');
insert into table2 values('RecordD');

select column1,column2 from table1,table2;


02 oracle ders 18 cartesian join . jpg

Gordugunuz gibi tablolarimizi olusturup , kayitlari ekledikten sonra sorgumuzu calistirdigimizda cartesian product sonucunu aldik. Sorgumuzda dikkat edecek olursaniz hic bir sart belirlemedik sadece 2 tabloya ait alanlarin getirilmesini istedik.

Cross Join
Yukarida bahsettigimiz yontem Cartesian Product yapisinin , geleneksel (traditional) yapisidir. Burada cross join anahtar kelimesiyle ayni ornegi yapacak olursak..

select column1, column2 from table1 cross join table2;

Yukaridaki sorguyu calistirdigimizda ayni sonucu elde ederiz. Burada from anahtar kelimesinden sonra tablolari virgul ile ayirip yazmak yerine tablo isminden sonra cross join yazarak diger tablonun ismini yaziyoruz. Ucuncu bir tabloyu da hesaba katip devam edebiliriz.

create table table3 ( 
column3 varchar2(20)
);

insert into table3 values('RecordQ');
insert into table3 values('RecordY');
insert into table3 values('RecordZ');
insert into table3 values('RecordT');

select column1, column2, column3 from table1 cross join table2 cross join table3;
select column1, column2, column3 from table1,table2,table3;

Sorgu sonucu donen satir sayisi tablolardaki kayit sayisinin carpimi kadar olacaktir.

Equality (Esitlik) Join
Bu join turumuz, equijoins , inner joins ya da simple joins olarak adlandirilir. Burada anlamamiz gereken bir kavram var ; common column , yani birden fazla tablo icin ortak olan bir kolonun ayni isimle oldugunu dusunelim ornegin BOOKS ve PUBLISHER tablomuzda pubid ortak olarak bulunmaktadir. pubid ye common column olarak adlandiririz.

Traditional Equality Join

select books.pubid, title , name from books, publisher
where books.pubid = publisher.pubid;

03 oracle ders 18 equal traditonal join

Buradaki geleneksel join yontemimizde , iki tabloyu birlestirme islemi where anahtar kelimesi araciligiyla saglanmaktadir. Sartimiza gore BOOKS tablomuzda bulunan pubid nin PUBLISHER tablomuzda bulunan pubid ye esit olmasidir.
Burada ek olarak sunu belirmek istiyorum eger sorgumuzda common column icin (burada pubid) basina tablo ismini yazmazsak hata aliriz. Bu hatanin nedeni Oracle farkli tablolarda ayni isimde kolonu bulmaktadir ve kafasi karismaktadir 🙂

select pubid, title , name from books, publisher
where books.pubid = publisher.pubid;

Bu sorgu su hataya neden olacaktir :

ORA-00918: column ambiguously defined
00918. 00000 – “column ambiguously defined”

Simdi de su ornegi inceleyelim…

select b.title , b.pubid , p.name
from books b, publisher p
where b.pubid = p.pubid
and(b.cost <15  OR p.pubid =1 )
order by b.title;

Burada yeri gelmisken table aliases (tabloya isim verme) kavramindan bahsetmek istiyorum , birden fazla join isleminde uzun tablo isimlerini yazmak yerine tabloya bir takma isim verebiliriz. Burada books icin b, publisher icin p ismini erdik  ve common column uzerinden join islemini gerceklestirdik.
Table aliases , 30 karakter uzunlugunda olabilir. Amacimiz kisaltmaksa 30 karakter coook bile 🙂
Table aliases verimlilik arttirici bir ozellige sahiptir.

Euality Joins : JOIN
Burada Oracle 11 G de 3 yaklasim bulunmaktadir. Bunlar Natural Join , Using , ve Join… On yaklasimidir.

Natural Join
Natural Join otomatik olarak iki tabloyu birbirine baglar. Peki bunu nasil yapar tabiki common column uzerinden.

select pubid,title, name 
from publisher natural join books;

Bu sorgumuzun sonucu biraz once calistirdigimiz su sorgu ile ayni olacaktir.

select books.pubid, title , name from books, publisher
where books.pubid = publisher.pubid;

Using
Bir diger yontem olarak using anahtar kelimesinden yararlanilir.

select b.title,pubid,p.name
from publisher p join books b 
using (pubid);

Burada common column ‘i using anahtar kelimesi araciligiyla kendimiz verebiliriz.

JOIN … ON 
Join.. On yaklasiminda , common column alan zorunlulugu yoktur. publisher ile publisher2 tablosunda ayni veriler vardir ve pubid , id adindadir.
Using yaklasiminda mutlaka common column kullanilmak zorundadir.

select b.title , b.pubid, p.name
from publisher2 p join books b
on p.id = b.pubid;

Bu sorgumuzda diger sorgular gibi ayni sonucu dondurecektir.

Join ile ilgili yazimin ilk bolumu burada bitiyor.

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *