İçeriğe geç

SQL’de SELECT: Veri Sorgulama Sanatı

Şimdi bu SQL denen meret var ya, hani şu veritabanlarıyla konuşmanın dili. Aslında bir zamanlar SQL dediğimizde aklımıza ne gelirdi? İşte bir sürü tablo, karmaşık join’ler, belki biraz da stored procedure falan filan. Ama gelin görün ki, her şeyin temeli bir yerde yatıyor. O da SELECT komutu. Yani, veriyi çekme komutu. Ne güzel değil mi? Veritabanına gidip ‘Bana şunları ver!’ diyorsun, o da sana paketleyip getiriyor. Sanki sihirli değnek gibi.

Benim ilk zamanlarımda, yani bu işlere yeni başladığımda, SELECT deyince sadece basit bir ‘SELECT * FROM TabloAdi’ dönerdim. Ama sonra fark ettim ki, işin aslı bambaşkaymış. Bu SELECT, sadece veri çekmek değil, aynı zamanda veriyi şekillendirmek, filtrelemek, hatta biraz da manipüle etmek demek. Düşünsenize, elinizde tonlarca veri var ama siz sadece belirli bir kısmını istiyorsunuz. İşte orada SELECT devreye giriyor ve size istediğinizi parmaklarınızın ucuna getiriyor.

Hani bazen bir makale okursunuz ya, içinde bir sürü bilgi vardır ama siz sadece ana fikri almak istersiniz. İşte SELECT de tam olarak o işi yapıyor. Veritabanından çıkan bütün o karmaşık yapının içinden, sizin ihtiyacınız olanı alıp getiriyor. Gerçi bu işi yaparken de dikkatli olmak lazım. Çünkü yanlış bir sorgu yazarsanız, hem gereksiz yere veritabanını yorarsınız hem de istediğiniz bilgiyi alamayabilirsiniz. Ya da daha kötüsü, yanlış bilgiyi alırsınız ki o daha kötü tabii.

Bir de işin şöyle bir yanı var. Bu SELECT komutunu ne kadar iyi kullanırsanız, veritabanı işlemleriniz o kadar hızlı ve verimli olur. Yani aslında, sadece veri çekmek değil, aynı zamanda veritabanının performansını da doğrudan etkileyen bir komut bu. Kendi yazdığım programlarda bile, bazen bir sorguyu biraz daha optimize ederek inanılmaz bir hız artışı yakaladığım oldu. Hani şöyle olur ya, ‘Aaa, bu iş böyle daha mı hızlı oluyormuş!’ dersiniz. İşte o an anlarsınız SELECT’in gücünü.

Şimdi gelelim işin pratik kısmına. Bir kere, her zaman her şeyi çekmeye çalışmayın. Yani o meşhur ‘SELECT *’ olayından biraz uzaklaşın. Neden mi? Çünkü size sadece sütun adı lazımsa, gidip de bütün tabloyu çekmek mantıklı değil. Hem gereksiz veri trafiği olur, hem de veritabanı sunucusu boşuna çalışır. Bu arada, sadece istediğiniz sütunları çekmekle kalmayıp, verileri filtrelemek için WHERE komutunu da kullanmayı öğrenmeniz lazım. Bu da SELECT’in en yakın arkadaşı diyebiliriz. Yani, ‘Bana şu tablodan, şu koşula uyan kayıtları getir’ diyorsunuz.

Mesela şöyle bir senaryo düşünün. Bir e-ticaret sitesinde çalışıyorsunuz ve sadece belirli bir tarihten sonra sipariş veren müşterilerin listesini istiyorsunuz. İşte orada hem SELECT hem de WHERE komutu devreye giriyor. Tabii ki ORDER BY ile de bu listeyi istediğiniz gibi sıralayabilirsiniz. Mesela sipariş tarihine göre mi, yoksa müşterinin adına göre mi? Tamamen sizin elinizde. Bu arada, bu komutları birleştirerek inanılmaz esnek sorgular yazmak mümkün. Tabii ki bu iş biraz pratik gerektiriyor ama öğrenince de tadından yenmez.

