SQL JOIN kullanımı

PHP ve MySQL ile ilgili yardım taleplerinizi paylaşabilirsiniz.
Cevapla
Kullanıcı avatarı
Gökhan
Deneyimli Üye
Deneyimli Üye
Mesajlar: 390
Kayıt: 11 Şub 2009, 22:57

SQL JOIN kullanımı

Mesaj gönderen Gökhan » 01 Mar 2012, 09:38

Veritabanı tasarımlarımızda, birbiri ile ilişkili pek çok tablo oluştururuz,

bir kaç örnek vermek gerekirse,

Ürün satışı ya da tanıtımı yapılacak bir sitede genellikle kategorilere ihtiyaç duyarız,
en çok verilen örnek ile, bir kitap satış projesinde mutlaka kitaplar ve yazarlar tablosu olur.

Peki neden zaten kitabı bir tabloda tutuyorken, o tabloya bir alan daha açıp yazarını da yanına yazmayız?

Bu konu aslında veritabanı optimizasyonunun konusu ama JOIN örneğini vermeden önce ilişkili tablolar yapmamızın sebebine bir iki neden yazayım.

Ürün satışı yapılan bir site projesini düşünürsek,

Eğer kategorileri de Ürünler ile ilgili bir tabloda alan olarak tutuyor olsaydık,

1 - Aynı kategori için birden fazla ürün girilecekse ki mutlak durum bu, veri tekrarı yapmış olurduk,

Yani Bilgisayar kategorisine birden çok ürün girdiğimizde kategori alanında her seferinde Bilgisayar yazacaktık ve her bir Bilgisayar yazısı için 10 byte yer tüketecektik, oysa Bilgisayarı bir kategoriler tablosunda bir ID ile
tutup, ürünler tablosuna bu ID sayısını girersek, her bir kayıt için sadece 2 byte yer harcamış oluruz.

Data boyutu olarak çok az bir kazancımız oluyor gibi görünse de, bir çok yerde bu optimizasyonu yaparak ve çok özellikle çok adetli kayıtlarda, önemli bir yer kazanabiliriz.(Bu ana neden olmasa da)

2 - Veirlerin bir görünmesini sağlamak için,
Örneğin Yazıcı grubu için, eğer kategorileri veritabanına ürünler tablosuna bir alan olarak yazsaydık, aynı kategoriden bazı kayıtlara örneğin, Mürekkepli Yazıcılar, bazılarına Mürekkep Yazıcılar, bazılarına mürekkepli yazıcılar, bazılarına mürekkepli yazıcı grubu gibi birbirinden farklı yazıları unutarak ya da hata ile girebilirdik, ama kategoriler tablosuna bir defa Mürekkepli Yazıcılar şeklinde girdikten sonra, her bir ilgili kayda bunun idsini yazarak, her üründe aynı kategoride, aynı kategori ismini görmemiz mümkün olacak.

Ayrıca kategori simini tek bir yerden değiştirdiğimizde, tüm ürün kayıtlarına anında etkimiş olacak.


İlişkili tablolar yaptığımızda mutlaka ortak bir alanları bulunmalı, örneğin kategoriler tablomuzun id alanı ile, ürünler tablomuzun kategori_id alanını ortak düşünelim.

Bu durumda, ürün girerken, kategori tablosundaki ilgili kategorinin idsini, ürünler tablomuzdaki kategori_id bölümüne yazmalıyız.

Şimdi artık esas konumuz olan JOIN'e dönebiliriz, çünkü ürünleri listelerken, kategorisi olarak artık elimizde 1,2 vb sayılar olacak.

Ürünleri listelerken, kategori alanlarına sayılar yerine kategori isimlerini yazmak istiyorsak genel olarak 2 seçeneğimiz var.

Ya önceden tüm kategorileri kategoriler tablosundan alıp, id ve ismine dayalı bir dizi oluşturacağız ve ürünleri listelerken kategor_id değerini bu diziye vereceğiz, ya da JOIN kullanacağız.

JOIN iki ya da daha fazla farklı ama bir alandan ilişkli tabloları tek bir tabloymuş gibi kullanmamıza olanak tanıyan bir SQL özelliğidir.


Örnek:

İki adet tablomuz var;
- urunler ve kategoriler

urunler tablomuzun alanları : (id, kategori_id, urun)
kategoriler tablomuzun alanları (id, kategori)

yukarıdaki tablolarda ilişkili alanlar urunler tablosunun kategori_id alanı ile kategoriler tablosunun id alanı.


Kategoriler ve ürünler tablosuna girilen örnek kayıtlar aşağıdaki gibi olsun;
tablolar.jpg
Örnek Kodlama ve çıktıyı da aşağıda hazırladım.

Kod: Tümünü seç

<table border="1">
<tr><td align="center">Ürün ID</td><td align="center">Ürün</td><td align="center">Kategori</td></tr>
<?
$sql = "select * from urunler order by id asc";
$query = mysql_query($sql);
while($array = mysql_fetch_array($query))
{
?>
<tr><td align="center"><?=$array["id"];?></td><td align="center"><?=$array["urun"];?></td><td align="center"><?=$array["kategori_id"];?></td></tr>
<?php	
}
?>
</table>
<br /><br />
<table border="1">
<tr><td align="center">Ürün ID</td><td align="center">Ürün</td><td align="center">Kategori</td></tr>
<?
$sql = "select urunler.*, kategoriler.kategori from urunler 
	left join kategoriler on kategoriler.id = urunler.kategori_id 
		 order by urunler.id asc";
$query = mysql_query($sql);
while($array = mysql_fetch_array($query))
{
?>
<tr><td align="center"><?=$array["id"];?></td><td align="center"><?=$array["urun"];?></td><td align="center"><?=$array["kategori"];?></td></tr>
<?php	
}
?>
</table>
Yukarıda ilk tablo bölümünde JOIN kullanmadan, ikincisinde ise JOIN kullanarak örnekler verdim, ekran çıktıları da aşağıdaki gibi olacaktır.

JOIN kullanmadan;
tablo1.jpg
JOIN kullanarak;
tablo2.jpg
Özellikle $sql = ""; ile yazdığım sql sorgularını dikkatlice incelerseniz, join'de artık alanların başına tablo isimlerini ekleyerek kullanıyoruz ve JOIN ile ekleyeceğimiz tabloyu belirtirken on kelimesinden sonra ana tablo ve ekleyeceğimiz tablonun ilişkili alanlarını da belirtiyoruz.

Örnekte LEFT JOIN özelliğini kullandım, bunu dışında RIGHT JOIN ve INNER JOIN gibi JOIN özellikleri de var.

Cevapla

Kimler çevrimiçi

Bu forumu görüntüleyen kullanıcılar: Majestic-12 [Bot] ve 1 misafir