SELECT deyimini inceleme
Transact-SQL veya T-SQL, Microsoft SQL ürün ve hizmetleri tarafından kullanılan ANSI standart SQL dilinin diyalektlerinden biridir. Standart SQL'e benzer. Odak noktamızın çoğu, herhangi bir DML deyiminin açık ara en çok seçeneğini ve varyasyonunu içeren SELECT deyiminde olacaktır.
Select deyiminin nasıl işlendiğine üst düzey bir bakış atarak başlayalım. SELECT deyiminin yazıldığı sıra, SQL Server veritabanı altyapısı tarafından değerlendirildiği ve işlendiği sıra değildir.
Aşağıdaki sorguyu göz önünde bulundurun:
SELECT OrderDate, COUNT(OrderID) AS Orders
FROM Sales.SalesOrder
WHERE Status = 'Shipped'
GROUP BY OrderDate
HAVING COUNT(OrderID) > 1
ORDER BY OrderDate DESC;
Sorgu, her biri alınan verilere uygulanması gereken belirli bir işlemi tanımlayan birden çok yan tümceden oluşan bir SELECT deyiminden oluşur. İşlemlerin çalışma zamanı sırasını incelemeden önce, çeşitli yan tümcelerin ayrıntıları bu modülde ele alınmasa da bu sorgunun ne yaptığına kısaca göz atalım.
SELECT yan tümcesi OrderDate sütununu ve SiparişKimliği değerlerinin sayısını döndürür; bu değer, Orders adını (veya diğer adını) atar:
SELECT OrderDate, COUNT(OrderID) AS Orders
FROM yan tümcesi, sorgunun satırlarının kaynağı olan tabloyu tanımlar; bu durumda Sales.SalesOrder tablosudur:
FROM Sales.SalesOrder
WHERE yan tümcesi sonuçların dışında kalan satırları filtreler ve yalnızca belirtilen koşulu karşılayan satırları tutar; bu durumda, durumu "sevk edildi" olan siparişler:
WHERE Status = 'Shipped'
GROUP BY yan tümcesi, filtre koşuluna uygun satırları alır ve bunları OrderDate'a göre gruplandırır, böylece aynı OrderDate'a sahip tüm satırlar tek bir grup olarak kabul edilir ve her grup için bir satır döndürülür:
GROUP BY OrderDate
Gruplar oluşturulduktan sonra HAVING yan tümcesi grupları kendi koşuluna göre filtreler. Sonuçlara yalnızca birden fazla sipariş içeren tarihler eklenir:
HAVING COUNT(OrderID) > 1
Bu sorgunun önizlemesini görüntüleme amacıyla, son yan tümcesi, çıkışı Azalan DüzenTarihi düzenine göre sıralayan ORDER BY yan tümcesidir:
ORDER BY OrderDate DESC;
Artık her yan tümcenin ne yaptığını gördüğünüze göre, SQL Server'ın bunları gerçekten değerlendirme sırasına bakalım:
- FROM yan tümcesi, deyiminin geri kalanı için kaynak satırları sağlamak üzere ilk olarak değerlendirilir. Bir sanal tablo oluşturulur ve sonraki adıma geçirilir.
- WHERE yan tümcesi, bir koşulla eşleşen kaynak tablodan bu satırları filtreleyerek değerlendirilecek. Filtrelenen sanal tablo sonraki adıma geçirilir.
- Sırada GROUP BY vardır ve sanal tablodaki satırları GROUP BY listesinde bulunan benzersiz değerlere göre düzenler. Grup listesini içeren yeni bir sanal tablo oluşturulur ve sonraki adıma geçirilir. İşlem akışının bu noktasından, yalnızca GROUP BY listesindeki veya toplama işlevlerindeki sütunlara diğer öğeler tarafından başvurulabilir.
- HAVING yan tümcesi daha sonra değerlendirilerek tüm grupların koşuluna göre filtrelenmesi sağlanır. 3. adımda oluşturulan sanal tablo filtrelenip sonraki adıma geçirilir.
- SELECT yan tümcesi son olarak yürütülür ve sorgu sonuçlarında hangi sütunların görüneceği belirlenir. SELECT yan tümcesi diğer adımlarda değerlendirildiğinden, burada oluşturulan tüm sütun diğer adları (bizim örneğimizde , Siparişler) GROUP BY veya HAVING yan tümcesinde kullanılamaz.
- ORDER BY yan tümcesi, satırları sütun listesine göre belirlenen şekilde sıralayarak yürütülecek son yan tümcedir.
Bu anlayışı örnek sorgumuza uygulamak için yukarıdaki SELECT deyiminin çalışma zamanındaki mantıksal sıra aşağıda verilmiştir:
FROM Sales.SalesOrder
WHERE Status = 'Shipped'
GROUP BY OrderDate
HAVING COUNT(OrderID) > 1
SELECT OrderDate, COUNT(OrderID) AS Orders
ORDER BY OrderDate DESC;
Yazdığınız her SELECT deyiminde tüm olası yan tümceler gerekli değildir. Tek gerekli yan tümce, bazı durumlarda kendi başına kullanılabilen SELECT yan tümcesidir. Sorgulanan tabloyu tanımlamak için genellikle from yan tümcesi de eklenir. Ayrıca Transact-SQL'in eklenebilecek başka yan tümceleri de vardır.
Gördüğünüz gibi, T-SQL sorgularını mantıksal olarak değerlendirildikleri sırada yazmazsınız. Değerlendirmenin çalışma zamanı sırası, yan tümcenin yalnızca önceden işlenmiş bir yan tümceden sağlanan bilgilere erişimi olduğundan hangi yan tümceler için hangi verilerin kullanılabilir olduğunu belirler. Bu nedenle, sorgu yazarken gerçek mantıksal işlem sırasını anlamak önemlidir.
Tüm sütunları seçme
SELECT yan tümcesi genellikle SELECT listesi olarak adlandırılır çünkü sorgunun sonuçlarında döndürülecek değerleri listeler.
SELECT yan tümcesinin en basit biçimi, tüm sütunları döndürmek için yıldız karakteri (*) kullanılmasıdır. T-SQL sorgularında kullanıldığında buna yıldız adı verilir. SELECT * hızlı test için uygun olsa da, aşağıdaki nedenlerle üretim çalışmalarında kullanmaktan kaçınmalısınız:
- Tablodaki sütunları ekleyen veya yeniden düzenleyen değişiklikler sorgu sonuçlarına yansıtılır ve bu da sorguyu kullanan uygulamalar veya raporlar için beklenmeyen bir çıkışa neden olabilir.
- Gerekli olmayan verilerin döndürülmesi sorgularınızı yavaşlatabilir ve kaynak tabloda çok sayıda satır varsa performans sorunlarına neden olabilir.
Örneğin, aşağıdaki örnek (varsayımsal) Production.Product tablosundaki tüm sütunları alır.
SELECT * FROM Production.Product;
Bu sorgudan elde edilen sonuç, tablonun tüm satırları için tüm sütunları içeren bir satır kümesidir ve şöyle görünebilir:
ProductID
Veri Akışı Adı
ÜrünNo
Renk
Standart Maliyet
ListPrice
Boyut
Ağırlık
ProductCatID
680
HL Yol Çerçevesi - Siyah, 58
FR-R92B-58
Siyah
1059.31
1431.5
58
1016.04
18
706
HL Yol Çerçevesi - Kırmızı, 58
FR-R92R-58
Kırmızı
1059.31
1431.5
58
1016.04
18
Kategori 707
Spor-100 Kask, Kırmızı
HL-U509-R
Kırmızı
13.0863
34.99
35
708
Spor-100 Kask, Siyah
HL-U509
Siyah
13.0863
34.99
35
...
...
...
...
...
...
...
...
...
Belirli sütunları seçme
Açık sütun listesi, tam olarak hangi sütunların ve hangi sırayla döndürülecekleri üzerinde denetim sahibi olmanıza olanak tanır. Sonuçtaki her sütun üst bilgi olarak sütunun adına sahip olur.
Örneğin, aşağıdaki sorguyu göz önünde bulundurun; bu da yine varsayımsal Production.Product tablosunu kullanır.
SELECT ProductID, Name, ListPrice, StandardCost
FROM Production.Product;
Bu kez sonuçlar yalnızca belirtilen sütunları içerir:
ProductID
Veri Akışı Adı
ListPrice
Standart Maliyet
680
HL Yol Çerçevesi - Siyah, 58
1431.5
1059.31
706
HL Yol Çerçevesi - Kırmızı, 58
1431.5
1059.31
Kategori 707
Spor-100 Kask, Kırmızı
34.99
13.0863
708
Spor-100 Kask, Siyah
34.99
13.0863
...
...
...
...
İfade seçme
Select yan tümcesi, belirtilen tabloda depolanan sütunları almaya ek olarak, sütunları ve değerleri veya birden çok sütunu birleştirmek için işleçler kullanan hesaplamalar ve işlemeler gerçekleştirebilir. Hesaplamanın veya düzenlemenin sonucu, sonuçta ayrı bir sütun olarak görünecek tek değerli (skaler) bir sonuç olmalıdır.
Örneğin, aşağıdaki sorgu iki ifade içerir:
SELECT ProductID,
Name + '(' + ProductNumber + ')',
ListPrice - StandardCost
FROM Production.Product;
Bu sorgunun sonuçları şuna benzer olabilir:
ProductID
680
HL Yol Çerçevesi - Siyah, 58(FR-R92B-58)
372.19
706
HL Yol Çerçevesi - Kırmızı, 58(FR-R92R-58)
372.19
Kategori 707
Spor-100 Kask, Kırmızı (HL-U509-R)
21.9037
708
Spor-100 Kask, Siyah(HL-U509)
21.9037
...
...
...
Bu sonuçlarla ilgili dikkate alınacak birkaç ilginç nokta vardır:
- İki ifade tarafından döndürülen sütunların sütun adı yoktur. Sorgunuzu göndermek için kullandığınız araçlara bağlı olarak, eksik sütun adı boş bir sütun başlığı, değişmez değer "sütun adı yok" göstergesi veya column1 gibi varsayılan bir adla gösterilebilir. Bu bölümün devamında sorguda sütun adı için bir diğer ad belirtmeyi göreceğiz.
- İlk ifade, dize (karakter tabanlı) değerleri birleştirmek için işlecini kullanırken + , ikinci ifade bir sayısal değeri başka bir sayısal değerden çıkarmak için işlecini kullanır - . Sayısal değerlerle kullanıldığında, + işleç toplama gerçekleştirir. Bu durumda, ifadelere eklediğiniz sütunların veri türlerini anlamak önemlidir. Sonraki bölümde veri türlerini ele alacağız.
Sütun diğer adlarını belirtme
SELECT sorgusu tarafından döndürülen her sütun için kaynak sütun adına alternatif olarak veya bir ifadenin çıkışına bir ad atamak için bir diğer ad belirtebilirsiniz.
Örneğin, aşağıda öncekiyle aynı sorgu verilmiştir ancak sütunların her biri için diğer adlar belirtilmiştir:
SELECT ProductID AS ID,
Name + '(' + ProductNumber + ')' AS ProductName,
ListPrice - StandardCost AS Markup
FROM Production.Product;
Bu sorgunun sonuçları belirtilen sütun adlarını içerir:
Kimlik
ProductName
İşaretleme
680
HL Yol Çerçevesi - Siyah, 58(FR-R92B-58)
372.19
706
HL Yol Çerçevesi - Kırmızı, 58(FR-R92R-58)
372.19
Kategori 707
Spor-100 Kask, Kırmızı (HL-U509-R)
21.9037
708
Spor-100 Kask, Siyah(HL-U509)
21.9037
...
...
...
Not
AS anahtar sözcüğü bir diğer ad belirtirken isteğe bağlıdır, ancak bunu açıklama için eklemek iyi bir uygulamadır.
Sorguları biçimlendirme
Bu bölümdeki örneklerde sorgu kodunuzu biçimlendirme konusunda esnek olabileceğinizi belirtebilirsiniz. Örneğin, her yan tümceyi (veya sorgunun tamamını) tek bir satıra yazabilir veya birden çok satıra bölebilirsiniz. Çoğu veritabanı sisteminde kod büyük/küçük harfe duyarlı değildir ve T-SQL dilinin bazı öğeleri isteğe bağlıdır (daha önce belirtildiği gibi AS anahtar sözcüğü ve hatta deyimin sonundaki noktalı virgül dahil).
T-SQL kodunuzu kolayca okunabilir hale getirmek için aşağıdaki yönergeleri göz önünde bulundurun (ve bu nedenle anlaşılması ve hata ayıklaması daha kolay!):
- SELECT, FROM, AS gibi T-SQL anahtar sözcüklerini büyük harfe çevirme. Anahtar sözcükleri büyük harfe çevirme, karmaşık bir deyimin her yan tümcesini bulmayı kolaylaştıran yaygın olarak kullanılan bir kuraldır.
- Bir deyiminin her ana yan tümcesi için yeni bir satır başlatın.
- SELECT listesinde birkaçtan fazla sütun, ifade veya diğer ad varsa, her sütunu kendi satırında listelemeyi göz önünde bulundurun.
- Hangi kodun her bir ana yan tümceye ait olduğunu net hale getirmek için alt başlıklar veya sütunlar içeren satırları girintileme.