Ünite 6: Veri Sorgulama

Giriş

SQL (Yapılandırılmış Sorgu Dili) veri ile ilgili yapılacak işlemleri tarif etmek için İngilizce dil yapısında geliştirilmiş bir bildirim dilidir (Declarative language). Diğer programlama dillerinden farklı olarak işlemleri değil sonuçları tarif eden bir yapısı vardır. Dolayısıyla veritabanı yönetim sistemi tarafından SQL komutları çözümlenerek istenilen işlem yerine getirilir. İlişkisel veritabanı yönetim sistemlerinde tablolar hâlinde depolanan verilere ulaşmak için SQL dilinin Veri Sorgulama Dili (DQL- Data Query Language) komutları kullanılmaktadır. Bu komutlardan biri olan SELECT komutu, Verinin sadece okunması ile ilgilidir ve bu komutun çalışma prensibinin öğrenilmesi ilişkisel veritabanı sistemlerinin anlaşılmasında en önemli adımdır.

Seçme (Select) Komutu

SELECT ifadesi ilişkisel veritabanı yönetim sistemlerinde veri kayıtlarını getirmek için kullanılan komuttur. SELECT komutu VTYS’nin en fazla kullanılan komutudur. Farklı tablolarda depolanan verinin kullanıcıların ihtiyacına cevap verecek şekilde elde edilmesini sağlar. Genel yazım kuralı aşağıda verilen komutun köşeli parantez içerisinde belirtilen bölümleri isteğe bağlı seçeneklerdir:

SELECT alan_listesi
[INTO yeni_tablo]
[FROM tablo_kaynağı]
[WHERE seçme_koşulları]
[GROUP BY gruplama ifadeleri]
[HAVING Gruplanan_alan_kısıtlamaları]
[ORDER BY sıralama düzeni ASC DESC]

Seçme komutu İngilizce dil yapısına göre bir emir cümlesidir ve seç fiili ile başlamaktadır. Yukarıdaki Seçme sorgusunun yazım kuralında “Select alan_listesi” dışında yer alan kısımlar zorunlu değildir. Çalışabilecek en basit seçme sorgusuna örnek olarak “SELECT ‘Hello World’” verilebilir. FROM ile başlayan satır seçme işleminin hangi veri kümesinden yapılacağını belirtilir. Bu kısımda bir tablo, bir görünüm ya da bir alt sorgu yer alabilir. WHERE satırı seçme işleminde görüntülenecek ya da hesaba katılacak satırların sınırlanması sağlanır. Filtreleme işlemi gibi düşünülebilir. GROUP BY ifadesi verileri özetleme ya da gruplama işlemleri için kullanılabilecek bir seçme sorgusu bölümüdür. HAVING gruplanan ya da hesaplanan alanların sınırlanması için kullanılan bir kısımdır ve WHERE kısmı ile karıştırılmaması gerekir. ORDER BY sorgunun en sonunda yer alan sıralama işlemidir. Eylem gereği de tüm seçme işlemi tamamlandıktan sonra verinin kullanıcıya hangi sırada gönderileceği bu satıra yazılan komutlarla belirlenir. SELECT ifadesinin mantıksal işleme sırası aşağıdaki gibidir:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE or WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

Select sorgusuyla elde edilen bir veri kümesinin yeni bir tablo olarak kaydedilmesi için FROM ifadesinden önce INTO tablo_Adı ifadesi yazılmalıdır.

Seçme sorgularında sıkça kullanılan ifadelerden birisi de bir alandaki verilerin tekrarsız olarak görüntülenmesini sağlayan DISTINCT ifadesidir.

Seçme komutunun mantıksal işleme sırasının son iki adımı olan ORDER BY ve TOP ifadeleri elde edilen veri kümesinin kullanıcı ya da istemci yazılıma iletilmeden önce sıralanmasını sağlar. SELECT komutunun son kısmında yer alan ORDER BY ifadesinden sonra veri kümesinin istenilen alanlara göre sıralanması sağlanır. Bu noktada artan sıralama yapılacak alanların yanında herhangi bir ifade eklenmesine gerek yokken, azalan sıralamalarda DESC (DESCending: azalma) ifadesine yer verilmelidir. Sorgu ifadelerinde sıralama yapılacak alanların sonuç kümesinde bulunma zorunluluğu yoktur. Bazı durumlarda da SELECT komutu ile elde edilen verinin en üst satırlarının görüntülenmesi gerekebilir. Örneğin en fazla satış yapılan on müşteri ya da en fazla ciro yapılan ürün listesi elde edilmek istenebilir. VTYS tüm veri hazırlama sürecini yerine getirdikten sonra en son TOP kısmını işleyerek en üstte yer alan satırlar görüntülenir ya da iletilir.

