JOIN: Tablo Verilerini Birleştirme

PostgreSQL JOIN: Birden Çok Tablodan Veri Birleştirme

PostgreSQL eğitim serimize tekrar hoş geldiniz! Bu derste, PostgreSQL'de, ilişkili sütunlara dayalı olarak iki veya daha fazla tabloyu birleştirmenize olanak tanıyan güçlü bir özellik olan JOIN komutunu inceleyeceğiz. JOIN'leri anlamak, ilişkisel veritabanlarında etkili sorgulamalar yapmak için çok önemlidir.

JOIN'lere Giriş

PostgreSQL'de, JOIN ifadesi, ilişkili bir sütuna dayalı olarak iki veya daha fazla tablodan satırları birleştirmek için kullanılır. JOIN'ler, verilerin birden fazla tabloya dağıtıldığı durumlarda veri elde etmek için temeldir.

Temel Sözdizimi

SELECT sütunlar
FROM tablo1
JOIN tablo2 ON tablo1.sütun_adi = tablo2.sütun_adi;
  • SELECT: Elde etmek istediğiniz sütunları belirtir.
  • FROM: Birincil tabloyu belirtir.
  • JOIN: Diğer tabloda satırları birleştirir.
  • ON: Satırların eşleştiği koşulu belirtir.

PostgreSQL'de JOIN Türleri

PostgreSQL, çeşitli JOIN türlerini destekler:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
  • CROSS JOIN

Her JOIN türüne örneklerle bakalım.

1. INNER JOIN

Bir INNER JOIN, iki tabloda da eşleşen satırlar olduğunda sonuç döndürür.

Örnek: Kitapları ve yazarlarının isimlerini getir

Diyelim ki bir books tablomuz ve bir authors tablomuz var. Kitap başlıklarını yazarlarının isimleriyle birlikte almak için:

SELECT books.title, authors.name
FROM books
INNER JOIN authors ON books.author = authors.name;

Şema Başlatmayı Görüntüle

Açıklama:

  • books ve authors tablolarını, books tablosundaki author sütunu ile authors tablosundaki name sütunu eşleştirildiğinde birleştiririz.
  • Sadece her iki tabloda eşleşen yazara sahip satırlar döndürülür.

2. LEFT JOIN

Bir LEFT JOIN, sol tablodaki tüm satırları ve sağ tablodan eşleşen satırları döndürür. Sağ tablodan eşleşmeyen satırlar için sonuç NULL olur.

Örnek: Yazar tablosunda karşılık gelmeyen yazarları da içeren tüm kitapları ve yazarlarını getir

SELECT books.title, authors.name
FROM books
LEFT JOIN authors ON books.author = authors.name;

Açıklama:

  • Tüm kitaplar döndürülür.
  • Eğer bir kitabın yazarı authors tablosunda bulunamazsa, authors.name değeri NULL olacaktır.

3. RIGHT JOIN

Bir RIGHT JOIN, sağ tablodaki tüm satırları ve sol tablodan eşleşen satırları döndürür. Sol tablodaki eşleşmeyen satırlar için sonuç NULL olur.

Örnek: Kitap yazmamış olan yazarlar dahil tüm yazarları ve kitaplarını getir

SELECT books.title, authors.name
FROM books
RIGHT JOIN authors ON books.author = authors.name;

Açıklama:

  • Tüm yazarlar döndürülür.
  • Eğer bir yazarın books tablosunda bir kitabı yoksa, books.title değeri NULL olacaktır.

4. FULL OUTER JOIN

Bir FULL OUTER JOIN, iki tablodan birinde eşleşme olduğunda tüm satırları döndürür. Eşleşmeyen satırlarda, eşleşmeyen tabloya ait sütunlarda NULL değerleri olur.

Örnek: Eşleşmeyen kayıtları da içeren tüm kitapları ve yazarları getir

SELECT books.title, authors.name
FROM books
FULL OUTER JOIN authors ON books.author = authors.name;

Açıklama:

  • Hem LEFT hem de RIGHT JOIN'lerin sonuçlarını birleştirir.
  • Tüm kitaplar ve yazarlar listelenir, eşleşmeyen alanlar NULL olur.

5. CROSS JOIN

Bir CROSS JOIN, tabloların satırları arasında Kartezyen çarpım üretir. İlk tablodaki her satırı ikinci tablodaki tüm satırlarla birleştirir.

Örnek: Kitaplar ve filmler arasında tüm olası kombinasyonları üret

Filmlerin yer aldığı bir movies tablomuz olduğunu varsayalım:

SELECT books.title AS book_title, movies.title AS movie_title
FROM books
CROSS JOIN movies;

Açıklama:

  • Her kitap başlığı her film başlığı ile eşleşir.
  • Kombinasyonlar veya test amaçları için kullanışlıdır.

Birden Fazla Tabloyu Birleştirme

Tek bir sorguda ikiden fazla tabloyu birleştirebilirsiniz.

Örnek: Kitap başlıklarını, yazarları ve ilgili filmleri getir

Bir book_movies tablosunun kitapları ve filmleri birleştirdiğini varsayalım:

-- book_movies tablosunun book_title ve movie_title sütunlarına sahip olduğunu varsayın
 
SELECT books.title, authors.name, movies.title
FROM books
INNER JOIN authors ON books.author = authors.name
INNER JOIN book_movies ON books.title = book_movies.book_title
INNER JOIN movies ON book_movies.movie_title = movies.title;

Açıklama:

  • books tablosu önce authors, ardından book_movies ve movies tablolarıyla birleştirilir.
  • Sadece tüm tablolarda eşleşen kayıtlar döndürülür.

Tablo Takma İsimleri Kullanma

Takma isimler, özellikle birden fazla tablo ile çalışırken sorguları daha okunabilir hale getirir.

Örnek: Takma isimlerle sorguyu netleştir

SELECT b.title, a.name
FROM books AS b
INNER JOIN authors AS a ON b.author = a.name;
  • b ve a, sırasıyla books ve authors tabloları için takma adlardır.

Self JOIN

Bir Self JOIN, bir tabloda kendiyle bağlantı kurulan bir JOIN işlemidir.

Örnek: Aynı fiyata sahip kitapları bul

SELECT b1.title AS book1, b2.title AS book2, b1.price
FROM books AS b1
INNER JOIN books AS b2 ON b1.price = b2.price AND b1.title <> b2.title;

Açıklama:

  • Aynı fiyatlara sahip ancak başlıkları farklı olan kitapları bulmak için books tablosu kendiyle birleştirilir.
  • Aynı tablo içindeki yinelenen veya ilişkili kayıtları bulmak için kullanışlıdır.

USING İfadesi ile JOIN

USING ifadesi, her iki tablo da aynı ada sahip bir sütuna sahipse, birleştirme koşulunu basitleştirir.

Örnek: Birleştirme koşulunu basitleştir

SELECT books.title, authors.name
FROM books
INNER JOIN authors USING (name);

Not: Şemamızda, books tablosunda author, authors tablosunda ise name adlı sütunlar bulunur. Sütun adları farklı olduğu için, USING ancak sütun adları aynı olduğunda uygulanabilir.

NATURAL JOIN

Bir NATURAL JOIN, aynı ada sahip sütunlara dayanarak tabloları otomatik olarak birleştirir.

Örnek: Ortak sütun adlarına sahip tablo arasında doğal birleştirme yap

-- Her iki tabloda da 'author' adında bir sütun varsa
 
SELECT *
FROM books
NATURAL JOIN authors;

Dikkat: NATURAL JOIN dikkatle kullanılmalıdır, çünkü istemediğiniz sütunlarda da eşleşme yapabilir.

Sonuç

PostgreSQL'de JOIN'ler, birden fazla tablo arasında veri sorgulama konusunda hayati öneme sahiptir. JOIN'leri ustalıkla kullanarak, ilişkisel verilerden değerli bilgiler elde edebileceğiniz karmaşık sorgular yazabilirsiniz.

Önemli Noktalar:

  • INNER JOIN: İki tablodaki eşleşen satırları döndürür.
  • LEFT JOIN: Sol tablodaki tüm satırları ve sağ tablodaki eşleşen satırları döndürür.
  • RIGHT JOIN: Sağ tablodaki tüm satırları ve sol tablodaki eşleşen satırları döndürür.
  • FULL OUTER JOIN: Bir tabloda eşleşme olduğunda tüm satırları döndürür.
  • CROSS JOIN: Her iki tablonun Kartezyen çarpımını döndürür.
  • Okunabilirliği artırmak için tablo takma isimleri kullanın.
  • NATURAL JOIN ve USING ifadelerinde dikkatli olun.

Schema Initialization

-- Create the books table
CREATE TABLE books (
    title VARCHAR(255),
    author VARCHAR(255),
    price NUMERIC(10, 2),
    pages INTEGER
);
 
-- Insert sample data into the books table
INSERT INTO books (title, author, price, pages) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald', 10.99, 180),
('To Kill a Mockingbird', 'Harper Lee', 7.99, 281),
('1984', 'George Orwell', 8.99, 328),
('Pride and Prejudice', 'Jane Austen', 6.99, 279),
('The Catcher in the Rye', 'J.D. Salinger', 9.99, 214),
('Moby-Dick', 'Herman Melville', 11.99, 635),
('War and Peace', 'Leo Tolstoy', 12.99, 1225);
 
-- Create the authors table
CREATE TABLE authors (
    name VARCHAR(255)
);
 
-- Insert sample data into the authors table
INSERT INTO authors (name) VALUES
('F. Scott Fitzgerald'),
('Harper Lee'),
('George Orwell'),
('Jane Austen'),
('J.D. Salinger'),
('Herman Melville'),
('Leo Tolstoy');
 
-- Create the movies table
CREATE TABLE movies (
    title VARCHAR(255)
);
 
-- Insert sample data into the movies table
INSERT INTO movies (title) VALUES
('The Shawshank Redemption'),
('The Godfather'),
('The Dark Knight'),
('Pulp Fiction'),
('The Lord of the Rings');

Verileri anlamak için örneklerle oynayın ve sorgularını değiştirerek PostgreSQL JOIN'lerini daha derinlemesine öğrenin. İyi sorgulamalar!