Bir de işin ilginç bir yanı var. Bu SELECT komutuyla verileri sadece çekmekle kalmıyorsunuz, aynı zamanda onları gruplandırabiliyorsunuz. GROUP BY komutuyla, mesela belirli bir üründen kaç tane satıldığını, veya belirli bir şehirde kaç tane müşteriniz olduğunu görebiliyorsunuz. Ve daha da güzeli, bu gruplandırılmış veriler üzerinde de çeşitli fonksiyonlar kullanabiliyorsunuz. SUM, AVG, COUNT gibi. Yani, sadece veri çekmek değil, aynı zamanda o veriyi analiz etme yolunda da büyük bir adım atmış oluyorsunuz. Bu da bana göre işin en keyifli kısımlarından biri.

Hani bazen bir filmin fragmanını izlersiniz ya, bütün hikayeyi anlatmaz ama size bir fikir verir. SELECT komutu da veritabanı için tam olarak öyle bir şey. Size bütün veriyi göstermez ama ihtiyacınız olanı gösterir. Ve bunu yaparken de performanslı çalışır. Tabi bu işin incelikleri var tabii. Mesela subquery’ler falan derken işler biraz daha karmaşıklaşabiliyor. Ama temel mantık hep aynı kalıyor. Veriyi seç, filtrele, sırala, gruplandır. Bu kadar basit aslında.

Şimdi gelelim şu kod kısmına. Ben genelde C# ile çalışırken Dapper gibi ORM’ler kullanıyorum ama aslında arka planda hep SQL sorguları dönüyor. Bazen de doğrudan SQL yazmak gerekiyor tabii. Mesela şöyle basit bir örnek düşünelim. Bir ürün tablomuz var ve biz sadece fiyatı belirli bir değerin üstünde olan ürünleri çekmek istiyoruz. İşte bu noktada WHERE komutu devreye giriyor.

Şöyle bir senaryo düşünelim. Elimizde bir ‘Products’ tablomuz var ve bu tabloda ‘ProductName’ (ürün adı) ve ‘Price’ (fiyat) sütunları var. Biz de sadece fiyatı 50 TL’nin üzerinde olan ürünleri listelemek istiyoruz.

Yanlış yapma ihtimalimiz ne olurdu peki? Belki de tüm ürünleri çekip sonra kodumuzda filtrelemeye çalışırdık. Ama bu çok verimsiz bir yöntem olurdu. Zaten veritabanı bunu bizim için yapabiliyorken, neden gereksiz yere sunucuya yük bindirelim ki?

İşte doğru sorgu şöyle olurdu:

-- YANLIŞ: Tüm ürünleri çekip sonra kodda filtrelemek (Çok verimsiz) SELECT ProductName, Price FROM Products;

-- DOĞRU: Sadece istenen koşula uyan ürünleri çekmek SELECT ProductName, Price FROM Products WHERE Price > 50;

Gördüğünüz gibi, ikinci sorgu çok daha temiz ve verimli. Sadece ihtiyacımız olanı çekiyoruz. Bu arada, bu sadece basit bir örnek tabii. İlerleyen zamanlarda daha karmaşık sorgular, join’ler, aggregate fonksiyonlar falan da konuşuruz belki. Ama başlangıç için bu mantık çok önemli. Hani derler ya, temel sağlam olmalı diye. İşte SELECT komutu da veritabanı sorgularının temeli diyebiliriz.

Neticede, bu SELECT komutu, veritabanı dünyasının olmazsa olmazı. Hem basit veri çekme işlemlerinden tutun da, en karmaşık veri analizlerine kadar her yerde karşımıza çıkıyor. Tabi onu iyi öğrenmek, veritabanı ile olan ilişkinizi çok daha sağlam ve verimli hale getirir. Açıkçası ben bu komutu ilk öğrendiğimde ne kadar önemli olduğunu tam olarak kavrayamamıştım, ama zamanla onun ne kadar güçlü bir araç olduğunu gördüm.

Unutmayın, ne kadar çok pratik yaparsanız, o kadar çok ustalaşırsınız. Farklı senaryolar deneyin, farklı sorgular yazın. Hatalar yapacaksınız, evet, o da normal. Kendi programım sınıfta kaldı :), ama o hatalardan ders çıkararak daha iyi bir yere geleceksiniz.

Belki de bir sonraki yazıda daha karmaşık SELECT senaryolarına, mesela JOIN’lere veya GROUP BY’a değiniriz, ne dersiniz? Bakalım o zaman da bu kadar heyecanlı olacak mıyız? 🙂

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.