join ile ilgili başlıca farklar;

  • Leftjoin adında anlaşılacağı üzere sol yani ana tablonun yanına birleştirilecek tabloyu getirmenizi sağlar, Örnek verecek olursa, bir personel tablonuz var id isim ve mail alanlarından oluşan birde maaşlar tablonuz var içinde personel id ve maaşı şeklinde, sorgumuzda personelin adının yanına maaşlarını getirmek istiyorsak personel leftjoin personel_maaslari şeklinde kullanmamız gerekir
  • Rightjoin ise yukarıdaki anlatılan örneğin sol değil sağdaki tablo üzerinden işlem yapılmak istenirse kullanılır.
  • Left ve Right joinin temel farkı, left joinde personel tablonunda 5 id li bir personel var fakat maaşları tablosunda ise bunun karşılığı yok “personel” leftjoin kişiyi getirir fakat maaşı kısmını null olarak yazar,
  • Right join ise tam tersi olarak kullanırsınız, tüm maaşları listeler ve karşılığı var ise personel getirir yok ise null atar.
  • Innerjoin ise leftjoin ve right joinden farklı olarak, personel ve maaşları tablosunda sadece eşleşen alanları getirir, yani gösterilen veriler içinde personelin kendisi ve maaşı mutlaka olması gerekir eğer birinden biri yok ise o personel veya maaşından hiçbir detay göremezsiniz.
  • Outerjoin ise inner joinin tam tersi olarak kullanılır, iki tablo arasından eşleşmeyen veya boşta kalan verileri listelemeye yardımcı olur.



Detaylı açıklamalar;

sql_joins

Inner Join

Çok basit olarak inner join  bir-e-bir join anlamına gelmektedir. İki tablonuz olduğunu düşünün TabloA da Alan1 adlı bir alanınız var bu alanda A,B,C değerleri var,
TabloB de Alan1 de ise A,B,K değerleri var.

Eğer iki tablo arasında inner join kurarsanız sonuç ta dönecek listede sadece A ve B değerleri olacaktır. Çünkü inner joinde yanlızca eşit olan kayıtlar döner.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT TabloA.Alan1 as TabloAAlan1 , TabloB.Alan1 as TabloBAlan1
FROM TabloA INNER JOIN TabloB
ON TabloA.Alan1 = TabloB.Alan1
--Kodun MSSQL de sade şekli şudur :
SELECT TabloA.Alan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 = TabloB.Alan1
--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B

Outer Join

Çok basit olarak outer bir-e-çoklu join anlamına gelmektedir (MsSQL Server da çok-a-çoklu join de kurulabilmektedir). İki tablonuz olduğunu düşünün TabloA da Alan1 adlı bir alanınız var bu alanda A,B,C değerleri var, TabloB de Alan1 de ise A,B,K değerleri var.

Eğer iki tablo arasında outer join kuracaksınız ve sizin için TabloA daki tüm kayıtlar TabloB de ise sadece TabloA da bulunanlar gelir.

Left Outer Join

Join kelimesinin sol tarafındaki tabloyu baz alarak eklemek için kullanılır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA LEFT OUTER JOIN TabloB
ON TabloA.Alan1 = TabloB.Alan1
--Bu kodun MSSQL de sade şekli şudur :
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 *= TabloB.Alan1
--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--C Null


Right Outer Join

Join kelimesinin sağ tarafındaki tabloyu baz alarak eklemek için kullanılır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA RIGHT OUTER JOIN TabloB
ON TabloA.Alan1 = TabloB.Alan1
--Bu kodun MSSQL de sade şekli şudur :
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 =* TabloB.Alan1
--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--Null K

Full Outer Join (MySQL için Cross Outer Join)
Her iki tablodaki tüm verileri getirmek için kullanılır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA FULL OUTER JOIN TabloB
ON TabloA.Alan1 = TabloB.Alan1
--Bu kodun MSSQL de sade şekli şudur :
SELECT TabloA.Alan1 as TabloAAlan1, TabloB.Alan1 as TabloBAlan1
FROM TabloA , TabloB
WHERE TabloA.Alan1 =* TabloB.Alan1
--Dönen Sonuç :
--TabloAAlan1 TabloBAlan1
--A A
--B B
--Null K
--C Null

Join’ nin sade halinde kullanılan “*” karakteri ise sadece Ms SQL Server’a özeldir. Oracle da ise bu karakter yerine “(+)” işareti kullanılmaktadır ve alan isimlerin sonuna bir boşluk bırakarak yazılır.

Örnek olarak : WHERE TabloA.Alan1 = TabloB.Alan1 (+)

