İçeriğe geç

SELECT: Veri Sorgulama Temelleri ve Pratik İpuçları

Selam millet! Nasılsınız, iyi misiniz? Umarım her şey yolundadır. Bu aralar yine kodların başında biraz fazla vakit geçirdim, hatta öyle ki kendi programlarım bile sınıfta kaldı diyebilirim 🙂 Ama neyse efendim, işin tatlı telaşı bu işte, değil mi? Bugün size, özellikle veriyle haşır neşir olanlar için hayat kurtarıcı olabilecek bir konudan bahsedeceğim: SELECT ile veri sorgulama temelleri.

Şimdi düşününce, ilk defa böyle bir komutla tanıştığım zamanları hatırlıyorum da, sanki bir büyücü değneği sallıyormuşum gibi geliyordu bana. Tabii o zamanlar işin inceliklerini bilmiyordum, sadece ‘bana şunu ver’ diyordum, o da veriyordu. Ama zamanla anladım ki, bu sadece bir başlangıçmış. Aslında SELECT komutu, SQL’in en temel taşı ama aynı zamanda en güçlülerinden de biri. Ne kadar iyi bilirsen, o kadar hızlı ve doğru verilere ulaşırsın. Bana göre bu, bir nevi veri denizinde pusulan olmak gibi bir şey.

Hani bazen çok büyük bir veri setimiz olur da, içinden sadece birkaç satıra ihtiyacımız kalır ya, işte tam o noktada SELECT devreye giriyor. ‘Tüm tabloyu getir bana’ demek yerine, ‘Sadece şu sütundaki şu koşula uyan satırları istiyorum’ diyebiliyorsun. Bu da hem performansı inanılmaz artırıyor hem de senin kafandaki soruyu daha net cevaplamanı sağlıyor.

Peki, bu SELECT olayı nasıl işliyor tam olarak? En basit haliyle şöyle düşünebiliriz: Bir kütüphanedesiniz ve sadece belirli bir yazarın kitaplarını istiyorsunuz. ‘Bana Orhan Pamuk’un tüm kitaplarını getir’ dediğinizde, kütüphaneci gidip ilgili raftan sadece onun kitaplarını bulup getirir, değil mi? SQL’deki SELECT komutu da tam olarak bunu yapıyor ama çok daha hızlı ve milyonlarca satır arasında.

İlk olarak, SELECT anahtar kelimesini kullanıyoruz tabii ki. Ardından, hangi sütunları görmek istediğimizi belirtiyoruz. Eğer tüm sütunları istiyorsak, yıldız (*) işaretini kullanırız. Mesela, tüm kullanıcı bilgilerini çekmek istediğimizde şöyle bir şey yazarız: SELECT \* FROM Kullanicilar;

Bu, ‘Kullanicilar’ tablosundaki tüm sütunları ve tüm satırları getir bana demektir. Gayet basit, değil mi?

Fakat her zaman tüm tabloya ihtiyacımız olmayabiliyor. Bazen sadece kullanıcı adlarını ve e-posta adreslerini görmek isteriz. İşte o zaman yıldız yerine sütun isimlerini tek tek yazarız. Mesela:

SELECT KullaniciAdi, Email FROM Kullanicilar;

Bu komut, ‘Kullanicilar’ tablosundan sadece ‘KullaniciAdi’ ve ‘Email’ sütunlarını getirir. Diğer tüm sütunlar göz ardı edilir. Ne kadar güzel değil mi? Yani hem gereksiz veri yüklemesinden kurtuluyorsun hem de sonuçları daha anlaşılır hale getiriyorsun.

Şimdi gelelim işin biraz daha derinlerine, yani WHERE koşuluna. Bu kısım gerçekten çok önemli çünkü veriyi filtrelememizi sağlıyor. Hani kütüphane örneğine dönersek, ‘Bana Orhan Pamuk’un sadece ‘Kara Kitap’ romanını getir’ demek gibi. WHERE ile istediğimiz koşulu belirtebiliyoruz.

Örneğin, sadece belirli bir şehirde yaşayan kullanıcıları görmek istersek şöyle yaparız:

SELECT KullaniciAdi, Sehir FROM Kullanicilar WHERE Sehir = ‘Bursa’;

Bu komut, ‘Kullanicilar’ tablosundan sadece ‘Sehir’ sütunu ‘Bursa’ olan satırların ‘KullaniciAdi’ ve ‘Sehir’ bilgilerini getirir. Yani Bursa’da yaşayanlar listelenir, diğerleri listede olmaz. Bu arada, ben de Bursa’da yaşadığım için bu tür sorgular benim için her zaman bir tık daha anlamlı oluyor sanırım 🙂

WHERE ile sadece eşittir (=) değil, büyüktür (>), küçüktür (<), büyüktür veya eşittir (>=), küçüktür veya eşittir (<=), eşit değildir (!= veya <>) gibi operatörleri de kullanabiliriz. Hatta birden fazla koşulu AND (ve) veya OR (veya) ile birleştirebiliriz. Mesela, Bursa’da yaşayan ve yaşı 30’dan büyük olan kullanıcıları çekmek istersek şöyle bir şey yapabiliriz:

SELECT KullaniciAdi, Sehir, Yas FROM Kullanicilar WHERE Sehir = ‘Bursa’ AND Yas > 30;