SQL komutlarının tek satır olarak yazılması zorunluluğu yoktur. Derleyici satır gözetmeksizin SELECT komutunun yazım kuralına göre ifadeleri dikkate alır.

Veri sorgulamasında kayıtların belirli ölçütlere göre sınırlanması ya da diğer bir ifadeyle tablolar içinde aranması için WHERE ifadesi kullanılır.

MS SQL Server VTYS’i yazılımında sıklıkla koşul ifadeleri kullanılmaktadır (s:123, Tablo 6.1). Bu operatörlerden CONTAINS ve FREETEXT ifadeleri uzun metin verisi içeren alanlarda ilgili metin ifadelerinin bulunması için kullanılır. Arama yapılacak alanların daha önce Full-Text Indeks olarak tanımlanması gerekmektedir.

Koşul operatörlerinden LIKE ile kullanılabilecek ifadeler aşağıda listelenmiştir:

  • %: Herhangi bir karakter dizisi ya da hiçbir metin için kullanılır. ‘A%’ ifadesi “A” ile başlayan ya da sadece ‘A’ içeren alanları sınırlayabilir.
  • _ (Alt çizgi): Herhangi tek bir karakter. ‘_eri’ ifadesi ilk harfi farklı olabilecek “Geri”, “Seri” gibi ifadeleri bulabilmektedir.
  • [ ]: Köşeli parantez aralığında tanımlanan harfler ile sınırlanmaktadır. ‘ [a-f] ‘ veya ‘[abcdef] ‘ şeklinde yazılabilir. ‘[C-T]apa’ ifadesi ile “Çapa”, “Sapa” gibi metinler sınırlanabilir.
  • [^]: Belirtilen aralıkta karakter içermeyen metinler bulunur. ‘File[^1]%’ ifadesi içerisinde 1 olamayan ancak ‘File’ ile başlayan metinleri bulabilecektir.

Koşul ifadelerinden AND birbirine bağlanan ifadelerin her ikisinin de gerçekleşmesini zorunlu kılar. OR ifadesi ise koşullardan en az birinin yerine getirilmesi durumunda ilgili satırı veri kümesine dahil eder.

Birden Fazla Tablodan Veri Seçimi

İlişkisel veritabanı yönetim sistemlerinde gerçek dünya varlıklarının tablolar şekilde gösterimi söz konusudur. Bu yapılarda sistem, verileri birbirine bağlı çok sayıda tablolar hâlinde organize edilir. Tablolar arasında farklı ilişki türleri kurulabilmektedir. Veritabanı tasarımı esnasında tablolar ve aralarındaki ilişkilere karar verilmektedir. Ancak istenen veri kümelerini elde etme de tablo yapılarını ve aralarındaki ilişki özelliklerini bilmek gerekmektedir.

Basit olarak iki tabloyu birbirine bağlamak için WHERE komutu kullanılabilir (s:124, Tablo 6.2). Tabloları bir sorgu içerisinde birbiri ile bağlamanın en kolay ve yaygın yolu ise JOIN komutudur. JOIN komutu ile sadece iki değil çok sayıda tablo birbirine bağlanabilmektedir. Ayrıca farklı bağlanma türleri ile kullanıcıların istenilen veri kümelerini elde etmelerine olanak sağlar. Farklı JOIN komutları olmasına karşı yazım kuralı genelde benzerdir.

FROM ifadesinden sonra bağlanacak tablo adlarının arasında INNER JOIN ifadesi yer almakta ON ifadesinden sonra da bağlantı eşitliği tanımlanmaktadır. Bu kısımda farklı mantıksal ilişkilerle de tablolar bağlanabilir. Birden fazla tablonun bulunduğu ya da içiçe sorguların kullanılmasında tablo isimlerini uzun olarak yazmaktansa bunun yerine kısa takma adlar kullanılabilir (s:125, Tablo 6.3). Sorgu içerisinde tablo adlarından sonra AS ifadesi kullanılarak takma bir adla ifade edilebilir. Alan adları için de aynı durum söz konusudur.

İki tablonun birbirine JOIN komutu ile bağlanmasında INNER, OUTTER ve CROSS olmak üzere üç farklı seçenek bulunmaktadır. Inner bağlantı ile iki tablonun eşleşen alanlarının seçilmesi sağlanmaktadır. Diğer bir ifadeyle kesişim kümesi seçilmektedir. Seçme işleminin sonucunda her iki kümenin bağlantılı olduğu alandaki ortak değerlerin sayısı kadar satır görüntülenir. Outer bağlantıları soldan, sağdan ve tüm (full) şeklinde üç farklı türden oluşmaktadır. LEFT OUTER JOIN bağlantısı bu ifadenin solunda ve sağında kalan tabloların konumu baz alınarak soldaki tablonun tüm içeriğinin görüntülenmesi sağlar. LEFT OUTER JOIN bağlantısının tam tersi olan RIGHT OUTER JOIN ise ifadenin sağında kalan tablodaki tüm değerlerin seçilmesini sağlar. FULL OUTER JOIN ise her iki tabloda yer alan tüm satırların görüntülenmesini sağlar. Herhangi iki alanın eşleştirilmediği bağlantı türü çapraz (cross) bağlantıdır. İki tablonun eleman sayılarının çarpımı çapraz bağlantı sonucu oluşan listenin satır sayısını verir. Çapraz tablo bağlantısı şablon veri tablolarının üretilmesinde kullanılabilmektedir.

Çok sayıda tablonun birbirine bağlanması için farklı bir bağlantı türü yoktur. JOIN komutu aynı yapıyla kullanılır ancak ON kısmında birbiri ile ilişkili alanların doğru tarif edilmesi gerekir. Tabloların bağlantılarının oluşturulmasında INNER JOIN yapısı kullanıldığından sıralamanın önemi yoktur. Önemli olan ON ifadelerinden sonra hangi alanın hangi alanla bağlanacağının belirtildiği eşitleme kısmıdır. Bu alanda bir hatanın olması elde edilen veri kümesinin hatalı olmasına neden olur.

Tabloların birbirine bağlanması ilişkili alanların eşlenerek bağlanan tabloda karşılığının aranması için kullanılır. Veri birleştirme ise birbiri ile aynı sayıda ve türde alanları olan veri kümelerinin alt alta birleştirilmesi, kesişim kümelerinin ve farklarının bulunması işlemidir. İki veya daha fazla veri kümesinin birleştirilmesi için veri kümelerinin aynı sayıda ve türde alanlarının olması gerekir. Veri kümeleri INTERSECT, EXCEPT, UNION, UNION ALL komutları ile birleştirilebilir.

Intersect , iki veya daha çok veri kümesindeki satırların kesişiminin bulunmasında kullanılır. İki farklı sorgunun arasına INTERSECT ifadesi kullanılarak birleştirme gerçekleştirilir. Except ifadesi ile birleştirilen sorgular veri kümeleri arasındaki farkı listelemek için kullanılırlar. UNION ve UNION ALL komutları kümelerin birleşim kümelerini elde etmek için kullanılır. UNION ifadesi ile birleştirilmiş veri kümelerinde kesişim kümesi bir kez yer alır. UNION ALL ile birleştirilmiş kümelerde ise herhangi bir işlem yapılmadan iki liste alt alta eklenir.

Tabloların birleştirilmesinde alan sayıları eşleşmediğinde SQL Server “All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.” iletisi ile kullanıcıyı bilgilendirir. Yine benzer şekilde veri tipi uyuşmaması durumunda ise “Conversion failed when converting the nvarchar value ‘One’ to data type tinyint.” benzeri bir hata üretilir.

Gruplama ve Özetleme Sorguları

Veritabanı Yönetim Sistemlerinin önemli görevlerinden biri kullanıcı isteklerine göre verilerin özetlenmesi ve gruplanması işlemleridir. Bu sayede veri kümesi işlenerek mevcut sistem hakkında bilgi elde edilir. Veritabanı tablolarında özetleme ve gruplama işlemlerinde GROUP BY komutu kullanılır. GROUP BY komutu bir veri kümesinde belirlenen alanların içerdiği verinin tekrarsız hâle getirerek özetlenmesidir (s: 130, Şekil 6.2).

