İLERİ ACCESS SORGU STRATEJİLERİ
Access'i ilk öğrenen biri tasarım görünümünde sorgu kurmaya başlar; sürükle bırak, kutuları işaretle, ölçüt yaz. Bu yaklaşım basit sorularda hızlıdır ama karmaşıklaşan iş sorularıyla baş etmek için yetersiz kalır. İleri sorgu yazımı SQL görünümünde yapılır ve Access'in dilini gerçekten konuşmayı gerektirir. Bu seviyeye geçildiğinde Access'in büyük bir veri tabanı motoru kadar yetenekli olduğu görülür.
Parametreli Sorgular
Parametreli sorgu kullanıcıdan değer alarak çalışan sorgudur. SELECT ifadesinde WHERE bölümünde köşeli parantez içinde bir metin yazıldığında Access bunu parametre olarak algılar: WHERE DonemBaslangic >= [Başlangıç tarihi giriniz]. Sorgu çalıştırıldığında Access kullanıcıya bir kutu açar, değer ister, gelen değeri yerleştirir ve sorguyu icra eder.
Bu yaklaşım form üzerinden de yönetilebilir. Bir formdaki kontrolün değeri parametre olarak kullanılır: WHERE DonemBaslangic >= [Forms]![Filtre]![txtBaslangic]. Bu yapı kullanıcının form üzerinden filtreleme yapmasını sağlar; her seferinde manuel parametre girmek zorunda kalmaz. Raporlama formlarının ardındaki klasik teknik budur.
Birleştirme Tipleri
SQL'in JOIN yapısı Access'te de aynıdır ama sürekli karıştırılır. Doğru JOIN seçimi sorgu sonucunu kökten değiştirir:
- INNER JOIN: Her iki tabloda da eşleşen kayıtları döner; eşleşmeyen taraflar süzülür.
- LEFT JOIN: Soldaki tablodaki tüm kayıtları döner; sağda eşleşme yoksa NULL gelir. "Hangi müşterinin hiç faturası yok" sorusu burada çözülür.
- RIGHT JOIN: LEFT JOIN'in tersi; sağdaki tablo eksiksiz, sol taraf NULL olabilir.
- FULL OUTER JOIN: Her iki taraftaki tüm kayıtları getirir. Access bu sözdizimini doğrudan desteklemez; UNION ile LEFT ve RIGHT birleştirilerek elde edilir.
Doğru JOIN seçimi sorgu sonucunu kökten değiştirir. "Hangi müşterinin hiç faturası yok" sorusu LEFT JOIN ile sorulur ve sağ taraf NULL olanlar süzülür. "Hangi faturanın eşleşmeyen müşterisi var" sorusu da tersine bir LEFT JOIN'le çözülür. Bu kalıplar veri kalitesi kontrolünün temelidir.

Alt Sorgular
Bir sorgunun sonucu başka bir sorgunun girdisi olarak kullanılır; bu alt sorgudur (subquery). En yaygın kullanım WHERE içinde değer kontrolüdür: WHERE musteri_id IN (SELECT id FROM aktif_musteri). Bu sorgu önce aktif müşteri ID'lerinin listesini hazırlar, sonra ana sorguda bu listede olan kayıtları filtreler.
Alt sorgular SELECT bölümünde de kullanılır; bir kaydın özel bir hesabını içermek için kullanılır. Toplam fatura tutarı her satırın yanında gözükmesi için (SELECT SUM(tutar) FROM faturalar WHERE musteri_id = m.id) gibi bir alt sorgu eklenir. Bu yaklaşım anlaşılır ama performansı düşüktür; aynı sonuca GROUP BY ile JOIN kullanarak daha hızlı varılabilir.
UNION ve UNION ALL
İki ayrı sorgunun sonuçlarını alt alta birleştirmek UNION ile yapılır. İki sorgunun da aynı sayıda ve aynı tipte sütunu olmalıdır. UNION otomatik olarak duplicate satırları temizler; UNION ALL ise temizlemez, performans olarak daha hızlıdır. Yöneticinin "tüm fatura ve tüm sipariş satırlarını birlikte göster" tipi raporları UNION ile çözülür.
UNION sıralama sadece tüm birleşimin sonunda yapılır; ayrı ayrı her sorguda ORDER BY olamaz. Sıralama için son satıra ORDER BY eklenir ve sütun adı yerine sütun numarası kullanılır (ORDER BY 2 gibi). Bu küçük detay UNION'ı ilk yazan kişiyi şaşırtır.
Hesaplanmış Alanlar
Access sorgularında yeni alanlar oluşturmak için SELECT bölümünde ifadeler yazılır. Adım adım uygulanışı Microsoft'un Access destek sayfasında açıklanır. Tutar * vergi_orani / 100 hesaplaması yeni bir Vergi alanı verir. Bu hesaplama her satır için anında yapılır ve tabloda saklanmaz. Daha kalıcı hale getirilmek isteniyorsa hesaplama tablo seviyesinde Calculated alan olarak tanımlanır; bu durumda her ekleme/güncellemede otomatik hesaplanır.
IIf fonksiyonu Access'in koşullu hesaplama aracıdır. IIf(durum = "Onaylı", tutar, 0) durumu kontrol eder, true ise tutar, false ise sıfır döner. Switch fonksiyonu birden çok koşulu sırayla kontrol eder. Bu fonksiyonlar SQL'in CASE WHEN ifadesinin Access karşılığıdır ve farkına varılmadığında karmaşık ifadelere yol açar.
Crosstab Sorguları
Access'in özel bir sorgu tipi olan Crosstab pivot benzeri bir görünüm üretir. Satırlar müşteri olabilir, sütunlar aylar, hücreler her ay her müşterinin satış tutarı. TRANSFORM ifadesiyle hücre değeri belirlenir, PIVOT ifadesiyle hangi alanın sütunlara dönüşeceği seçilir. Bu sorgu raporlamada doğrudan pivot tablo gibi davranır.
TRANSFORM Sum(Faturalar.Tutar) AS AyToplam
SELECT Musteri.Adi
FROM Musteri INNER JOIN Faturalar
ON Musteri.Id = Faturalar.MusteriId
WHERE Year(Faturalar.Tarih) = 2026
GROUP BY Musteri.Adi
PIVOT Format(Faturalar.Tarih, "mmm") IN ("Oca","Şub","Mar","Nis","May","Haz");Crosstab'ın güçlü yanı veri yapısını okuma için optimize etmesidir. Zayıf yanı sütun sayısının veriye göre değişebilmesidir; aylar artar, eski ayların sütunları kalmaya devam eder. Sütun listesini önceden sabitlemek için PIVOT IN ("Ocak", "Şubat", "Mart") gibi bir liste eklemek mümkündür.
Performans Stratejileri
Access büyük veritabanı olmadığı için performans çabuk fark edilir. Birkaç temel kural sorgu hızını korur: gerek olmayan tablo JOIN'lerini yapma, WHERE şartlarında indekslenmiş alanları kullan, alt sorgu yerine JOIN'i tercih et, çok büyük tabloları toplu güncelleyeceksen sayfa kilidi mantığını anla.
İndeks yönetimi Access'te en az kullanılan ama en etkili optimizasyondur. Sık filtrelenen alanlara indeks koymak sorguları on katı hızlandırabilir. Tablo tasarım görünümünden alanın Indexed özelliğini "Yes" yapmak yeterlidir. Çok fazla indeks ise INSERT işlemini yavaşlatır; bu denge tablo kullanım profiline göre kurulur.

VBA ile Dinamik Sorgu
Bir sorgunun SQL ifadesi VBA içinden dinamik olarak yaratılabilir. CurrentDb.QueryDefs("sorguAdi").SQL = "SELECT ..." yapısı sorgunun ifadesini değiştirir. Bu yaklaşım kullanıcı arayüzünden gelen karmaşık filtre kombinasyonlarına göre sorgunun runtime'da oluşturulmasını sağlar.
Dinamik SQL kullanırken SQL injection güvenlik riski oluşur; kullanıcı girdisi doğrudan sorguya birleştirilmemelidir. Parametreli sorgular veya değer kontrolü yapılan birleştirme yöntemleri tercih edilir.
Access sorgu becerileri arttıkça uygulamanın esnekliği belirgin biçimde artar. İleri Access eğitimi bu stratejileri gerçek iş senaryoları üzerinden uygulamalı olarak işler.
Sıkça Sorulan Sorular
Tasarım görünümü mü SQL görünümü mü tercih etmeli?
Basit sorgular için tasarım görünümü hızlıdır. Karmaşık sorgularda (alt sorgu, UNION, kompleks JOIN) SQL görünümü zorunlu hale gelir.
Access SQL diğer veritabanlarıyla aynı mı?
Çoğu standart SQL Access'te de çalışır ama bazı Access'e özgü farklar vardır: IIf (CASE değil), TRANSFORM/PIVOT (Crosstab için), tarih biçimi (# ile sarılı). Bu farklar başka motora geçişte düzeltme gerektirir.
Alt sorgu mu JOIN mi daha hızlı?
Çoğunlukla JOIN. <strong>Alt sorgular</strong> her satır için ayrı çalıştığında performans düşer; JOIN tek seferde indeks kullanarak çözer. Modern motorlar bazı durumlarda alt sorguyu JOIN'e çevirir ama Access'te bu garantili değildir.
Crosstab sorgusu kaç sütun üretebilir?
Teknik limit yüksektir ama pratik olarak otuz kırk sütundan sonra okunabilirlik düşer. Çok sütunlu Crosstab sorguları için Excel'e dışa aktarıp pivot kullanmak daha mantıklı olur.
Büyük tabloda sorgu yavaşladı, ne yapmalı?
İlk olarak filtrelediğin alanlara indeks ekle. Sonra JOIN sayısını azalt. Son olarak tablonun gerçekten Access'te kalması gerekip gerekmediğini sorgula; SQL Server'a taşımak gerekebilir.
Parametreli sorgu formdan nasıl çalıştırılır?
Sorgu içinde [Forms]![FormAdi]![KontrolAdi] referansı verilir. Form açıkken sorgu çalıştırılırsa parametre form kontrolünden alınır; form kapalıysa Access manuel parametre kutusu açar.



