Bu yazıda SQL join ile sorgulama ve kullanılacak türlerinin birbirlerinden farkları üzerinde durulacaktır. Farklı tabloların içeriğini birleştirmek için join işlemi sıkça kullanılır. Ana join türleri inner, left, right ve full outer join işlemleri küme (venn) şeması yöntemi kullanılarak aşağıda anlatılmıştır.

Join sorgu örneklerinde kullanılacak customers ve orders tabloların venn şema gösterimini Şekil1’de görebilirsiniz.

Table Venn şema gösterimi
Şekill: Table Venn şema gösterimi

Örnek Tablo Oluşturma Scripti:

/****** Object:  Table [dbo].[Customers]   ******/

CREATE TABLE [dbo].[Customers](
	[CustomerId] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
	[CustomerId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

/****** Object:  Table [dbo].[Orders] ******/

CREATE TABLE [dbo].[Orders](
	[OrderId] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](50) NULL,
	[CustomerId] [int] NULL,
 CONSTRAINT [PK__Orders__630B995662511101] PRIMARY KEY CLUSTERED 
(
	[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Örnek Data Yükleme Scripti:

/****** Data:  Table [dbo].[Customers]   ******/

INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (1, N'Cade Weeks');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (2, N'Patrick P. Morrow');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (3, N'Hedda X. Kaufman');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (4, N'Neville I. Yang');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (5, N'Kai N. Higgins');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (6, N'Teagan R. Mccormick');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (7, N'Alisa Aguirre');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (8, N'Hall G. Orr');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (9, N'Quinn V. Sutton');
INSERT [dbo].[Customers] ([CustomerId], [Name]) VALUES (10, N'Savannah Hooper');

/****** Data:  Table [dbo].[Orders] ******/

INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (1, N'Ford Fiesta', 4);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (2, N'Renault Clio', 8);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (3, N'Volkswagen Jetta', 2);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (4, N'Opel Corsa', NULL);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (5, N'Ford Escape', 6);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (6, N'Chevrolet Impala', NULL);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (7, N'Ford Fusion', 3);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (8, N'Volkswagen Jetta', 9);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (9, N'Ford Focus', 3);
INSERT [dbo].[Orders] ([OrderId], [Name], [CustomerId]) VALUES (10, N'Toyota Corolla', 2);

Inner Join

Inner join en çok kullanılan join türüdür ve iki tablo arasındaki ortak kayıtları getirir. Aşağıdaki venn şemasında gösterildiği gibi iki tablonun kesişiminin datasını verir.

Şekil: SQL Inner Join Venn Şema

Customers ve orders tablolarını aşağıda verilen inner join sorgusu ile birleştirildiğinde sorgunun sonucu sadece eşleşen kayıtları getirir, yani gösterilen veriler içinde müşterinin kendisi ve siparişi mutlaka olması gerekir. Eğer kayıtların içerisinde birinden biri yok ise o müşteriye ait satış bilgisinin hiçbir detayını göremezsiniz.

Sorgu:

SELECT *
FROM [dbo].[Customers] c
INNER JOIN [dbo].[Orders] o
ON c.CustomerId=o.CustomerId

Çıktı:

CustomerIdNameOrderIDNameCustomerID
4Neville I. Yang1Ford Fiesta4
2Patrick P. Morrow2Renault Clio2
2Patrick P. Morrow3Volkswagen Jetta2
6Teagan R. Mccormick5Ford Escape6
3Teagan R. Mccormick7Ford Escape3
9Quinn V. Sutton8Volkswagen Jetta9
3Hedda X. Kaufman9Ford Focus3
2Patrick P. Morrow10Ford Focus2
Tablo:

Sonuç kümesinin ilk iki kolonu customers tablosundan diğer iki kolon ise orders tablosuna aittir. Her iki tablonun CustomerId kolonlarına bakarsanız birebir eşleştiğini görüyorsunuz. Sorgu, iki tablonun kesişim verisini getirmiştir.

Left Outer Join

İsminden de anlaşılacağı üzere sol tarafta olan küme demektir. Örnek verecek olursa, customerId ve name alanlarından oluşan bir müşteri tablosu olsun, birde orderId, name ve customerId alanlarından oluşan birde sipariş tablosu. Müşteri bilgisinin yanına sipariş bilgisini de getirmek istiyorsak left join kullanılır.

Şekil: Left Outer Join Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
LEFT OUTER JOIN [dbo].[Orders] o
ON c.customerid=o.customerid

Çıktı:

CustomerIDNameOrderIDNameCustomerID
1Cade WeeksNULLNULLNULL
2Patrick P. Morrow3Volkswagen Jetta2
2Patrick P. Morrow3Toyota Corolla2
3Hedda X. Kaufman10Ford Fusion3
3Hedda X. Kaufman7Ford Focus3
4Neville I. Yang1Ford Fiesta4
5Kai N. HigginsNULLNULLNULL
6Teagan R. Mccormick5Ford Escape6
7Alisa AguirreNULLNULLNULL
8Hall G. Orr2Renault Clio8
9Quinn V. Sutton8Volkswagen Jetta9
10Savannah HooperNULLNULLNULL
Tablo:

Siparişi olmayan müşterileri bulmak için LEFT JOIN IS NULL kullanılır:

Şekil: Left Outer Join Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
LEFT OUTER JOIN [dbo].[Orders] o
ON c.customerID=o.customerID
WHERE o.CustomerID IS NULL

Çıktı:

CustomerIDNameOrderIDCustomerID
1Cade WeeksNULLNULL
5Kai N. HigginsNULLNULL
7Alisa AguirreNULLNULL
10Hall G. OrrNULLNULL

Right Outer Join

Sağdaki tablo üzerinden işlem yapılmak istenirse kullanılır. Oders tablosundaki veriler koşulsuz gelirken Customers tablosundan eşleştirebildiklerini (bu kısımlar kesişim bölümüne karşılık gelir) getirir, eşleştiremeyen kayıtlar NULL olarak getirir.


Şekil: Right Outer Join Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
RIGHT OUTER JOIN [dbo].[Orders] o
ON c.customerID=o.customerID

Çıktı:

CustomerIDNameOrderIDCustomerID
4Neville I. Yang14
2Patrick P. Morrow22
2Patrick P. Morrow32
NULLNULL4NULL
6Teagan R. Mccormick56
NULLNULL6NULL
3Hedda X. Kaufman73
9Quinn V. Sutton89
3Hedda X. Kaufman93
2Patrick P. Morrow102
Tablo:

Müşeri bilgisi olmayan sipariş kayıtlarını bulmak için RIGHT JOIN IS NULL kullanılır:

Şekil: RightOuter Join Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
RIGHT OUTER JOIN [dbo].[Orders] o
ON o.customerID=c.customerID
WHERE
o.customerID IS NULL

Çıktı:

CustomerIDNameOrderIDCustomerID
NULLNULL4NULL
NULLNULL6NULL

Full Outer Join

İki tablodaki eşleşen kayıtlar ve eşleşmeyen sol ve sağ kayıtlar için kullanılan join türüdür. LEFT ve RIGHT Join birleşimidir.

Şekil: Full Outer Join Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
FULL OUTER JOIN [dbo].[Orders] o
ON c.customerid=o.customerid

Çıktı:

CustomerIDNameOrderIDCustomerID
1Cade WeeksNULLNULL
2Patrick P. Morrow22
2Patrick P. Morrow32
2Patrick P. Morrow102
3Hedda X. Kaufman73
3Hedda X. Kaufman93
4Neville I. Yang14
5Kai N. HigginsNULLNULL
6Teagan R. Mccormick56
7Alisa AguirreNULLNULL
8Hall G. OrrNULLNULL
9Quinn V. Sutton89
10Savannah HooperNULLNULL
NULLNULL4NULL
NULLNULL6NULL
Tablo
Şekil: Full Outer Join / Is Null Venn Şema

Sorgu:

SELECT *
FROM [dbo].[Customers] c
FULL OUTER JOIN [dbo].[Orders] o
ON o.customerID=c.customerID
WHERE
c.customerID IS NULL
OR o.CustomerID IS NULL

Çıktı:

CustomerIDNameOrderIDCustomerID
1Cade WeeksNULLNULL
5Kai N. HigginsNULLNULL
7Alisa AguirreNULLNULL
8Hall G. OrrNULLNULL
10Savannah HooperNULLNULL
NULLNULL4NULL
NULLNULL6NULL
Tablo:
Close