İşte bu noktada işler iyice güzelleşiyor. Artık sadece istediğimiz veriye değil, tam olarak kafamızdaki kritere uyan verilere ulaşabiliyoruz. Bu arada, eskiden olsa böyle bir sorguyu Excel’de yapmak için saatlerimi harcardım herhalde. Şimdi tek bir satır kodla hallediyorum.

Bir de ORDER BY kısmı var ki, bu da sonuçları sıralamak için kullanılıyor. Mesela, kullanıcıları soyadlarına göre alfabetik olarak sıralamak istediğimizde şöyle yaparız:

SELECT KullaniciAdi, Soyadi FROM Kullanicilar ORDER BY Soyadi ASC;

ASC, ‘ascending’ yani artan sıra anlamına geliyor. Eğer azalan sırada sıralamak istersek DESC (descending) kullanırız. Bu da özellikle raporlama yaparken veya veriyi daha okunabilir hale getirmek istediğimizde çok işe yarıyor. Mesela, en yüksek skor alan kullanıcıları görmek gibi.

Bu arada, bir keresinde şöyle bir teknik problem yaşamıştım. Bir uygulama geliştiriyordum ve veritabanından çektiğim verileri kullanıcılara göstermem gerekiyordu. Ama sorgularım o kadar kötü yazılmıştı ki, milyonlarca satır arasından veri çekerken uygulama resmen donuyordu. Kullanıcılar sürekli hata alıyordu, ben de delirdim tabii :)) Sonunda oturup sorgularımı baştan yazdım, WHERE ve ORDER BY’ı doğru yerlerde kullanarak performansı acayip artırdım. İşte o zaman anladım ki, SELECT komutunu iyi öğrenmek sadece bir ‘artı’ değil, işin temelinden gelen bir zorunluluk.

Şimdi size basit ama etkili bir kod örneği göstermek istiyorum. Diyelim ki bir e-ticaret sitesinde çalışıyorsunuz ve en çok satılan 10 ürünü görmek istiyorsunuz. Bunu yaparken hem doğru sorguyu yazacağız hem de performans açısından dikkat edeceğiz.

Öncelikle, bu iş için Satislar ve Urunler diye iki tablomuz olduğunu varsayalım. Satislar tablosunda hangi üründen kaç adet satıldığı, Urunler tablosunda ise ürünün adı ve ID’si bulunuyor. En çok satılanları bulmak için, Satislar tablosundaki adetleri toplayıp Urunler tablosuyla birleştirmemiz gerekecek.

Şimdi gelin önce yanlış bir yaklaşıma bakalım. Belki ilk aklımıza gelecek şey, tüm satışları çekip sonra bellekte toplamak olabilir ama bu büyük veri setlerinde felaket olur. Ya da şöyle bir şey yapmaya kalkabiliriz:

-- YANLIŞ YAKLAŞIM (Performanssız ve Hatalı Olabilir!) SELECT     U.UrunAdi,     SUM(S.Adet) AS ToplamSatis FROM     Satislar AS S JOIN     Urunler AS U ON S.UrunID = U.UrunID GROUP BY     U.UrunAdi ORDER BY     ToplamSatis DESC LIMIT 10;

Bu kod çalışır gibi görünüyor ama aslında bazı veritabanlarında (özellikle eski versiyonlarda veya belirli konfigürasyonlarda) performans sorunları yaşatabilir. Özellikle GROUP BY ve ORDER BY işlemi, veritabanını zorlayabilir. Ama daha da kötüsü, eğer UrunAdi benzersiz değilse, aynı ürünü farklı isimlerle de listeleyebiliriz. En iyisi ID üzerinden gitmek.

Şimdi gelelim daha doğru ve performanslı bir yaklaşıma. Burada `UrunID` üzerinden gruplama yapıp, sonra `Urunler` tablosuyla birleştirerek daha temiz bir sonuç elde edeceğiz. LIMIT yerine TOP (SQL Server) veya ROWNUM (Oracle) gibi ifadeler de kullanılabilir ama standart SQL’de LIMIT daha yaygın.

-- DOĞRU VE PERFORMANSLI YAKLAŞIM SELECT     U.UrunAdi,     SUM(S.Adet) AS ToplamSatis FROM     Satislar AS S JOIN     Urunler AS U ON S.UrunID = U.UrunID GROUP BY     U.UrunID, U.UrunAdi  -- ID ile gruplama daha güvenli ORDER BY     ToplamSatis DESC LIMIT 10;

İşte bu kadar! Gördüğünüz gibi, sadece küçük bir değişiklik ama performansta ve doğruluğunda büyük fark yaratıyor. `GROUP BY`’a `UrunID`’yi eklemek, aynı isimdeki farklı ürünleri ayırt etmemizi sağlıyor ve daha güvenilir bir sonuç veriyor. Bu arada, bu tür sorguları optimize etmek için veritabanı indekslerini de kullanmak harika olurdu ama o biraz daha ileri seviye bir konu sanırım. Şimdilik bu kadarla yetinelim 🙂

Neticede, SELECT komutu veri sorgulama dünyasının kapılarını aralayan ilk anahtar. Ne kadar çok pratik yaparsan, o kadar ustalaşırsın. Bu arada, veri tabanlarında dolaşırken aklınıza takılan bir şey olursa, çekinmeden Google’da aratın veya forumlarda sorun. Ben de zamanında çok sordum, çok araştırdım.

Umarım bu yazı, SELECT komutunun temellerini anlamanıza yardımcı olmuştur. Unutmayın, pratik yapmak en iyi öğrenme yolu. Hadi bakalım, klavyeleriniz tıklasın!

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.