OUTER cümlesi kullanılmasada olur. (Left Join gibi)

 

Veritabanı notları

SELECT INTO deyimi
SELECT INTO deyimi daha çok tabloların kopyalarını yapmakta veya bir
kümenin kopyasını disk üzerinde oluşturmak için kullanılır.
Yapı
SELECT kolon_ad(ları) INTO [bir_başka_veritabanı.dbo.]yeni_tablo_adı
FROM kaynak
Yedekleme amacıyla kopya oluşturma
Örneğin Kişiler tablosunda bir takım değişiklikler yapılacaksa önceden
Kişiler tablosunun yedeğini almakta yarar vardır.
SELECT * INTO Kişiler_yedek
FROM Kişiler
Bu örnekte Kişiler tablosunun Kişiler_yedek tablosuna bir kopyası
yazılmaktadır. Bu tablonun ayni server üzerinde olan bir başka
veritabanına kopyası da yapılabilir.
Örnek:
SELECT * INTO Northwind.dbo.Kişiler
FROM Kişiler
Bu SQL deyimi Kişiler tablosunun bir kopyasını Northwind veri tabanına
adı Kişiler olan bir tabloya kopyalayacaktır.
Her iki durumda da INTO dan sonra gelen tablo adı, kopyanın yapılacağı
veritabanında bulmamalıdır.
Tüm bir veri tabanını kopyalamak yerine, INTO deyimi ile bir SELECT
sonucu elde edilen bir sonuç kümesini bir tablo haline getirebiliriz.
Örnek:
SELECT K.AD, K.SOYAD, A.fkSIRANO, D.DERSKOD, D.DERSAD, A.YIL,
A.Donem, A.BasNot
INTO TRANSRIPT_9
FROM KUTUK A INNER JOIN
DERS D ON A.fkDersSIRANO = D.pkDersSIRANO INNER
JOIN
Kişiler K ON A.fkSIRANO = K.SIRANO
WHERE (A.fkSIRANO = 9)
Bu SQL deyimi 9 nolu öğrencinin aldığı dersleri, derslerin alındığı dönemleri ve notları
TRANSRIPT_9 adlı bir tabloya kopyalamaktadır.
CREATE VIEW deyimi
Yapı
CREATE VIEW View_adı
AS
SELECT deyimi
Önce view deyiminin ne olduğunu öğrenelim.
Bir view, bir SELECT deyimi ile elde edilen bir sonuç kümesine dayalı
oluşturulan bir sanal tablodur. Bunu anlamak için aşağıdaki örneği
inceleyelim.
Örnek:
CREATE VIEW TRANSRIPT
AS
SELECT A.fkSIRANO, D.DERSKOD, D.DERSAD, A.YIL, A.Donem,
A.BasNot
FROM KUTUK A INNER JOIN
DERS D ON A.fkDersSIRANO = D.pkDersSIRANO
Bu SQL deyimi bize SQL Server içinde her zaman kullandığımız
veritabanında TRANSRIPT adında bir view oluşturur. Bu view bir sanal
tablo olarak düşünülebilir. Bu sanal tablonun kolonları ve kolonların
alındığı özgün alanlar düşünülerek aşağıdaki gibidir:
fkSIRANO int
DERSKOD varchar(6)
DERSAD varchar(30)
YIL smallint
Donem smallint
BasNot varchar(2)
Artık bu sanal tabloyu SELECT deyimlerinde kullanabiliriz.
Örnek:
SELECT K.SIRANO, K.AD, K.SOYAD, T.DERSKOD, T.DERSAD, T.YIL,
T.Donem, T.BasNot
FROM TRANSRIPT T INNER JOIN
Kişiler K ON T.fkSIRANO = K.SIRANO
Bir başka view örneği verelim.
Örnek:
CREATE VIEW TEKRAR_EDEN_ILCE
AS
SELECT COUNT(ILCEAD) AS SAY, ILCEAD
FROM ILCE
GROUP BY ILCEAD
HAVING (COUNT(ILCEAD) > 1)
Şimdi bu view bir SELECT deyiminde kullanalım
Örnek:
SELECT I.ILAD, C.ILCEAD, V.SAY
FROM ILCE C INNER JOIN
TEKRAR_EDEN_ILCE V ON C.ILCEAD = V.ILCEAD INNER JOIN
IL I ON C.ILKOD = I.ILKOD
Not: Veri tabanı view da oluşan datayı saklamaz. Dolayısıyla bir viewun geçtiği SQL
deyimi her çalıştırıldığında ilgili view sanal kümeyi yeniden oluşturur.


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir