TOP

SQL Dersi 11. Tabloların gelişmiş birleşimi (OUTER JOIN)

Önceki bölümde, WHERE ve INNER JOIN cümlelerini kullanarak tabloları birleştirmenin en basit yollarını ele aldık. Bu kombinasyonlara iç kombinasyonlar veya eşdeğerlik kombinasyonları denir. Bununla birlikte, SQL'in cephaneliğinde tabloları birleştirmek için çok daha fazla seçenek vardır; yani başka tür birleştirmeler de vardır: dış birleştirmeler, doğal birleştirmeler ve kendi kendine birleştirmeler. Ancak önce tablolara nasıl takma ad atayabileceğimizi düşünelim, çünkü daha sonra alanların tam adlarını (Table.Field) kullanmak zorunda kalacağız, bunların kısaltmalar olmadan büyük uzunlukları nedeniyle çalıştırılması çok zor olacaktır.


1. Tablo takma adlarının kullanımı (Takma adlar)

Önceki bölümde, takma adların belirli tablo alanlarına veya hesaplanan alanlara atıfta bulunmak için nasıl kullanılabileceğini öğrendik. SQL ayrıca tablo adları yerine takma adlar kullanmamıza da olanak tanır. Bu bize daha kısa SQL sözdizimi gibi avantajlar sağlar ve aynı tabloyu SELECT ifadesinde birden çok kez kullanmamıza olanak tanır.

Run SQLSELECT Seller_name, SUM(Amount) AS Sum1 
FROM Sellers AS S, Sumproduct AS SP 
WHERE S.City = SP.City 
GROUP BY Seller_name

Her satıcı için satılan toplam mal miktarını gösterdik. SQL sorgumuzda şu takma adları kullandık: hesaplanan SUM(Amount) alanı için Sum1 takma adı, Sellers tablosu için S takma adı ve Sumproduct için SP takma adı. Tablo takma adlarının ORDER BY, GROUP BY ve diğerleri gibi diğer cümlelerde de kullanılabileceğini unutmayın.

2. Kendi kendine bağlantı (SELF JOIN)

Bir örnek düşünelim. Diyelim ki John Smith ile aynı ülkede ticaret yapan satıcıların adresini bilmemiz gerekiyor. Bunu yapmak için aşağıdaki isteği oluşturacağız:

Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country 
                 FROM Sellers 
                 WHERE Seller_name = 'John Smith')

Ayrıca aşağıdaki kodu yazarak bu sorunu kendi kendine bağlantı yoluyla çözebiliriz:

Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2 
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'

Bu sorunu çözmek için takma adlar kullanıldı. İlk kez Sellers tablosuna S1 takma adı, ikinci kez S2 takma adı atandı. Bu takma adlar daha sonra tablo adları olarak kullanılabilir. WHERE operatöründe, her alanın adına S1 önekini ekliyoruz, böylece DBMS hangi tablonun çıktılanması gerektiğini anlıyor (bir tablodan iki sanal tablo oluşturduğumuz için). WHERE yan tümcesi önce tabloları birleştirir ve ardından yalnızca gerekli değerleri döndürmek için ikinci tablonun verilerini Seller_name alanına göre filtreler.

Kendi kendine birleştirmeler genellikle SELECT dış operatörüyle aynı tablodan veri seçen alt sorguları değiştirmek için kullanılır. Nihai sonuç aynı olsa da, çoğu DBMS'nin süreci, alt sorgulardan çok daha hızlı birleşir. Hangi sorgunun daha hızlı çalıştığını belirlemek için deneme yapmaya değer.

3. Doğal kombinasyon

Doğal birleştirme, yalnızca tekrarlanmayan sütunları seçtiğiniz bir birleştirmedir. Bu genellikle bir tablo için (SELECT *) yazıp geri kalan tablolar için bir alan listesi belirterek yapılır. Örnek:

Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S 
WHERE SP.City = S.City

Bu örnekte joker karakter (*) yalnızca ilk tablo için kullanılmıştır. Diğer tüm sütunlar açıkça belirtildiğinden yinelenen sütunlar seçilmez.

4. Harici kombinasyon (OUTER JOIN)

Genellikle, birleştirme sırasında, bir tablonun satırları başka bir tablonun karşılık gelen satırlarına bağlanır, ancak bazı durumlarda, başka bir tabloda ilgili satırları olmayan satırların (yani tümünün) sonuca dahil edilmesi gerekebilir. bir tablodaki satırlar seçilir ve yalnızca diğerinden ilgili satırlar eklenir). Bu tür bir bağlantıya harici denir. Bunun için LEFT veya RIGHT ön ekiyle OUTER JOIN ... ON ... anahtar kelimeleri kullanılır.

Daha önce yeni bir satıcıyı (henüz satışı olmayan Semuel Piter) Sellers tablosuna ekleyen bir örneği ele alalım:

Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2 
LEFT OUTER JOIN Sumproduct 
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name

Bu taleple birlikte veri tabanındaki tüm satıcıların listesini çıkardık ve onlara tüm aylar için satılan toplam mal miktarını hesapladık. Yeni satıcı Semuel Piter için satış olmadığını görüyoruz. Eğer iç birleşim kullansaydık, Sumproduct tablosunda hiçbir kaydı olmadığından yeni satıcıyı göremeyiz. Sadece yazarak değil kombinasyonun yönünü de değiştirebiliriz. LEFT veya RIGHT, ancak aynı zamanda yalnızca tabloların sırasını değiştirerek (yani aşağıdaki iki kayıt aynı sonucu verecektir: Sellers LEFT OUTER JOIN Sumproduct ve Sumproduct RIGHT OUTER JOIN Sellers).

Ayrıca, bazı DBMS'ler, sırasıyla LEFT OUTER JOIN ve RIGHT OUTER JOIN'ye karşılık gelen *= ve =* işaretlerini kullanarak basitleştirilmiş bir kayıtta harici birleştirmelere izin verir. Böylece önceki sorgu şu şekilde yeniden yazılabilir:

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City

Ne yazık ki MS Access dış birleştirme için kısaltılmış bir kaydı desteklemiyor.

5. Tam dış birleştirme (FULL OUTER JOIN)

Ayrıca başka bir dış birleştirme türü daha vardır; her iki tablodaki tüm satırları görüntüleyen ve yalnızca ilişkilendirilebilecekleri birleştiren tam dış birleştirme. Tam bir dış birleştirmenin sözdizimi aşağıdaki gibidir:

SELECT Seller_name, Product
FROM Sellers 
FULL OUTER JOIN Sumproduct 
ON Sellers.City = Sumproduct.City

Yine tam dış birleştirme şu DBMS tarafından desteklenmemektedir: MS Access, MySQL, SQL Server ve Sybase. Bu adaletsizliğin üstesinden nasıl gelineceğini bir sonraki bölümde ele alacağız.