SQL veritabanlarında Görünümler (VIEW), kullanıcıların veya uygulamaların temel tablolardaki verilere daha organize, güvenli ve basitleştirilmiş bir şekilde erişmesini sağlayan güçlü araçlardır. Fiziksel olarak veri depolamazlar ancak bir veya daha fazla tablodan türetilmiş, önceden tanımlanmış bir sorgunun sonucunu sunan sanal tablolar olarak işlev görürler. Bu “sanal tablolar”, veri erişimini soyutlayarak karmaşıklığı azaltır ve güvenlik katmanları ekler.
Görünüm (View) Nedir?
Bir Görünüm, temel (fiziksel) tablolardaki belirli verileri mantıksal olarak temsil eden, ancak kendisi veri depolamayan sanal bir tablodur. Temelde, bir SQL sorgusunun kaydedilmiş halidir. Bir görünüm sorgulandığında, kaydedildiği zaman tanımlanan temel sorgu çalıştırılır ve sonucu tıpkı fiziksel bir tabloymuş gibi döndürülür. Bu sayede, kullanıcılar veya uygulamalar, karmaşık join’ler, filtrelemeler veya hesaplamalar içerebilen bir dizi temel tablo yerine basitçe görünüme sorgu gönderebilirler.
Görünümler Neden Kullanılır?
Görünümlerin kullanımı, veritabanı yönetiminde birçok avantaj sunar:
Veri Güvenliği
Görünümler, hassas verilerin gizlenmesi için etkili bir yöntem sunar. Örneğin, bir personel tablosu maaş veya kişisel bilgileri içerebilir. Bu bilgilere tüm kullanıcıların erişmesi gerekmeyebilir. Bir görünüm oluşturarak, yalnızca belirli sütunlara (örn. Ad, Soyad, Departman) veya belirli satırlara (örn. Yalnızca kendi departmanının çalışanları) erişimi kısıtlayabilirsiniz. Böylece, kullanıcılara doğrudan temel tablolara erişim izni vermek yerine görünümlere erişim izni verilerek güvenlik artırılır.
CREATE VIEW CalisanPublicBilgiler AS
SELECT CalisanID, Ad, Soyad, Departman
FROM Calisanlar;
Karmaşık Sorguları Basitleştirme
Birden fazla tablodan veri birleştiren, filtreleyen veya hesaplamalar içeren karmaşık SQL sorguları, görünümler aracılığıyla basitleştirilebilir. Geliştiriciler veya son kullanıcılar, bu karmaşık mantığı her seferinde yeniden yazmak zorunda kalmadan, önceden tanımlanmış görünümleri basit bir SELECT deyimiyle sorgulayabilirler. Bu, sorgu geliştirme süresini azaltır ve hataları minimize eder.
CREATE VIEW MusteriSiparisOzeti AS
SELECT
M.MusteriAd,
S.SiparisTarihi,
SUM(SD.Miktar * U.BirimFiyat) AS ToplamTutar
FROM
Musteriler M
JOIN
Siparisler S ON M.MusteriID = S.MusteriID
JOIN
SiparisDetaylari SD ON S.SiparisID = SD.SiparisID
JOIN
Urunler U ON SD.UrunID = U.UrunID
GROUP BY
M.MusteriAd, S.SiparisTarihi;
Artık bu karmaşık sorgu yerine sadece SELECT * FROM MusteriSiparisOzeti; kullanılabilir.
Veri Soyutlama ve Tutarlılık
Görünümler, temel tablolardaki yapısal değişikliklerin (örneğin, bir sütunun adı değiştirildiğinde veya yeni bir tablo eklendiğinde) uygulamaları doğrudan etkilemesini engelleyebilir. Görünüm, temel tablolardaki değişikliklere rağmen aynı çıktıyı sağlayacak şekilde yeniden tanımlanabilir. Bu, uygulamaların temel veri yapısından soyutlanmasını sağlayarak veri bağımsızlığını artırır ve tutarlı bir arayüz sunar.
Yeniden Kullanılabilir Mantık
Belirli bir iş kuralını veya veri perspektifini içeren bir sorgu, bir görünüm olarak tanımlanarak veritabanının farklı bölümlerinde veya farklı uygulamalarda tekrar tekrar kullanılabilir. Bu, kod tekrarını önler ve bakım kolaylığı sağlar.
Görünüm Oluşturma ve Güncelleme
Bir görünüm, CREATE VIEW komutuyla oluşturulur. Mevcut bir görünümün tanımını değiştirmek için ALTER VIEW veya CREATE OR REPLACE VIEW (destekleyen veritabanlarında) kullanılır. Bir görünümü kaldırmak için ise DROP VIEW komutu kullanılır.
-- Görünüm Oluşturma
CREATE VIEW AktifMusteriler AS
SELECT MusteriID, Ad, Soyad, Email
FROM Musteriler
WHERE Durum = 'Aktif';
-- Görünüm Güncelleme (ALTER VIEW)
ALTER VIEW AktifMusteriler AS
SELECT MusteriID, Ad, Soyad, Email, Telefon
FROM Musteriler
WHERE Durum = 'Aktif';
-- Görünüm Güncelleme (CREATE OR REPLACE VIEW) - PostgreSQL, Oracle
CREATE OR REPLACE VIEW AktifMusteriler AS
SELECT MusteriID, Ad, Soyad, Email, Telefon
FROM Musteriler
WHERE Durum = 'Aktif' AND KayitTarihi > '2023-01-01';
-- Görünüm Silme
DROP VIEW AktifMusteriler;
Güncellenebilir Görünümler (Updatable Views)
Tüm görünümler güncellenebilir değildir. Bir görünüm aracılığıyla temel tablolardaki verileri INSERT, UPDATE veya DELETE işlemleriyle değiştirebilmek için belirli koşulların sağlanması gerekir:
- Görünüm tek bir temel tabloya dayanmalıdır.
- Görünüm,
DISTINCT,GROUP BY,HAVING, kümeleme fonksiyonları (SUM,AVG,COUNT) veyaUNIONgibi yapılar içermemelidir. - Görünüm, hesaplanmış sütunlar içermemelidir.
- Join içeren görünümler genellikle güncellenemez (bazı veritabanları belirli koşullar altında basit join’li görünümlere izin verebilir).
WITH CHECK OPTION ifadesi, bir görünüm aracılığıyla eklenen veya güncellenen satırların görünümün WHERE koşuluna uymasını sağlar. Eğer uymazsa, işlem reddedilir.
CREATE VIEW DüsükMaasliCalisanlar AS
SELECT CalisanID, Ad, Soyad, Maas
FROM Calisanlar
WHERE Maas < 50000
WITH CHECK OPTION;
-- Bu işlem başarılı olur
INSERT INTO DüsükMaasliCalisanlar (CalisanID, Ad, Soyad, Maas)
VALUES (101, 'Ayşe', 'Yılmaz', 45000);
-- Bu işlem WITH CHECK OPTION nedeniyle başarısız olur
-- INSERT INTO DüsükMaasliCalisanlar (CalisanID, Ad, Soyad, Maas)
-- VALUES (102, 'Mehmet', 'Demir', 60000);
Sanal Tablolar ve Görünümler İlişkisi
“Sanal Tablo” terimi genellikle Görünüm (View) ile eş anlamlı olarak kullanılır. Görünümler, veri depolamadan, temel tabloların veya diğer görünümlerin verilerini bir sorgu sonucu olarak sunan mantıksal yapılardır. Bu nedenle, veritabanı sisteminde fiziksel olarak diskte yer kaplayan ve veri içeren “gerçek” tabloların aksine “sanal” bir tablo görünümü sunarlar.
Görünümler, geçici tablolar (temporary tables) veya tablo değerli fonksiyonlar (table-valued functions) ile karıştırılmamalıdır. Geçici tablolar, oturuma özel olarak oluşturulan ve veri depolayan fiziksel tablolardır. Tablo değerli fonksiyonlar ise, parametre alabilen ve bir tablo döndüren programatik bir yapıdır; bir sorgunun sonucunu döndürme konusunda görünümlere benzerler ancak daha dinamik ve parametre odaklıdırlar.
Performans ve Sınırlamalar
Görünümler, kendileri veri depolamadıkları için performansı doğrudan artırmazlar; bir görünüm sorgulandığında, altında yatan temel sorgu çalıştırılır. Çok karmaşık görünümler veya iyi indekslenmemiş temel tablolar üzerinde yapılan sorgular, performans sorunlarına yol açabilir. Bu gibi durumlarda, bazı veritabanı sistemleri “İndekslenmiş Görünümler” (SQL Server) veya “Materialized Views” (Oracle, PostgreSQL) gibi seçenekler sunar. Bu yapılar, görünümün sonucunu fiziksel olarak depolayarak sorgu performansını artırabilir, ancak bu durumda veri tazeliği ve depolama alanı gibi ek yönetim gereksinimleri ortaya çıkar.
SQL’deki görünümler veya sanal tablolar, veritabanı tasarımını ve yönetimini önemli ölçüde geliştiren vazgeçilmez araçlardır. Güvenliği artırırken karmaşık veri erişimini basitleştirir, veri soyutlama sağlayarak veritabanı yapısındaki değişikliklerin etkisini azaltır ve tekrar kullanılabilir mantık sunar. Görünümleri etkili bir şekilde kullanmak için onların nasıl çalıştığını, ne zaman güncellenebilir olduklarını ve performans etkilerini iyi anlamak, daha sağlam ve yönetilebilir veritabanı çözümleri oluşturmak için kritik öneme sahiptir.