Kurs
SQL ile veri analizi yaparken, çoğu zaman birden fazla tabloya bakmanız ve bunları birleştirerek istediğiniz sonuçları elde etmeniz gerekir. Verileri analiz etmek için tabloları birleştirmek, bir veri bilimcisi için de gerekli bir beceridir. Bu eğitimde, PostgreSQL’de gerçekleştirebileceğiniz farklı join türlerini öğreneceksiniz. Önce SQL’de join’ların ön hazırlık kavramlarını inceleyecek, ardından farklı join türlerini ve PostgreSQL’deki sözdizimlerini göreceksiniz. Eğitimi, iki tablo kullanarak çeşitli join sorgularını çalıştırarak bitireceksiniz. Takip edebilmek için SQL’in temellerine ve PostgreSQL’de basit sorgular yazmaya aşina olmanız gerekir. Bunları öğrenmek için kaynak arıyorsanız, aşağıdakiler faydalı olabilir -
- PostgreSQL’e Başlangıç Rehberi
- Veri Bilimi için SQL’e Giriş kursu (DataCamp)
Hadi başlayalım.
PostgreSQL’de veritabanı ortamını hazırlama
SQL join’ların temellerini incelemeden önce analizleriniz için bazı tablolar oluşturmak iyi bir fikir olacaktır. En az bir ortak sütunu olan en az iki tabloya ihtiyacınız olacak. Aynı tablo üzerinde self-join sorguları çalıştırabileceğiniz halde, bunu şimdilik göz ardı edelim.
Tüm SQL işlemlerini genellikle PostgreSQL kurulumuyla birlikte gelen pgAdmin adlı araçta yapabilirsiniz. İlerlemek için mevcut bir veritabanınız yoksa, tabloları oluşturmak üzere pgAdmin’i açıp bir veritabanı (istediğiniz bir ad verin) oluşturun. Ardından aşağıdaki iki tabloyu belirtilen özelliklerle oluşturabilirsiniz -
- student_name (id, name)
- student_stream (id, stream)
Not: Her iki tabloda da ortak olan id sütunu vardır. Tabloları oluşturmak için aşağıdaki CREATE ifadelerini kullanabilirsiniz -
- student_name için -
CREATE TABLE student_name ( id smallint, name "char"[] ); - student_stream için -
CREATE TABLE student_stream ( id smallint, stream "char"[] );
Şimdi tablolara bazı kayıtlar ekleyelim.
- student_name için -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');
INSERT INTO student_name(id, name) VALUES (2, 'Alex');
INSERT INTO student_name(id, name) VALUES (3, 'Sameer');
INSERT INTO student_name(id, name) VALUES (4, 'Rick');
- student_stream için -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');
INSERT INTO student_stream(id, stream) VALUES (1, 'IT');
INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');
INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');
Yukarıdaki sorguları hiçbir şeyi değiştirmeden çalıştırdıysanız, tablo girişleri aşağıdaki gibi olmalıdır -

Artık iki basit tablonuz hazır. Şimdi SQL join’ların temellerini incelemeye geçelim.
SQL Join’lar - Temeller
SQL Join’lar, ortak tanımlayıcılar kullanarak iki veya daha fazla (bazen tek bir tablo) tabloyu bir araya getirmenizi sağlar. Oluşturduğunuz yukarıdaki iki tablo örneğini ele alın - iki tabloda da ortak olan sütun id’dir. Peki SQL’de join yapmaya neden ihtiyaç duyulur? Bunu kısaca tartışalım.
Normalleştirme kısıtları nedeniyle, gerekli tüm bilgilerin tek bir tabloda bulunmaması mümkündür. Tutarlılığı sağlamak, fazlalığı azaltmak ve çeşitli ekleme/güncelleme anormalliklerini önlemek için normalleştirme sadece arzu edilen değil, aynı zamanda gereklidir. Yukarıdaki iki tabloyu tekrar düşünün. Diyelim ki Sayak’ın hangi akımlara (stream) kaydolduğunu bulmak istiyorsunuz. Bu sorunun yanıtını almak için iki tabloyu birleştirmeniz (alt sorgular da kullanılabilir, ancak bunu şimdilik dikkate almayalım) ve buna göre ilerlemeniz gerekir.
İki tablonun birleştirilebilmesi için aralarında ortak bir şey olmalıdır. Bu, her iki tabloda da adı aynı olan en az bir sütun olması gerektiği anlamına mı gelir? Yoksa koşul tam olarak nedir?
Birleştirmek istediğiniz tablolarda adı aynı olan bir sütun bulunması şart değildir, ancak mantıksal olarak aynı olmalıdırlar; yani veri türleri aynı olmalıdır. Adı aynı ama veri türleri farklı olan sütunlara sahip iki tabloyu birleştiremezsiniz. Şimdi farklı SQL join türlerini inceleyelim.
Farklı SQL Join türleri
Bu bölümde birkaç SQL Join türünü inceleyeceksiniz -
- INNER JOIN
- Self-join
- OUTER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
- CROSS JOIN
- Semi-join ve Anti-join
PostgreSQL, büyük harflerle belirtilen bu join türleri için ayrı anahtar sözcükler sağlar. Şimdi bunların her birini tek tek inceleyelim. Bunun için önce join’ları görsel olarak ele alacak, ardından PostgreSQL’de ilgili join sorgularını çalıştıracaksınız.
INNER JOIN
INNER JOIN’ı görsel olarak anlamak için aşağıdaki diyagrama bakın -

