SQL Views
1. Giriş
Veritabanlarında milyonlarca satır veri saklanabilir, bu veriler üzerinde sorgular çalıştırılabilir ve raporlar hazırlanabilir. Ancak zamanla verilerin karmaşıklığı artar; çok sayıda tablo, ilişkiler ve karmaşık sorgular ortaya çıkar. İşte tam da bu noktada SQL View kavramı devreye girer.
View’lar, veritabanındaki gerçek tablolar üzerine inşa edilen ama kendisi fiziksel veri barındırmayan sanal tablolardır. Yani bir view aslında bir sorgunun saklanmış halidir. Kullanıcı, view’i normal bir tablo gibi sorgulayabilir ama arka planda tanımlanmış SQL cümlesi çalışır.
Bu yazıda, SQL’de View’ların ne olduğunu, hangi avantajları sunduğunu ve nasıl oluşturulup yönetildiğini adım adım inceleyeceğiz. Hem teorik bilgileri hem de örnek SQL kodlarını paylaşarak View’lar hakkında bilgi sahibi olacağız.
2. View Nedir?
View, temelde bir veya birden fazla tabloya dayanan sanal tablodur. Fiziksel olarak veri saklamaz, sadece bir SQL sorgusunun kaydedilmiş halidir. View’ı çağırdığımızda, arkada tanımlanmış olan sorgu çalışır ve sonuçları bize bir tablo gibi sunar.
Buradaki en önemli nokta, view’ların fiziksel olarak veri saklamaması, sadece tanımlanmış sorguya göre verileri getirmesidir. Bu yüzden view, bir tablo gibi görünüp kullanılabilir ama aslında verinin kendisi her zaman kaynağındaki tablolarda durur.
Örneğin, bir müşteri tablonuz olduğunu ve sadece aktif müşterileri sık sık sorgulamak istediğinizi düşünelim: Her seferinde aynı WHERE koşulunu yazmak yerine bir view oluşturabilir ve bundan sonra sadece o view üzerinden sorgulama yapabilirsiniz:
CREATE VIEW VW_ActiveCustomers AS
SELECT CustomerID, CustomerName, Email
FROM Customers
WHERE IsActive = 1;Artık VW_ActiveCustomers adında bir view oluştu. Siz bu view’i normal bir tablo gibi sorgulayabilirsiniz:
SELECT * FROM VW_ActiveCustomers;Sonuç olarak karşınıza yalnızca aktif müşteriler gelir.
3. Fiziksel Tablolar ve Sanal Tablolar
Veritabanlarında tablolar iki farklı şekilde karşımıza çıkar: fiziksel tablolar ve sanal tablolar (view’lar). Fiziksel tablolar, veriyi gerçekten diskte saklayan yapılardır. İçlerine yeni kayıt ekleyebilir, mevcut kayıtları güncelleyebilir ya da silebilirsiniz. Ayrıca fiziksel tablolar üzerinde indeksler tanımlayarak sorguların daha hızlı çalışmasını sağlayabilirsiniz. Kısacası, verinin asıl kaynağı bu tablolardır ve depolama alanı kaplarlar.
Buna karşılık view’lar, yani sanal tablolar, aslında herhangi bir veri saklamaz. Sadece bir sorgunun tanımını tutarlar. Siz bir view’i çağırdığınızda, arka planda tanımlanmış olan SQL sorgusu yeniden çalıştırılır ve sonuç size tabloymuş gibi sunulur. Bu nedenle view’lar ek depolama alanı kaplamaz, yalnızca tanımının saklanması için küçük bir yer ayrılır. Ayrıca normal view’lar doğrudan indekslenemez; yalnızca bazı veritabanı sistemlerinde desteklenen materialized view veya indexed view yapıları bu imkanı sağlar.
Özetle, fiziksel tablolar verinin kendisini saklarken, view’lar verinin farklı bir bakış açısıyla sunulmasını sağlayan sorgu tanımlarıdır.
4. View İşlemleri
View’lar üzerinde en sık yapılan işlemler; oluşturma, güncelleme, silme ve sorgulama işlemleridir. Gelin her bir işlemi tek tek inceleyelim.
View Oluşturma (CREATE)
Yeni bir view oluşturmak için CREATE VIEW ifadesi kullanılır. İçine yazılan sorgu, view’in tanımı olur.
Syntax:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;Kullanım:
CREATE VIEW VW_ActiveUsers AS
SELECT user_id, username, email, created_date
FROM users
WHERE is_active = 1;Artık VW_ActiveUsers view’i bir tablo gibi kullanılabilir:
SELECT * FROM VW_ActiveUsers WHERE created_date > '2023-01-01';View’in Yapısını Değiştirme (ALTER)
Var olan bir view’in içeriğini değiştirmek için ALTER VIEW komutu kullanılır.
Syntax:
ALTER VIEW view_name AS
SELECT ...Kullanım:
CREATE VIEW VW_ActiveOrders AS
SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE Status = 'Active';ALTER VIEW VW_ActiveOrders AS
SELECT OrderID, CustomerID, OrderDate, TotalAmount
FROM Orders
WHERE Status = 'Active';ALTER VIEW kullanarak ilgili view’a ek olarak TotalAmountsütununu ekledik.
View Silme (DROP)
View’ları silmek için DROP VIEW komutunu kullanırız.
Syntax: DROP VIEW view_name
Get Berkan Serbes’s stories in your inbox
Join Medium for free to get updates from this writer.
Kullanım: DROP VIEW VW_ActiveOrders
View Üzerinden Veri Sorgulama (SELECT)
View’ler, normal tablolar gibi sorgulanabilir. SELECT, WHERE, ORDER BY gibi ifadeler kullanılabilir.
SELECT CustomerID, OrderDate
FROM VW_ActiveOrders
WHERE OrderDate > '2025-01-01'
ORDER BY OrderDate DESC;View Üzerinden Veri Güncelleme (UPDATE)
View’ler çoğunlukla veri okumak için kullanılsa da, bazı durumlarda view üzerinden INSERT, UPDATE ve DELETE işlemleri de yapılabilir. Ancak bu durumun geçerli olması için bazı koşullar vardır.
- View tek bir tablodan türetilmiş olmalıdır.
JOIN,GROUP BY,HAVING,UNION,DISTINCTveya aggregate fonksiyonlar (SUM,COUNTvb.) içermemelidir.- Sütunlar doğrudan temel tablonun sütunları olmalıdır, yani hesaplanmış sütunlar veya diğer karmaşık ifadeler olmamalıdır.
CREATE VIEW VW_SimpleCustomers AS
SELECT CustomerID, CustomerName, Email
FROM Customers;Bu view üzerinden kayıt güncellenebilir:
UPDATE VW_SimpleCustomers
SET Email = 'newmail@example.com'
WHERE CustomerID = 5;Bu işlem arka planda aslında Customers tablosunu günceller.
Veri Değişikliklerinin Kısıtlanması (WITH CHECK OPTION)
Güncellenebilir View’lar için WITH CHECK OPTION anahtar kelimesi önemlidir. Bu seçenek, View'a eklenen veya güncellenen verinin, View'ın temel sorgusundaki koşullara uyup uymadığını kontrol eder. Örneğin, stokta_fazla_urunler View'ını oluştururken bu seçeneği eklersek:
CREATE VIEW stokta_fazla_urunler AS
SELECT
urun_adi,
stok_adedi,
fiyat
FROM
urunler
WHERE
stok_adedi > 100
WITH CHECK OPTION;Bu durumda, bir ürünün stok adedini 100'ün altına düşürecek bir UPDATE işlemi gerçekleştirmeye çalıştığınızda veritabanı bir hata döndürür ve işlemi engeller.
Şifreli View Oluşturma (WITH ENCRYPTION)
SQL Server’da bir view tanımladığınızda, normal şartlarda o view’in sorgu tanımı sistem tablolarında veya SSMS (SQL Server Management Studio) üzerinden görülebilir. Ancak bazı durumlarda, view’in içindeki sorgu mantığının dışarıya açık olmaması istenebilir. İşte bu gibi senaryolarda WITH ENCRYPTION ifadesi kullanılarak view tanımı şifrelenebilir.
Örnek kullanım:
CREATE VIEW vw_EncryptedCustomerEmails
WITH ENCRYPTION
AS
SELECT CustomerID, Email
FROM Customers
WHERE IsActive = 1;Bu şekilde oluşturulan view, çalıştırıldığında normal şekilde sonuç döndürür. Ancak sp_helptext gibi bir sistem prosedürüyle view’in tanımını görmek isterseniz, şifrelenmiş olduğu için sorgu metni görünmez.
5. View Çeşitleri
SQL’de view’lar genel olarak iki grupta incelenir: sistem view’ları (system views) ve kullanıcı tanımlı view’lar (user-defined views). Bu çalışmada odaklanılacak kısım, kullanıcı tanımlı view’lardır. Kullanıcı tanımlı view’lar, kullanım amaçlarına ve sahip oldukları karmaşıklık düzeyine göre farklı türlerde sınıflandırılabilir.
Basit View (Simple View)
Basit view, genellikle tek bir tabloya dayalı, karmaşık işlem barındırmayan view’ları ifade eder. Bu tür view’lar sadece belirli kolonları seçmek veya basit filtreler uygulamak için kullanılır. Bu view çeşidinde genellikle UPDATE ve INSERT işlemleri yapılabilir.
CREATE VIEW CustomerNames AS
SELECT CustomerID, CustomerName
FROM Customers;Karmaşık View (Complex View)
Karmaşık view, birden fazla tabloyu JOIN eden, GROUP BY, HAVING , DISTINCT ve gibi ifadeler kullanan ya da Aggregate fonksiyonlar (SUM, COUNT, AVG vb.) içeren view’lardır. Daha kapsamlı raporlar veya özel veri setleri için tercih edilir. Genellikle sadece okunabilirler, UPDATE ve INSERT işlemleri yapılamaz.
CREATE VIEW department_statistics AS
SELECT
d.department_name,
COUNT(e.employee_id) as employee_count,
AVG(e.salary) as avg_salary,
MAX(e.salary) as max_salary,
MIN(e.hire_date) as oldest_hire_date,
ROUND(AVG(DATEDIFF(YEAR, e.hire_date, GETDATE())), 1) as avg_tenure_years
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
WHERE e.status = 'ACTIVE'
GROUP BY d.department_id, d.department_name
HAVING COUNT(e.employee_id) >= 0;Materialized View
Materialized View, bir View’ın sorgu sonucunu fiziksel olarak diskte saklar. Bu, sorgu sonucunu her seferinde yeniden hesaplamak yerine, önceden saklanan veriyi okuyarak çok daha hızlı erişim sağlar. Bir Materialized View’ı REFRESH MATERIALIZED VIEW komutuyla periyodik olarak manuel veya otomatik olarak güncelleyebilirsiniz.
Örnek (PostgreSQL):
-- PostgreSQL
-- Aylık satış raporu için materialized view
CREATE MATERIALIZED VIEW monthly_sales_report AS
SELECT
EXTRACT(YEAR FROM o.order_date) as sale_year,
EXTRACT(MONTH FROM o.order_date) as sale_month,
p.category_name,
COUNT(DISTINCT o.order_id) as total_orders,
SUM(oi.quantity) as total_quantity,
SUM(oi.quantity * oi.unit_price) as total_revenue,
AVG(oi.unit_price) as avg_unit_price
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date >= DATEADD(year, -2, GETDATE())
GROUP BY
EXTRACT(YEAR FROM o.order_date),
EXTRACT(MONTH FROM o.order_date),
p.category_name;
-- Materialized view'ı refresh etme
REFRESH MATERIALIZED VIEW monthly_sales_report;6. View Kullanmanın Avantajları
SQL’de view kullanmak, sadece kod yazımını kolaylaştırmakla kalmaz aynı zamanda güvenlik adına avantajlar sağlar.
Tekrar Eden Sorguları Basitleştirme: Sık kullanılan karmaşık sorgular, view haline getirilerek tek bir tablo gibi çağrılabilir. Böylece her defasında uzun SELECT ifadeleri yazmak yerine sadece view üzerinden işlem yapılır.
Güvenlik Sağlama: View’lar, kullanıcıların sadece belirli kolonlara veya filtrelenmiş verilere erişmesini sağlar. Örneğin, bir tabloda çalışanların maaş bilgisi varsa, maaş sütununu gizleyip sadece isim ve departman bilgilerini gösterecek bir view oluşturabilirsiniz. Bu şekilde tabloya direkt erişim olmadan veri güvenliği sağlanır.
Veri Soyutlama: Uygulamalar view sayesinde karmaşık veritabanı yapısını bilmek zorunda kalmaz. Tablo ilişkilerini, join’leri ya da filtreleme koşullarını gizleyebilirsiniz. Dışarıdan bakıldığında basit bir tablo gibi görünür ama arka planda karmaşık bir sorgu çalışır.
7. Performans İçin Dikkat Edilmesi Gerekenler
View’lar kullanışlıdır ama performans açısından dikkatli kullanılmaları gerekir.
View Her Çağrıldığında Yeniden Çalışır: Normal bir view sorgulandığında, veritabanı tanımlı SQL ifadesini tekrar çalıştırır. Dolayısıyla view aslında performans artırmaz, sadece sorgu yazımını kolaylaştırır. Eğer view çok karmaşık sorgular içeriyorsa sık çalıştırıldığında sistemde yük oluşturabilir.
Indexed View ile Performans Artışı: Bazı veritabanları (örneğin SQL Server) view üzerine indeks oluşturulmasına izin verir. Indexed View (ya da Materialized View), sorgunun sonucunu fiziksel olarak saklar. Böylece her seferinde sorgu yeniden çalıştırılmak yerine, önceden hazırlanmış veri hızlıca döndürülür. Bu yöntem büyük veri setlerinde ciddi performans kazancı sağlayabilir. Her view’in indexed yapılması gereksizdir. Indexed View sadece büyük veri setleri üzerinde sık kullanılan, ağır sorgular için tercih edilmelidir.
Çok Fazla View Kullanmanın Riski: Gereksiz yere çok sayıda view tanımlamak veritabanı yapısını karmaşıklaştırır. Ayrıca view’lar birbirine bağımlı hale gelirse (bir view başka bir view’i kullanıyorsa) bakımı zorlaşır ve performans sorunları yaşanabilir.
Select * Kullanımından Kaçının: View tanımlarken SELECT * kullanmak yerine, sadece gerekli kolonları seçmek daha iyidir. Çünkü tabloya yeni kolon eklendiğinde view’in beklenmeyen şekilde davranmasına neden olabilir. Ayrıca gereksiz veri çekmek performansı olumsuz etkiler.
Sonuç
View’lar, veriyi daha anlaşılır ve güvenli bir şekilde sunmanın en pratik yollarından biridir. Karmaşık sorguları sadeleştirir, uygulamaların bakımını kolaylaştırır ve veri erişimini kontrol altına alır. Doğru senaryoda kullanıldığında hem performans hem de okunabilirlik açısından büyük avantaj sağlar.