Gruplama işlemlerinde hangi alanın gruplanacağı ve hangi alanının görüntüleneceğini belirlemek çok önemlidir. Bu süreçte yapılan hatalar sorgunun çalışmamasına neden olacaktır. Gruplama işlemleri birden fazla tablo üzerinde gerçekleştirilen sorgulamalarda da uygulanabilir. Seçme sorgularının mantıksal işleme sırasına göre GROUP BY işleminden önce tablolardan seçme işlemi ve varsa WHERE ile sınırlama işlemi uygulanır (s:132, Tablo 6.4).

Gruplama sorgularında sorgulamak istenen veri kümesi GROUP BY ifadesinden sonraki alanlara göre gruplanırken diğer alanlar üzerinde de özetleme işlemleri gerçekleştirilir. Sayısal alanlar için sayma, toplama, ortalama gibi matematiksel işlemler, metin türündeki alanlar için ise sayma, en büyük ve en küçük değerlerin alınması gibi işlemler özetleme işlevleri tarafından gerçekleştirilir.

Özetleme işlevleri olarak COUNT (sayma), SUM (toplama), AVG (ortalama), MIN (en küçük değer), MAX (en büyük değer), STDEV (standart sapma), VAR (varyans) ifadeleri kullanılabilmektedir (s: 132, Tablo 6.5).

Özetleme işlevleri işlem yapılan alandaki NULL olmayan, dolu olan alanlar için işlem yapmaktadır. İşlev adından sonra açılacak parantez içinde alan adından önce DISTINCT ifadesi konursa tekrarsız satırlar için işlem yapılmaktadır. AVG işlevi ile sayısal değerli alanların ortalaması hesaplanmaktadır. Ancak bu ortalamaların kesirli sayı olması gereken durumlarda dahi tam sayı değerli sonuçlar görülür. Bunun nedeni SQL Server’daki özetleme işlevlerinin sonuç olarak üzerinde hesaplama yapılan alanın türünde veri geri döndürmelidirler. “Tinyint”, “smallint” ve int veri türleri int, bigint veri türü bigint, float ve real veri türleri float türünde veri geri döndürürler. Ancak bu değerin kesirli sayı olarak hesaplanması istenirse veri türlerinin dönüştürülmesinde kullanılan Cast ve Convert komutları kullanılmalıdır.

Cast ve Convert işlevleri Select sorgularında görüntülenecek değerlerin veri türünü değiştirmek için kullanılır. Tablolardaki alanların veri yapılarını kalıcı olarak değiştirmek için veri tanımlama dilindeki ALTER komutu kullanılır.

Gruplama sorgularında özetlenen değerlerin belirli koşullara göre sınırlaması için HAVING komutu kullanılır. HAVING komutunun mantıksal işleme sırası Select ifadesinden önce Gruplama işlevinden sonra yer almasıdır. Dolayısıyla gruplama ve özetleme işlemi tamamlandıktan sonra koşullara uymayan satırlar seçilmez. WHERE komutu ise gruplama işleminden önce gerçekleştiği WHERE ile belirtilen koşullar Özetleme işlemlerine dahil edilmezler.

SQL İşlevleri

SQL sorgularında çeşitli hesaplama ve mantıksal işlemleri gerçekleştirebilmek için işlevler bulunmaktadır. Microsoft SQL Server Transact-SQL dili farklı işlemler için farklı türde işlevler sunmaktadır.

Birçok programlama dilinde farklı yazım şekilleriyle benzer görevleri yerine getiren işlevler mevcuttur. Bu işlevlerin çalışma prensibinin kavranması ve ihtiyaç olduğunda ilgili yardım dosyalarına ulaşarak bu işlevleri etkin kullanmak bir veritabanı kullanıcısı ya da programcısı için oldukça önemlidir.

Mantıksal işlevler: Mantıksal işlevler SELECT sorgularında alanların değerlerini belirli koşullara göre farklı değerlere dönüştürürler.

CHOOSE: İndeks değeri içeren bir değerin tanımlanan sıralı listede eşleştirerek karşı gelen elemanı görüntüler. CHOOSE (İndeks,‘Seç1’,‘Seç2’, ……..,‘SeçN’) olarak yazılır.

IIF: Mantıksal bir karşılaştırma sonucu doğru ve yanlış durumları için iki ayrı değer görüntüler. Bu mantıksal işlev IIF(Mantıksal_ifade, Doğru_değer, Yanlış_Değer) şeklinde oluşturulur.

CASE: CASE komutu mantıksal işlevlerden farklı olarak birden çok koşulun tanımlanmasına olanak sağlar. CASE komutunun iki farklı yazım kuralı bulunmaktadır (s:136, Tablo 6.7).

Sayısal işlevler: Veritabanı tabloları üzerinde gerçekleştirilecek sorgulamalarda gerekli olabilecek hazır matematiksel işlevler bulunmaktadır (s: 137, Tablo 6.8). Bu işlevler veri tablosunun bir alanı için kullanılabileceği gibi sabit bir değer verilerek de hesaplama yaptırılabilir. Ancak unutulmaması gereken bir konu seçme sorgusunun alan listesinde yar alan bir işlem ya da değer seçimin tüm satırları için tekrar ettiğidir.

Sayısal işlevlerden ABS, belirtilen değerin mutlak değerini veren matematik işlevidir. SIGN, sayısal değerin pozitif, negatif veya işaretsiz olduğunu döndürür. ASIN, ACOS, ATAN, ATN2, belirtilen trigonometrik değerlerin radyan cinsinden açı değerini hesaplar. SIN, COS, TAN, COT; radyan cinsinden belirtilen değerlerin trigonometrik değerlerini hesaplar. RADIANS, derece cinsinden verilen açı değerini radyan cinsine çevirir. DEGREES, radyan cinsinden verilen açı değerini derece cinsine çevirir. PI, pi (?) katsayısını verir. CEILING, kesirli sayıları bir üst tamsayıya yuvarlar. FLOOR, kesirli sayıları bir üst tamsayıya yuvarlar. ROUND, belirtilen sayı ya da alandaki değeri istenilen basamağa yuvarlar. İlk değer yuvarlanacak değer, ikini değer yuvarlanacak basamaktır. EXP, LOG, LOG10, POWER; üssel ve logaritmik işlem yapan işlevlerdir. RAND, 0 ile 1 aralığında düzgün dağılmış rassal sayı üretir. SQRT, belirtilen değerin karekökünü hesaplar. SQUARE, belirtilen değerin karesini hesaplar.

Metin işlevleri: Metin türündeki alanların ya da değerlerin işlenmesine yönelik çok sayıda metin işlevi bulunmaktadır (s: 138, Tablo 6.9).

Metin işlevlerden SUBSTRING, metin türündeki bir değerin içerisinden belirli bir bölümün alınmasını sağlayan işlevdir. PATINDEX, bir metin içerisinde belirli bir metin ifadesinin arayarak ilk bulunduğu konum bilgisini döndürür. LEN, metindeki karakter sayısını döndürür. LEFT, RIGHT; metin türündeki bir alan ya da değerin soldan (LEFT) veya sağdan (RIGHT) istenilen sayıda karakterin seçilmesini sağlar. REPLACE, bir metin içerisinde belirli bir metni bularak o istenilen metin ile değiştirir. CONCAT, bir veya daha fazla metin değeri birleştirir. REPLICATE, bir metnin değişkenin istenildiği kadar tekrarlanması için kullanılır. SPACE, istenilen sayıda boşluk karakteri üretir. NCHAR Unicode karakter tablosunun, CHAR ise ASCII kod tablosunun belirtilen rakama karşı gelen karakterini getirir. UNICODE bir karakterin Unicode, ASCII ise ASCII kod tablosundaki kod karşılığını getirir. STR, sayısal bir değeri istenilen hassasiyette metne çevirir.

Tarih işlevleri: Farklı kültürde aynı takvim kullanılsa da tarih bilgilerinin yazılması konusunda farklılıklar bulunmaktadır. Bu nedenle veritabanı yönetim sistemlerinde tarihin gösterilmesi, eklenmesi ile ilgili problemleri ortadan kaldırmak için çeşitli işlev ve formatlar bulunmaktadır (s: 138, Tablo 6.10). Bilgisayarlarda tarih ve saat bilgileri aslında bir sayı olarak saklanır. Bu sayının tamsayı kısmı gün, ondalıklı kısmı ise 24 saat 1 tamsayıya denk gelecek şekilde depolanmaktadır.

Tarih işlevlerinden DATANAME, tarih veri türündeki bir değerin bir bölümünü isim olarak geri döndürür. DATEPART, tarih veri türündeki bir değerin istenen bölümünün elde edilmesini sağlar. DAY, MONTH, YEAR; bu üç işlev sırasıyla bir tarih verisinin yıl, ay ve gün bilgisini sayısal olarak geri döndürür. DATEFROMPARTS, yıl, ay ve gün bilgilerinin sayısal olarak girildiği ve ilgili değerlerden tarih veri türünde değişken döndüren bir işlevdir. DATEDIFF, iki tarih türündeki verinin arasındaki farkı istenilen tarih birimi olarak hesaplayan bir işlevdir. DATEADD, bir tarih türündeki veriye istenilen tarih birimi olarak ekleme işlemi gerçekleştiren işlevdir. ISDATE, bir metin türündeki verinin içeriğinin tarih bilgisi olup olmadığını kontrol ederek pozitif durumda 1, negatif durumda 0 değerini döndüren işlevdir.

Alt Sorgular

Alt sorgu (subquery) bir seçme sorgusunun bir parçasını oluşturan ve parantez içinde yazılmış SQL seçme sorgusuna denilir. Alt sorgular bir üst sorguya bir değer ya da bir tablo çıktısı verebilirler. Alt sorgu alanları ile üst sorgu alanlarının birbiri ile ilişkilendirmek yoluyla da seçme sorguları hazırlanabilmektedir.

Alt sorguların içinde de alt sorgu kullanılabilmektedir. Hedef veri kümesine ulaşmak için çok sayıda iç içe sorgu kullanılabilmekte ancak daha sonra bu sorguların düzenlenmesinde zorluk ortaya çıkabilmektedir. Bu nedenle çok karmaşık sorgular, birbirini izleyen görünümler (view) olarak tasarlanabilmektedir.

Alt sorgular tablo olarak kullanılabileceği gibi sınırlayıcı olarak da kullanılabilmektedir. WHERE komutu ile bir alandaki değerler başka bir sorgunun içerdiği değerlerle sınırlanabilir.

Kısıt olarak bir alt sorgunun kullanılmasında IN ve EXISTS sınırlama yapıları kullanılır. IN ile yapılan sınırlamalarda alt sorgunun sadece ilgili alanı kısıtlamak için veri türünde tek bir alan seçmelidir. Aksi durumda üst sorgu ilgili alanı hangi değerin içinde arayacağını bilemeyeceğinden hata mesajı oluşturacaktır. Böyle bir hatada kullanıcı “Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.” ifadesi ile uyarılacaktır.

Alt sorgularla yapılan sınırlamalarda tek bir değer üreten alt sorgular da kullanılabilmektedir.

Alt sorgular bir üst sorgunun alanları ile sınırlanabilmektedir. Biraz karmaşık bir durum gibi görünse de veri kümesi mantığı ile değerlendirildiğinde bu yöntemle istenilen veri kümelerine etkili bir şekilde ulaşılabildiği görülecektir.

EXISTS komutu sorguya eklenen alt sorgu ile verilerin ilişkilendirilmesini sağlar. Alt sorguda yer alan müşterilerin üst listeden çıkarılması için EXISTS ifadesinden önce NOT operatörünün kullanılması önemlidir. EXISTS ile yapılan sınırlamalarda alt sorgunun tüm alanlarının “*” sembolü ile seçildiğine dikkat edilmelidir. “*” ile tüm alanları seçilmeyen bir alt sorgu EXISTS ile kullanılamaz.

Alt sorguların bir üst sorgunun tablosu, kısıtlayıcısı olabileceği gibi herhangi bir değer olarak da üst sorgu tarafından kullanılabilmektedir. Bir sorgunun seçim kısmında yer alan alt sorgular ciddi performans kaybına neden olabilmektedir. Her satır için çalıştırılan sorgunun gerçekleştirdiği işlem, üst sorgu ile ilişkili olması ve sorgu sonucu oluşacak satır sayısı oluşan performans kaybı ile doğrudan ilişkilidir.