Logo

MySQL Detaylı Özellikleri


MySQL JOIN Yapıları

 

Bu yazımızda, MySQL veritabanı yapısında tablolar arası birleştirmeler ve veriler arası ilişkileri inceleyeceğiz.

 

İngilizce JOIN kelimesi, katılmak, birleştirmek anlamlarına gelmektedir. JOIN yapısını veritabanı yapılarında birden fazla tablodaki ilişkili verileri birleştirmek ve anlamlı bütünler oluşturmak için kullanacağız. Ayrıca JOIN yapılacak tabloların, tablolar arası bağlantıyı kuran sütunların, veri tipleri ve veri uzunlukları birbirinden farklı olmamalıdır. Eğer farklıysa JOIN kullanmak sorguyu çok uzatır ve bu da performans açısından sisteme çok yük binmesine sebep olur.

 


Visual SQL JOINS

 

JOIN yapıları 4 farklı şekilde kullanılmaktadır, LEFT JOIN, RIGHT JOIN, INNER JOIN ve CROSS JOIN. Şimdi yapıları inceleyelim.

 

Örnek Uygulama

Dört adet tablomuz olsun. İlki ürün listesi tutan “urun” tablosu, ikinci tablomuz ise ürünlerin detaylarını tutan “urun_detay” tablosu, üçüncü tablo firmamıza kayıtlı olan müşterileri tutacak olan “musteri” tablosu, son tablomuzda müşterilerimize satış yaptığımız ürünlerin kaydını tutan tablo “satis” olsun.

 


firmam veritabani sablonu

 

Örnek Veriler

Müşteri (musteri) Tablosu:


SELECT * FROM `firmam`.`musteri`;
+------------+------------+---------------+-----------------+-------------------------+---------------+
| musteri_id | musteri_ad | musteri_soyad | musteri_telefon | musteri_email | musteri_durum |
+------------+------------+---------------+-----------------+-------------------------+---------------+
| 1 | Jason | DOE | 2129999999 | jason@jasondoe.com | AKTIF |
| 2 | John | DOE | 2127777777 | john@johndoe.com | AKTIF |
| 3 | Jane | DOE | 2128888888 | jane@janedoe.com | DEAKTIF |
+------------+------------+---------------+-----------------+-------------------------+---------------+
6 rows in set

 

Müşteri Detay (musteri_detay) Tablosu:

 

SELECT * FROM `firmam`.`musteri_detay`;
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
| musteri_id | musteri_detay_ulke | musteri_detay_sehir | musteri_detay_ilce | musteri_detay_postakodu | musteri_detay_adres | musteri_detay_website |
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
| 2 | US | New York | NULL | NULL | NULL | NULL |
| 3 | TR | İstanbul | NULL | NULL | NULL | https://medanis.com.tr |
+------------+--------------------+---------------------+--------------------+-------------------------+---------------------+---------------------------+
2 rows in set

 

Ürün (urun) Tablosu:

 

SELECT * FROM `firmam`.`urun`;
+---------+------------------------+------------+------------+-------------+
| urun_id | urun_adi | urun_marka | urun_model | urun_uretim |
+---------+------------------------+------------+------------+-------------+
| 1 | Asus Notebook B43 4GB | Asus | B43 | 2010-04-01 |
| 2 | Asus Notebook N51V 4GB | Asus | N51V | 2009-12-01 |
+---------+------------------------+------------+------------+-------------+
2 rows in set

 

Satış (satis) Tablosu:

 

SELECT * FROM `firmam`.`satis`;
+----------+---------+------------+-------------+--------------+-------------+---------------------+
| satis_id | urun_id | musteri_id | satis_birim | satis_miktar | satis_tutar | satis_tarih |
+----------+---------+------------+-------------+--------------+-------------+---------------------+
| 1 | 1 | 5 | 100 | 40 | 4000 | 2010-12-01 10:00:00 |
| 2 | 1 | 5 | 100 | 10 | 1000 | 2010-12-02 10:00:00 |
| 3 | 1 | 5 | 100 | 40 | 4000 | 2010-12-01 10:00:00 |
| 4 | 1 | 5 | 150 | 10 | 1500 | 2010-12-02 10:00:00 |
| 5 | 1 | 4 | 170 | 10 | 1700 | 2010-12-02 11:00:00 |
| 6 | 1 | 5 | 140 | 10 | 1400 | 2010-12-02 12:00:00 |
| 7 | 1 | 6 | 100 | 10 | 1000 | 2010-12-03 10:00:00 |
| 8 | 2 | 5 | 100 | 30 | 3000 | 2010-12-03 12:00:00 |
| 9 | 2 | 5 | 100 | 20 | 2000 | 2010-12-03 13:00:00 |
| 10 | 2 | 2 | 180 | 10 | 1000 | 2010-12-03 14:00:00 |
| 11 | 2 | 2 | 100 | 10 | 1000 | 2010-12-03 15:00:00 |
| 12 | 2 | 3 | 100 | 30 | 3000 | 2010-12-03 16:41:00 |
| 13 | 2 | 3 | 120 | 20 | 2400 | 2010-12-03 16:58:00 |
| 14 | 2 | 4 | 100 | 30 | 3000 | 2010-12-03 17:15:00 |
| 15 | 2 | 1 | 100 | 10 | 1000 | 2010-12-03 17:30:00 |
+----------+---------+------------+-------------+--------------+-------------+---------------------+
15 rows in set

 

INNER JOIN

İlk olarak en yaygın kullanılan JOIN tipi olan INNER JOIN’i inceleyelim. INNER JOIN seçtiğiniz tablolarda birebir eşleşen kayıtları getirir. Örneğin musteri ve musteri_detay tablolarını inceleyecek olursanız 3 adet müşteri kaydımız ve 2 adet müşteri detay kaydımız bulunuyor. Biz bu tablolar için INNER JOIN kullanırsak bize sadece 2 satır kayıt dönecektir. Çünkü her iki tabloda kaydı bulunan musteri sadece 2 tanedir.

 

SELECT m.*, md.musteri_detay_website
FROM firmam.musteri AS m
INNER JOIN firmam.musteri_detay AS md ON m.musteri_id = md.musteri_id

 

Örnek INNER JOIN Sorgu Sonucu :

+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
| musteri_id | musteri_ad | musteri_soyad | musteri_telefon | musteri_email | musteri_durum | musteri_detay_website |
+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
| 2 | John | DOE | 2127777777 | john@johndoe.com | AKTIF | NULL |
| 3 | Jane | DOE | 2128888888 | jane@janedoe.com | DEAKTIF | https://medanis.com.tr |
+------------+------------+---------------+-----------------+-------------------------+---------------+---------------------------+
2 rows in set (0.00 sec)

 

Diğer dersimizde diğer JOIN kullanımlarını inceleyeceğiz.