Veri Tabanı Sorgularında Joinler Nedir?
Veri Tabanı Sorgularında Joinler Nedir?
Joinler, veri tabanında hazırladığımız bir sorgu ile birden fazla tabloyu tek tablo gibi göstermek istediğimiz durumlar olabilir. Örneğin filmler ve kategoriler isminde iki tablomuz olduğunu varsayalım. Select işlemi yaptığımız zaman filmlere ait bilgiler listelenirken kategori kısmı ID değeri olarak gelecektir. Biz burada ID değeri yerine bu ID değerinin karşılığı olan isimlerin gelmesini istersek yani filmler tablomuzda x filminin kategori kısmında 1 yerine komedi filmi (x filminin türüne göre) yazmasını istersek birleştirme yapmamız gerekir işte burada devreye joinler girmektedir.
JOIN Nedir?
SQL’de özellikle ilişkili tablolarda istediğimiz tabloları belirlenen şartlara göre birleştirmek için kullanılan bir türdür. Join işleminde ilk etapta birleştirilecek sütunlar SELECT sorgusu içinde yazılır. SELECT ifadesinden sonra kullanılacak tabloların sütun değerleri yazılır. Sonrasında FROM ifadesini kullanırız. Birleştirmek için kullanacağımız ilk tabloyu sonra ilgili join ifadesini ardından da birleştirmek için kullanacağımız ikinci tabloyu yazıyoruz. Yazım kuralı olan ON ifadesini kullanıyoruz. Son olarak 1.tablomuzdaki sütun ile birleştirmek istediğimiz ikinci tablonun sütununu eşleştiririz.
Syntax yapısı (sözdizimi)
SELECT Sutun1, Sutun2, ..., SutunN FROM Tablo1 JOIN_TÜRÜ Tablo2 ON Tablo1.PrimaryKey = Tablo2.PrimaryKey
Şimdi basit olarak filmler ve kategoriler isimli iki tablo oluşturup örnek yapalım;
Movies (Filmler) Tablomuzu Oluşturalım;
CREATE TABLE movies ( movie_id INT PRIMARY KEY, movie_name VARCHAR(100), movie_vision_date DATE, movie_country VARCHAR(50) );
Tablomuza Kayıtlar Ekleyelim;
INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES(1001, 'Recep İvedik 5', '2017-02-16', 'Türkiye'); INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES(1002, 'Babam ve Oğlum', '2005-10-18', 'Türkiye'); INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES(1003, 'Dağ II', '2016-10-04', 'Türkiye'); INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES( 1004, ' New Yorkta Beş Minare', '2010-10-05', 'Türkiye'); INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES(1005, ' Celal ile Ceren', '2013-01-18', 'Türkiye'); INSERT INTO movies ( movie_id, movie_name, movie_vision_date, movie_country) VALUES ( 1006, ' Organize İşler', '2005-12-13', 'Türkiye');
Şimdi de Categories isimli tablomuzu oluşturalım;
Categories (Kategoriler) Tablomuz;
CREATE TABLE categories ( categori_id INT PRIMARY KEY, categori_name VARCHAR(100), movie_id INT, Point DECIMAL FOREIGN KEY (movie_id) REFERENCES movies(movie_id) );
Şimdi de Categories isimli tablomuza kayıtlarımızı ekleyelim;
INSERT INTO categories (categori_id, categori_name, movie_id, Point) VALUES (1, 'Komedi', 1001, 8.2); INSERT INTO categories (categori_id, categori_name, movie_id, Point) VALUES (2, 'Dram', 1002, 10.2); INSERT INTO categories (categori_id, categori_name, movie_id, Point) VALUES (3, 'Aksiyon', 1003, 5.1); INSERT INTO categories (categori_id, categori_name, movie_id, Point) VALUES (4, 'Bilim Kurgu', 1004, 7.4);
JOIN Tipleri Ve Kullanımları
1. INNER JOIN
Bu join türümüz, Movies ve Categories isimli iki tablomuzu birleştirir ve sadece eşleşen kayıtları bize döndürür.
Sorgumuzu Yazalım,
SELECT * FROM categories INNER JOIN movies ON categories.movie_id = movies.movie_id
Çıktımız aşağıdaki gibi olacaktır,
2. LEFT JOIN
Bu join türümüz, Movies isimli birinci tablomuzdaki tüm kayıtları getirir ve her iki tablodaki eşleşen kayıtları bize getirir. Eşleşmeyen kayıtlar NULL olarak gelir.
Sorgumuzu Yazalım,
SELECT * FROM movies LEFT JOIN categories ON movies.movie_id = categories.movie_id
Çıktımız aşağıdaki gibi olacaktır,
3. RIGHT JOIN
Bu join türümüz, Categories isimli ikinci tablodaki tüm kayıtları getirir ve her iki tablodaki eşleşen kayıtları bize getirir. Eşleşmeyen kayıtlar NULL olarak gelir.
Sorgumuzu Yazalım,
SELECT * FROM categories RIGHT JOIN movies ON categories.movie_id = movies.movie_id
Çıktımız aşağıdaki gibi olacaktır,
4. FULL OUTER JOIN
Bu join türümüz, hem left join hem de right join işlemini bir arada gerçekleştirir. Movies ve Categories isimli tablolarımızdaki tüm kayıtları getirir. Eşleşmeyen kayıtları da NULL olarak döndürür. Sorgumuzu Yazalım,
SELECT * FROM movies FULL OUTER JOIN categories ON movies.movie_id = categories.movie_id
Çıktımız aşağıdaki gibi olacaktır,