Yukarıdaki örnekte, dikkate alınan sütun id sütunudur. INNER JOIN, her iki tabloda da ortak olmayan değerlere sahip kalan sütunları yok sayacaktır. Şimdi PostgreSQL’de, iki tablo (student_name ve student_stream) arasında INNER JOIN gerçekleştirecek bir sorgu çalıştıralım.
Aşağıdaki sorguyu çalıştırdığınızda, yukarıdaki şekilde sunulan sonucu elde edersiniz -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;
s1 ve s2 iki tablo için takma adlardır. INNER JOIN ile birlikte ON anahtar sözcüğünü kullandınız. Sorgu USING anahtar sözcüğüyle de çalıştırılabilir -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);
Self Join, aynı tabloyu birleştirmenize olanak tanır. Peki bu nerede iyi bir seçenek olabilir? Diyelim ki aşağıdaki sütunlardan oluşan bir tablonuz var -
- Country
- Continent
Şimdi, kıtaları aynı olan iki ülkeyi listelemek istiyorsunuz. Aşağıdaki şekil beklenen sonuçlara dair bir fikir verecektir -

OUTER JOIN
OUTER JOIN üç türe ayrılabilir -
LEFT JOIN veya Left Outer JOIN: Aşağıdaki diyagram, SQL’de LEFT JOIN hakkında genel bir fikir verir -

Not: INNER JOIN’dan farklı olarak, LEFT JOIN sağ tablodaki (sorgunuzda belirttiğiniz sıraya göre) eşleşen bir girişi olmayan sol tablodaki kayıtları da getirir. Bu da size Sameer ve Rick’in herhangi bir akıma kaydolmadığını gösterir. Buna ilişkin sorgu şöyle olacaktır -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;
RIGHT JOIN veya Right Outer JOIN : RIGHT JOIN, LEFT JOIN’in tam tersidir -

RIGHT JOIN, hiçbir öğrencinin kaydolmadığı akım(lar)ı bulmanıza yardımcı olabilir. Bunun için sorgu şöyle olacaktır -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;
FULL JOIN veya Full Outer JOIN: FULL JOIN, LEFT JOIN ve RIGHT JOIN’i tek bir bütünlemede birleştirmenizi sağlar -

İlgili sorgu şöyle olacaktır -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;
Not: Yukarıdaki tüm OUTER JOIN sorgularını USING anahtar sözcüğüyle de çalıştırabilirsiniz. Şimdi CROSS JOIN’i inceleyelim.
CROSS JOIN
CROSS JOIN özünde, SQL kullanılarak ifade edilen iki öğe arasındaki Kartezyen çarpımdır. Diyelim ki iki tablo arasında ya da tek bir tablo içinde mümkün olan tüm kombinasyonlara ihtiyacınız var. Bunu yapmak için CROSS JOIN’e ihtiyacınız olacak. Aşağıdaki şekil bu kavramı görsel olarak sunar -

Bunu denemek için zaten iki tablonuz var. student_name ve student_stream tablolarının id sütunları arasındaki tüm olası kombinasyonları elde etmek için aşağıdaki sorguyu çalıştırabilirsiniz -
SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;
Ve aşağıdaki sonucu elde edersiniz -

Şimdi PostgreSQL’in doğrudan anahtar sözcük sağlamadığı diğer iki join türüne bakalım.
Semi-join ve Anti-join
Eğitimin başlarında oluşturduğunuz tabloları ele alalım:

Semi Join sorguları genellikle alt sorgular şeklinde çalıştırılır; burada birinci tablodan, ikinci tabloda eşleşen bir koşula (veya koşul kümesine) göre satırlar seçilir. Sol tabloyu birinci tablo, sağ tabloyu ise ikinci tablo olarak varsayalım.
Anti Join sorguları ise tam tersidir. Anti Join’da, birinci tablodan, ikinci tabloda eşleşmeyen bir koşula (veya koşul kümesine) göre satırlar seçilir. Bunu görsel olarak anlamanız için bir diyagram -

Semi Join’ı gerçekleştiren sorgu şöyle olacaktır -
select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Benzer şekilde, bu durumda Anti Join’ı gerçekleştiren sorgu şöyle olacaktır -
select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Yukarıdaki sorguda NOT kullanımına dikkat edin.
SQL Join ustalığınızı bir üst seviyeye taşımak
Bu eğitim bu kadar. Bu eğitimde bir dizi farklı SQL Join türünü incelediniz ve PostgreSQL sözdizimlerine de aşina oldunuz. Zorlu SQL Join alıştırmaları yapmak istiyorsanız, DataCamp’in SQL’de Verileri Birleştirme kursunu alabilirsiniz. Nitekim bu eğitimi hazırlarken kurstan materyaller referans olarak kullanılmıştır.
Sorularınızı Yorumlar bölümünde paylaşın.